@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,126 +0,0 @@
1
- /**
2
- * The conflict types a policy decides on. The engine detects a conflict and
3
- * hands it to your {@link ConflictPolicy}, which returns a
4
- * {@link ConflictDecision}.
5
- *
6
- * There are two conflict shapes. A {@link StaleContextConflict} is a write
7
- * whose `readAt` watermark is older than the latest delta on the target row. A
8
- * {@link ClaimHeldConflict} is a participant trying to claim a target that
9
- * someone else already holds. {@link Conflict} is the discriminated union of
10
- * the two; switch on `kind` to narrow it.
11
- */
12
- /**
13
- * The conflict policy the engine uses when you do not supply your own. It
14
- * favors people: a human is never blocked, while agents and automated writers
15
- * yield to a claim someone else holds.
16
- *
17
- * For a `claim_held` conflict, the decision follows the committer's kind:
18
- *
19
- * • `user` → `allow` — a human is never blocked by a claim. A claim is a
20
- * coordination hint among agents, not a lock on
21
- * people.
22
- * • `agent` → `reject` — an agent yields to a claim held by someone else.
23
- * The one sanctioned exception is the privileged
24
- * `claim.preempt` capability; see
25
- * {@link capabilityPreemptPolicy}.
26
- * • `system` → `reject` — automated and backend writers serialize through
27
- * claims the same way agents do, so a server job
28
- * cannot silently overwrite a held row. Declare the
29
- * model's conflict axis to overwrite if you want that.
30
- *
31
- * Allowing only `user` by default is deliberate: a backend key is a
32
- * full-access credential, and claim serialization depends on those writers
33
- * respecting claims unless a model opts out.
34
- *
35
- * For a `stale_context` conflict, the decision honors the committer's declared
36
- * `onStale` intent: `'notify'` holds the write and notifies the actor to
37
- * resolve it, and anything else (including `'reject'` or an absent value)
38
- * rejects. An `onStale` of `'overwrite'` never reaches a policy — it is a hard
39
- * opt-out resolved before the conflict is detected.
40
- *
41
- * To change this behavior for a model, declare its conflict axis in the schema;
42
- * a declared axis overrides this default.
43
- */
44
- // Typed by its real synchronous shape with `satisfies`, rather than the
45
- // async-permissive `ConflictPolicy` alias, so synchronous callers such as
46
- // `interpretConflictAxis` and `capabilityPreemptPolicy` receive a plain
47
- // `ConflictDecision` rather than `ConflictDecision | Promise<…>`. It remains
48
- // assignable to `ConflictPolicy` wherever it is used as one.
49
- export const defaultPolicy = ((conflict) => {
50
- if (conflict.kind === 'claim_held') {
51
- // A human (`user`) is never blocked; agents and system actors yield.
52
- // Keeping every non-`user` kind on `reject` here ensures an agent cannot
53
- // bypass a claim even on this default resolution path, which — unlike the
54
- // declared-axis path — has no separate agent guard of its own.
55
- return conflict.committer.kind === 'user'
56
- ? { action: 'allow', note: 'principal:not-blocked' }
57
- : { action: 'reject', reason: 'claim_conflict' };
58
- }
59
- return conflict.requestedMode === 'notify'
60
- ? { action: 'notify', reason: 'stale_notify_hold' }
61
- : { action: 'reject', reason: 'stale_context' };
62
- });
63
- /**
64
- * A ready-made policy that grants capability-gated preemption. When the
65
- * committer's capability allowlist includes the `claim.preempt` operation, a
66
- * `claim_held` conflict is preempted: the current holder is evicted and the
67
- * committer takes the lease. Every other conflict falls back to
68
- * {@link defaultPolicy}, which rejects. Register it as your conflict policy to
69
- * let a privileged identity take over a held entity without writing a bespoke
70
- * policy. The authorization rests on holding the capability, not on any
71
- * particular identity string.
72
- */
73
- export const capabilityPreemptPolicy = (conflict) => {
74
- if (conflict.kind === 'claim_held' &&
75
- conflict.committerOperations.includes('claim.preempt')) {
76
- return { action: 'preempt', reason: 'capability:claim.preempt' };
77
- }
78
- return defaultPolicy(conflict);
79
- };
80
- const _conflictAxisPinned = [true, true];
81
- void _conflictAxisPinned;
82
- /**
83
- * Resolves a declared {@link ConflictAxis} into a {@link ConflictDecision} for
84
- * one concrete conflict. It is pure and synchronous, doing no I/O, so it can
85
- * run on either the client or the server. It reads the committer's kind from
86
- * the conflict and maps the declared mode:
87
- *
88
- * - undefined → the engine default, {@link defaultPolicy}: a human is
89
- * allowed, an agent or system committer is rejected on a
90
- * `claim_held`, and a stale write honors `onStale: 'notify'`.
91
- * - `overwrite` → `allow`; the write wins and the committer is never blocked.
92
- * - `reject` → `reject`; the committer yields.
93
- * - `notify` → on a `stale_context` conflict, hold the write and notify so
94
- * the committer re-reads and re-applies; on a `claim_held`
95
- * conflict there is no held write to reconcile (see
96
- * {@link ConflictDecision} `notify`), so it degrades to
97
- * `reject` rather than silently writing to a claimed row.
98
- *
99
- * This is only the generic interpretation. Stronger server-side rules — such as
100
- * an agent never bypassing a claim held by someone else — are enforced where
101
- * the decision is applied, not here.
102
- */
103
- export function interpretConflictAxis(axis, conflict) {
104
- const mode = axis[conflict.committer.kind];
105
- if (mode === undefined)
106
- return defaultPolicy(conflict);
107
- switch (mode) {
108
- case 'overwrite':
109
- return { action: 'allow', note: 'conflict:overwrite' };
110
- case 'reject':
111
- return {
112
- action: 'reject',
113
- reason: conflict.kind === 'claim_held' ? 'claim_conflict' : 'stale_context',
114
- };
115
- case 'notify':
116
- return conflict.kind === 'stale_context'
117
- ? { action: 'notify', reason: 'stale_notify_hold' }
118
- : { action: 'reject', reason: 'claim_conflict' };
119
- default: {
120
- // Exhaustiveness backstop: a future `OnStaleMode` member surfaces as a
121
- // localized compile error here, not a missing-return at the signature.
122
- const _exhaustive = mode;
123
- return _exhaustive;
124
- }
125
- }
126
- }
@@ -1,79 +0,0 @@
1
- /**
2
- * The functional update — `ablo.<model>.update(id, current => next)`.
3
- *
4
- * This is the surface that just works under contention. You express only your
5
- * intent — given the latest row, here is the next state — and the client does
6
- * the rest: it reads the fresh row and its watermark, runs your updater, writes
7
- * the result as a compare-and-swap against that watermark, and on any concurrent
8
- * write it re-reads, recomputes, and retries. No claim, no identity, no transport
9
- * awareness, and no `stale_context` or `claim_*` error codes ever reach the
10
- * caller. The write either lands or, at the extreme, throws a single
11
- * {@link AbloContentionError} once the reconcile budget is spent.
12
- *
13
- * Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
14
- * (optimistic concurrency, or compare-and-swap), not from participant identity.
15
- * That is why it is immune to the shared-credential silent-overwrite hazard and
16
- * behaves identically on both transports: the HTTP and WebSocket clients inject
17
- * the same two functions ({@link ReconcileTransport}) into the shared loop below,
18
- * so the guarantee cannot drift between them — only the mechanism differs.
19
- *
20
- * The mental model is React's `setState(prev => next)`: pass a function of the
21
- * current state and the runtime owns reconciliation.
22
- */
23
- import { AbloContentionError } from '../errors.js';
24
- /**
25
- * The functional form of an update: given the freshly-read row, return the
26
- * fields to write. Return `null` or `undefined` to make no write — a no-op the
27
- * caller chose after seeing the latest state (for example, "already done").
28
- */
29
- export type ModelUpdater<T> = (current: T) => Partial<T> | null | undefined | Promise<Partial<T> | null | undefined>;
30
- /** Tuning for the functional update's internal reconcile loop. */
31
- export interface ContentionOptions {
32
- /**
33
- * Max reconcile rounds under contention before throwing
34
- * {@link AbloContentionError}. Each round re-reads the latest row and re-runs
35
- * your updater. Defaults to {@link DEFAULT_CONTENTION_RETRIES}.
36
- */
37
- readonly retries?: number;
38
- /** Abort the reconcile loop (e.g. the request was cancelled). */
39
- readonly signal?: AbortSignal;
40
- }
41
- /** Reconcile rounds before a hot row is declared permanently contended. */
42
- export declare const DEFAULT_CONTENTION_RETRIES = 16;
43
- /**
44
- * Reports whether a thrown error means "another writer moved the row — re-read
45
- * and retry" rather than a genuine failure to surface. These are the
46
- * optimistic-concurrency signals the functional update reconciles against:
47
- * - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
48
- * - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
49
- * - `claim_queued` — a holder is actively editing the row right now
50
- */
51
- export declare function isReconcilableConflict(err: unknown): boolean;
52
- /**
53
- * The transport-specific read and write that the shared loop drives. Each client
54
- * injects its own pair — the one thing that differs between the HTTP and
55
- * WebSocket transports.
56
- */
57
- export interface ReconcileTransport<T, R> {
58
- readonly model: string;
59
- readonly id: string;
60
- /** Read the latest row and its watermark from the authoritative store. */
61
- readFresh: () => Promise<{
62
- readonly data: T | null | undefined;
63
- readonly stamp: number;
64
- }>;
65
- /**
66
- * Write the computed patch as a compare-and-swap against `readAt`. It must
67
- * throw a reconcilable conflict (`stale_context` or `claim_*`) when the
68
- * watermark was overtaken — that rejection is what drives the next reconcile
69
- * round.
70
- */
71
- writeNext: (patch: Partial<T>, readAt: number) => Promise<R>;
72
- }
73
- /**
74
- * Run the read-fresh → compute → compare-and-swap → reconcile loop. Shared by
75
- * both transports so the guarantee is provably identical. Returns the write's
76
- * result, or `undefined` when the updater opted out of writing.
77
- */
78
- export declare function reconcileFunctionalUpdate<T, R>(updater: ModelUpdater<T>, options: ContentionOptions | undefined, transport: ReconcileTransport<T, R>): Promise<R | undefined>;
79
- export { AbloContentionError };
@@ -1,87 +0,0 @@
1
- /**
2
- * The functional update — `ablo.<model>.update(id, current => next)`.
3
- *
4
- * This is the surface that just works under contention. You express only your
5
- * intent — given the latest row, here is the next state — and the client does
6
- * the rest: it reads the fresh row and its watermark, runs your updater, writes
7
- * the result as a compare-and-swap against that watermark, and on any concurrent
8
- * write it re-reads, recomputes, and retries. No claim, no identity, no transport
9
- * awareness, and no `stale_context` or `claim_*` error codes ever reach the
10
- * caller. The write either lands or, at the extreme, throws a single
11
- * {@link AbloContentionError} once the reconcile budget is spent.
12
- *
13
- * Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
14
- * (optimistic concurrency, or compare-and-swap), not from participant identity.
15
- * That is why it is immune to the shared-credential silent-overwrite hazard and
16
- * behaves identically on both transports: the HTTP and WebSocket clients inject
17
- * the same two functions ({@link ReconcileTransport}) into the shared loop below,
18
- * so the guarantee cannot drift between them — only the mechanism differs.
19
- *
20
- * The mental model is React's `setState(prev => next)`: pass a function of the
21
- * current state and the runtime owns reconciliation.
22
- */
23
- import { AbloError, AbloNotFoundError, AbloStaleContextError, AbloClaimedError, AbloContentionError, } from '../errors.js';
24
- /** Reconcile rounds before a hot row is declared permanently contended. */
25
- export const DEFAULT_CONTENTION_RETRIES = 16;
26
- /**
27
- * Reports whether a thrown error means "another writer moved the row — re-read
28
- * and retry" rather than a genuine failure to surface. These are the
29
- * optimistic-concurrency signals the functional update reconciles against:
30
- * - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
31
- * - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
32
- * - `claim_queued` — a holder is actively editing the row right now
33
- */
34
- export function isReconcilableConflict(err) {
35
- if (err instanceof AbloStaleContextError)
36
- return true;
37
- if (err instanceof AbloClaimedError) {
38
- return err.code === 'claim_lost' || err.code === 'claim_queued';
39
- }
40
- return false;
41
- }
42
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
43
- /**
44
- * Jittered backoff so N reconcilers retrying at once don't lock-step straight
45
- * back into the same collision. Bounded; grows mildly with the attempt.
46
- */
47
- function backoffMs(attempt) {
48
- return 60 + attempt * 40 + Math.floor(Math.random() * 60);
49
- }
50
- /**
51
- * Run the read-fresh → compute → compare-and-swap → reconcile loop. Shared by
52
- * both transports so the guarantee is provably identical. Returns the write's
53
- * result, or `undefined` when the updater opted out of writing.
54
- */
55
- export async function reconcileFunctionalUpdate(updater, options, transport) {
56
- const retries = options?.retries ?? DEFAULT_CONTENTION_RETRIES;
57
- let lastConflict;
58
- for (let attempt = 0; attempt <= retries; attempt++) {
59
- if (options?.signal?.aborted) {
60
- throw new AbloError(`Update of ${transport.model}/${transport.id} was aborted before it landed.`, { code: 'update_aborted' });
61
- }
62
- const { data, stamp } = await transport.readFresh();
63
- if (data == null) {
64
- throw new AbloNotFoundError(`Cannot update ${transport.model}/${transport.id}: it does not exist (or is ` +
65
- `outside this credential's scope).`, [transport.id]);
66
- }
67
- const patch = await updater(data);
68
- if (patch == null)
69
- return undefined; // updater opted out after reading fresh
70
- try {
71
- return await transport.writeNext(patch, stamp);
72
- }
73
- catch (err) {
74
- if (!isReconcilableConflict(err))
75
- throw err; // genuine failure — surface it
76
- lastConflict = err;
77
- if (attempt < retries)
78
- await sleep(backoffMs(attempt));
79
- }
80
- }
81
- throw new AbloContentionError(transport.model, transport.id, retries + 1, {
82
- cause: lastConflict,
83
- });
84
- }
85
- // Re-exported so call sites import the loop and its terminal error from one
86
- // place; the class itself lives with the rest of the error hierarchy.
87
- export { AbloContentionError };
@@ -1,321 +0,0 @@
1
- /**
2
- * Shared resource types for the typed clients and private HTTP transport.
3
- * the commit and claim shapes, the session-mint params and resource, and the
4
- * {@link HttpClaimApi} derivation. This module holds only types and has no runtime
5
- * imports.
6
- */
7
- import type { ClaimHeartbeatAckPayload, OnStaleMode, ReadDependency, TrackDependency } from '../coordination/schema.js';
8
- import type { ClaimHeartbeatReply, ClaimState } from '../wire/claims.js';
9
- import type { ClientCommitReceipt, CommitWait } from '../wire/commit.js';
10
- export type { CommitWait };
11
- import type { ModelTarget, ModelClaim } from '../coordination/schema.js';
12
- export type { ModelTarget, ModelClaim };
13
- import type { ResolveClaimMeta } from '../types/global.js';
14
- import type { SchemaRecord } from '../schema/schema.js';
15
- import type { SyncGroupInput } from '../schema/roles.js';
16
- import type { CapabilityCan, CapabilityOperation, CapabilityScope } from '../auth/capability.js';
17
- import type { Claim, ClaimStream, ClaimWaitOptions, Duration, HeldClaim } from '../types/streams.js';
18
- import type { ClaimOptions, ClaimParams, ClaimReadApi, AwaitedClaimMethod } from './modelOperations.js';
19
- /**
20
- * The operations available on each model in the sync engine:
21
- * `retrieve({ id })` — an async single-row server read
22
- * `list({ where })` — an async collection server read
23
- * `local.retrieve(id)` / `local.list(...)` / `local.count(...)` — synchronous local reads
24
- * `create({ data })` / `update({ id, data })` / `delete({ id })` — writes
25
- * `claim({ id })` — a durable claim handle for coordinated writes
26
- */
27
- export type ModelOperationAction = 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
28
- export type IfClaimedPolicy = 'return' | 'fail';
29
- export interface ClaimedOptions {
30
- /**
31
- * What to do when another participant has claimed the target: `return` lets
32
- * the read proceed; `fail` throws `AbloClaimedError`. Inspect claim state via
33
- * `ablo.<model>.claim.state({ id })`. Waiting is a claim-side concern — take
34
- * `ablo.<model>.claim({ id })` (it queues fairly); reads never block.
35
- */
36
- readonly ifClaimed?: IfClaimedPolicy;
37
- }
38
- export type { ClaimWaitOptions } from '../types/streams.js';
39
- export interface ModelReadOptions extends ClaimedOptions {
40
- }
41
- /**
42
- * The target a caller names when creating a claim: {@link ModelTarget} with its
43
- * one caller-authored member typed — `meta` is the shape declared on
44
- * `Register`'s `ClaimMeta` slot, the same declaration every reader of the claim
45
- * is given back.
46
- *
47
- * Derived rather than restated, and narrowed only here: `modelTargetSchema`
48
- * keeps parsing `meta` as an open record, because a peer on a newer build must
49
- * still be understood. The wire stays permissive; the DTO the caller writes
50
- * does not.
51
- */
52
- export type ModelTargetInput = Omit<ModelTarget, 'meta'> & {
53
- readonly meta?: ResolveClaimMeta;
54
- };
55
- export interface ClaimCreateOptions {
56
- readonly target: ModelTargetInput;
57
- /** Peer-visible description of the work — the same field on every claim
58
- * surface. Defaults to `'editing'` when omitted. */
59
- readonly description?: string;
60
- readonly ttl?: Duration;
61
- /**
62
- * Join the server's fair FIFO queue when the target is already claimed,
63
- * rather than failing immediately. `create` then resolves only once the
64
- * lease is actually ours (the server pushes `claim_acquired` if the target
65
- * was free, or `claim_granted` when we reach the head of the line). Without
66
- * this, a contended claim throws. Used by `ablo.<model>.claim` so writers
67
- * serialize instead of racing.
68
- */
69
- readonly queue?: boolean;
70
- /** Cap on how long to wait for a queued grant before rejecting. */
71
- readonly waitTimeoutMs?: number;
72
- /** Abort a pending wait from outside — rejects with `claim_wait_aborted`.
73
- * Ignored once the grant has arrived. */
74
- readonly signal?: AbortSignal;
75
- /**
76
- * Backpressure: reject with `AbloClaimedError('queue_too_deep')` instead of
77
- * waiting if the queue is already `>= maxQueueDepth` when we join.
78
- */
79
- readonly maxQueueDepth?: number;
80
- }
81
- export interface CommitOperationInput {
82
- readonly action: ModelOperationAction;
83
- /** The model name — matches `ablo.<model>` and the schema's `model()`. */
84
- readonly model: string;
85
- readonly id?: string | null;
86
- readonly data?: Record<string, unknown> | null;
87
- readonly transactionId?: string | null;
88
- readonly readAt?: number | null;
89
- readonly onStale?: OnStaleMode | null;
90
- /** Fencing token (Option B) from the batch's claim handle; server-validated. */
91
- readonly fenceToken?: number | null;
92
- }
93
- export interface CommitCreateOptions {
94
- readonly idempotencyKey?: string | null;
95
- readonly readAt?: number | null;
96
- readonly onStale?: OnStaleMode | null;
97
- /**
98
- * A claim handle from `ablo.<model>.claim({ id })` (or the HTTP claim
99
- * surface). Same vocabulary as the per-model writes: the handle's
100
- * snapshot watermark becomes the batch `readAt` default and `onStale`
101
- * defaults to `'reject'`, so a commit that follows a claim is guarded
102
- * against concurrent edits without re-stating the watermark by hand.
103
- * Explicit `readAt`/`onStale` on the options win.
104
- */
105
- readonly claim?: Claim | null;
106
- /** One atomic batch. Use a one-element array for a single operation. */
107
- readonly operations: readonly CommitOperationInput[];
108
- readonly wait?: CommitWait;
109
- /**
110
- * The batch premise — the "did anything I looked at change?" guard.
111
- * Declare the rows (`{ model, id, readAt, fields? }`) or sync groups
112
- * (`{ group, readAt }`, for example `report:abc`) this batch was premised on; the
113
- * server checks that none moved since `readAt` and fires the entry's `onStale`
114
- * over the batch. This is distinct from the write-target `readAt`: it guards what
115
- * you read, not what you write.
116
- */
117
- readonly reads?: readonly ReadDependency[] | null;
118
- /**
119
- * Durable premises to register as part of this batch — the persisted
120
- * sibling of `reads`. Where `reads` guards only this commit, a `track` entry
121
- * (`{ model, id, readAt? }` for a row or `{ group, readAt? }` for a sync group)
122
- * lives on past it: a later matching change rides back on a future receipt's
123
- * `notifications`. A track-only batch (just `track`, an empty `operations`) is
124
- * the batch form of `ablo.<model>.track()`.
125
- */
126
- readonly track?: readonly TrackDependency[] | null;
127
- }
128
- /** Public projection inferred from the canonical runtime schema. */
129
- export type CommitReceipt = ClientCommitReceipt;
130
- export interface CommitResource {
131
- create(options: CommitCreateOptions): Promise<CommitReceipt>;
132
- }
133
- export interface ClaimResource extends ClaimStream {
134
- create(options: ClaimCreateOptions): Promise<Claim>;
135
- list(target?: Partial<ModelTarget>): readonly ModelClaim[];
136
- waitFor(target: Partial<ModelTarget>, options?: ClaimWaitOptions): Promise<void>;
137
- }
138
- /**
139
- * The claim-ticket surface of the stateless HTTP client — the operations a
140
- * caller performs holding only a `claimId`, which is what a queued acquire
141
- * leaves in its hand (`AbloClaimedError('claim_queued')` carries it on
142
- * `error.claims`). The WebSocket client never needs these: it awaits the grant
143
- * on its socket.
144
- *
145
- * All three shapes are the wire's own — `claimStateSchema`,
146
- * `claimHeartbeatReplySchema`, and the batch ack — so this surface cannot
147
- * describe a response the server does not send.
148
- */
149
- export interface HttpClaimsResource {
150
- /**
151
- * The claim's current state, by its id — `GET /v1/claims/{claimId}`. The
152
- * poll half of the queued-grant handover: a queued caller polls until
153
- * `status` is `'active'`, at which point `fenceToken` is present and the
154
- * work can begin. `position` is advisory (a privileged caller can reorder
155
- * the line, so it may go up); only `status` is authoritative.
156
- */
157
- retrieve(params: {
158
- readonly claimId: string;
159
- }): Promise<ClaimState>;
160
- /**
161
- * One beat on the named lease — `POST /v1/claims/{claimId}/heartbeat`. On a
162
- * held lease it extends the TTL; on a queued ticket it refreshes the
163
- * waiter's slot in the line and reports `{ status: 'queued', position }`.
164
- */
165
- heartbeat(params: {
166
- readonly claimId: string;
167
- readonly ttl?: string | number;
168
- }): Promise<ClaimHeartbeatReply>;
169
- /**
170
- * One beat for every lease this identity holds — `POST /v1/claims/heartbeat`,
171
- * one ack per extended lease. The socketless twin of the realtime
172
- * keepalive, for a stateless worker holding many rows.
173
- */
174
- heartbeatAll(options?: {
175
- readonly ttl?: string | number;
176
- }): Promise<readonly ClaimHeartbeatAckPayload[]>;
177
- /**
178
- * Give the ticket back — `DELETE /v1/claims/{claimId}`. On a held lease this
179
- * releases it and promotes the head of the queue; on a queued ticket it
180
- * leaves the line, so the waiters behind move up instead of waiting out
181
- * your slot's TTL. Idempotent: releasing an already-ended claim is a no-op.
182
- */
183
- release(params: {
184
- readonly claimId: string;
185
- }): Promise<void>;
186
- }
187
- export interface ModelMutationOptions extends ClaimedOptions {
188
- readonly claimRef?: string | {
189
- readonly id: string;
190
- } | null;
191
- readonly idempotencyKey?: string | null;
192
- readonly readAt?: number | null;
193
- readonly onStale?: OnStaleMode | null;
194
- readonly wait?: CommitWait;
195
- readonly claim?: Claim | ClaimOptions | null;
196
- /** Fencing token (Option B) from the claim; server-validated at commit. */
197
- readonly fenceToken?: number | null;
198
- }
199
- /**
200
- * The stateless HTTP claim surface. Most code puts a `claim` directly on the write
201
- * (`update({ id, data, claim })`) and lets the SDK release it; reach for this
202
- * namespace for multi-step handles and coordination screens.
203
- *
204
- * It is the same surface as the reactive claim API, but because every read is a
205
- * server round-trip, `state`, `queue`, and `reorder` are awaited here. The
206
- * WebSocket client resolves those synchronously from its local cache, which is what
207
- * lets it read a claim's state inside a React render; a stateless client has no
208
- * cache to read, so the promise is unavoidable.
209
- *
210
- * It is derived from `ClaimReadApi` through {@link AwaitedClaimMethod} so the two
211
- * transports cannot drift: the only difference is the promise wrapper that
212
- * statelessness forces. `claim({ id })` is identical on both (already async);
213
- * `state`, `queue`, `reorder`, and `release` are the awaited form.
214
- */
215
- export type HttpClaimApi<T = Record<string, unknown>> = ((params: ClaimParams<T> & {
216
- queue: false;
217
- }) => Promise<HeldClaim<T> | null>) & ((params: ClaimParams<T>) => Promise<HeldClaim<T>>) & {
218
- [K in keyof ClaimReadApi<T>]: AwaitedClaimMethod<ClaimReadApi<T>[K]>;
219
- };
220
- /** A single data operation a scoped **agent** session may perform on a model.
221
- * The SDK-facing name for {@link CapabilityOperation}; the vocabulary itself is
222
- * declared once, as a schema, in `auth/capability.ts`. */
223
- export type SessionOperation = CapabilityOperation;
224
- /** Parameters for minting an end-user session — full data authority within the
225
- * organization. Mints an `ek_` token. `user.id` is your end user's id from your
226
- * own identity provider and becomes the session's `participantId`; Ablo does not
227
- * model your users, so it is treated as an opaque string at the trust boundary. */
228
- export interface CreateUserSessionParams {
229
- /** Your end user. `id` becomes the token's `participantId`. */
230
- user: {
231
- id: string;
232
- };
233
- /** Mint the session into this organization instead of the key's own — for a
234
- * platform that serves many tenants from one backend. Requires the `sk_` key to
235
- * carry the `ephemeral:mint-any-org` scope; omit it for the normal
236
- * single-tenant case. */
237
- organizationId?: string;
238
- /** Sync groups this session may subscribe to — typed (`'default'` or
239
- * `<namespace>:<id>`; build with `syncGroup(kind, id)` from
240
- * `@abloatai/ablo/schema`). Omit for the server default:
241
- * `[org:<your org>, user:<user.id>]`. */
242
- syncGroups?: readonly SyncGroupInput[];
243
- /** Token lifetime in seconds. Defaults to 900 (15 minutes). */
244
- ttlSeconds?: number;
245
- /** Opaque identity blob echoed back to the client as `ablo.user`. */
246
- userMeta?: Record<string, unknown>;
247
- agent?: never;
248
- can?: never;
249
- }
250
- /** Mint params for a scoped **agent** session — mints a restricted `rk_` token
251
- * gated to exactly the operations named in `can`. `can` is typed off your
252
- * schema (no magic `'task.update'` strings): `{ Task: ['update'], Report: ['read'] }`
253
- * — the SDK serializes each entry to the wire allowlist (`task.update`). */
254
- export interface CreateAgentSessionParams<S extends SchemaRecord> {
255
- /** Your agent. `id` becomes the token's `participantId`. */
256
- agent: {
257
- id: string;
258
- };
259
- /** Per-model operation allowlist, typed against the schema's model names. */
260
- can: CapabilityCan<S>;
261
- /** Sync groups this session may subscribe to — typed (`'default'` or
262
- * `<namespace>:<id>`; build with `syncGroup(kind, id)` from
263
- * `@abloatai/ablo/schema`). Omit for the server default: the org
264
- * anchor (`org:<your org>`) + the agent's own anchor. */
265
- syncGroups?: readonly SyncGroupInput[];
266
- /** Token lifetime in seconds. Defaults to 900 (15 minutes). */
267
- ttlSeconds?: number;
268
- /** Opaque identity blob echoed back to the client as `ablo.agent`. */
269
- userMeta?: Record<string, unknown>;
270
- user?: never;
271
- }
272
- /** Params for {@link Ablo.sessions}.create — a discriminated union: pass
273
- * `{ user }` for a full-authority end-user session (`ek_`) or `{ agent, can }`
274
- * for a scoped agent session (`rk_`). */
275
- export type CreateSessionParams<S extends SchemaRecord> = CreateUserSessionParams | CreateAgentSessionParams<S>;
276
- /** Params for {@link Ablo.agents}.create — a flattened agent descriptor (no
277
- * `{ agent }` discriminator: `agents.create` only ever mints an agent). Unlike
278
- * {@link CreateSessionParams} it resolves to a connected, scoped {@link Ablo}
279
- * client rather than a raw token. */
280
- export interface CreateAgentClientParams<S extends SchemaRecord> {
281
- /** The wire participant identity (`agent:<id>`) that claim exclusion and the
282
- * FIFO queue gate on. Omit it to get a fresh random id — a distinct, independent
283
- * participant, which is the default and what you want for concurrent agents.
284
- * Pass a stable string only when one logical agent must re-attach to its own
285
- * held claims across reconnects or restarts. */
286
- id?: string;
287
- /** A human-readable label for logs and attribution (carried in `userMeta.name`).
288
- * It is independent of `id`: two agents that share a `name` still receive
289
- * distinct ids and coordinate as separate participants — `name` never derives or
290
- * collapses identity. */
291
- name?: string;
292
- /** Per-model operation allowlist, typed against the schema's model names. */
293
- can: CapabilityCan<S>;
294
- /** Sync groups this agent may subscribe to — typed (`'default'` or
295
- * `<namespace>:<id>`). Omit for the server default (org anchor + the
296
- * agent's own anchor). */
297
- syncGroups?: readonly SyncGroupInput[];
298
- /** Token lifetime in seconds. Defaults to 900 (15 minutes); the returned client
299
- * re-mints before expiry, so a long-running agent never handles rotation
300
- * itself. */
301
- ttlSeconds?: number;
302
- /** Extra opaque identity blob echoed on the session scope. Merged with
303
- * `name` (the `name` param wins if you also set `userMeta.name`). */
304
- userMeta?: Record<string, unknown>;
305
- }
306
- /** A minted session. `token` is the secret the holder presents as its bearer. */
307
- export interface AbloSession {
308
- object: 'session';
309
- /** Stable id of the minted credential (for revocation). */
310
- id: string;
311
- /** The short-lived session token — `ek_` for a `{ user }` session, `rk_`
312
- * for an `{ agent }` session. Hand this to the participant's runtime. */
313
- token: string;
314
- /** ISO-8601 expiry. */
315
- expiresAt: string;
316
- organizationId: string;
317
- /** The grant this token carries, on both axes — the same shape the key row
318
- * stores and the gates enforce. */
319
- scope: CapabilityScope;
320
- userMeta: Record<string, unknown>;
321
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Shared resource types for the typed clients and private HTTP transport.
3
- * the commit and claim shapes, the session-mint params and resource, and the
4
- * {@link HttpClaimApi} derivation. This module holds only types and has no runtime
5
- * imports.
6
- */
7
- export {};