@abloatai/ablo 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  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 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  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 +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,2 +0,0 @@
1
- import type { ClaimTargetDetails } from './locator.js';
2
- export declare function targetsConflict(held: ClaimTargetDetails, incoming: ClaimTargetDetails | undefined): boolean;
@@ -1,103 +0,0 @@
1
- /**
2
- * Whether two claims on the same entity collide — the single most consequential
3
- * predicate in the claim protocol, and the one rule that decides whether a
4
- * second writer is granted a lease or made to wait.
5
- *
6
- * It lived in two files for as long as there were two claim authorities: the
7
- * Redis lease store, which is authoritative wherever Redis is wired, and the
8
- * in-process presence store, which answers when it is not. Both spelled the
9
- * rule out in full, byte for byte, so a change to the granularity semantics had
10
- * two places to land and no way to notice when it landed in one. It is one
11
- * definition here, and both authorities import it.
12
- *
13
- * It lives in the settlement core rather than the server because it is the rule
14
- * itself, not a deployment of it: a claim authority running against a
15
- * developer's own database has to answer this question exactly the same way,
16
- * and a client that wants to predict a refusal before paying for the round trip
17
- * reads the same predicate. Nothing about it needs a socket, a store, or a
18
- * screen.
19
- *
20
- * Entity identity is NOT part of this comparison. Callers reach this predicate
21
- * having already narrowed to a single `(organization, environment, entityType,
22
- * entityId)` bucket — the lease store through its key, the presence store
23
- * through its per-entity scan — so what remains to decide is only whether the
24
- * two sub-targets within that entity overlap.
25
- *
26
- * **The bias is deliberate: when in doubt, conflict.** A false conflict costs a
27
- * writer a wait. A missed conflict hands two writers the same target and loses
28
- * one of their updates with no error anywhere, which is the failure this
29
- * predicate exists to prevent.
30
- */
31
- /**
32
- * The named parts a claim covers, as one set.
33
- *
34
- * `field` and `fields` are the same idea at two cardinalities, so the rule
35
- * reads both through here and never has to ask which one a caller used. Names
36
- * are lowercased for the same reason the single-field comparison always
37
- * lowercased them.
38
- */
39
- function fieldSet(target) {
40
- const names = [
41
- ...(target?.field !== undefined ? [target.field] : []),
42
- ...(target?.fields ?? []),
43
- ];
44
- return new Set(names.map((n) => n.toLowerCase()));
45
- }
46
- /** Whether a claim narrows below the whole entity at all. */
47
- function hasSubtarget(target) {
48
- return Boolean(target?.path ||
49
- target?.field ||
50
- (target?.fields && target.fields.length > 0) ||
51
- target?.range);
52
- }
53
- function lower(value) {
54
- return value?.toLowerCase();
55
- }
56
- /**
57
- * Whether two paths address overlapping parts of a document.
58
- *
59
- * Paths are hierarchical, so equality is the wrong test: `/content` contains
60
- * `/content/3`, and a writer holding the parent is holding the child too.
61
- * Comparing them as opaque strings reported no conflict and granted both
62
- * leases — the parent's writer and the child's writer would then both write,
63
- * and one update would vanish with nothing raised anywhere.
64
- *
65
- * Containment is checked on a separator boundary so `/content` contains
66
- * `/content/3` but not `/contentious`, which is the same trap as any
67
- * prefix match over structured names.
68
- */
69
- function pathsOverlap(a, b) {
70
- const x = lower(a) ?? '';
71
- const y = lower(b) ?? '';
72
- if (x === y)
73
- return true;
74
- const contains = (parent, child) => child.startsWith(parent.endsWith('/') ? parent : `${parent}/`);
75
- return contains(x, y) || contains(y, x);
76
- }
77
- function rangesOverlap(a, b) {
78
- // Line-level overlap is the stable default. Columns can be layered
79
- // in by policy later, but line ranges are what code/editor agents
80
- // can reliably produce across tools.
81
- return a.startLine <= b.endLine && b.startLine <= a.endLine;
82
- }
83
- export function targetsConflict(held, incoming) {
84
- // Whole-entity claims are conservative: they conflict with any
85
- // narrower path/field/range claim under the same entity.
86
- if (!hasSubtarget(held) || !hasSubtarget(incoming))
87
- return true;
88
- if (held.path && incoming?.path && !pathsOverlap(held.path, incoming.path)) {
89
- return false;
90
- }
91
- // A claim that names no field covers every field, so it conflicts with any
92
- // claim under the same path. Two that both name fields conflict only where
93
- // their sets intersect.
94
- const heldFields = fieldSet(held);
95
- const incomingFields = fieldSet(incoming);
96
- const fieldConflicts = heldFields.size === 0 ||
97
- incomingFields.size === 0 ||
98
- [...heldFields].some((name) => incomingFields.has(name));
99
- const rangeConflicts = !held.range ||
100
- !incoming?.range ||
101
- rangesOverlap(held.range, incoming.range);
102
- return fieldConflicts && rangeConflicts;
103
- }
@@ -1,78 +0,0 @@
1
- /**
2
- * A claim log — the simplest way to watch agents collide. The engine reports
3
- * the claim lifecycle (`acquired → queued → granted → lost / rejected /
4
- * expired`) and the notify-instead-of-abort stale write through two channels:
5
- * human-readable `logger` lines (shown with `new Ablo({ debug: true })`) and
6
- * structured `observability.captureClaim` / `captureConflict` calls.
7
- *
8
- * This is a third channel, shaped for tests and evals. Pass a {@link ClaimLog}
9
- * as `Ablo({ observability })`, run your scenario, then read back an ordered
10
- * list — print it to eyeball what happened, or call `collisions()` to assert on it.
11
- */
12
- import type { ClaimEvent, ConflictEvent, CoordinationObserver } from './events.js';
13
- /** A claim state change as one quiet, greppable line. */
14
- export declare function formatClaim(e: ClaimEvent): string;
15
- /** A notify-instead-of-abort stale write as one readable line. */
16
- export declare function formatConflict(e: ConflictEvent): string;
17
- /** One ordered entry in a {@link ClaimLog}. */
18
- export interface ClaimLogEntry {
19
- /** Monotonic order index — deterministic, clock-free, eval-friendly. */
20
- readonly seq: number;
21
- /** The same one-line text the console and breadcrumb channels emit. */
22
- readonly line: string;
23
- /** A collision worth flagging: a rejected/lost claim or a stale write. */
24
- readonly collision: boolean;
25
- readonly claim?: ClaimEvent;
26
- readonly conflict?: ConflictEvent;
27
- }
28
- /**
29
- * Collects the claim lifecycle + stale-write collisions into an ordered list.
30
- *
31
- * @example
32
- * ```ts
33
- * const log = new ClaimLog();
34
- * const ablo = new Ablo({ schema, apiKey, observability: log });
35
- * // …run the agents…
36
- * console.log(`${log}`); // pretty timeline for eyeballing
37
- * expect(log.collisions()).toHaveLength(0); // assert no one stepped on anyone
38
- * ```
39
- *
40
- * Implements the transaction layer's narrow {@link CoordinationObserver}.
41
- * The sync engine re-serves a compatibility subclass that fills its broader
42
- * lifecycle-observability contract, so the public `Ablo({ observability })`
43
- * usage remains unchanged without teaching this core class about bootstrap,
44
- * IndexedDB, or WebSockets.
45
- */
46
- export declare class ClaimLog implements CoordinationObserver {
47
- private readonly max;
48
- private rows;
49
- private seq;
50
- private readonly listeners;
51
- /** Cap the buffer so a long-running session can't grow unbounded. */
52
- constructor(max?: number);
53
- captureClaim(claim: ClaimEvent): void;
54
- captureConflict(conflict: ConflictEvent): void;
55
- /**
56
- * Fire `listener` every time an event lands. Returns an unsubscribe fn. Same
57
- * contract as `ablo.claims.onChange` — drop it into `useSyncExternalStore` in
58
- * React or `autorun` in MobX to render a live activity feed.
59
- *
60
- * @example
61
- * ```tsx
62
- * const log = useMemo(() => new ClaimLog(), []);
63
- * const entries = useSyncExternalStore(log.onChange, () => log.entries);
64
- * return <ul>{entries.map((e) => <li key={e.seq}>{e.line}</li>)}</ul>;
65
- * ```
66
- */
67
- readonly onChange: (listener: () => void) => (() => void);
68
- /** The full ordered list. Stable reference until the next event lands. */
69
- get entries(): readonly ClaimLogEntry[];
70
- /** Only the collisions: rejected/lost claims + stale writes. */
71
- collisions(): readonly ClaimLogEntry[];
72
- /** Drop everything — useful between scenarios in one process. */
73
- clear(): void;
74
- /** Printable: one event per line, collisions marked. */
75
- toString(): string;
76
- private add;
77
- private notify;
78
- }
@@ -1,138 +0,0 @@
1
- /**
2
- * A claim log — the simplest way to watch agents collide. The engine reports
3
- * the claim lifecycle (`acquired → queued → granted → lost / rejected /
4
- * expired`) and the notify-instead-of-abort stale write through two channels:
5
- * human-readable `logger` lines (shown with `new Ablo({ debug: true })`) and
6
- * structured `observability.captureClaim` / `captureConflict` calls.
7
- *
8
- * This is a third channel, shaped for tests and evals. Pass a {@link ClaimLog}
9
- * as `Ablo({ observability })`, run your scenario, then read back an ordered
10
- * list — print it to eyeball what happened, or call `collisions()` to assert on it.
11
- */
12
- // ─────────────────────────────────────────────
13
- // Formatters — one readable line per event. Shared by the debug logger and
14
- // this log so console output and log output never drift.
15
- // ─────────────────────────────────────────────
16
- /** A claim state change as one quiet, greppable line. */
17
- export function formatClaim(e) {
18
- const target = e.model && e.id ? `${e.model}/${e.id}` : e.claimId ?? 'unknown target';
19
- const scope = e.field ? `#${e.field}` : '';
20
- const pos = e.position !== undefined ? ` [pos ${e.position}]` : '';
21
- // The kind belongs to the counterparty, which is the only participant an
22
- // event names: on an acquisition the participant is us.
23
- const kind = e.heldBy?.participantKind;
24
- const actor = e.actor ? `${e.actor}${kind ? ` (${kind})` : ''}` : '';
25
- // `rejected`/`lost` name the blocking holder; the rest name us (or no one).
26
- const by = actor
27
- ? e.phase === 'rejected' || e.phase === 'lost'
28
- ? ` — held by ${actor}`
29
- : ` — by ${actor}`
30
- : '';
31
- // The cause when there is one, in the policy's own words when a policy
32
- // decided; otherwise what the holder said they were doing. A line never
33
- // shows both, because a claim that ended has a cause and a claim that is
34
- // simply alive has only its description.
35
- const why = e.reason
36
- ? `: ${e.policyReason ?? e.reason}`
37
- : e.description
38
- ? `: ${e.description}`
39
- : '';
40
- return `claim ${e.phase}: ${target}${scope}${pos}${by}${why}`;
41
- }
42
- /** A notify-instead-of-abort stale write as one readable line. */
43
- export function formatConflict(e) {
44
- const rows = e.rows.map((r) => `${r.model}/${r.id}(${r.fields.join(',')})`).join(', ');
45
- return `conflict: tx ${e.clientTxId} — ${e.rows.length} row(s) changed underneath${rows ? `: ${rows}` : ''}`;
46
- }
47
- /**
48
- * Collects the claim lifecycle + stale-write collisions into an ordered list.
49
- *
50
- * @example
51
- * ```ts
52
- * const log = new ClaimLog();
53
- * const ablo = new Ablo({ schema, apiKey, observability: log });
54
- * // …run the agents…
55
- * console.log(`${log}`); // pretty timeline for eyeballing
56
- * expect(log.collisions()).toHaveLength(0); // assert no one stepped on anyone
57
- * ```
58
- *
59
- * Implements the transaction layer's narrow {@link CoordinationObserver}.
60
- * The sync engine re-serves a compatibility subclass that fills its broader
61
- * lifecycle-observability contract, so the public `Ablo({ observability })`
62
- * usage remains unchanged without teaching this core class about bootstrap,
63
- * IndexedDB, or WebSockets.
64
- */
65
- export class ClaimLog {
66
- max;
67
- // Immutable list: a new array reference on every change. This is what lets
68
- // `useSyncExternalStore(log.onChange, () => log.entries)` detect updates —
69
- // it compares snapshots by reference, so an in-place push would never render.
70
- rows = [];
71
- seq = 0;
72
- listeners = new Set();
73
- /** Cap the buffer so a long-running session can't grow unbounded. */
74
- constructor(max = 1_000) {
75
- this.max = max;
76
- }
77
- // —— the two channels we record ——
78
- captureClaim(claim) {
79
- this.add({
80
- line: formatClaim(claim),
81
- collision: claim.phase === 'rejected' || claim.phase === 'lost',
82
- claim,
83
- });
84
- }
85
- captureConflict(conflict) {
86
- this.add({ line: formatConflict(conflict), collision: true, conflict });
87
- }
88
- // —— reactivity ——
89
- /**
90
- * Fire `listener` every time an event lands. Returns an unsubscribe fn. Same
91
- * contract as `ablo.claims.onChange` — drop it into `useSyncExternalStore` in
92
- * React or `autorun` in MobX to render a live activity feed.
93
- *
94
- * @example
95
- * ```tsx
96
- * const log = useMemo(() => new ClaimLog(), []);
97
- * const entries = useSyncExternalStore(log.onChange, () => log.entries);
98
- * return <ul>{entries.map((e) => <li key={e.seq}>{e.line}</li>)}</ul>;
99
- * ```
100
- */
101
- onChange = (listener) => {
102
- this.listeners.add(listener);
103
- return () => this.listeners.delete(listener);
104
- };
105
- // —— inspection ——
106
- /** The full ordered list. Stable reference until the next event lands. */
107
- get entries() {
108
- return this.rows;
109
- }
110
- /** Only the collisions: rejected/lost claims + stale writes. */
111
- collisions() {
112
- return this.rows.filter((e) => e.collision);
113
- }
114
- /** Drop everything — useful between scenarios in one process. */
115
- clear() {
116
- this.rows = [];
117
- this.seq = 0;
118
- this.notify();
119
- }
120
- /** Printable: one event per line, collisions marked. */
121
- toString() {
122
- if (this.rows.length === 0)
123
- return 'claim log: (empty)';
124
- const w = String(this.rows.length).length;
125
- return this.rows
126
- .map((e) => `${String(e.seq).padStart(w)} ${e.collision ? '⚠ ' : ' '}${e.line}`)
127
- .join('\n');
128
- }
129
- add(entry) {
130
- const next = [...this.rows, { seq: this.seq++, ...entry }];
131
- this.rows = next.length > this.max ? next.slice(next.length - this.max) : next;
132
- this.notify();
133
- }
134
- notify() {
135
- for (const listener of this.listeners)
136
- listener();
137
- }
138
- }
@@ -1,62 +0,0 @@
1
- /**
2
- * The durable-write port and the option that installs it.
3
- *
4
- * Owns the persistence contract behind `Ablo({ durableWrites })` — a behavior
5
- * contract of methods, not a serialized shape, which is why it lives here
6
- * rather than in `transactions/settlement/`. The records that cross this port
7
- * are owned by `pendingWriteSchema` there; this module never redescribes them.
8
- *
9
- * The engine consumes the port through `commitOutboxStore`, and the HTTP client
10
- * accepts the same option through `transport/httpOptions`.
11
- */
12
- import { z } from 'zod';
13
- import type { CommitOutboxScope } from './transactions/settlement/commitEnvelope.js';
14
- import type { PendingWrite } from './transactions/settlement/pendingWrite.js';
15
- /**
16
- * Persistence port used by `Ablo({ durableWrites })`.
17
- *
18
- * `seal` is the durability boundary: it must atomically persist the exact write
19
- * and consume the staged records that write supersedes. Resolving this promise
20
- * authorizes Ablo to dispatch the request, so adapters must never report success
21
- * before the data is durable.
22
- */
23
- export interface DurableWriteStore {
24
- /**
25
- * Atomically reserve a pending write and consume the staged records it owns.
26
- * The same id + same request is idempotent; the same id + a different request
27
- * must be rejected. For a source-accepted envelope, a re-seal may add the
28
- * monotonic `acceptedAt`/`correlationId` evidence and the store must preserve
29
- * that upgrade atomically rather than ignoring it.
30
- */
31
- seal(write: PendingWrite, consumedRecordIds: readonly string[]): Promise<void>;
32
- /** Load all unacknowledged writes. Stored data is treated as untrusted. */
33
- list(): Promise<readonly unknown[]>;
34
- /** Remove one write only after its outcome is definitive. */
35
- remove(writeId: string): Promise<void>;
36
- }
37
- /** Runtime validation for injected adapters, including JavaScript consumers. */
38
- export declare const durableWriteStoreSchema: z.ZodCustom<DurableWriteStore, DurableWriteStore>;
39
- /** Options for crash-durable `create`, `update`, and `delete` calls. */
40
- export declare const durableWritesConfigSchema: z.ZodObject<{
41
- store: z.ZodCustom<DurableWriteStore, DurableWriteStore>;
42
- namespace: z.ZodOptional<z.ZodString>;
43
- }, z.core.$strict>;
44
- export type DurableWritesConfig = z.infer<typeof durableWritesConfigSchema>;
45
- interface DurableWriteOptionInput {
46
- readonly durableWrites?: DurableWritesConfig;
47
- /** Compatibility input for pre-`durableWrites` clients. */
48
- readonly commitOutbox?: DurableWriteStore;
49
- /** Compatibility input and internal child-client identity seam. */
50
- readonly commitOutboxScope?: CommitOutboxScope;
51
- }
52
- export interface ResolvedDurableWrites {
53
- readonly store?: DurableWriteStore;
54
- readonly namespace?: string;
55
- }
56
- /**
57
- * Resolves one canonical store configuration for both HTTP and WebSocket
58
- * clients. Mixed old/new configuration fails loudly so Ablo never persists to
59
- * one adapter while the caller believes another adapter is authoritative.
60
- */
61
- export declare function resolveDurableWrites(options: DurableWriteOptionInput): ResolvedDurableWrites;
62
- export {};
@@ -1,71 +0,0 @@
1
- /**
2
- * The durable-write port and the option that installs it.
3
- *
4
- * Owns the persistence contract behind `Ablo({ durableWrites })` — a behavior
5
- * contract of methods, not a serialized shape, which is why it lives here
6
- * rather than in `transactions/settlement/`. The records that cross this port
7
- * are owned by `pendingWriteSchema` there; this module never redescribes them.
8
- *
9
- * The engine consumes the port through `commitOutboxStore`, and the HTTP client
10
- * accepts the same option through `transport/httpOptions`.
11
- */
12
- import { z } from 'zod';
13
- import { AbloValidationError } from './errors.js';
14
- /** Runtime validation for injected adapters, including JavaScript consumers. */
15
- export const durableWriteStoreSchema = z.custom((value) => {
16
- if (typeof value !== 'object' || value === null)
17
- return false;
18
- const candidate = value;
19
- return (typeof candidate.seal === 'function' &&
20
- typeof candidate.list === 'function' &&
21
- typeof candidate.remove === 'function');
22
- }, { message: 'store must implement seal(), list(), and remove()' });
23
- /** Options for crash-durable `create`, `update`, and `delete` calls. */
24
- export const durableWritesConfigSchema = z.strictObject({
25
- store: durableWriteStoreSchema,
26
- /** Separates deployments or workflow lanes that share an authenticated actor. */
27
- namespace: z.string().trim().min(1).optional(),
28
- });
29
- function invalidDurableWrites(message) {
30
- return new AbloValidationError(`Ablo: invalid \`durableWrites\` option — ${message}.`, {
31
- code: 'invalid_options',
32
- param: 'durableWrites',
33
- });
34
- }
35
- /**
36
- * Resolves one canonical store configuration for both HTTP and WebSocket
37
- * clients. Mixed old/new configuration fails loudly so Ablo never persists to
38
- * one adapter while the caller believes another adapter is authoritative.
39
- */
40
- export function resolveDurableWrites(options) {
41
- if (options.durableWrites !== undefined && options.commitOutbox !== undefined) {
42
- throw invalidDurableWrites('pass `durableWrites` or the deprecated `commitOutbox`, not both');
43
- }
44
- if (options.durableWrites !== undefined) {
45
- const parsed = durableWritesConfigSchema.safeParse(options.durableWrites);
46
- if (!parsed.success) {
47
- throw invalidDurableWrites(parsed.error.issues.map((issue) => issue.message).join('; '));
48
- }
49
- return {
50
- store: parsed.data.store,
51
- ...(parsed.data.namespace !== undefined
52
- ? { namespace: parsed.data.namespace }
53
- : options.commitOutboxScope?.namespace !== undefined
54
- ? { namespace: options.commitOutboxScope.namespace }
55
- : {}),
56
- };
57
- }
58
- if (options.commitOutbox !== undefined) {
59
- const parsed = durableWriteStoreSchema.safeParse(options.commitOutbox);
60
- if (!parsed.success) {
61
- throw invalidDurableWrites(parsed.error.issues.map((issue) => issue.message).join('; '));
62
- }
63
- return {
64
- store: parsed.data,
65
- ...(options.commitOutboxScope?.namespace !== undefined
66
- ? { namespace: options.commitOutboxScope.namespace }
67
- : {}),
68
- };
69
- }
70
- return {};
71
- }
@@ -1,105 +0,0 @@
1
- import { z } from 'zod';
2
- /**
3
- * Two axes live in this module, and they are NOT the same axis. They stay
4
- * together because they convert into each other; they stay distinct because
5
- * conflating them is how credentials acquire a mode nobody chose.
6
- *
7
- * - The PLANE axis ({@link Environment}) — which isolated plane a row, schema
8
- * artifact, or data source belongs to. Open-ended: `production` is the root
9
- * plane and any number of others may exist beside it.
10
- * - The CREDENTIAL axis ({@link KeyEnvironment}) — the mode a key was minted
11
- * in. Binary, and fixed by the key format: a prefix spells exactly one of
12
- * `live` or `test`, so a third value is not representable in a key at all.
13
- *
14
- * These were one type until this split, which is the shape behind two
15
- * incidents: an `sk_test_` exchange that minted an `ek_live_` and landed
16
- * sandbox commits in another tenant's tables, and a rotation that handed back
17
- * an `rk_live_` in place of an `rk_test_`. Widening the plane axis while the
18
- * credential axis aliased it would reopen that door one plane name wider, so
19
- * the split comes first and the conversions below are deliberately narrow.
20
- */
21
- /**
22
- * The plane names every deployment has: the root, plus the plane every project
23
- * starts with beside it. This is the well-known set, not the permitted set —
24
- * {@link environmentSchema} decides what is valid.
25
- */
26
- export declare const ENVIRONMENTS: readonly ["production", "sandbox"];
27
- /** The root plane — the one every other plane is defined relative to. */
28
- export declare const ROOT_ENVIRONMENT = "production";
29
- /**
30
- * The modes a credential can be minted in. Deliberately its own list rather
31
- * than a view of {@link ENVIRONMENTS}: this one is fixed by the key format,
32
- * which has exactly two prefix spellings, and must not grow when planes do.
33
- */
34
- export declare const KEY_ENVIRONMENTS: readonly ["production", "sandbox"];
35
- /**
36
- * How a credential's mode is spelled inside an API-key prefix: a `live` key
37
- * acts on production and a `test` key acts on the sandbox. Convert between this
38
- * spelling and {@link KeyEnvironment} with {@link environmentFromKeyPrefix} and
39
- * {@link environmentToKeyPrefix}.
40
- */
41
- export declare const KEY_PREFIX_ENVIRONMENTS: readonly ["live", "test"];
42
- export type KeyPrefixEnvironment = (typeof KEY_PREFIX_ENVIRONMENTS)[number];
43
- /**
44
- * Validates a value as a plane name — a lowercase slug that may not lead or
45
- * trail with a hyphen.
46
- *
47
- * The character set is load-bearing rather than cosmetic. A plane name is
48
- * interpolated into two delimited identifiers: the sync-group prefix
49
- * (`sandbox:<org>:<slug>`, colon separated) and the tenant secret scope
50
- * (`<org>/<env>/<project>/<sandbox>`, slash separated). Admitting `:` or `/`
51
- * would let one plane's name parse as two segments and so collide with a
52
- * different plane's identity, which is why the pattern excludes every delimiter
53
- * either format relies on.
54
- */
55
- export declare const environmentSchema: z.ZodString;
56
- /** A plane name. `production` is the root; any other slug is a plane beside it. */
57
- export type Environment = z.infer<typeof environmentSchema>;
58
- /** Validates a value as one of the {@link KEY_ENVIRONMENTS}. */
59
- export declare const keyEnvironmentSchema: z.ZodEnum<{
60
- production: "production";
61
- sandbox: "sandbox";
62
- }>;
63
- /**
64
- * The mode a credential was minted in — `'production'` or `'sandbox'`, never
65
- * anything else. Not an alias of {@link Environment}: a key's mode is a trust
66
- * boundary, and a plane name must never be able to answer it.
67
- */
68
- export type KeyEnvironment = z.infer<typeof keyEnvironmentSchema>;
69
- /**
70
- * Coerces an untrusted value into a valid {@link Environment}, returning
71
- * `fallback` (which defaults to the root plane) when the value is not a
72
- * well-formed plane name. Use it when reading a plane from configuration or off
73
- * the wire.
74
- */
75
- export declare function normalizeEnvironment(value: unknown, fallback?: Environment): Environment;
76
- /** True when the given plane is the root plane. */
77
- export declare function isRootEnvironment(value: Environment): boolean;
78
- /**
79
- * The mode a credential acting on the given plane must be minted in.
80
- *
81
- * This is the ONE narrowing from the open plane axis to the binary credential
82
- * axis, and it is deliberately asymmetric: only the root plane yields a
83
- * production-mode key, and every other plane — named, numbered, or newly forked
84
- * — yields a sandbox-mode one. A plane cannot acquire live authority by being
85
- * spelled a particular way, which is the property that keeps adding planes from
86
- * widening what any credential is allowed to touch.
87
- */
88
- export declare function keyEnvironmentForPlane(value: Environment): KeyEnvironment;
89
- /**
90
- * Maps an API-key prefix spelling to the mode it denotes: a `'test'` key was
91
- * minted in the sandbox, and anything else in production.
92
- */
93
- export declare function environmentFromKeyPrefix(value: KeyPrefixEnvironment): KeyEnvironment;
94
- /**
95
- * Maps a credential's mode to the spelling used in its key prefix.
96
- *
97
- * Takes a {@link KeyEnvironment} rather than an {@link Environment} on purpose.
98
- * Planes outside the well-known two have no prefix spelling, and a signature
99
- * that accepted one would silently answer `'live'` for them — minting a
100
- * production-mode credential for a plane that is not production. That is the
101
- * 2026-06-10 incident with a new cause, so the type refuses the input instead.
102
- */
103
- export declare function environmentToKeyPrefix(value: KeyEnvironment): KeyPrefixEnvironment;
104
- /** Returns true when the given environment is the sandbox. */
105
- export declare function isSandboxEnvironment(value: Environment): boolean;
@@ -1,108 +0,0 @@
1
- import { z } from 'zod';
2
- /**
3
- * Two axes live in this module, and they are NOT the same axis. They stay
4
- * together because they convert into each other; they stay distinct because
5
- * conflating them is how credentials acquire a mode nobody chose.
6
- *
7
- * - The PLANE axis ({@link Environment}) — which isolated plane a row, schema
8
- * artifact, or data source belongs to. Open-ended: `production` is the root
9
- * plane and any number of others may exist beside it.
10
- * - The CREDENTIAL axis ({@link KeyEnvironment}) — the mode a key was minted
11
- * in. Binary, and fixed by the key format: a prefix spells exactly one of
12
- * `live` or `test`, so a third value is not representable in a key at all.
13
- *
14
- * These were one type until this split, which is the shape behind two
15
- * incidents: an `sk_test_` exchange that minted an `ek_live_` and landed
16
- * sandbox commits in another tenant's tables, and a rotation that handed back
17
- * an `rk_live_` in place of an `rk_test_`. Widening the plane axis while the
18
- * credential axis aliased it would reopen that door one plane name wider, so
19
- * the split comes first and the conversions below are deliberately narrow.
20
- */
21
- /**
22
- * The plane names every deployment has: the root, plus the plane every project
23
- * starts with beside it. This is the well-known set, not the permitted set —
24
- * {@link environmentSchema} decides what is valid.
25
- */
26
- export const ENVIRONMENTS = ['production', 'sandbox'];
27
- /** The root plane — the one every other plane is defined relative to. */
28
- export const ROOT_ENVIRONMENT = 'production';
29
- /**
30
- * The modes a credential can be minted in. Deliberately its own list rather
31
- * than a view of {@link ENVIRONMENTS}: this one is fixed by the key format,
32
- * which has exactly two prefix spellings, and must not grow when planes do.
33
- */
34
- export const KEY_ENVIRONMENTS = ['production', 'sandbox'];
35
- /**
36
- * How a credential's mode is spelled inside an API-key prefix: a `live` key
37
- * acts on production and a `test` key acts on the sandbox. Convert between this
38
- * spelling and {@link KeyEnvironment} with {@link environmentFromKeyPrefix} and
39
- * {@link environmentToKeyPrefix}.
40
- */
41
- export const KEY_PREFIX_ENVIRONMENTS = ['live', 'test'];
42
- /**
43
- * Validates a value as a plane name — a lowercase slug that may not lead or
44
- * trail with a hyphen.
45
- *
46
- * The character set is load-bearing rather than cosmetic. A plane name is
47
- * interpolated into two delimited identifiers: the sync-group prefix
48
- * (`sandbox:<org>:<slug>`, colon separated) and the tenant secret scope
49
- * (`<org>/<env>/<project>/<sandbox>`, slash separated). Admitting `:` or `/`
50
- * would let one plane's name parse as two segments and so collide with a
51
- * different plane's identity, which is why the pattern excludes every delimiter
52
- * either format relies on.
53
- */
54
- export const environmentSchema = z
55
- .string()
56
- .regex(/^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$/, 'must be a lowercase slug');
57
- /** Validates a value as one of the {@link KEY_ENVIRONMENTS}. */
58
- export const keyEnvironmentSchema = z.enum(KEY_ENVIRONMENTS);
59
- /**
60
- * Coerces an untrusted value into a valid {@link Environment}, returning
61
- * `fallback` (which defaults to the root plane) when the value is not a
62
- * well-formed plane name. Use it when reading a plane from configuration or off
63
- * the wire.
64
- */
65
- export function normalizeEnvironment(value, fallback = ROOT_ENVIRONMENT) {
66
- const parsed = environmentSchema.safeParse(value);
67
- return parsed.success ? parsed.data : fallback;
68
- }
69
- /** True when the given plane is the root plane. */
70
- export function isRootEnvironment(value) {
71
- return value === ROOT_ENVIRONMENT;
72
- }
73
- /**
74
- * The mode a credential acting on the given plane must be minted in.
75
- *
76
- * This is the ONE narrowing from the open plane axis to the binary credential
77
- * axis, and it is deliberately asymmetric: only the root plane yields a
78
- * production-mode key, and every other plane — named, numbered, or newly forked
79
- * — yields a sandbox-mode one. A plane cannot acquire live authority by being
80
- * spelled a particular way, which is the property that keeps adding planes from
81
- * widening what any credential is allowed to touch.
82
- */
83
- export function keyEnvironmentForPlane(value) {
84
- return isRootEnvironment(value) ? 'production' : 'sandbox';
85
- }
86
- /**
87
- * Maps an API-key prefix spelling to the mode it denotes: a `'test'` key was
88
- * minted in the sandbox, and anything else in production.
89
- */
90
- export function environmentFromKeyPrefix(value) {
91
- return value === 'test' ? 'sandbox' : 'production';
92
- }
93
- /**
94
- * Maps a credential's mode to the spelling used in its key prefix.
95
- *
96
- * Takes a {@link KeyEnvironment} rather than an {@link Environment} on purpose.
97
- * Planes outside the well-known two have no prefix spelling, and a signature
98
- * that accepted one would silently answer `'live'` for them — minting a
99
- * production-mode credential for a plane that is not production. That is the
100
- * 2026-06-10 incident with a new cause, so the type refuses the input instead.
101
- */
102
- export function environmentToKeyPrefix(value) {
103
- return value === 'sandbox' ? 'test' : 'live';
104
- }
105
- /** Returns true when the given environment is the sandbox. */
106
- export function isSandboxEnvironment(value) {
107
- return value === 'sandbox';
108
- }