@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,10 +0,0 @@
1
- /**
2
- * Identity shared by the durable write records.
3
- *
4
- * A retry must reuse the same non-empty key so the server can recognize the
5
- * same logical write. This is a persistence invariant, not a second commit
6
- * protocol.
7
- */
8
- import { z } from 'zod';
9
- export declare const idempotencyKeySchema: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
10
- export type IdempotencyKey = z.output<typeof idempotencyKeySchema>;
@@ -1,9 +0,0 @@
1
- /**
2
- * Identity shared by the durable write records.
3
- *
4
- * A retry must reuse the same non-empty key so the server can recognize the
5
- * same logical write. This is a persistence invariant, not a second commit
6
- * protocol.
7
- */
8
- import { z } from 'zod';
9
- export const idempotencyKeySchema = z.string().min(1).max(255).brand();
@@ -1,112 +0,0 @@
1
- /**
2
- * The persisted shape of a write awaiting a definitive outcome.
3
- *
4
- * Owns one authoritative union over the two durable commit envelopes — the
5
- * WebSocket envelope and its HTTP counterpart — so an injected store and the
6
- * engine that reads back from it agree on exactly one set of records. The
7
- * envelope schemas in this directory remain authoritative for their own fields;
8
- * this module only unions them.
9
- *
10
- * The port that persists these records is a behavior contract, not a persisted
11
- * shape, so it lives outside this directory in `src/durableWrites.ts`.
12
- */
13
- import { z } from 'zod';
14
- /** Every write shape that Ablo may ask an injected store to persist. */
15
- export declare const pendingWriteSchema: z.ZodUnion<readonly [z.ZodObject<{
16
- id: z.ZodString;
17
- type: z.ZodLiteral<"commit_envelope">;
18
- storageVersion: z.ZodLiteral<1>;
19
- origin: z.ZodEnum<{
20
- model_batch: "model_batch";
21
- atomic_commit: "atomic_commit";
22
- }>;
23
- idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
24
- operations: z.ZodArray<z.ZodObject<{
25
- type: z.ZodEnum<{
26
- CREATE: "CREATE";
27
- UPDATE: "UPDATE";
28
- DELETE: "DELETE";
29
- ARCHIVE: "ARCHIVE";
30
- UNARCHIVE: "UNARCHIVE";
31
- }>;
32
- readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
33
- onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
34
- reject: "reject";
35
- overwrite: "overwrite";
36
- notify: "notify";
37
- }>>>;
38
- fenceToken: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
39
- model: z.ZodString;
40
- id: z.ZodString;
41
- input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
42
- transactionId: z.ZodOptional<z.ZodString>;
43
- options: z.ZodOptional<z.ZodObject<{
44
- idempotencyKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
45
- label: z.ZodOptional<z.ZodString>;
46
- }, z.core.$strict>>;
47
- }, z.core.$strip>>;
48
- sourceMutationIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
49
- commitOptions: z.ZodDefault<z.ZodObject<{
50
- reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
51
- model: z.ZodString;
52
- id: z.ZodString;
53
- readAt: z.ZodNumber;
54
- fields: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
55
- onStale: z.ZodOptional<z.ZodEnum<{
56
- reject: "reject";
57
- overwrite: "overwrite";
58
- notify: "notify";
59
- }>>;
60
- }, z.core.$strip>, z.ZodObject<{
61
- group: z.ZodString;
62
- readAt: z.ZodNumber;
63
- onStale: z.ZodOptional<z.ZodEnum<{
64
- reject: "reject";
65
- overwrite: "overwrite";
66
- notify: "notify";
67
- }>>;
68
- }, z.core.$strip>]>>>>;
69
- track: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
70
- id: z.ZodString;
71
- model: z.ZodString;
72
- readAt: z.ZodOptional<z.ZodNumber>;
73
- }, z.core.$strip>, z.ZodObject<{
74
- group: z.ZodString;
75
- readAt: z.ZodOptional<z.ZodNumber>;
76
- }, z.core.$strip>]>>>>;
77
- }, z.core.$strict>>;
78
- scope: z.ZodOptional<z.ZodObject<{
79
- organizationId: z.ZodString;
80
- participantId: z.ZodString;
81
- namespace: z.ZodString;
82
- }, z.core.$strict>>;
83
- createdAt: z.ZodNumber;
84
- sealedAt: z.ZodNumber;
85
- acceptedAt: z.ZodOptional<z.ZodNumber>;
86
- correlationId: z.ZodOptional<z.ZodString>;
87
- sequence: z.ZodOptional<z.ZodNumber>;
88
- timestamp: z.ZodNumber;
89
- }, z.core.$strict>, z.ZodObject<{
90
- id: z.ZodString;
91
- type: z.ZodLiteral<"http_commit_envelope">;
92
- storageVersion: z.ZodLiteral<1>;
93
- idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
94
- protocolVersion: z.ZodDefault<z.ZodNumber>;
95
- request: z.ZodObject<{
96
- method: z.ZodEnum<{
97
- DELETE: "DELETE";
98
- POST: "POST";
99
- PATCH: "PATCH";
100
- }>;
101
- path: z.ZodString;
102
- body: z.ZodString;
103
- }, z.core.$strict>;
104
- scopeNamespace: z.ZodString;
105
- createdAt: z.ZodNumber;
106
- sealedAt: z.ZodNumber;
107
- acceptedAt: z.ZodOptional<z.ZodNumber>;
108
- correlationId: z.ZodOptional<z.ZodString>;
109
- sequence: z.ZodOptional<z.ZodNumber>;
110
- timestamp: z.ZodNumber;
111
- }, z.core.$strict>]>;
112
- export type PendingWrite = z.infer<typeof pendingWriteSchema>;
@@ -1,20 +0,0 @@
1
- /**
2
- * The persisted shape of a write awaiting a definitive outcome.
3
- *
4
- * Owns one authoritative union over the two durable commit envelopes — the
5
- * WebSocket envelope and its HTTP counterpart — so an injected store and the
6
- * engine that reads back from it agree on exactly one set of records. The
7
- * envelope schemas in this directory remain authoritative for their own fields;
8
- * this module only unions them.
9
- *
10
- * The port that persists these records is a behavior contract, not a persisted
11
- * shape, so it lives outside this directory in `src/durableWrites.ts`.
12
- */
13
- import { z } from 'zod';
14
- import { durableCommitEnvelopeSchema } from './commitEnvelope.js';
15
- import { durableHttpCommitEnvelopeSchema } from './httpCommitEnvelope.js';
16
- /** Every write shape that Ablo may ask an injected store to persist. */
17
- export const pendingWriteSchema = z.union([
18
- durableCommitEnvelopeSchema,
19
- durableHttpCommitEnvelopeSchema,
20
- ]);
@@ -1,90 +0,0 @@
1
- /**
2
- * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
- * provides the single place claim events are traced. These are stateless
4
- * helpers that hold no socket state, so both the transport and its frame
5
- * dispatch can share them.
6
- */
7
- import type { CommitMessage } from '../wire/index.js';
8
- import type { CommitAck as CanonicalCommitAck } from '../wire/commit.js';
9
- import type { OnStaleMode, StaleNotification, ReadDependency, TrackDependency } from '../coordination/schema.js';
10
- import type { ClaimAcquired, ClaimGranted, ClaimQueued, ClaimLost, ClaimRejection, ClaimExpired } from '../coordination/schema.js';
11
- import type { Logger } from '../logger.js';
12
- import type { SocketObservability } from '../observability.js';
13
- /**
14
- * The value a commit acknowledgement resolves to. `notifications` is present
15
- * only when a guarded write (`onStale: 'notify'`) met a concurrent change; it
16
- * carries the advisory signal that lets the writer self-heal, and the same
17
- * signal also arrives on the `conflict:notified` event.
18
- */
19
- export type CommitAck = CanonicalCommitAck;
20
- /**
21
- * The slice of a queued client mutation the commit frame reads — a structural
22
- * port, so the reactive engine's fatter `MutationOperation` satisfies it
23
- * without this module importing the consumer package.
24
- */
25
- export interface CommitFrameOperation {
26
- readonly type: string;
27
- readonly model: string;
28
- readonly id: string;
29
- readonly input?: Record<string, unknown>;
30
- readonly transactionId?: string;
31
- readonly readAt?: number | null;
32
- readonly onStale?: OnStaleMode | null;
33
- readonly fenceToken?: number | null;
34
- }
35
- /**
36
- * Converts the client's list of {@link CommitFrameOperation} values into the wire
37
- * {@link CommitMessage} the server accepts. This is the one place the loosely
38
- * typed operation — its `type` is a string, and it carries client-only
39
- * `options` the server never reads — becomes the strict wire contract. Mapping
40
- * each field by hand means a change to {@link WireCommitOperation} fails to compile
41
- * here; the single `as` cast narrows the validated `type` to the wire union and
42
- * is the only place that loosening happens.
43
- */
44
- export declare function buildCommitFrame(operations: readonly CommitFrameOperation[], clientTxId: string, reads?: readonly ReadDependency[] | null, track?: readonly TrackDependency[] | null): CommitMessage;
45
- /**
46
- * Defensively validate the optional `notifications` array off a commit ack.
47
- * Untrusted wire data — a malformed entry is dropped rather than throwing,
48
- * so a bad notification never sinks an otherwise-successful commit.
49
- */
50
- export declare function parseNotifications(raw: unknown): StaleNotification[] | undefined;
51
- /** The reporting ports a claim trace writes through — supplied by the caller
52
- * (the frame dispatch passes its session's own ports). */
53
- export interface ClaimTracePorts {
54
- readonly logger: Logger;
55
- readonly observability: SocketObservability;
56
- }
57
- /**
58
- * Which frame reports each phase of a claim's life.
59
- *
60
- * The correspondence is real and was previously implicit: six dispatch handlers
61
- * each passed their own payload alongside a phase they picked by hand, and
62
- * nothing checked that the two matched. Stating it once means a caller cannot
63
- * label a rejection as an acquisition.
64
- *
65
- * Every value is the `z.infer` of the schema the dispatcher parsed with, so no
66
- * field is restated here — this maps existing types, it does not describe them.
67
- */
68
- interface ClaimFrameByPhase {
69
- acquired: ClaimAcquired;
70
- granted: ClaimGranted;
71
- queued: ClaimQueued;
72
- lost: ClaimLost;
73
- rejected: ClaimRejection;
74
- expired: ClaimExpired;
75
- }
76
- /**
77
- * The single place claim events are traced. Every `claim_*` frame passes
78
- * through here, so a developer debugging a collision gets one consistent record
79
- * — a console line and a structured capture — without each frame case
80
- * re-deriving the row and holder shape.
81
- *
82
- * The payload arrives already validated against its frame's schema, so this
83
- * reads it as the shape it is rather than re-narrowing an untyped record. That
84
- * distinction is not cosmetic: while this took `Record<string, unknown>` it
85
- * read `actor`, `participantKind`, and `description` off frames that carry none
86
- * of them, and every one of those reads silently produced `undefined` because a
87
- * string key never has to exist.
88
- */
89
- export declare function recordClaim<P extends keyof ClaimFrameByPhase>(ports: ClaimTracePorts, phase: P, payload: ClaimFrameByPhase[P]): void;
90
- export {};
@@ -1,134 +0,0 @@
1
- /**
2
- * Builds the outgoing frames the sync WebSocket sends on the commit path, and
3
- * provides the single place claim events are traced. These are stateless
4
- * helpers that hold no socket state, so both the transport and its frame
5
- * dispatch can share them.
6
- */
7
- import { claimEventReasonSchema, staleNotificationSchema, } from '../coordination/schema.js';
8
- import { formatClaim } from '../coordination/trace.js';
9
- import { modelTarget } from '../coordination/locator.js';
10
- /**
11
- * Converts the client's list of {@link CommitFrameOperation} values into the wire
12
- * {@link CommitMessage} the server accepts. This is the one place the loosely
13
- * typed operation — its `type` is a string, and it carries client-only
14
- * `options` the server never reads — becomes the strict wire contract. Mapping
15
- * each field by hand means a change to {@link WireCommitOperation} fails to compile
16
- * here; the single `as` cast narrows the validated `type` to the wire union and
17
- * is the only place that loosening happens.
18
- */
19
- export function buildCommitFrame(operations, clientTxId, reads, track) {
20
- const payload = {
21
- operations: operations.map((op) => ({
22
- type: op.type,
23
- model: op.model,
24
- id: op.id,
25
- input: op.input,
26
- transactionId: op.transactionId,
27
- readAt: op.readAt,
28
- onStale: op.onStale,
29
- fenceToken: op.fenceToken,
30
- })),
31
- clientTxId,
32
- };
33
- // The batch premise: the rows or groups the writer read before committing.
34
- if (reads && reads.length > 0)
35
- payload.reads = [...reads];
36
- // Durable premises the writer is registering: the rows or groups it
37
- // wants to keep hearing about after this commit, delivered on a future receipt.
38
- if (track && track.length > 0)
39
- payload.track = [...track];
40
- return { type: 'commit', payload };
41
- }
42
- /**
43
- * Defensively validate the optional `notifications` array off a commit ack.
44
- * Untrusted wire data — a malformed entry is dropped rather than throwing,
45
- * so a bad notification never sinks an otherwise-successful commit.
46
- */
47
- export function parseNotifications(raw) {
48
- if (!Array.isArray(raw) || raw.length === 0)
49
- return undefined;
50
- const out = [];
51
- for (const entry of raw) {
52
- const parsed = staleNotificationSchema.safeParse(entry);
53
- if (parsed.success)
54
- out.push(parsed.data);
55
- }
56
- return out.length > 0 ? out : undefined;
57
- }
58
- // The phases this map covers and the phases a ClaimEvent can report are the
59
- // same set. Adding one to either without the other stops compiling here.
60
- const _phaseCoverage = true;
61
- void _phaseCoverage;
62
- /**
63
- * The single place claim events are traced. Every `claim_*` frame passes
64
- * through here, so a developer debugging a collision gets one consistent record
65
- * — a console line and a structured capture — without each frame case
66
- * re-deriving the row and holder shape.
67
- *
68
- * The payload arrives already validated against its frame's schema, so this
69
- * reads it as the shape it is rather than re-narrowing an untyped record. That
70
- * distinction is not cosmetic: while this took `Record<string, unknown>` it
71
- * read `actor`, `participantKind`, and `description` off frames that carry none
72
- * of them, and every one of those reads silently produced `undefined` because a
73
- * string key never has to exist.
74
- */
75
- export function recordClaim(ports, phase, payload) {
76
- // Widened so the members can be told apart with `in`. The parameter above
77
- // stays correlated to `phase`, which is what the widening cannot undo.
78
- const frame = payload;
79
- const target = 'target' in frame ? frame.target : undefined;
80
- // The holder rides on the rejection and queued frames, with a summary of
81
- // their claim beside it. Collecting it is the whole of "name the
82
- // counterparty" — the wire has carried it all along and this projection used
83
- // to flatten it into one string alongside the cause.
84
- const counterparty = {
85
- ...('heldBy' in frame && frame.heldBy !== undefined
86
- ? { actor: frame.heldBy }
87
- : {}),
88
- ...('heldByKind' in frame && frame.heldByKind !== undefined
89
- ? { participantKind: frame.heldByKind }
90
- : {}),
91
- ...('heldByClaimId' in frame && frame.heldByClaimId !== undefined
92
- ? { claimId: frame.heldByClaimId }
93
- : {}),
94
- ...('heldByExpiresAt' in frame && frame.heldByExpiresAt !== undefined
95
- ? { expiresAt: frame.heldByExpiresAt }
96
- : {}),
97
- ...('heldByClaim' in frame && frame.heldByClaim?.description !== undefined
98
- ? { description: frame.heldByClaim.description }
99
- : {}),
100
- };
101
- // `reason` is a plain string on the wire, which is frozen, so an older server
102
- // may send a word the closed set does not list. One that parses becomes the
103
- // typed reason; one that does not is absent rather than passed off as prose.
104
- const parsedReason = 'reason' in frame ? claimEventReasonSchema.safeParse(frame.reason) : undefined;
105
- const event = {
106
- phase,
107
- claimId: frame.claimId,
108
- ...(target ? modelTarget(target) : {}),
109
- ...(target?.field !== undefined ? { field: target.field } : {}),
110
- // No claim frame names an actor of its own; the only participant one
111
- // carries is the holder that blocked it.
112
- ...('heldBy' in frame && frame.heldBy !== undefined
113
- ? { actor: frame.heldBy }
114
- : {}),
115
- ...('position' in frame ? { position: frame.position } : {}),
116
- ...(parsedReason?.success ? { reason: parsedReason.data } : {}),
117
- ...('policyReason' in frame && frame.policyReason !== undefined
118
- ? { policyReason: frame.policyReason }
119
- : {}),
120
- ...(Object.keys(counterparty).length > 0 ? { heldBy: counterparty } : {}),
121
- };
122
- const message = formatClaim(event);
123
- // A rejection or lost lease is the collision a developer is actively
124
- // debugging → warn (shows at the default log level). The routine events
125
- // (acquired/queued/granted/expired) are debug-only so they never drown the
126
- // console until you opt in with `new Ablo({ debug: true })`.
127
- const isCollision = phase === 'rejected' || phase === 'lost';
128
- if (isCollision)
129
- ports.logger.warn(message);
130
- else
131
- ports.logger.debug(message);
132
- ports.observability.breadcrumb(message, 'sync.coordination', isCollision ? 'warning' : 'info');
133
- ports.observability.captureClaim(event);
134
- }
@@ -1,215 +0,0 @@
1
- /**
2
- * Owns the sync engine's connection lifecycle: the state machine that carries a
3
- * client from a healthy connection, through a dropout, and back to live. It
4
- * watches the browser's online/offline and visibility events, probes real
5
- * connectivity and session validity with {@link probeNetwork}, applies retry
6
- * backoff with a ceiling and jitter, and runs a watchdog for the cases where
7
- * the browser never fires an event (VPN flips, captive portals). When it
8
- * decides to recover, it drives the reconnect sequence — bootstrap, then
9
- * WebSocket connect — through the {@link ConnectionCallbacks.onReconnect}
10
- * callback and reacts to the outcome.
11
- *
12
- * It deliberately does not perform the bootstrap, local-storage, or object-pool
13
- * work itself; that lives in the embedding store, which the manager reaches
14
- * only through its callbacks. One manager is created per store, started on the
15
- * first successful connect and disposed on teardown.
16
- *
17
- * This is a plain state machine, not a reactive object: it lives in the
18
- * settlement core, which carries no reactivity runtime (ADR 0016). A consumer
19
- * that wants to render recovery progress mirrors the transitions through
20
- * {@link ConnectionCallbacks.onStateChange} into its own observable state —
21
- * which is what the reactive engine's store does.
22
- *
23
- * CONNECTED ──(socket drop)──► PROBING_NETWORK ──► RECONNECTING ──► CONNECTED
24
- * │ │ │
25
- * (network lost) ▼ ▼
26
- * ▼ SESSION_EXPIRED BACKOFF ──► PROBING_NETWORK
27
- * OFFLINE ──(online)──► PROBING_NETWORK
28
- * │
29
- * ▼
30
- * WAITING_FOR_NETWORK
31
- *
32
- * Three behaviors are worth calling out. A network return or tab focus during a
33
- * backoff delay jumps straight to probing instead of waiting out the full
34
- * interval. Reaching the retry ceiling while the browser reports offline parks
35
- * in `waiting_for_network` rather than hard-reloading a browser that has no
36
- * network. And a socket drop (close code 1006) goes straight to probing rather
37
- * than the passive `offline` state — 1006 is generated locally and carries no
38
- * connectivity signal, so on a healthy machine no online/offline event ever
39
- * fires; only a genuine operating-system network loss parks in `offline` to
40
- * wait for the `online` event.
41
- */
42
- import { type ProbeResult } from './networkProbe.js';
43
- import type { AuthTokenGetter } from '../auth/credentialSource.js';
44
- import type { CredentialRefreshOutcome } from './credentialLifecycle.js';
45
- import { type Logger } from '../logger.js';
46
- import { type TransportObservability } from '../observability.js';
47
- export type ConnectionState = 'connected' | 'offline' | 'probing_network' | 'validating_session' | 'refreshing_credential' | 'reconnecting' | 'backoff' | 'waiting_for_network' | 'auth_blocked' | 'session_expired';
48
- export type ConnectionEvent = {
49
- type: 'NETWORK_LOST';
50
- } | {
51
- type: 'NETWORK_ONLINE';
52
- } | {
53
- type: 'TAB_VISIBLE';
54
- } | {
55
- type: 'WS_CONNECTED';
56
- } | {
57
- type: 'WS_DISCONNECTED';
58
- } | {
59
- type: 'WS_SESSION_ERROR';
60
- } | {
61
- type: 'WS_HANDSHAKE_FAILED';
62
- } | {
63
- type: 'PROBE_SUCCESS';
64
- sessionValid: boolean;
65
- } | {
66
- type: 'PROBE_AUTH_BLOCKED';
67
- }
68
- /** The probe saw an expired ephemeral access key (`access_credential_expiry`).
69
- * Recoverable: re-mint a fresh `ek_`/`rk_` and re-probe — never a sign-out. */
70
- | {
71
- type: 'PROBE_CREDENTIAL_STALE';
72
- } | {
73
- type: 'PROBE_FAILED';
74
- }
75
- /** A fresh access credential is available (the re-mint succeeded, or one was
76
- * pushed in via `setAuthToken`). Re-probe so a parked connection picks it up. */
77
- | {
78
- type: 'CREDENTIAL_REFRESHED';
79
- } | {
80
- type: 'RECONNECT_SUCCESS';
81
- } | {
82
- type: 'RECONNECT_FAILED';
83
- } | {
84
- type: 'BACKOFF_ELAPSED';
85
- } | {
86
- type: 'BOOTSTRAP_FAILED_SESSION';
87
- } | {
88
- type: 'MANUAL_RETRY';
89
- };
90
- export interface ConnectionCallbacks {
91
- /** Run bootstrap + WebSocket reconnect. Returns the outcome. */
92
- onReconnect: () => Promise<'success' | 'session_error' | 'network_error'>;
93
- /**
94
- * Re-mints the short-lived access credential (the `ek_`/`rk_`) and pushes it
95
- * into the credential source, then reports the outcome. Invoked in the
96
- * `refreshing_credential` state — that is, when a probe found the access key
97
- * stale (`PROBE_CREDENTIAL_STALE`). The three outcomes map onto recovery:
98
- * - `'refreshed'` → a fresh credential is in place; re-probe and reconnect.
99
- * - `'session_error'` → the long-lived login itself is gone (the mint
100
- * returned null, a 401/403); terminal, so sign out.
101
- * - `'network_error'` → the mint endpoint was unreachable (offline, 5xx, or
102
- * a throw); transient, so back off and retry rather
103
- * than sign out.
104
- * Optional: a deployment with no re-mint path (for example a static `apiKey`)
105
- * omits it, and the state machine falls back to a plain re-probe.
106
- */
107
- onRefreshCredential?: () => Promise<CredentialRefreshOutcome>;
108
- /** Called when the session is confirmed expired — route to signin. */
109
- onSessionExpired: () => void;
110
- /** Called to tear down the WebSocket when entering a dead state. */
111
- onDisconnectWebSocket: () => void;
112
- /**
113
- * Fires on every state transition. It lets the embedding store mirror
114
- * recovery progress into its visible `syncStatus`, so the UI can show
115
- * "Reconnecting…" instead of a sticky "offline" while the machine cycles
116
- * through `probing_network` → `reconnecting` → `backoff`. Optional; when
117
- * omitted, the state machine is simply opaque to the UI.
118
- */
119
- onStateChange?: (next: ConnectionState, prev: ConnectionState) => void;
120
- }
121
- export interface ConnectionManagerOptions {
122
- /**
123
- * Sync-server base URL used for probes. Falls back to the env-based
124
- * default of `probeNetwork`.
125
- */
126
- baseUrl?: string;
127
- /**
128
- * Current bearer credential for authenticated probes. Read lazily so token
129
- * refreshes pushed through `Ablo.setAuthToken()` are used by the next probe
130
- * without recreating the manager.
131
- */
132
- getAuthToken?: AuthTokenGetter;
133
- /** Override retry ceilings / jitter. Production should leave defaults. */
134
- backoff?: Partial<typeof DEFAULT_BACKOFF>;
135
- /** Where transitions are logged. Defaults to silent. */
136
- logger?: Logger;
137
- /** Where dead-end states are reported. Defaults to silent. */
138
- observability?: TransportObservability;
139
- }
140
- declare const DEFAULT_BACKOFF: {
141
- readonly BASE_MS: 2000;
142
- readonly MAX_MS: 30000;
143
- readonly MAX_ATTEMPTS: 8;
144
- readonly JITTER: 0.15;
145
- };
146
- export declare class ConnectionManager {
147
- state: ConnectionState;
148
- offlineSince: Date | null;
149
- attempt: number;
150
- lastProbeResult: ProbeResult | null;
151
- private callbacks;
152
- private backoffTimer;
153
- private debounceTimer;
154
- private watchdogTimer;
155
- private stuckCycles;
156
- /** Consecutive access-key re-mints in the current recovery cycle; reset on
157
- * reaching `connected`. See {@link MAX_CREDENTIAL_REFRESH_ATTEMPTS}. */
158
- private credentialRefreshAttempts;
159
- private disposed;
160
- private readonly baseUrl?;
161
- private readonly getAuthToken?;
162
- private readonly backoff;
163
- private readonly logger;
164
- private readonly observability;
165
- private handleBrowserOnline;
166
- private handleBrowserOffline;
167
- private handleVisibilityChange;
168
- constructor(options?: ConnectionManagerOptions);
169
- start(callbacks: ConnectionCallbacks): void;
170
- dispose(): void;
171
- send(event: ConnectionEvent): void;
172
- private transition;
173
- private onEnterState;
174
- /**
175
- * FSM effects are fire-and-forget by design (`onEnterState` is sync). Each
176
- * effect catches its own operational failures and maps them onto an FSM
177
- * event, so a rejection here means the machine wedged mid-transition
178
- * (`send()` or a transition listener threw) with no retry timer armed past
179
- * it — capture it instead of losing the reconnect loop silently.
180
- */
181
- private captureEffectFailure;
182
- private runProbe;
183
- /**
184
- * Re-mint the short-lived access key on `refreshing_credential`. Delegates to
185
- * the `onRefreshCredential` callback (which mints a fresh `ek_`/`rk_` from the
186
- * still-valid login and pushes it into the credential source) and maps its
187
- * tri-state outcome onto the FSM:
188
- * - `refreshed` → `CREDENTIAL_REFRESHED` → re-probe & reconnect.
189
- * - `session_error` → `BOOTSTRAP_FAILED_SESSION` → sign out (login is gone).
190
- * - `network_error` → `RECONNECT_FAILED` → back off & retry (never sign out).
191
- *
192
- * A bounded attempt counter guards against a hot loop where the server keeps
193
- * reporting the key stale even after a "successful" re-mint (e.g. a clock skew
194
- * or a mint that returns an already-rejected key): after
195
- * `MAX_CREDENTIAL_REFRESH_ATTEMPTS` we fall through to `auth_blocked` (stop,
196
- * no sign-out) rather than spin. The counter resets once we reach `connected`.
197
- *
198
- * When no refresher is wired (e.g. a static `apiKey` deployment), we re-probe
199
- * directly — the credential source's own scheduler owns refresh there.
200
- */
201
- private runRefreshCredential;
202
- private runReconnect;
203
- private scheduleBackoff;
204
- private setupBrowserListeners;
205
- private removeBrowserListeners;
206
- private startWatchdog;
207
- get isConnected(): boolean;
208
- get isOffline(): boolean;
209
- get isReconnecting(): boolean;
210
- get isSessionExpired(): boolean;
211
- get offlineDuration(): string | null;
212
- private clearBackoffTimer;
213
- private clearDebounceTimer;
214
- }
215
- export {};