@abloatai/ablo 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,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,164 +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 { MutationOperationType } from '../../transaction/types/index.js';
12
- import type { OnStaleMode } from '../../transaction/coordination/schema.js';
13
- import type { MutationOptions, WriteOptions } from '../../interfaces/index.js';
14
- import type { CommitEnvelopeMember } from '../../transaction/transactions/settlement/commitEnvelope.js';
15
- export interface UserContext {
16
- userId: string;
17
- organizationId: string;
18
- role?: string;
19
- teamIds?: string[];
20
- }
21
- /** Wire-format mutation payload (post-projection). */
22
- export type MutationInput = Record<string, unknown>;
23
- /**
24
- * Projects a model's serialized data onto the fields declared in its schema and
25
- * returns a wire-safe commit payload. It does two things:
26
- *
27
- * 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
28
- * `syncStatus`) and anything not declared on the model's schema.
29
- * 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
30
- * fields stay objects rather than pre-serialized strings, while reactive
31
- * proxies cannot leak into persistence or the wire payload.
32
- *
33
- * For updates (`dropUndefined: true`), `undefined` values are also removed so
34
- * they are not written as `SET column = NULL` on the server.
35
- *
36
- * Field metadata comes from the model registry, populated when the schema is
37
- * registered at initialization. If a model has no registered field metadata —
38
- * for example a manually registered model — projection snapshots all serialized
39
- * data apart from the framework keys.
40
- */
41
- export declare function projectCommitPayload(modelName: string, source: Record<string, unknown>, opts: {
42
- dropUndefined: boolean;
43
- }): MutationInput;
44
- export interface QueuedMutation {
45
- id: string;
46
- type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
47
- modelName: string;
48
- modelId: string;
49
- modelKey: string;
50
- data?: MutationInput;
51
- previousData?: MutationInput | null;
52
- context: UserContext;
53
- status: 'pending' | 'executing' | 'awaiting_delta' | 'completed' | 'failed' | 'rolled_back';
54
- createdAt: number;
55
- attempts: number;
56
- priority: 'normal' | 'high';
57
- priorityScore: number;
58
- writeOptions?: WriteOptions;
59
- batchId?: string;
60
- /**
61
- * Stable identity of the wire commit that currently owns this operation.
62
- *
63
- * A transport failure is ambiguous: the server may have committed the
64
- * batch even though the acknowledgement never reached this client. Keeping
65
- * this envelope on every member lets the queue replay the exact same ordered
66
- * batch with the exact same idempotency key instead of accidentally
67
- * re-batching its operations under a fresh key.
68
- */
69
- commitEnvelope?: CommitEnvelopeMember;
70
- /** Pending-mutation journal entries atomically consumed by this envelope. */
71
- sourceMutationIds?: string[];
72
- /** Completed locally without a server operation; no sync echo will arrive. */
73
- localOnly?: boolean;
74
- /** Sync-id threshold: the transaction confirms once a delta with an id at least this value arrives. */
75
- syncIdNeededForCompletion?: number;
76
- /**
77
- * Opaque customer-side batch identity returned with a queued source receipt.
78
- * It is retained durably and is the only identity a live WAL delta may use
79
- * to settle this pending commit. Server-side replay additionally proves the
80
- * complete stored operation-id set before returning `confirmed`.
81
- */
82
- correlationId?: string;
83
- /**
84
- * A queued forward has no authoritative sync-id watermark yet. It may only
85
- * confirm when a WAL delta carries its opaque server-derived correlation;
86
- * unrelated deltas must never satisfy it by advancing the global watermark.
87
- */
88
- requiresCorrelatedDelta?: boolean;
89
- /**
90
- * Resolves once the server has confirmed this transaction, whether by a delta
91
- * or an HTTP acknowledgement. It rejects with the originating error if the
92
- * transaction is permanently rolled back; for a source-forwarded write it
93
- * also rejects with `replication_lag_timeout` when the accepted write's WAL
94
- * echo misses the confirmation deadline. That timeout does not roll back or
95
- * fail the transaction: it remains pending and may confirm when replication
96
- * recovers. This gives a caller one place to await the answer to "did my write
97
- * land?", matching the
98
- * `commits.create({ wait: 'confirmed' })` and
99
- * {@link MutationQueue.waitForConfirmation} vocabulary, so a failure
100
- * surfaces at the call site instead of only as a silent local rollback. The
101
- * permanent-rejection value is the same {@link AbloError} carried on the
102
- * queue's `transaction:failed` event.
103
- */
104
- confirmation?: Promise<void>;
105
- }
106
- export declare const normalizeModelKey: (modelName: string) => string;
107
- export declare const stripModelSuffix: (modelName: string) => string;
108
- /**
109
- * Returns the priority score used to order create operations by foreign-key
110
- * depth, so a parent row commits before its children.
111
- *
112
- * The score comes from a priority map on the runtime configuration, built once
113
- * at initialization by walking the schema's `belongsTo` graph. No model names
114
- * are hard-coded here, and an application can override specific priorities
115
- * through `configOverrides.modelCreatePriority`.
116
- *
117
- * Non-create operations (update, delete, archive, unarchive) need no
118
- * foreign-key ordering because the row already exists, so they all share the
119
- * configured default non-create priority.
120
- */
121
- export declare const computePriorityScore: (type: QueuedMutation["type"], modelName: string) => number;
122
- export declare const TX_TYPE_TO_MUTATION_OP: Record<QueuedMutation['type'], MutationOperationType>;
123
- export declare function hasStaleWriteOptions(options?: WriteOptions): boolean;
124
- /** Options whose identity/audit semantics forbid merging two caller writes. */
125
- export declare function hasCommitCoalescingBarrier(options?: WriteOptions): boolean;
126
- export interface WriteOperationFields {
127
- readAt?: number | null;
128
- onStale?: OnStaleMode | null;
129
- fenceToken?: number | null;
130
- options?: Pick<MutationOptions, 'idempotencyKey' | 'label'>;
131
- }
132
- /**
133
- * Copies a transaction's `writeOptions` onto the wire operation. The
134
- * stale-context guards (`readAt` and `onStale`) sit at the operation's root,
135
- * while `idempotencyKey` and `label` go in its `options` slot — the
136
- * `mutation_log` cache key and audit tag. This is the one place caller-supplied
137
- * write options cross onto the wire.
138
- */
139
- export declare function applyWriteOptions<T extends object>(op: T, transaction: QueuedMutation): T & WriteOperationFields;
140
- /**
141
- * The structural shape used to inspect transport-layer errors. It covers the
142
- * GraphQL-style and HTTP-style error shapes the mutation executor can surface,
143
- * and is kept intentionally narrow so it does not claim fields the runtime may
144
- * not supply.
145
- */
146
- export interface TransportError {
147
- message?: string;
148
- code?: string | number;
149
- extensions?: Record<string, unknown>;
150
- locations?: readonly unknown[];
151
- path?: readonly (string | number)[];
152
- response?: {
153
- status?: number;
154
- errors?: readonly {
155
- extensions?: {
156
- code?: string;
157
- };
158
- message?: string;
159
- }[];
160
- };
161
- error?: string;
162
- }
163
- export declare function asTransportError(value: unknown): TransportError;
164
- 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 { getContext } 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) {
39
- const metadata = getContext().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) => {
94
- const { modelCreatePriority, defaultCreatePriority, defaultNonCreatePriority } = getContext().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,59 +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 { LogPosition } from '../../transaction/logPosition.js';
11
- import type { QueuedMutation } from './commitPayload.js';
12
- /**
13
- * The subset of {@link MutationQueue} that the confirmation tracker needs:
14
- * store lookups and status changes, removing optimistic entries once a write
15
- * confirms, the queue's event emitter (`transaction:completed`,
16
- * `reconciliation:needed`, and so on), a connection check (so timeouts
17
- * re-schedule instead of escalating while offline), and the shared client
18
- * position (`noteAck` advances the acknowledgement cursor; diagnostics read the
19
- * applied cursor).
20
- */
21
- export interface DeltaConfirmationContext {
22
- store: {
23
- get(id: string): QueuedMutation | undefined;
24
- getByStatus(status: QueuedMutation['status']): QueuedMutation[];
25
- updateStatus(id: string, status: QueuedMutation['status']): void;
26
- };
27
- optimisticUpdates: {
28
- delete(id: string): boolean;
29
- };
30
- emit(event: string, payload?: unknown): void;
31
- isConnected(): boolean;
32
- position: LogPosition;
33
- }
34
- export declare class DeltaConfirmationTracker {
35
- private readonly ctx;
36
- private static readonly DELTA_MAX_RETRIES;
37
- private static readonly DELTA_MAX_TIMEOUT_MS;
38
- private deltaConfirmationTimeouts;
39
- private deltaConfirmationRetries;
40
- constructor(ctx: DeltaConfirmationContext);
41
- /** Applied-cursor alias, kept so the read sites below stay legible. */
42
- private get lastSeenSyncId();
43
- private matchesSourceEcho;
44
- noteAck(lastSyncId: number | undefined): void;
45
- /**
46
- * Confirms every awaiting transaction whose sync-id threshold this delta
47
- * meets or exceeds.
48
- * @param syncId - The sync id of the received delta.
49
- */
50
- onDeltaReceived(syncId: number, correlationId?: string): void;
51
- scheduleDeltaConfirmationTimeout(tx: QueuedMutation, timeoutMs: number): void;
52
- private cancelDeltaConfirmationTimeout;
53
- /**
54
- * Clears every armed confirmation timer, one per in-flight transaction.
55
- * {@link MutationQueue.dispose} calls this; without it a disposed queue
56
- * would keep the process alive and fire callbacks against a cleared store.
57
- */
58
- dispose(): void;
59
- }
@@ -1,233 +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 { getContext } 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
- constructor(ctx) {
24
- this.ctx = ctx;
25
- }
26
- /** Applied-cursor alias, kept so the read sites below stay legible. */
27
- get lastSeenSyncId() {
28
- return this.ctx.position.applied;
29
- }
30
- matchesSourceEcho(tx, correlationId) {
31
- return (correlationId !== undefined &&
32
- tx.correlationId !== undefined &&
33
- correlationId === tx.correlationId);
34
- }
35
- noteAck(lastSyncId) {
36
- this.ctx.position.noteAck(lastSyncId);
37
- }
38
- /**
39
- * Confirms every awaiting transaction whose sync-id threshold this delta
40
- * meets or exceeds.
41
- * @param syncId - The sync id of the received delta.
42
- */
43
- onDeltaReceived(syncId, correlationId) {
44
- // The cursor advances where the delta is applied (the store calls
45
- // position.advanceApplied / advancePersisted); this hook only resolves
46
- // confirmation thresholds against the incoming id.
47
- const awaitingTxs = this.ctx.store.getByStatus('awaiting_delta');
48
- const executingTxs = this.ctx.store.getByStatus('executing');
49
- // Debug: Show state when delta arrives
50
- if (awaitingTxs.length > 0 || executingTxs.length > 0) {
51
- getContext().logger.debug('tx:delta_received', {
52
- syncId,
53
- lastSeenSyncId: this.lastSeenSyncId,
54
- awaitingCount: awaitingTxs.length,
55
- executingCount: executingTxs.length,
56
- awaitingThresholds: awaitingTxs.map((tx) => ({
57
- txId: tx.id.slice(0, 8),
58
- model: tx.modelName,
59
- needed: tx.syncIdNeededForCompletion,
60
- requiresCorrelatedDelta: tx.requiresCorrelatedDelta === true,
61
- willConfirm: tx.requiresCorrelatedDelta === true
62
- ? this.matchesSourceEcho(tx, correlationId)
63
- : tx.syncIdNeededForCompletion !== undefined &&
64
- syncId >= tx.syncIdNeededForCompletion,
65
- })),
66
- });
67
- }
68
- // Fast path: no awaiting transactions
69
- if (awaitingTxs.length === 0)
70
- return;
71
- let confirmedCount = 0;
72
- for (const tx of awaitingTxs) {
73
- // Queued forward receipts deliberately have no watermark. They confirm
74
- // only when the authoritative source echoes the receipt's opaque,
75
- // authenticated-scope batch identity; the legacy anomaly path continues
76
- // to use its sync-id threshold.
77
- const confirmedByCorrelation = tx.requiresCorrelatedDelta === true &&
78
- this.matchesSourceEcho(tx, correlationId);
79
- const confirmedByThreshold = tx.requiresCorrelatedDelta !== true &&
80
- tx.syncIdNeededForCompletion !== undefined &&
81
- syncId >= tx.syncIdNeededForCompletion;
82
- if (confirmedByCorrelation || confirmedByThreshold) {
83
- this.cancelDeltaConfirmationTimeout(tx.id);
84
- this.ctx.store.updateStatus(tx.id, 'completed');
85
- this.ctx.emit('transaction:completed', tx);
86
- this.ctx.emit(`transaction:completed:${tx.id}`, tx);
87
- this.ctx.optimisticUpdates.delete(tx.id);
88
- confirmedCount++;
89
- getContext().logger.debug('tx:confirm_via_delta', {
90
- txId: tx.id.slice(0, 8),
91
- model: tx.modelName,
92
- neededSyncId: tx.syncIdNeededForCompletion,
93
- receivedSyncId: syncId,
94
- confirmation: confirmedByCorrelation ? 'source_correlation' : 'sync_id',
95
- });
96
- }
97
- }
98
- // Log batch summary only if we confirmed something
99
- if (confirmedCount > 0) {
100
- // Leave a breadcrumb when transactions confirm.
101
- getContext().observability.breadcrumb('Transactions confirmed via delta', 'sync.transaction', 'info', {
102
- count: confirmedCount,
103
- syncId,
104
- remainingAwaiting: awaitingTxs.length - confirmedCount,
105
- });
106
- }
107
- }
108
- // Schedule the confirmation wait for a transaction. On timeout the tracker
109
- // retries with exponential backoff and requests reconciliation to catch up on
110
- // missed deltas, rather than rolling back, which would discard state the
111
- // server has already confirmed. A rollback happens only on an explicit server
112
- // rejection, never on a timeout.
113
- scheduleDeltaConfirmationTimeout(tx, timeoutMs) {
114
- // Cancel any existing timeout for this transaction
115
- this.cancelDeltaConfirmationTimeout(tx.id);
116
- // Deliberately not an async callback: the body is fully synchronous, and
117
- // `setTimeout(async …)` would turn any throw into an unhandled promise
118
- // rejection instead of a catchable synchronous error.
119
- const timeoutHandle = setTimeout(() => {
120
- const currentTx = this.ctx.store.get(tx.id);
121
- if (currentTx?.status !== 'awaiting_delta') {
122
- this.deltaConfirmationRetries.delete(tx.id);
123
- return; // Already confirmed or failed
124
- }
125
- // If disconnected, re-schedule with same timeout (no backoff while offline)
126
- if (!this.ctx.isConnected()) {
127
- // Self-healing: re-schedule the confirmation wait while offline, no
128
- // consumer action needed → debug.
129
- getContext().logger.debug('[MutationQueue] Timeout fired while disconnected - re-scheduling', {
130
- txId: tx.id.slice(0, 8),
131
- model: tx.modelName,
132
- });
133
- this.deltaConfirmationTimeouts.delete(tx.id);
134
- this.scheduleDeltaConfirmationTimeout(tx, timeoutMs);
135
- return;
136
- }
137
- const retryCount = this.deltaConfirmationRetries.get(tx.id) ?? 0;
138
- getContext().observability.captureReconciliation({
139
- reason: 'delta_timeout',
140
- model: tx.modelName,
141
- modelId: tx.modelId,
142
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
143
- lastSeenSyncId: this.lastSeenSyncId,
144
- retryCount,
145
- connectionState: this.ctx.isConnected() ? 'connected' : 'disconnected',
146
- });
147
- if (retryCount < DeltaConfirmationTracker.DELTA_MAX_RETRIES) {
148
- // Retry: request reconciliation and re-schedule with exponential
149
- // backoff. The server has already committed the mutation; only the
150
- // delta is outstanding.
151
- this.deltaConfirmationRetries.set(tx.id, retryCount + 1);
152
- this.deltaConfirmationTimeouts.delete(tx.id);
153
- // Exponential backoff: 30s → 60s → 120s → 120s → 120s (capped)
154
- const nextTimeout = Math.min(timeoutMs * 2, DeltaConfirmationTracker.DELTA_MAX_TIMEOUT_MS);
155
- // Request reconciliation so the client can cycle the connection and
156
- // catch up on missed deltas from the server.
157
- this.ctx.emit('reconciliation:needed', {
158
- reason: 'delta_confirmation_timeout',
159
- txId: tx.id,
160
- model: tx.modelName,
161
- modelId: tx.modelId,
162
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
163
- lastSeenSyncId: this.lastSeenSyncId,
164
- retryCount: retryCount + 1,
165
- });
166
- // Self-healing retry with backoff — the server already committed; we're
167
- // just waiting on the delta. No consumer action → debug.
168
- getContext().logger.debug('[MutationQueue] Re-scheduling with backoff', {
169
- txId: tx.id.slice(0, 8),
170
- model: tx.modelName,
171
- nextTimeoutMs: nextTimeout,
172
- retry: retryCount + 1,
173
- });
174
- this.scheduleDeltaConfirmationTimeout(tx, nextTimeout);
175
- }
176
- else {
177
- // Retries exhausted: persist the awaiting state instead of rolling back.
178
- // The commit succeeded on the server, so the data exists there. Saving
179
- // the awaiting state lets it survive the page closing; on the next
180
- // session, reconnecting and catching up on deltas will confirm it.
181
- this.deltaConfirmationRetries.delete(tx.id);
182
- this.deltaConfirmationTimeouts.delete(tx.id);
183
- getContext().observability.captureDeltaRetryExhausted({
184
- txId: tx.id,
185
- model: tx.modelName,
186
- modelId: tx.modelId,
187
- retryCount: DeltaConfirmationTracker.DELTA_MAX_RETRIES,
188
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
189
- });
190
- // Emit the persist event; the client performs the write to local storage.
191
- this.ctx.emit('transaction:persist_awaiting', {
192
- txId: tx.id,
193
- model: tx.modelName,
194
- modelId: tx.modelId,
195
- operationType: tx.type,
196
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
197
- });
198
- // Also request one final reconciliation cycle
199
- this.ctx.emit('reconciliation:needed', {
200
- reason: 'delta_retries_exhausted',
201
- txId: tx.id,
202
- model: tx.modelName,
203
- modelId: tx.modelId,
204
- syncIdNeeded: currentTx.syncIdNeededForCompletion,
205
- lastSeenSyncId: this.lastSeenSyncId,
206
- retryCount: DeltaConfirmationTracker.DELTA_MAX_RETRIES,
207
- });
208
- }
209
- }, timeoutMs);
210
- this.deltaConfirmationTimeouts.set(tx.id, timeoutHandle);
211
- }
212
- // Cancel a pending delta confirmation timeout and clean up retry tracking
213
- cancelDeltaConfirmationTimeout(id) {
214
- const timeoutHandle = this.deltaConfirmationTimeouts.get(id);
215
- if (timeoutHandle) {
216
- clearTimeout(timeoutHandle);
217
- this.deltaConfirmationTimeouts.delete(id);
218
- }
219
- this.deltaConfirmationRetries.delete(id);
220
- }
221
- /**
222
- * Clears every armed confirmation timer, one per in-flight transaction.
223
- * {@link MutationQueue.dispose} calls this; without it a disposed queue
224
- * would keep the process alive and fire callbacks against a cleared store.
225
- */
226
- dispose() {
227
- for (const timeoutHandle of this.deltaConfirmationTimeouts.values()) {
228
- clearTimeout(timeoutHandle);
229
- }
230
- this.deltaConfirmationTimeouts.clear();
231
- this.deltaConfirmationRetries.clear();
232
- }
233
- }
@@ -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';