@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,26 +0,0 @@
1
- /**
2
- * Narrow persistence port for crash-durable commit envelopes.
3
- *
4
- * Browser clients use {@link DatabaseCommitOutboxStore}. Agent/Node hosts can
5
- * inject a workflow-, SQLite-, or filesystem-backed implementation without
6
- * coupling MutationQueue to the browser database/cache implementation.
7
- */
8
- /** Strict IndexedDB adapter backed by Database's `__transactions` store. */
9
- export class DatabaseCommitOutboxStore {
10
- database;
11
- constructor(database) {
12
- this.database = database;
13
- }
14
- async seal(envelope, consumedRecordIds) {
15
- // This adapter deliberately has no duck-typed fallback. Reporting a
16
- // successful seal after a no-op or a non-atomic save/delete handoff would
17
- // authorize network dispatch without the durability this port promises.
18
- await this.database.sealTransactionRecord(envelope, consumedRecordIds);
19
- }
20
- async list() {
21
- return this.database.getPersistedTransactions();
22
- }
23
- async remove(envelopeRecordId) {
24
- await this.database.removeTransaction(envelopeRecordId);
25
- }
26
- }
@@ -1,165 +0,0 @@
1
- /**
2
- * The vocabulary a local transaction uses on the wire. This module defines the
3
- * {@link QueuedMutation} record and the helpers that turn a transaction into a
4
- * wire-safe commit operation: schema-field projection
5
- * ({@link projectCommitPayload}), write-option projection
6
- * ({@link applyWriteOptions}), foreign-key-aware priority scoring
7
- * ({@link computePriorityScore}), and the structural checks used to classify
8
- * transport errors. Nothing here holds queue state or timers, so the batched
9
- * queue path and the HTTP commit path share the same projection.
10
- */
11
- import type { RuntimeContext } from '../../RuntimeContext.js';
12
- import { MutationOperationType } from '../../transaction/types/index.js';
13
- import type { OnStaleMode } from '../../transaction/coordination/schema.js';
14
- import type { MutationOptions, WriteOptions } from '../../interfaces/index.js';
15
- import type { CommitEnvelopeMember } from '../../transaction/transactions/settlement/commitEnvelope.js';
16
- export interface UserContext {
17
- userId: string;
18
- organizationId: string;
19
- role?: string;
20
- teamIds?: string[];
21
- }
22
- /** Wire-format mutation payload (post-projection). */
23
- export type MutationInput = Record<string, unknown>;
24
- /**
25
- * Projects a model's serialized data onto the fields declared in its schema and
26
- * returns a wire-safe commit payload. It does two things:
27
- *
28
- * 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
29
- * `syncStatus`) and anything not declared on the model's schema.
30
- * 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
31
- * fields stay objects rather than pre-serialized strings, while reactive
32
- * proxies cannot leak into persistence or the wire payload.
33
- *
34
- * For updates (`dropUndefined: true`), `undefined` values are also removed so
35
- * they are not written as `SET column = NULL` on the server.
36
- *
37
- * Field metadata comes from the model registry, populated when the schema is
38
- * registered at initialization. If a model has no registered field metadata —
39
- * for example a manually registered model — projection snapshots all serialized
40
- * data apart from the framework keys.
41
- */
42
- export declare function projectCommitPayload(modelName: string, source: Record<string, unknown>, opts: {
43
- dropUndefined: boolean;
44
- }, runtime?: RuntimeContext): MutationInput;
45
- export interface QueuedMutation {
46
- id: string;
47
- type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
48
- modelName: string;
49
- modelId: string;
50
- modelKey: string;
51
- data?: MutationInput;
52
- previousData?: MutationInput | null;
53
- context: UserContext;
54
- status: 'pending' | 'executing' | 'awaiting_delta' | 'completed' | 'failed' | 'rolled_back';
55
- createdAt: number;
56
- attempts: number;
57
- priority: 'normal' | 'high';
58
- priorityScore: number;
59
- writeOptions?: WriteOptions;
60
- batchId?: string;
61
- /**
62
- * Stable identity of the wire commit that currently owns this operation.
63
- *
64
- * A transport failure is ambiguous: the server may have committed the
65
- * batch even though the acknowledgement never reached this client. Keeping
66
- * this envelope on every member lets the queue replay the exact same ordered
67
- * batch with the exact same idempotency key instead of accidentally
68
- * re-batching its operations under a fresh key.
69
- */
70
- commitEnvelope?: CommitEnvelopeMember;
71
- /** Pending-mutation journal entries atomically consumed by this envelope. */
72
- sourceMutationIds?: string[];
73
- /** Completed locally without a server operation; no sync echo will arrive. */
74
- localOnly?: boolean;
75
- /** Sync-id threshold: the transaction confirms once a delta with an id at least this value arrives. */
76
- syncIdNeededForCompletion?: number;
77
- /**
78
- * Opaque customer-side batch identity returned with a queued source receipt.
79
- * It is retained durably and is the only identity a live WAL delta may use
80
- * to settle this pending commit. Server-side replay additionally proves the
81
- * complete stored operation-id set before returning `confirmed`.
82
- */
83
- correlationId?: string;
84
- /**
85
- * A queued forward has no authoritative sync-id watermark yet. It may only
86
- * confirm when a WAL delta carries its opaque server-derived correlation;
87
- * unrelated deltas must never satisfy it by advancing the global watermark.
88
- */
89
- requiresCorrelatedDelta?: boolean;
90
- /**
91
- * Resolves once the server has confirmed this transaction, whether by a delta
92
- * or an HTTP acknowledgement. It rejects with the originating error if the
93
- * transaction is permanently rolled back; for a source-forwarded write it
94
- * also rejects with `replication_lag_timeout` when the accepted write's WAL
95
- * echo misses the confirmation deadline. That timeout does not roll back or
96
- * fail the transaction: it remains pending and may confirm when replication
97
- * recovers. This gives a caller one place to await the answer to "did my write
98
- * land?", matching the
99
- * `commits.create({ wait: 'confirmed' })` and
100
- * {@link MutationQueue.waitForConfirmation} vocabulary, so a failure
101
- * surfaces at the call site instead of only as a silent local rollback. The
102
- * permanent-rejection value is the same {@link AbloError} carried on the
103
- * queue's `transaction:failed` event.
104
- */
105
- confirmation?: Promise<void>;
106
- }
107
- export declare const normalizeModelKey: (modelName: string) => string;
108
- export declare const stripModelSuffix: (modelName: string) => string;
109
- /**
110
- * Returns the priority score used to order create operations by foreign-key
111
- * depth, so a parent row commits before its children.
112
- *
113
- * The score comes from a priority map on the runtime configuration, built once
114
- * at initialization by walking the schema's `belongsTo` graph. No model names
115
- * are hard-coded here, and an application can override specific priorities
116
- * through `configOverrides.modelCreatePriority`.
117
- *
118
- * Non-create operations (update, delete, archive, unarchive) need no
119
- * foreign-key ordering because the row already exists, so they all share the
120
- * configured default non-create priority.
121
- */
122
- export declare const computePriorityScore: (type: QueuedMutation["type"], modelName: string, runtime?: RuntimeContext) => number;
123
- export declare const TX_TYPE_TO_MUTATION_OP: Record<QueuedMutation['type'], MutationOperationType>;
124
- export declare function hasStaleWriteOptions(options?: WriteOptions): boolean;
125
- /** Options whose identity/audit semantics forbid merging two caller writes. */
126
- export declare function hasCommitCoalescingBarrier(options?: WriteOptions): boolean;
127
- export interface WriteOperationFields {
128
- readAt?: number | null;
129
- onStale?: OnStaleMode | null;
130
- fenceToken?: number | null;
131
- options?: Pick<MutationOptions, 'idempotencyKey' | 'label'>;
132
- }
133
- /**
134
- * Copies a transaction's `writeOptions` onto the wire operation. The
135
- * stale-context guards (`readAt` and `onStale`) sit at the operation's root,
136
- * while `idempotencyKey` and `label` go in its `options` slot — the
137
- * `mutation_log` cache key and audit tag. This is the one place caller-supplied
138
- * write options cross onto the wire.
139
- */
140
- export declare function applyWriteOptions<T extends object>(op: T, transaction: QueuedMutation): T & WriteOperationFields;
141
- /**
142
- * The structural shape used to inspect transport-layer errors. It covers the
143
- * GraphQL-style and HTTP-style error shapes the mutation executor can surface,
144
- * and is kept intentionally narrow so it does not claim fields the runtime may
145
- * not supply.
146
- */
147
- export interface TransportError {
148
- message?: string;
149
- code?: string | number;
150
- extensions?: Record<string, unknown>;
151
- locations?: readonly unknown[];
152
- path?: readonly (string | number)[];
153
- response?: {
154
- status?: number;
155
- errors?: readonly {
156
- extensions?: {
157
- code?: string;
158
- };
159
- message?: string;
160
- }[];
161
- };
162
- error?: string;
163
- }
164
- export declare function asTransportError(value: unknown): TransportError;
165
- export declare function extractStatusCode(error: unknown): number | undefined;
@@ -1,152 +0,0 @@
1
- /**
2
- * The vocabulary a local transaction uses on the wire. This module defines the
3
- * {@link QueuedMutation} record and the helpers that turn a transaction into a
4
- * wire-safe commit operation: schema-field projection
5
- * ({@link projectCommitPayload}), write-option projection
6
- * ({@link applyWriteOptions}), foreign-key-aware priority scoring
7
- * ({@link computePriorityScore}), and the structural checks used to classify
8
- * transport errors. Nothing here holds queue state or timers, so the batched
9
- * queue path and the HTTP commit path share the same projection.
10
- */
11
- import { globalRuntime } from '../../context.js';
12
- import { MutationOperationType } from '../../transaction/types/index.js';
13
- import { snapshotJsonValue } from '../../transaction/utils/json.js';
14
- /**
15
- * Framework-internal keys added by `Model.toJSON()` that must never
16
- * reach the wire. The server treats each top-level key as a target
17
- * column, so shipping these would blow up the INSERT/UPDATE.
18
- */
19
- const FRAMEWORK_KEYS = new Set(['__class', '__typename', 'clientId', 'syncStatus']);
20
- /**
21
- * Projects a model's serialized data onto the fields declared in its schema and
22
- * returns a wire-safe commit payload. It does two things:
23
- *
24
- * 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
25
- * `syncStatus`) and anything not declared on the model's schema.
26
- * 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
27
- * fields stay objects rather than pre-serialized strings, while reactive
28
- * proxies cannot leak into persistence or the wire payload.
29
- *
30
- * For updates (`dropUndefined: true`), `undefined` values are also removed so
31
- * they are not written as `SET column = NULL` on the server.
32
- *
33
- * Field metadata comes from the model registry, populated when the schema is
34
- * registered at initialization. If a model has no registered field metadata —
35
- * for example a manually registered model — projection snapshots all serialized
36
- * data apart from the framework keys.
37
- */
38
- export function projectCommitPayload(modelName, source, opts, runtime = globalRuntime) {
39
- const metadata = runtime.getModelMetadata(modelName);
40
- const fields = metadata?.fields;
41
- const out = {};
42
- if (!fields) {
43
- // Unknown registration — strip framework keys and ship the rest.
44
- for (const [k, v] of Object.entries(source)) {
45
- if (FRAMEWORK_KEYS.has(k))
46
- continue;
47
- if (opts.dropUndefined && v === undefined)
48
- continue;
49
- out[k] = v;
50
- }
51
- return snapshotJsonValue(out, '$.input');
52
- }
53
- for (const key of Object.keys(fields)) {
54
- if (!(key in source))
55
- continue;
56
- const value = source[key];
57
- if (opts.dropUndefined && value === undefined)
58
- continue;
59
- // JSON-typed fields (stored as jsonb on the server) are sent as objects,
60
- // not pre-serialized strings. Pre-stringifying here corrupts a round trip:
61
- //
62
- // 1. The client stringifies `position: {x, y}` to `'{"x":...}'`.
63
- // 2. The server writes it to the jsonb column, parsing the string, fine.
64
- // 3. The server's delta echoes the input, where `position` is still the
65
- // string from step 1.
66
- // 4. The client merges the delta and sets `model.position` to that string.
67
- // 5. The next edit spreads the string character by character, producing a
68
- // corrupted, index-keyed object.
69
- // 6. That corrupt object lands in the next commit and is stored in jsonb.
70
- //
71
- // Sending objects avoids the mismatch: the value travels through the delta
72
- // and the commit unchanged, and the Postgres driver serializes a JS object
73
- // to jsonb correctly once the column is identified as jsonb.
74
- out[key] = value;
75
- }
76
- return snapshotJsonValue(out, '$.input');
77
- }
78
- export const normalizeModelKey = (modelName) => modelName.replace('Model', '').toLowerCase();
79
- export const stripModelSuffix = (modelName) => modelName.replace('Model', '');
80
- /**
81
- * Returns the priority score used to order create operations by foreign-key
82
- * depth, so a parent row commits before its children.
83
- *
84
- * The score comes from a priority map on the runtime configuration, built once
85
- * at initialization by walking the schema's `belongsTo` graph. No model names
86
- * are hard-coded here, and an application can override specific priorities
87
- * through `configOverrides.modelCreatePriority`.
88
- *
89
- * Non-create operations (update, delete, archive, unarchive) need no
90
- * foreign-key ordering because the row already exists, so they all share the
91
- * configured default non-create priority.
92
- */
93
- export const computePriorityScore = (type, modelName, runtime = globalRuntime) => {
94
- const { modelCreatePriority, defaultCreatePriority, defaultNonCreatePriority } = runtime.config;
95
- if (type !== 'create')
96
- return defaultNonCreatePriority;
97
- return modelCreatePriority.get(modelName) ?? defaultCreatePriority;
98
- };
99
- export const TX_TYPE_TO_MUTATION_OP = {
100
- create: MutationOperationType.CREATE,
101
- update: MutationOperationType.UPDATE,
102
- delete: MutationOperationType.DELETE,
103
- archive: MutationOperationType.ARCHIVE,
104
- unarchive: MutationOperationType.UNARCHIVE,
105
- };
106
- export function hasStaleWriteOptions(options) {
107
- return (options?.readAt !== undefined ||
108
- options?.onStale !== undefined);
109
- }
110
- /** Options whose identity/audit semantics forbid merging two caller writes. */
111
- export function hasCommitCoalescingBarrier(options) {
112
- return (hasStaleWriteOptions(options) ||
113
- typeof options?.idempotencyKey === 'string' ||
114
- typeof options?.label === 'string');
115
- }
116
- /**
117
- * Copies a transaction's `writeOptions` onto the wire operation. The
118
- * stale-context guards (`readAt` and `onStale`) sit at the operation's root,
119
- * while `idempotencyKey` and `label` go in its `options` slot — the
120
- * `mutation_log` cache key and audit tag. This is the one place caller-supplied
121
- * write options cross onto the wire.
122
- */
123
- export function applyWriteOptions(op, transaction) {
124
- const operation = op;
125
- const writeOptions = transaction.writeOptions;
126
- if (!writeOptions)
127
- return operation;
128
- if (writeOptions.readAt !== undefined) {
129
- operation.readAt = writeOptions.readAt;
130
- }
131
- if (writeOptions.onStale !== undefined) {
132
- operation.onStale = writeOptions.onStale;
133
- }
134
- if (writeOptions.fenceToken !== undefined) {
135
- operation.fenceToken = writeOptions.fenceToken;
136
- }
137
- if (writeOptions.idempotencyKey != null || writeOptions.label !== undefined) {
138
- operation.options = {
139
- ...(writeOptions.idempotencyKey != null
140
- ? { idempotencyKey: writeOptions.idempotencyKey }
141
- : {}),
142
- ...(writeOptions.label !== undefined ? { label: writeOptions.label } : {}),
143
- };
144
- }
145
- return operation;
146
- }
147
- export function asTransportError(value) {
148
- return (value && typeof value === 'object' ? value : {});
149
- }
150
- export function extractStatusCode(error) {
151
- return asTransportError(error).response?.status;
152
- }
@@ -1,63 +0,0 @@
1
- /**
2
- * Tracks whether the confirming delta for a write has arrived. It holds the
3
- * acknowledgement watermark (through the shared {@link LogPosition}), the
4
- * per-transaction confirmation timeouts, and the retry-with-backoff and
5
- * reconciliation policy for transactions in the `awaiting_delta` status. It
6
- * reaches back to {@link MutationQueue} only through the small
7
- * {@link DeltaConfirmationContext} interface, not the queue class itself, so it
8
- * has no cyclic dependency and can be tested on its own.
9
- */
10
- import type { RuntimeContext } from '../../RuntimeContext.js';
11
- import type { LogPosition } from '../../transaction/logPosition.js';
12
- import type { QueuedMutation } from './commitPayload.js';
13
- /**
14
- * The subset of {@link MutationQueue} that the confirmation tracker needs:
15
- * store lookups and status changes, removing optimistic entries once a write
16
- * confirms, the queue's event emitter (`transaction:completed`,
17
- * `reconciliation:needed`, and so on), a connection check (so timeouts
18
- * re-schedule instead of escalating while offline), and the shared client
19
- * position (`noteAck` advances the acknowledgement cursor; diagnostics read the
20
- * applied cursor).
21
- */
22
- export interface DeltaConfirmationContext {
23
- store: {
24
- get(id: string): QueuedMutation | undefined;
25
- getByStatus(status: QueuedMutation['status']): QueuedMutation[];
26
- updateStatus(id: string, status: QueuedMutation['status']): void;
27
- };
28
- optimisticUpdates: {
29
- delete(id: string): boolean;
30
- };
31
- emit(event: string, payload?: unknown): void;
32
- isConnected(): boolean;
33
- position: LogPosition;
34
- /** The owning client's runtime. Defaults to the module-global bridge. */
35
- runtime?: RuntimeContext;
36
- }
37
- export declare class DeltaConfirmationTracker {
38
- private readonly ctx;
39
- private static readonly DELTA_MAX_RETRIES;
40
- private static readonly DELTA_MAX_TIMEOUT_MS;
41
- private deltaConfirmationTimeouts;
42
- private deltaConfirmationRetries;
43
- private readonly runtime;
44
- constructor(ctx: DeltaConfirmationContext);
45
- /** Applied-cursor alias, kept so the read sites below stay legible. */
46
- private get lastSeenSyncId();
47
- private matchesSourceEcho;
48
- noteAck(lastSyncId: number | undefined): void;
49
- /**
50
- * Confirms every awaiting transaction whose sync-id threshold this delta
51
- * meets or exceeds.
52
- * @param syncId - The sync id of the received delta.
53
- */
54
- onDeltaReceived(syncId: number, correlationId?: string): void;
55
- scheduleDeltaConfirmationTimeout(tx: QueuedMutation, timeoutMs: number): void;
56
- private cancelDeltaConfirmationTimeout;
57
- /**
58
- * Clears every armed confirmation timer, one per in-flight transaction.
59
- * {@link MutationQueue.dispose} calls this; without it a disposed queue
60
- * would keep the process alive and fire callbacks against a cleared store.
61
- */
62
- dispose(): void;
63
- }
@@ -1,235 +0,0 @@
1
- /**
2
- * Tracks whether the confirming delta for a write has arrived. It holds the
3
- * acknowledgement watermark (through the shared {@link LogPosition}), the
4
- * per-transaction confirmation timeouts, and the retry-with-backoff and
5
- * reconciliation policy for transactions in the `awaiting_delta` status. It
6
- * reaches back to {@link MutationQueue} only through the small
7
- * {@link DeltaConfirmationContext} interface, not the queue class itself, so it
8
- * has no cyclic dependency and can be tested on its own.
9
- */
10
- import { globalRuntime } from '../../context.js';
11
- export class DeltaConfirmationTracker {
12
- ctx;
13
- // Retry configuration for delta confirmation, using exponential backoff.
14
- // Maximum retries before requesting a full reconciliation.
15
- static DELTA_MAX_RETRIES = 5;
16
- // Upper bound on the backoff timeout.
17
- static DELTA_MAX_TIMEOUT_MS = 120_000;
18
- // Pending confirmation timeouts for transactions awaiting their delta. On
19
- // timeout the tracker retries with backoff rather than rolling back.
20
- deltaConfirmationTimeouts = new Map();
21
- // Track retry attempts per transaction for exponential backoff
22
- deltaConfirmationRetries = new Map();
23
- runtime;
24
- constructor(ctx) {
25
- this.ctx = ctx;
26
- this.runtime = ctx.runtime ?? globalRuntime;
27
- }
28
- /** Applied-cursor alias, kept so the read sites below stay legible. */
29
- get lastSeenSyncId() {
30
- return this.ctx.position.applied;
31
- }
32
- matchesSourceEcho(tx, correlationId) {
33
- return (correlationId !== undefined &&
34
- tx.correlationId !== undefined &&
35
- correlationId === tx.correlationId);
36
- }
37
- noteAck(lastSyncId) {
38
- this.ctx.position.noteAck(lastSyncId);
39
- }
40
- /**
41
- * Confirms every awaiting transaction whose sync-id threshold this delta
42
- * meets or exceeds.
43
- * @param syncId - The sync id of the received delta.
44
- */
45
- onDeltaReceived(syncId, correlationId) {
46
- // The cursor advances where the delta is applied (the store calls
47
- // position.advanceApplied / advancePersisted); this hook only resolves
48
- // confirmation thresholds against the incoming id.
49
- const awaitingTxs = this.ctx.store.getByStatus('awaiting_delta');
50
- const executingTxs = this.ctx.store.getByStatus('executing');
51
- // Debug: Show state when delta arrives
52
- if (awaitingTxs.length > 0 || executingTxs.length > 0) {
53
- this.runtime.logger.debug('tx:delta_received', {
54
- syncId,
55
- lastSeenSyncId: this.lastSeenSyncId,
56
- awaitingCount: awaitingTxs.length,
57
- executingCount: executingTxs.length,
58
- awaitingThresholds: awaitingTxs.map((tx) => ({
59
- txId: tx.id.slice(0, 8),
60
- model: tx.modelName,
61
- needed: tx.syncIdNeededForCompletion,
62
- requiresCorrelatedDelta: tx.requiresCorrelatedDelta === true,
63
- willConfirm: tx.requiresCorrelatedDelta === true
64
- ? this.matchesSourceEcho(tx, correlationId)
65
- : tx.syncIdNeededForCompletion !== undefined &&
66
- syncId >= tx.syncIdNeededForCompletion,
67
- })),
68
- });
69
- }
70
- // Fast path: no awaiting transactions
71
- if (awaitingTxs.length === 0)
72
- return;
73
- let confirmedCount = 0;
74
- for (const tx of awaitingTxs) {
75
- // Queued forward receipts deliberately have no watermark. They confirm
76
- // only when the authoritative source echoes the receipt's opaque,
77
- // authenticated-scope batch identity; the legacy anomaly path continues
78
- // to use its sync-id threshold.
79
- const confirmedByCorrelation = tx.requiresCorrelatedDelta === true &&
80
- this.matchesSourceEcho(tx, correlationId);
81
- const confirmedByThreshold = tx.requiresCorrelatedDelta !== true &&
82
- tx.syncIdNeededForCompletion !== undefined &&
83
- syncId >= tx.syncIdNeededForCompletion;
84
- if (confirmedByCorrelation || confirmedByThreshold) {
85
- this.cancelDeltaConfirmationTimeout(tx.id);
86
- this.ctx.store.updateStatus(tx.id, 'completed');
87
- this.ctx.emit('transaction:completed', tx);
88
- this.ctx.emit(`transaction:completed:${tx.id}`, tx);
89
- this.ctx.optimisticUpdates.delete(tx.id);
90
- confirmedCount++;
91
- this.runtime.logger.debug('tx:confirm_via_delta', {
92
- txId: tx.id.slice(0, 8),
93
- model: tx.modelName,
94
- neededSyncId: tx.syncIdNeededForCompletion,
95
- receivedSyncId: syncId,
96
- confirmation: confirmedByCorrelation ? 'source_correlation' : 'sync_id',
97
- });
98
- }
99
- }
100
- // Log batch summary only if we confirmed something
101
- if (confirmedCount > 0) {
102
- // Leave a breadcrumb when transactions confirm.
103
- this.runtime.observability.breadcrumb('Transactions confirmed via delta', 'sync.transaction', 'info', {
104
- count: confirmedCount,
105
- syncId,
106
- remainingAwaiting: awaitingTxs.length - confirmedCount,
107
- });
108
- }
109
- }
110
- // Schedule the confirmation wait for a transaction. On timeout the tracker
111
- // retries with exponential backoff and requests reconciliation to catch up on
112
- // missed deltas, rather than rolling back, which would discard state the
113
- // server has already confirmed. A rollback happens only on an explicit server
114
- // rejection, never on a timeout.
115
- scheduleDeltaConfirmationTimeout(tx, timeoutMs) {
116
- // Cancel any existing timeout for this transaction
117
- this.cancelDeltaConfirmationTimeout(tx.id);
118
- // Deliberately not an async callback: the body is fully synchronous, and
119
- // `setTimeout(async …)` would turn any throw into an unhandled promise
120
- // rejection instead of a catchable synchronous error.
121
- const timeoutHandle = setTimeout(() => {
122
- const currentTx = this.ctx.store.get(tx.id);
123
- if (currentTx?.status !== 'awaiting_delta') {
124
- this.deltaConfirmationRetries.delete(tx.id);
125
- return; // Already confirmed or failed
126
- }
127
- // If disconnected, re-schedule with same timeout (no backoff while offline)
128
- if (!this.ctx.isConnected()) {
129
- // Self-healing: re-schedule the confirmation wait while offline, no
130
- // consumer action needed → debug.
131
- this.runtime.logger.debug('[MutationQueue] Timeout fired while disconnected - re-scheduling', {
132
- txId: tx.id.slice(0, 8),
133
- model: tx.modelName,
134
- });
135
- this.deltaConfirmationTimeouts.delete(tx.id);
136
- this.scheduleDeltaConfirmationTimeout(tx, timeoutMs);
137
- return;
138
- }
139
- const retryCount = this.deltaConfirmationRetries.get(tx.id) ?? 0;
140
- this.runtime.observability.captureReconciliation({
141
- reason: 'delta_timeout',
142
- model: tx.modelName,
143
- modelId: tx.modelId,
144
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
145
- lastSeenSyncId: this.lastSeenSyncId,
146
- retryCount,
147
- connectionState: this.ctx.isConnected() ? 'connected' : 'disconnected',
148
- });
149
- if (retryCount < DeltaConfirmationTracker.DELTA_MAX_RETRIES) {
150
- // Retry: request reconciliation and re-schedule with exponential
151
- // backoff. The server has already committed the mutation; only the
152
- // delta is outstanding.
153
- this.deltaConfirmationRetries.set(tx.id, retryCount + 1);
154
- this.deltaConfirmationTimeouts.delete(tx.id);
155
- // Exponential backoff: 30s → 60s → 120s → 120s → 120s (capped)
156
- const nextTimeout = Math.min(timeoutMs * 2, DeltaConfirmationTracker.DELTA_MAX_TIMEOUT_MS);
157
- // Request reconciliation so the client can cycle the connection and
158
- // catch up on missed deltas from the server.
159
- this.ctx.emit('reconciliation:needed', {
160
- reason: 'delta_confirmation_timeout',
161
- txId: tx.id,
162
- model: tx.modelName,
163
- modelId: tx.modelId,
164
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
165
- lastSeenSyncId: this.lastSeenSyncId,
166
- retryCount: retryCount + 1,
167
- });
168
- // Self-healing retry with backoff — the server already committed; we're
169
- // just waiting on the delta. No consumer action → debug.
170
- this.runtime.logger.debug('[MutationQueue] Re-scheduling with backoff', {
171
- txId: tx.id.slice(0, 8),
172
- model: tx.modelName,
173
- nextTimeoutMs: nextTimeout,
174
- retry: retryCount + 1,
175
- });
176
- this.scheduleDeltaConfirmationTimeout(tx, nextTimeout);
177
- }
178
- else {
179
- // Retries exhausted: persist the awaiting state instead of rolling back.
180
- // The commit succeeded on the server, so the data exists there. Saving
181
- // the awaiting state lets it survive the page closing; on the next
182
- // session, reconnecting and catching up on deltas will confirm it.
183
- this.deltaConfirmationRetries.delete(tx.id);
184
- this.deltaConfirmationTimeouts.delete(tx.id);
185
- this.runtime.observability.captureDeltaRetryExhausted({
186
- txId: tx.id,
187
- model: tx.modelName,
188
- modelId: tx.modelId,
189
- retryCount: DeltaConfirmationTracker.DELTA_MAX_RETRIES,
190
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
191
- });
192
- // Emit the persist event; the client performs the write to local storage.
193
- this.ctx.emit('transaction:persist_awaiting', {
194
- txId: tx.id,
195
- model: tx.modelName,
196
- modelId: tx.modelId,
197
- operationType: tx.type,
198
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
199
- });
200
- // Also request one final reconciliation cycle
201
- this.ctx.emit('reconciliation:needed', {
202
- reason: 'delta_retries_exhausted',
203
- txId: tx.id,
204
- model: tx.modelName,
205
- modelId: tx.modelId,
206
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
207
- lastSeenSyncId: this.lastSeenSyncId,
208
- retryCount: DeltaConfirmationTracker.DELTA_MAX_RETRIES,
209
- });
210
- }
211
- }, timeoutMs);
212
- this.deltaConfirmationTimeouts.set(tx.id, timeoutHandle);
213
- }
214
- // Cancel a pending delta confirmation timeout and clean up retry tracking
215
- cancelDeltaConfirmationTimeout(id) {
216
- const timeoutHandle = this.deltaConfirmationTimeouts.get(id);
217
- if (timeoutHandle) {
218
- clearTimeout(timeoutHandle);
219
- this.deltaConfirmationTimeouts.delete(id);
220
- }
221
- this.deltaConfirmationRetries.delete(id);
222
- }
223
- /**
224
- * Clears every armed confirmation timer, one per in-flight transaction.
225
- * {@link MutationQueue.dispose} calls this; without it a disposed queue
226
- * would keep the process alive and fire callbacks against a cleared store.
227
- */
228
- dispose() {
229
- for (const timeoutHandle of this.deltaConfirmationTimeouts.values()) {
230
- clearTimeout(timeoutHandle);
231
- }
232
- this.deltaConfirmationTimeouts.clear();
233
- this.deltaConfirmationRetries.clear();
234
- }
235
- }
@@ -1,14 +0,0 @@
1
- /**
2
- * The durable-write port moved to the settlement core (ADR 0016): it is a
3
- * contract over commit envelopes and holds no local rows. Re-exported here so
4
- * the existing `transactions/mutations/durableWriteStore` import path keeps
5
- * resolving for the queue, the outbox, and the client options.
6
- *
7
- * The port and its config live in the core's `durableWrites` module (a behavior
8
- * contract, not a persisted shape); the records that cross it are owned by
9
- * `transactions/settlement/pendingWrite`.
10
- */
11
- export { durableWriteStoreSchema, durableWritesConfigSchema, } from '../../transaction/durableWrites.js';
12
- export type { DurableWriteStore, DurableWritesConfig, } from '../../transaction/durableWrites.js';
13
- export { pendingWriteSchema } from '../../transaction/transactions/settlement/pendingWrite.js';
14
- export type { PendingWrite } from '../../transaction/transactions/settlement/pendingWrite.js';
@@ -1,12 +0,0 @@
1
- /**
2
- * The durable-write port moved to the settlement core (ADR 0016): it is a
3
- * contract over commit envelopes and holds no local rows. Re-exported here so
4
- * the existing `transactions/mutations/durableWriteStore` import path keeps
5
- * resolving for the queue, the outbox, and the client options.
6
- *
7
- * The port and its config live in the core's `durableWrites` module (a behavior
8
- * contract, not a persisted shape); the records that cross it are owned by
9
- * `transactions/settlement/pendingWrite`.
10
- */
11
- export { durableWriteStoreSchema, durableWritesConfigSchema, } from '../../transaction/durableWrites.js';
12
- export { pendingWriteSchema } from '../../transaction/transactions/settlement/pendingWrite.js';