@abloatai/ablo 0.26.0 → 0.27.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,32 +1,30 @@
1
1
  /**
2
- * Schema ⇄ JSON
2
+ * Schema ⇄ JSON.
3
3
  *
4
- * A `Schema` is serializable except for client-only closures (Zod
5
- * validators + computed getters). `serializeSchema` emits the plain-data
6
- * JSON form; `parseSchema` reconstructs a working `Schema` from it.
4
+ * A `Schema` is fully serializable apart from its client-only closures — the
5
+ * Zod validators and computed getters. {@link serializeSchema} emits the
6
+ * plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
7
+ * from it: one `Schema` type with two representations.
7
8
  *
8
- * This is the GraphQL `printSchema` / `buildSchema` model: one `Schema`
9
- * type, two representations. A hosted multi-tenant server obtains a tenant's
10
- * `Schema` by `parseSchema(json)` instead of an in-process import — the JSON
11
- * is what travels over the control plane (`ablo push`) and is stored
12
- * per `(tenant, version)`.
9
+ * A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
10
+ * rather than importing it in process. The JSON is what `ablo push` sends and
11
+ * what the server stores per tenant and version.
13
12
  *
14
13
  * What round-trips:
15
- * - all model routing/scoping metadata (typename, tableName, load,
16
- * mutable, the canonical `tenancy` descriptor, bootstrap hints, scope,
17
- * grants, entityRoles, the `conflict` disposition map, persist, autoFill,
18
- * requiredFields, lazyObservable).
19
- * NOTE: the authoring sugar (`policy`/`groups`) is normalized away at
20
- * `model()`-build; only the canonical wire fields cross here. `conflict`
21
- * is already canonical pure data, so it crosses verbatim.
22
- * - relations (incl. resolved `foreignKeyColumn`)
23
- * - field metadata (names + type tags), from which validators are rebuilt
24
- * - identity roles (already pure data)
14
+ * - all model routing and scoping metadata: typename, tableName, load,
15
+ * mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
16
+ * entityRoles, the `conflict` disposition map, persist, autoFill,
17
+ * requiredFields, and lazyObservable. The authoring shorthands (`policy`
18
+ * and `groups`) are normalized into these canonical fields when the model
19
+ * is built, so only the canonical fields cross here.
20
+ * - relations, including the resolved `foreignKeyColumn`
21
+ * - field metadata (names and type tags), from which validators are rebuilt
22
+ * - identity roles
25
23
  *
26
- * What does NOT round-trip (client-only, server never needs it):
27
- * - `computed` getters (closures) dropped
28
- * - exact Zod refinements rebuilt as permissive validators from
29
- * `FieldMeta` (the server does no field-shape validation anyway)
24
+ * What does not round-trip, because the server never needs it:
25
+ * - computed getters, which are closures and are dropped
26
+ * - exact Zod refinements, which are rebuilt as permissive validators from
27
+ * {@link FieldMeta}; the server does no field-shape validation
30
28
  */
31
29
  import type { FieldMeta } from './field.js';
32
30
  import type { Tenancy } from './tenancy.js';
@@ -34,10 +32,8 @@ import type { ModelResidency } from './residency.js';
34
32
  import type { GrantsRef, LoadStrategy, PersistOptions, AutoFillRule, ConflictAxis } from './model.js';
35
33
  import type { RelationType } from './relation.js';
36
34
  import { type Schema, type IdentityRole, type EntityRole } from './schema.js';
37
- /** Current schema-JSON envelope version. Bump on a breaking change to the
38
- * JSON shape itself (not the user's schema). v2 replaced the per-model
39
- * `syncGroupFormat` template string with structured `scope`/`grants`/
40
- * `entityRoles` (relation-driven sync groups). */
35
+ /** Current schema-JSON envelope version. Bump this on a breaking change to the
36
+ * JSON shape itself not to a user's schema. */
41
37
  declare const SCHEMA_JSON_VERSION: 3;
42
38
  /** A relation in JSON form. Mirrors the serializable members of {@link RelationDef}. */
43
39
  export interface RelationJSON {
@@ -56,14 +52,15 @@ export interface ModelJSON {
56
52
  readonly typename: string;
57
53
  readonly tableName?: string;
58
54
  readonly tenancy: Tenancy;
59
- /** Database plane. Optional for back-compat: absent in artifacts written before
60
- * the plane axis read as `tenant` (the default). See `./plane.ts`. */
55
+ /** The database plane the model's rows live in. Optional for backward
56
+ * compatibility: when absent (an artifact written before this field existed)
57
+ * it reads as `tenant`, the default. See {@link ModelResidency}. */
61
58
  readonly plane?: ModelResidency;
62
59
  readonly scope?: boolean | string;
63
60
  readonly grants?: GrantsRef;
64
61
  readonly entityRoles?: readonly EntityRole[];
65
- /** Axis 3 — declared write-conflict disposition per committer kind. Pure data;
66
- * absent in pre-conflict-axis artifacts undefined → engine default. */
62
+ /** The declared write-conflict disposition per committer kind. When absent,
63
+ * the engine falls back to its default. */
67
64
  readonly conflict?: ConflictAxis;
68
65
  readonly bootstrapLimit?: number;
69
66
  readonly bootstrapOrderBy?: string;
@@ -1,40 +1,36 @@
1
1
  /**
2
- * Schema ⇄ JSON
2
+ * Schema ⇄ JSON.
3
3
  *
4
- * A `Schema` is serializable except for client-only closures (Zod
5
- * validators + computed getters). `serializeSchema` emits the plain-data
6
- * JSON form; `parseSchema` reconstructs a working `Schema` from it.
4
+ * A `Schema` is fully serializable apart from its client-only closures — the
5
+ * Zod validators and computed getters. {@link serializeSchema} emits the
6
+ * plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
7
+ * from it: one `Schema` type with two representations.
7
8
  *
8
- * This is the GraphQL `printSchema` / `buildSchema` model: one `Schema`
9
- * type, two representations. A hosted multi-tenant server obtains a tenant's
10
- * `Schema` by `parseSchema(json)` instead of an in-process import — the JSON
11
- * is what travels over the control plane (`ablo push`) and is stored
12
- * per `(tenant, version)`.
9
+ * A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
10
+ * rather than importing it in process. The JSON is what `ablo push` sends and
11
+ * what the server stores per tenant and version.
13
12
  *
14
13
  * What round-trips:
15
- * - all model routing/scoping metadata (typename, tableName, load,
16
- * mutable, the canonical `tenancy` descriptor, bootstrap hints, scope,
17
- * grants, entityRoles, the `conflict` disposition map, persist, autoFill,
18
- * requiredFields, lazyObservable).
19
- * NOTE: the authoring sugar (`policy`/`groups`) is normalized away at
20
- * `model()`-build; only the canonical wire fields cross here. `conflict`
21
- * is already canonical pure data, so it crosses verbatim.
22
- * - relations (incl. resolved `foreignKeyColumn`)
23
- * - field metadata (names + type tags), from which validators are rebuilt
24
- * - identity roles (already pure data)
14
+ * - all model routing and scoping metadata: typename, tableName, load,
15
+ * mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
16
+ * entityRoles, the `conflict` disposition map, persist, autoFill,
17
+ * requiredFields, and lazyObservable. The authoring shorthands (`policy`
18
+ * and `groups`) are normalized into these canonical fields when the model
19
+ * is built, so only the canonical fields cross here.
20
+ * - relations, including the resolved `foreignKeyColumn`
21
+ * - field metadata (names and type tags), from which validators are rebuilt
22
+ * - identity roles
25
23
  *
26
- * What does NOT round-trip (client-only, server never needs it):
27
- * - `computed` getters (closures) dropped
28
- * - exact Zod refinements rebuilt as permissive validators from
29
- * `FieldMeta` (the server does no field-shape validation anyway)
24
+ * What does not round-trip, because the server never needs it:
25
+ * - computed getters, which are closures and are dropped
26
+ * - exact Zod refinements, which are rebuilt as permissive validators from
27
+ * {@link FieldMeta}; the server does no field-shape validation
30
28
  */
31
29
  import { z } from 'zod';
32
30
  import { AbloValidationError } from '../errors.js';
33
31
  import { baseFieldsSchema, } from './schema.js';
34
- /** Current schema-JSON envelope version. Bump on a breaking change to the
35
- * JSON shape itself (not the user's schema). v2 replaced the per-model
36
- * `syncGroupFormat` template string with structured `scope`/`grants`/
37
- * `entityRoles` (relation-driven sync groups). */
32
+ /** Current schema-JSON envelope version. Bump this on a breaking change to the
33
+ * JSON shape itself not to a user's schema. */
38
34
  const SCHEMA_JSON_VERSION = 3;
39
35
  // ── Serialize ────────────────────────────────────────────────────────────────
40
36
  function relationToJSON(rel) {
@@ -168,14 +164,14 @@ function modelFromJSON(json) {
168
164
  persist: json.persist,
169
165
  tableName: json.tableName,
170
166
  tenancy: json.tenancy,
171
- // Absent in pre-plane-axis artifacts → default `tenant` (matches the model
172
- // builder default + the provisioning fallback), so the round-trip is stable.
167
+ // Absent in older artifacts → default `tenant`, matching the model builder
168
+ // and provisioning defaults so the round-trip stays stable.
173
169
  plane: json.plane ?? 'tenant',
174
170
  scope: json.scope,
175
171
  grants: json.grants,
176
172
  entityRoles: json.entityRoles,
177
- // Axis 3 pure data; absent in pre-conflict-axis artifacts undefined
178
- // the commit path falls through to the function registry / engine default.
173
+ // Absent in older artifacts undefined, so the commit path falls through to
174
+ // the function registry or the engine default.
179
175
  conflict: json.conflict,
180
176
  mutable: json.mutable,
181
177
  lazyObservable: json.lazyObservable,
@@ -1,35 +1,20 @@
1
1
  /**
2
- * Claim-first shorthand for `model(...)` the Modal-inspired DX layer.
2
+ * A concise, claim-first way to declare a model. Each verb is shorthand for a
3
+ * {@link model} call with two decisions already made, so a reader learns the two
4
+ * facts that matter most about an entity before scanning its fields:
3
5
  *
4
- * The factory verbs encode the two orthogonal axes that matter for
5
- * safety and bootstrap behavior:
6
+ * - Writability: `mutable.*` lets clients send create, update, and delete
7
+ * operations over the commit protocol. `readOnly.*` means the server owns the
8
+ * model — its changes stream to clients as deltas, but clients cannot mutate it.
9
+ * - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
10
+ * first access, and `.manual` loads it only when you query it explicitly.
6
11
  *
7
- * - **Writability** (axis 1): `mutable.*` means clients may send
8
- * CREATE/UPDATE/DELETE over the `commit` wire protocol.
9
- * `readOnly.*` means the model is server-managed deltas stream
10
- * to clients but clients cannot mutate.
11
- * - **Load strategy** (axis 2): `.instant` loads at bootstrap,
12
- * `.lazy` loads on first access, `.manual` requires explicit
13
- * queries.
12
+ * The two-token form (`mutable.lazy({...})`) states the safety claim in the first
13
+ * token and the load shape in the second. The plain {@link model} factory remains
14
+ * available; these verbs are a convenience layered over it.
14
15
  *
15
- * The two-token form (`mutable.lazy({...})`) reads the safety claim
16
- * in the first token and the load shape in the second — you know both
17
- * key facts about the entity before scanning its fields.
18
- *
19
- * This is additive: the original `model(...)` factory keeps working.
20
- * New entities should prefer the verbs; existing entities can migrate
21
- * entity-by-entity.
22
- *
23
- * Example:
16
+ * @example
24
17
  * ```ts
25
- * // Before — 7 options to read before the fields make sense
26
- * tasks: model({ title: z.string() }, { ... }, {
27
- * typename: 'Task', tableName: 'tasks', mutable: true,
28
- * load: 'lazy', lazyObservable: true, computed: tasksComputed,
29
- * }),
30
- *
31
- * // After — claim reads off the verb; options carry only the
32
- * // fields that actually diverge from defaults
33
18
  * tasks: mutable.lazy({ title: z.string() }, {
34
19
  * typename: 'Task', tableName: 'tasks',
35
20
  * relations: { ... },
@@ -57,14 +42,14 @@ export interface SugarOptions<R extends RelationRecord = RelationRecord, C exten
57
42
  */
58
43
  typename?: string;
59
44
  /**
60
- * Actual Postgres table name. Override when Prisma's `@@map` diverges
61
- * from the naive snake_case of the typename (e.g. `Member` maps to
62
- * `'member'` singular, not `'members'`).
45
+ * The physical table name. Override it when the table name differs from the
46
+ * snake_case of the typename for example, a `Member` type stored in a table
47
+ * named `'member'` rather than `'members'`.
63
48
  */
64
49
  tableName?: string;
65
50
  /**
66
- * Row-access policy (tenant isolation / RLS) who may *read* a row.
67
- * Discriminated union on `by` (`column` | `parent` | `none`). See
51
+ * The row-access policy for tenant isolation the rule deciding who may read a
52
+ * row. A discriminated union on `by` (`column`, `parent`, or `none`). See
68
53
  * {@link ModelOptions.policy}.
69
54
  */
70
55
  policy?: ModelOptions['policy'];
@@ -1,35 +1,20 @@
1
1
  /**
2
- * Claim-first shorthand for `model(...)` the Modal-inspired DX layer.
2
+ * A concise, claim-first way to declare a model. Each verb is shorthand for a
3
+ * {@link model} call with two decisions already made, so a reader learns the two
4
+ * facts that matter most about an entity before scanning its fields:
3
5
  *
4
- * The factory verbs encode the two orthogonal axes that matter for
5
- * safety and bootstrap behavior:
6
+ * - Writability: `mutable.*` lets clients send create, update, and delete
7
+ * operations over the commit protocol. `readOnly.*` means the server owns the
8
+ * model — its changes stream to clients as deltas, but clients cannot mutate it.
9
+ * - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
10
+ * first access, and `.manual` loads it only when you query it explicitly.
6
11
  *
7
- * - **Writability** (axis 1): `mutable.*` means clients may send
8
- * CREATE/UPDATE/DELETE over the `commit` wire protocol.
9
- * `readOnly.*` means the model is server-managed deltas stream
10
- * to clients but clients cannot mutate.
11
- * - **Load strategy** (axis 2): `.instant` loads at bootstrap,
12
- * `.lazy` loads on first access, `.manual` requires explicit
13
- * queries.
12
+ * The two-token form (`mutable.lazy({...})`) states the safety claim in the first
13
+ * token and the load shape in the second. The plain {@link model} factory remains
14
+ * available; these verbs are a convenience layered over it.
14
15
  *
15
- * The two-token form (`mutable.lazy({...})`) reads the safety claim
16
- * in the first token and the load shape in the second — you know both
17
- * key facts about the entity before scanning its fields.
18
- *
19
- * This is additive: the original `model(...)` factory keeps working.
20
- * New entities should prefer the verbs; existing entities can migrate
21
- * entity-by-entity.
22
- *
23
- * Example:
16
+ * @example
24
17
  * ```ts
25
- * // Before — 7 options to read before the fields make sense
26
- * tasks: model({ title: z.string() }, { ... }, {
27
- * typename: 'Task', tableName: 'tasks', mutable: true,
28
- * load: 'lazy', lazyObservable: true, computed: tasksComputed,
29
- * }),
30
- *
31
- * // After — claim reads off the verb; options carry only the
32
- * // fields that actually diverge from defaults
33
18
  * tasks: mutable.lazy({ title: z.string() }, {
34
19
  * typename: 'Task', tableName: 'tasks',
35
20
  * relations: { ... },
@@ -86,8 +71,8 @@ export const mutable = {
86
71
  */
87
72
  export const readOnly = {
88
73
  instant: (shape, opts) =>
89
- // Reactive by default (like every variant now): a remote delta that mutates
90
- // a row in place must re-render reactive reads. Opt out per-model with
74
+ // Reactive by default, like every variant: a remote delta that mutates a row
75
+ // in place must re-render reactive reads. Opt out per-model with
91
76
  // `lazyObservable: false` for very large read-only lists where per-field
92
77
  // atoms cost more than the QueryView's entry-replaced reactivity.
93
78
  build(shape, opts, { mutable: false, load: 'instant', lazyObservable: true }),
@@ -1,48 +1,25 @@
1
1
  /**
2
- * Canonical Zod description of the `sync_deltas` STORAGE ROW, decomposed by the
3
- * subsystem it belongs to and the database plane it lives in.
2
+ * Zod schemas that describe the `sync_deltas` storage row the durable record of
3
+ * one committed change. The row is split into three slices by the concern each one
4
+ * serves:
4
5
  *
5
- * `sync_deltas` fuses five control-plane subsystems onto one denormalized row
6
- * (see `docs/plans/sync-delta-zod-decomposition.md`). This module is **P0** of
7
- * that decomposition: it DESCRIBES the existing columns as Zod schemas no DB
8
- * change, no rewiring so the subsystem + plane boundaries become explicit and
9
- * type-enforced:
6
+ * - {@link syncDeltaCoreSchema} the sync-protocol slice: everything a client
7
+ * needs to reconstruct the change, plus the tenant key. This is the portable
8
+ * part, and the only part written atomically with the application row.
9
+ * - {@link deltaAttributionSchema}who made the change, and on whose authority.
10
+ * - {@link deltaProvenanceSchema} — which AI task, if any, produced it.
10
11
  *
11
- * - {@link syncDeltaCoreSchema} the SYNC-PROTOCOL slice. `tenant` plane:
12
- * the only part that must be written
13
- * atomically with the app row, and the shape
14
- * a BYO outbox marker carries (the portable
15
- * slice).
16
- * - {@link deltaAttributionSchema} — who / on whose authority. `control` plane.
17
- * - {@link deltaProvenanceSchema} — which AI task caused it. `control` plane.
12
+ * {@link syncDeltaRowSchema} composes all three into the full stored row.
13
+ * {@link DELTA_RESIDENCY} records which database each slice lives in, so
14
+ * provisioning can derive that boundary from the schema instead of hand-coding it.
18
15
  *
19
- * {@link syncDeltaRowSchema} is the full stored row (core attribution
20
- * provenance). {@link DELTA_RESIDENCY} declares each slice's plane so provisioning
21
- * (P1) can derive "what a customer DB gets" from the schema, not hand-code it.
22
- *
23
- * Distinct from the WIRE `SyncDelta` (`sync/SyncWebSocket.ts`, client-facing) and
24
- * `SourceDelta` (`source/index.ts`, source-mode input) — those are projections of
25
- * this row. Field names mirror those + `AuditChainRow` (`@ablo/audit-chain`).
26
- *
27
- * Monorepo is on Zod v4 — `.extend(...).shape` (not deprecated `.merge`).
16
+ * This is the stored shape. The delta broadcast to clients is a narrower projection
17
+ * of it — see {@link import('../wire/delta.js').syncDeltaWireCoreSchema} and
18
+ * the field names here mirror those on that wire delta.
28
19
  */
29
20
  import { z } from 'zod';
30
- /** `participant_kind` */
31
- export declare const participantKindSchema: z.ZodEnum<{
32
- user: "user";
33
- agent: "agent";
34
- system: "system";
35
- }>;
36
- export type ParticipantKind = z.infer<typeof participantKindSchema>;
37
- /** `confirmation_state` */
38
- export declare const confirmationStateSchema: z.ZodEnum<{
39
- auto: "auto";
40
- previewed: "previewed";
41
- approved: "approved";
42
- required_human_approval: "required_human_approval";
43
- auto_historical: "auto_historical";
44
- }>;
45
- export type ConfirmationState = z.infer<typeof confirmationStateSchema>;
21
+ export { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
22
+ export type { ParticipantKind, ConfirmationState } from '../wire/delta.js';
46
23
  /** `backfill_provenance` */
47
24
  export declare const backfillProvenanceSchema: z.ZodEnum<{
48
25
  unknown: "unknown";
@@ -51,11 +28,11 @@ export declare const backfillProvenanceSchema: z.ZodEnum<{
51
28
  }>;
52
29
  export type BackfillProvenance = z.infer<typeof backfillProvenanceSchema>;
53
30
  /**
54
- * Everything a client needs to materialize the change, plus the tenant key. The
55
- * portable slice: the only part written atomically with the app row, and the
56
- * shape a BYO outbox marker carries. `id` / `createdAt` / `syncGroups` are
57
- * control-plane-assigned at enrich/append time, so they're optional here (an
58
- * outbox marker doesn't have them yet).
31
+ * Everything a client needs to materialize the change, plus the tenant key. This
32
+ * is the portable slice: the only part written atomically with the application
33
+ * row, and the shape an outbox marker in a customer's own database carries. `id`,
34
+ * `createdAt`, and `syncGroups` are assigned by the server when the delta is
35
+ * appended, so they are optional here — an outbox marker does not have them yet.
59
36
  */
60
37
  export declare const syncDeltaCoreSchema: z.ZodObject<{
61
38
  id: z.ZodOptional<z.ZodUnion<readonly [z.ZodBigInt, z.ZodNumber]>>;
@@ -104,7 +81,7 @@ export declare const deltaProvenanceSchema: z.ZodObject<{
104
81
  causedByTaskId: z.ZodNullable<z.ZodString>;
105
82
  }, z.core.$strip>;
106
83
  export type DeltaProvenance = z.infer<typeof deltaProvenanceSchema>;
107
- /** The complete `sync_deltas` row as stored today (core attribution provenance). */
84
+ /** The complete `sync_deltas` row: core, attribution, and provenance combined. */
108
85
  export declare const syncDeltaRowSchema: z.ZodObject<{
109
86
  id: z.ZodOptional<z.ZodUnion<readonly [z.ZodBigInt, z.ZodNumber]>>;
110
87
  actionType: z.ZodString;
@@ -147,10 +124,10 @@ export declare const syncDeltaRowSchema: z.ZodObject<{
147
124
  }, z.core.$strip>;
148
125
  export type SyncDeltaRow = z.infer<typeof syncDeltaRowSchema>;
149
126
  /**
150
- * Each slice's database plane. The durable answer to "what does a BYO customer DB
151
- * get?" only `tenant`-plane slices. Provisioning (P1) reads this instead of
152
- * hand-coding the boundary; the BYO outbox writes the `tenant` slice and the
153
- * relay enriches the `control` slices in Ablo's own database.
127
+ * Maps each slice to the database it belongs in. A customer's own database holds
128
+ * only the `tenant` slice; the `control` slices are enriched and stored in the
129
+ * host's own database. Provisioning reads this map to decide which columns a given
130
+ * database receives, rather than hand-coding the boundary.
154
131
  */
155
132
  export declare const DELTA_RESIDENCY: {
156
133
  readonly core: "tenant";
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Zod schemas that describe the `sync_deltas` storage row — the durable record of
3
+ * one committed change. The row is split into three slices by the concern each one
4
+ * serves:
5
+ *
6
+ * - {@link syncDeltaCoreSchema} — the sync-protocol slice: everything a client
7
+ * needs to reconstruct the change, plus the tenant key. This is the portable
8
+ * part, and the only part written atomically with the application row.
9
+ * - {@link deltaAttributionSchema} — who made the change, and on whose authority.
10
+ * - {@link deltaProvenanceSchema} — which AI task, if any, produced it.
11
+ *
12
+ * {@link syncDeltaRowSchema} composes all three into the full stored row.
13
+ * {@link DELTA_RESIDENCY} records which database each slice lives in, so
14
+ * provisioning can derive that boundary from the schema instead of hand-coding it.
15
+ *
16
+ * This is the stored shape. The delta broadcast to clients is a narrower projection
17
+ * of it — see {@link import('../wire/delta.js').syncDeltaWireCoreSchema} — and
18
+ * the field names here mirror those on that wire delta.
19
+ */
20
+ import { z } from 'zod';
21
+ import { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
22
+ // ── Enumerations that mirror the corresponding Postgres enum types ────────────
23
+ // `participant_kind` and `confirmation_state` are shared with the wire delta and
24
+ // live at the wire layer (see `../wire/delta.js`); they are re-exported here so
25
+ // code that imports them from `schema` keeps resolving.
26
+ export { participantKindSchema, confirmationStateSchema } from '../wire/delta.js';
27
+ /** `backfill_provenance` */
28
+ export const backfillProvenanceSchema = z.enum(['exact', 'inferred', 'unknown']);
29
+ /** A delta payload: the full post-mutation row (or null for deletes). */
30
+ const deltaDataSchema = z.record(z.string(), z.unknown()).nullable();
31
+ // ── Core — the sync-protocol slice ────────────────────────────────────────────
32
+ /**
33
+ * Everything a client needs to materialize the change, plus the tenant key. This
34
+ * is the portable slice: the only part written atomically with the application
35
+ * row, and the shape an outbox marker in a customer's own database carries. `id`,
36
+ * `createdAt`, and `syncGroups` are assigned by the server when the delta is
37
+ * appended, so they are optional here — an outbox marker does not have them yet.
38
+ */
39
+ export const syncDeltaCoreSchema = z.object({
40
+ /** Monotonically increasing sync id, assigned by the server when the delta is appended; absent on an outbox marker. */
41
+ id: z.union([z.bigint(), z.number()]).optional(),
42
+ /** The `action_type` column: a single character, `I` (insert), `U` (update), or `D` (delete). */
43
+ actionType: z.string().min(1).max(1),
44
+ modelName: z.string().min(1),
45
+ modelId: z.string().min(1),
46
+ data: deltaDataSchema,
47
+ previousData: deltaDataSchema.optional(),
48
+ /** Routing keys that decide which subscribers receive this delta; computed by the server at append time. */
49
+ syncGroups: z.array(z.string()).optional(),
50
+ /** The committing organization id — the coarse-grained tenant-isolation boundary. */
51
+ organizationId: z.string().nullable(),
52
+ /** ISO 8601 timestamp, assigned by the server when the delta is appended. */
53
+ createdAt: z.string().optional(),
54
+ transactionId: z.string().nullable(),
55
+ });
56
+ // ── Attribution — who made the change, and on whose authority ─────────────────
57
+ export const deltaAttributionSchema = z.object({
58
+ /** The acting participant, recorded as a single column for compatibility; the structured pair below is the richer form. */
59
+ createdBy: z.string().nullable(),
60
+ actorId: z.string().nullable(),
61
+ actorKind: participantKindSchema.nullable(),
62
+ onBehalfOfId: z.string().nullable(),
63
+ onBehalfOfKind: participantKindSchema.nullable(),
64
+ capabilityId: z.string().nullable(),
65
+ delegationChainRootUserId: z.string().nullable().optional(),
66
+ confirmationState: confirmationStateSchema.nullable(),
67
+ backfillProvenance: backfillProvenanceSchema.nullable(),
68
+ });
69
+ // ── Provenance — which AI task produced the change ────────────────────────────
70
+ export const deltaProvenanceSchema = z.object({
71
+ /** Foreign key to the task record for the AI turn that produced this commit; null when no task applies. */
72
+ causedByTaskId: z.string().nullable(),
73
+ });
74
+ // ── Full stored row and its residency map ─────────────────────────────────────
75
+ /** The complete `sync_deltas` row: core, attribution, and provenance combined. */
76
+ export const syncDeltaRowSchema = syncDeltaCoreSchema
77
+ .extend(deltaAttributionSchema.shape)
78
+ .extend(deltaProvenanceSchema.shape);
79
+ /**
80
+ * Maps each slice to the database it belongs in. A customer's own database holds
81
+ * only the `tenant` slice; the `control` slices are enriched and stored in the
82
+ * host's own database. Provisioning reads this map to decide which columns a given
83
+ * database receives, rather than hand-coding the boundary.
84
+ */
85
+ export const DELTA_RESIDENCY = {
86
+ core: 'tenant',
87
+ attribution: 'control',
88
+ provenance: 'control',
89
+ };