@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,225 +0,0 @@
1
- /**
2
- * Computes the migration plan that turns one schema into another. Given two
3
- * serialized schemas — the one currently active and the one being pushed — it
4
- * produces an ordered list of {@link MigrationStep}s describing how to evolve the
5
- * database, and a {@link MigrationClassification} that separates the risky parts
6
- * into warnings (they run, but may lose or risk data on a non-empty table) and
7
- * unexecutable steps (they fail on a non-empty table unless a backfill or default
8
- * is supplied). This module only plans: it has no database dependency and emits no
9
- * SQL, so it can be unit-tested exhaustively and reused by the command-line tools.
10
- * Turning a step into SQL and running it happens in the host implementation, which
11
- * owns the column-type mapping and row-security rules.
12
- *
13
- * A few design choices worth knowing about:
14
- * - Renames are supplied as data through {@link RenameHints}, not guessed. Without
15
- * a hint, a removed field plus an added field reads as a drop followed by an add,
16
- * which is the safe (lossy) default; a hint tells the planner they are the same
17
- * field under a new name.
18
- * - Destructive changes fall into two tiers — warnings versus unexecutable — and a
19
- * type change carries its own sub-tier ({@link CastSafety}: safe, risky, or not
20
- * castable) that decides between an in-place `ALTER COLUMN … TYPE` and a lossy
21
- * drop-and-recreate.
22
- * - A single {@link FieldChanges} value records which facets of a column changed
23
- * (type, nullability, enum values, index) so one `alter_field` step covers them
24
- * all instead of several separate steps.
25
- *
26
- * Steps come back in expand-then-contract order — add before drop, widen before
27
- * narrow: create models, rename, add columns (always nullable), alter, drop columns,
28
- * drop models. A newly added column is never created `NOT NULL`; making a column
29
- * required is a separate nullability change that a backfill must run before.
30
- */
31
- import type { FieldMeta } from '../transaction/schema/field.js';
32
- import type { SchemaJSON } from './serialize.js';
33
- export type FieldType = FieldMeta['type'];
34
- /** Whether a Postgres `ALTER COLUMN … TYPE` can preserve the existing data. */
35
- export type CastSafety = 'safe' | 'risky' | 'notCastable';
36
- /** Records a column's type change and how safely Postgres can carry it out. */
37
- export interface FieldTypeChange {
38
- readonly from: FieldType;
39
- readonly to: FieldType;
40
- /** How the type change is carried out: `safe` runs a plain `ALTER COLUMN … TYPE`;
41
- * `risky` runs one with a `USING` cast that may fail on some rows; `notCastable`
42
- * drops and recreates the column, losing its data. */
43
- readonly cast: CastSafety;
44
- }
45
- /** Records a change to whether a field is optional. Going from optional to required
46
- * (`true → false`) is the dangerous direction: it fails if any existing row holds
47
- * a null. */
48
- export interface NullabilityChange {
49
- readonly fromOptional: boolean;
50
- readonly toOptional: boolean;
51
- }
52
- /** Records which allowed values an enum field gained and lost. Removing a value is
53
- * the risky part — existing rows still holding it violate the new constraint. */
54
- export interface EnumValuesChange {
55
- readonly added: readonly string[];
56
- readonly removed: readonly string[];
57
- }
58
- /** Records a change to whether a field is indexed (`from` was, `to` will be). */
59
- export interface IndexChange {
60
- readonly from: boolean;
61
- readonly to: boolean;
62
- }
63
- /** Records a change to the physical database column name backing a field whose
64
- * logical name stayed the same. */
65
- export interface FieldColumnChange {
66
- readonly from: string;
67
- readonly to: string;
68
- }
69
- /** The set of facets of a single column that changed. Each optional member is
70
- * present only when that facet actually changed, so one `alter_field` step can
71
- * describe several simultaneous changes to the same column. */
72
- export interface FieldChanges {
73
- readonly column?: FieldColumnChange;
74
- readonly type?: FieldTypeChange;
75
- readonly nullability?: NullabilityChange;
76
- readonly enumValues?: EnumValuesChange;
77
- readonly indexed?: IndexChange;
78
- }
79
- /** One step in a migration plan. The `kind` tag names the operation and the
80
- * remaining fields carry its target and payload. {@link diffSchema} emits these in
81
- * expand-then-contract order, and the host implementation lowers each to SQL. */
82
- export type MigrationStep = {
83
- readonly kind: 'create_model';
84
- readonly model: string;
85
- readonly tableName: string;
86
- } | {
87
- readonly kind: 'drop_model';
88
- readonly model: string;
89
- readonly tableName: string;
90
- } | {
91
- readonly kind: 'rename_model';
92
- readonly from: string;
93
- readonly to: string;
94
- } | {
95
- readonly kind: 'add_field';
96
- readonly model: string;
97
- readonly field: string;
98
- readonly meta: FieldMeta;
99
- } | {
100
- readonly kind: 'drop_field';
101
- readonly model: string;
102
- readonly field: string;
103
- } | {
104
- readonly kind: 'rename_field';
105
- readonly model: string;
106
- readonly from: string;
107
- readonly to: string;
108
- } | {
109
- readonly kind: 'alter_field';
110
- readonly model: string;
111
- readonly field: string;
112
- readonly changes: FieldChanges;
113
- };
114
- /**
115
- * Tells {@link diffSchema} which removed-and-added pairs are really renames. Supply
116
- * these as data because the planner cannot safely guess: without a hint, a field
117
- * that disappears and a field that appears read as a drop followed by an add, which
118
- * loses the column's data. Each field rename names its model by the model's key in
119
- * the new schema, after any model rename has been applied.
120
- */
121
- export interface RenameHints {
122
- readonly models?: readonly {
123
- readonly from: string;
124
- readonly to: string;
125
- }[];
126
- readonly fields?: readonly {
127
- readonly model: string;
128
- readonly from: string;
129
- readonly to: string;
130
- }[];
131
- }
132
- /** Reports how safely a field's type can change from `from` to `to`. The same type
133
- * in and out is always safe; anything else is looked up in the cast-safety matrix
134
- * and defaults to `notCastable` when no entry exists. */
135
- export declare function classifyCast(from: FieldType, to: FieldType): CastSafety;
136
- /**
137
- * Diff two serialized schemas into an ordered, expand→contract migration plan.
138
- * `prev` is the active schema (`null` for a first push → all creates). Rename
139
- * decisions are supplied via {@link RenameHints}; anything not hinted reads as
140
- * drop+add.
141
- */
142
- export declare function diffSchema(prev: SchemaJSON | null, next: SchemaJSON, hints?: RenameHints): MigrationStep[];
143
- /**
144
- * Why a migration step is flagged as a warning — a change that runs but may lose or
145
- * risk data on a non-empty table. Each code corresponds to one destructive step
146
- * kind that {@link classifyMigration} recognizes.
147
- */
148
- export type WarningCode = 'drop_model' | 'drop_field' | 'risky_cast' | 'lossy_recreate' | 'enum_value_removed'
149
- /** A model stops being served to readers even though no table is dropped. This is
150
- * raised when a push is accepted, not by {@link classifyMigration}, and the loss
151
- * is visibility, not data — the underlying rows are left untouched. */
152
- | 'remove_model';
153
- /** Why a migration step is unexecutable — it fails on a non-empty table unless a
154
- * default or backfill is supplied. Both cases introduce a requirement that existing
155
- * rows might not satisfy. */
156
- export type BlockerCode = 'required_field_added' | 'made_required';
157
- /**
158
- * One flagged change in a classified migration plan. {@link code} says what kind of
159
- * risk it is, {@link model} and the optional {@link field} say where, and
160
- * {@link detail} is a human-readable explanation suitable for showing to a
161
- * developer.
162
- */
163
- export interface MigrationSignal {
164
- readonly code: WarningCode | BlockerCode;
165
- readonly model: string;
166
- readonly field?: string;
167
- readonly detail: string;
168
- /**
169
- * Extra context for a removal signal: the previously active schema this push was
170
- * compared against. Tools use it to show which baseline made the push look
171
- * incompatible — its version and when it was pushed — so the warning is not a
172
- * mystery.
173
- */
174
- readonly shadowed?: {
175
- readonly environment: string;
176
- readonly version: number;
177
- /** ISO 8601 timestamp when the compared-against schema was pushed, or null. */
178
- readonly pushedAt: string | null;
179
- /** Who pushed the compared-against schema, or null. */
180
- readonly pushedBy: string | null;
181
- };
182
- }
183
- /** The result of classifying a migration plan: its flagged changes split by
184
- * severity. Produced by {@link classifyMigration} and read by
185
- * {@link isAutoApplicable} and {@link unresolvedBlockers}. */
186
- export interface MigrationClassification {
187
- /** Changes that run but may lose or risk data on a non-empty table. */
188
- readonly warnings: readonly MigrationSignal[];
189
- /** Changes that fail on a non-empty table unless a default or backfill is supplied. */
190
- readonly unexecutable: readonly MigrationSignal[];
191
- }
192
- /**
193
- * Sorts a plan's steps into {@link MigrationClassification.warnings} and
194
- * {@link MigrationClassification.unexecutable}. Because a step carries no per-field
195
- * default, adding a required field is treated conservatively as unexecutable — the
196
- * classifier cannot prove a default exists, so a backfill or default must resolve
197
- * it. The classification is derived from the schema alone; whoever runs the plan can
198
- * still downgrade a flagged step to a no-op once it finds the target table is empty.
199
- */
200
- export declare function classifyMigration(steps: readonly MigrationStep[]): MigrationClassification;
201
- /** Whether a plan is safe to apply automatically — true when it has no unexecutable
202
- * steps. Warnings do not block auto-apply; only unexecutable steps do. */
203
- export declare function isAutoApplicable(classification: MigrationClassification): boolean;
204
- /**
205
- * A constant value to write into existing rows so an otherwise-unexecutable step can
206
- * run: a required field added to a non-empty table, or a field made required while
207
- * some rows hold null. This is intentionally a single constant, not an SQL
208
- * expression — it covers the common "new column defaults to X" case; anything more
209
- * elaborate is out of scope.
210
- */
211
- export interface BackfillValue {
212
- readonly model: string;
213
- readonly field: string;
214
- readonly value: string | number | boolean;
215
- }
216
- /**
217
- * Reports whether a supplied backfill resolves this blocker. Only the two
218
- * row-dependent blockers — `required_field_added` and `made_required` — can be
219
- * resolved with a backfill; a data-loss warning cannot, and must be accepted
220
- * explicitly instead.
221
- */
222
- export declare function isBlockerResolved(signal: MigrationSignal, backfills: readonly BackfillValue[]): boolean;
223
- /** The unexecutable signals that the supplied backfills do not cover. An empty
224
- * result means no blocker remains, though any warnings are still gated separately. */
225
- export declare function unresolvedBlockers(classification: MigrationClassification, backfills: readonly BackfillValue[]): readonly MigrationSignal[];
@@ -1,289 +0,0 @@
1
- /**
2
- * Computes the migration plan that turns one schema into another. Given two
3
- * serialized schemas — the one currently active and the one being pushed — it
4
- * produces an ordered list of {@link MigrationStep}s describing how to evolve the
5
- * database, and a {@link MigrationClassification} that separates the risky parts
6
- * into warnings (they run, but may lose or risk data on a non-empty table) and
7
- * unexecutable steps (they fail on a non-empty table unless a backfill or default
8
- * is supplied). This module only plans: it has no database dependency and emits no
9
- * SQL, so it can be unit-tested exhaustively and reused by the command-line tools.
10
- * Turning a step into SQL and running it happens in the host implementation, which
11
- * owns the column-type mapping and row-security rules.
12
- *
13
- * A few design choices worth knowing about:
14
- * - Renames are supplied as data through {@link RenameHints}, not guessed. Without
15
- * a hint, a removed field plus an added field reads as a drop followed by an add,
16
- * which is the safe (lossy) default; a hint tells the planner they are the same
17
- * field under a new name.
18
- * - Destructive changes fall into two tiers — warnings versus unexecutable — and a
19
- * type change carries its own sub-tier ({@link CastSafety}: safe, risky, or not
20
- * castable) that decides between an in-place `ALTER COLUMN … TYPE` and a lossy
21
- * drop-and-recreate.
22
- * - A single {@link FieldChanges} value records which facets of a column changed
23
- * (type, nullability, enum values, index) so one `alter_field` step covers them
24
- * all instead of several separate steps.
25
- *
26
- * Steps come back in expand-then-contract order — add before drop, widen before
27
- * narrow: create models, rename, add columns (always nullable), alter, drop columns,
28
- * drop models. A newly added column is never created `NOT NULL`; making a column
29
- * required is a separate nullability change that a backfill must run before.
30
- */
31
- // ── Cast safety matrix ────────────────────────────────────────────────────────
32
- // Keyed `${from}->${to}` over the 6 sync field types. Targets that map to TEXT
33
- // (`string`) accept any scalar losslessly; tightening into an `enum` adds a CHECK
34
- // that existing rows may violate (risky); narrowing into number/bool/date/json
35
- // is risky (USING cast can fail per-row) or impossible (notCastable).
36
- const CAST = {
37
- // → string (TEXT): always safe
38
- 'number->string': 'safe', 'boolean->string': 'safe', 'date->string': 'safe',
39
- 'enum->string': 'safe', 'json->string': 'safe',
40
- // → enum (TEXT + CHECK): constraint over existing data is risky
41
- 'string->enum': 'risky', 'number->enum': 'risky', 'boolean->enum': 'risky',
42
- 'date->enum': 'risky', 'json->enum': 'notCastable',
43
- // → number (DOUBLE PRECISION)
44
- 'string->number': 'risky', 'enum->number': 'risky', 'boolean->number': 'notCastable',
45
- 'date->number': 'notCastable', 'json->number': 'notCastable',
46
- // → boolean
47
- 'string->boolean': 'risky', 'enum->boolean': 'risky', 'number->boolean': 'risky',
48
- 'date->boolean': 'notCastable', 'json->boolean': 'notCastable',
49
- // → date (TIMESTAMPTZ)
50
- 'string->date': 'risky', 'enum->date': 'risky', 'number->date': 'notCastable',
51
- 'boolean->date': 'notCastable', 'json->date': 'notCastable',
52
- // → json (JSONB)
53
- 'string->json': 'risky', 'enum->json': 'risky', 'number->json': 'notCastable',
54
- 'boolean->json': 'notCastable', 'date->json': 'notCastable',
55
- };
56
- /** Reports how safely a field's type can change from `from` to `to`. The same type
57
- * in and out is always safe; anything else is looked up in the cast-safety matrix
58
- * and defaults to `notCastable` when no entry exists. */
59
- export function classifyCast(from, to) {
60
- if (from === to)
61
- return 'safe';
62
- return CAST[`${from}->${to}`] ?? 'notCastable';
63
- }
64
- // ── Diff ──────────────────────────────────────────────────────────────────────
65
- function diffEnumValues(from, to) {
66
- const a = new Set(from ?? []);
67
- const b = new Set(to ?? []);
68
- const added = [...b].filter((v) => !a.has(v));
69
- const removed = [...a].filter((v) => !b.has(v));
70
- if (added.length === 0 && removed.length === 0)
71
- return undefined;
72
- return { added, removed };
73
- }
74
- function camelToSnake(identifier) {
75
- return identifier.replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`);
76
- }
77
- function columnNameOf(fieldName, meta) {
78
- return meta.column ?? camelToSnake(fieldName);
79
- }
80
- function diffField(prevFieldName, nextFieldName, prev, next) {
81
- const changes = {};
82
- const prevColumn = columnNameOf(prevFieldName, prev);
83
- const nextColumn = columnNameOf(nextFieldName, next);
84
- if (prevColumn !== nextColumn) {
85
- changes.column = { from: prevColumn, to: nextColumn };
86
- }
87
- if (prev.type !== next.type) {
88
- changes.type = { from: prev.type, to: next.type, cast: classifyCast(prev.type, next.type) };
89
- }
90
- if (prev.isOptional !== next.isOptional) {
91
- changes.nullability = { fromOptional: prev.isOptional, toOptional: next.isOptional };
92
- }
93
- // Enum value drift only matters while the field is (still) an enum; a type
94
- // change away from enum is already captured by `type`.
95
- if (prev.type === 'enum' && next.type === 'enum') {
96
- const ev = diffEnumValues(prev.enumValues, next.enumValues);
97
- if (ev)
98
- changes.enumValues = ev;
99
- }
100
- if (prev.isIndexed !== next.isIndexed) {
101
- changes.indexed = { from: prev.isIndexed, to: next.isIndexed };
102
- }
103
- return Object.keys(changes).length === 0 ? null : changes;
104
- }
105
- function tableNameOf(model, key) {
106
- return model.tableName ?? key;
107
- }
108
- function diffModelFields(model, prev, next, fieldRenames) {
109
- const steps = [];
110
- const renameByNewName = new Map(fieldRenames.map((r) => [r.to, r.from]));
111
- const renamedFromNames = new Set(fieldRenames.map((r) => r.from));
112
- // Renames first (so subsequent alter steps reference the new name).
113
- for (const { from, to } of fieldRenames) {
114
- if (from in prev.fields && to in next.fields) {
115
- steps.push({ kind: 'rename_field', model, from, to });
116
- }
117
- }
118
- // Added (present in next, not in prev, and not the target of a rename).
119
- for (const [name, meta] of Object.entries(next.fields)) {
120
- if (name in prev.fields)
121
- continue;
122
- if (renameByNewName.has(name))
123
- continue;
124
- steps.push({ kind: 'add_field', model, field: name, meta });
125
- }
126
- // Altered: every field present in both (directly or via rename).
127
- for (const [name, nextMeta] of Object.entries(next.fields)) {
128
- const prevName = renameByNewName.get(name) ?? name;
129
- const prevMeta = prev.fields[prevName];
130
- if (!prevMeta)
131
- continue;
132
- const changes = diffField(prevName, name, prevMeta, nextMeta);
133
- if (changes?.column && renameByNewName.has(name)) {
134
- // A hinted logical field rename already emits `rename_field`, whose
135
- // lowering renames the physical column when needed. Do not emit a
136
- // second `alter_field.column` for the same transition.
137
- delete changes.column;
138
- }
139
- if (changes && Object.keys(changes).length > 0) {
140
- steps.push({ kind: 'alter_field', model, field: name, changes });
141
- }
142
- }
143
- // Dropped (present in prev, not in next, and not renamed away).
144
- for (const name of Object.keys(prev.fields)) {
145
- if (name in next.fields)
146
- continue;
147
- if (renamedFromNames.has(name))
148
- continue;
149
- steps.push({ kind: 'drop_field', model, field: name });
150
- }
151
- return steps;
152
- }
153
- /**
154
- * Diff two serialized schemas into an ordered, expand→contract migration plan.
155
- * `prev` is the active schema (`null` for a first push → all creates). Rename
156
- * decisions are supplied via {@link RenameHints}; anything not hinted reads as
157
- * drop+add.
158
- */
159
- export function diffSchema(prev, next, hints = {}) {
160
- if (!prev) {
161
- // First push: every model is created, with its fields carried in the
162
- // create (no per-field add steps — the table is born with them).
163
- return Object.entries(next.models).map(([model, def]) => ({
164
- kind: 'create_model',
165
- model,
166
- tableName: tableNameOf(def, model),
167
- }));
168
- }
169
- const modelRenames = hints.models ?? [];
170
- const renameByNewModel = new Map(modelRenames.map((r) => [r.to, r.from]));
171
- const renamedFromModels = new Set(modelRenames.map((r) => r.from));
172
- const fieldHints = hints.fields ?? [];
173
- const creates = [];
174
- const renames = [];
175
- const fieldSteps = [];
176
- const drops = [];
177
- // New + renamed models, and per-model field diffs.
178
- for (const [model, nextDef] of Object.entries(next.models)) {
179
- const prevModelKey = renameByNewModel.get(model) ?? model;
180
- const prevDef = prev.models[prevModelKey];
181
- if (!prevDef) {
182
- creates.push({ kind: 'create_model', model, tableName: tableNameOf(nextDef, model) });
183
- continue;
184
- }
185
- if (renameByNewModel.has(model)) {
186
- renames.push({ kind: 'rename_model', from: prevModelKey, to: model });
187
- }
188
- const myFieldRenames = fieldHints
189
- .filter((f) => f.model === model)
190
- .map((f) => ({ from: f.from, to: f.to }));
191
- fieldSteps.push(...diffModelFields(model, prevDef, nextDef, myFieldRenames));
192
- }
193
- // Dropped models (in prev, not in next, not renamed away).
194
- for (const [model, prevDef] of Object.entries(prev.models)) {
195
- if (model in next.models)
196
- continue;
197
- if (renamedFromModels.has(model))
198
- continue;
199
- drops.push({ kind: 'drop_model', model, tableName: tableNameOf(prevDef, model) });
200
- }
201
- // Expand → contract ordering. Within fieldSteps the per-model helper already
202
- // emits rename → add → alter → drop_field, which preserves the same invariant.
203
- return [...creates, ...renames, ...fieldSteps, ...drops];
204
- }
205
- /**
206
- * Sorts a plan's steps into {@link MigrationClassification.warnings} and
207
- * {@link MigrationClassification.unexecutable}. Because a step carries no per-field
208
- * default, adding a required field is treated conservatively as unexecutable — the
209
- * classifier cannot prove a default exists, so a backfill or default must resolve
210
- * it. The classification is derived from the schema alone; whoever runs the plan can
211
- * still downgrade a flagged step to a no-op once it finds the target table is empty.
212
- */
213
- export function classifyMigration(steps) {
214
- const warnings = [];
215
- const unexecutable = [];
216
- for (const step of steps) {
217
- switch (step.kind) {
218
- case 'drop_model':
219
- warnings.push({ code: 'drop_model', model: step.model, detail: `drops table for "${step.model}" (data loss)` });
220
- break;
221
- case 'drop_field':
222
- warnings.push({ code: 'drop_field', model: step.model, field: step.field, detail: `drops column "${step.field}" (data loss)` });
223
- break;
224
- case 'add_field':
225
- if (!step.meta.isOptional) {
226
- unexecutable.push({
227
- code: 'required_field_added',
228
- model: step.model,
229
- field: step.field,
230
- detail: `adds required column "${step.field}" — needs a default or backfill on a non-empty table`,
231
- });
232
- }
233
- break;
234
- case 'alter_field': {
235
- const { changes } = step;
236
- if (changes.nullability && changes.nullability.fromOptional && !changes.nullability.toOptional) {
237
- unexecutable.push({
238
- code: 'made_required',
239
- model: step.model,
240
- field: step.field,
241
- detail: `makes "${step.field}" required — fails if existing rows are NULL`,
242
- });
243
- }
244
- if (changes.type) {
245
- if (changes.type.cast === 'risky') {
246
- warnings.push({ code: 'risky_cast', model: step.model, field: step.field, detail: `${changes.type.from} → ${changes.type.to} may fail per-row` });
247
- }
248
- else if (changes.type.cast === 'notCastable') {
249
- warnings.push({ code: 'lossy_recreate', model: step.model, field: step.field, detail: `${changes.type.from} → ${changes.type.to} requires drop-and-recreate (data loss)` });
250
- }
251
- }
252
- if (changes.enumValues && changes.enumValues.removed.length > 0) {
253
- warnings.push({
254
- code: 'enum_value_removed',
255
- model: step.model,
256
- field: step.field,
257
- detail: `removes enum value(s) ${changes.enumValues.removed.join(', ')} — rows using them violate the new CHECK`,
258
- });
259
- }
260
- break;
261
- }
262
- // create_model, rename_model, rename_field, add optional field: non-destructive.
263
- default:
264
- break;
265
- }
266
- }
267
- return { warnings, unexecutable };
268
- }
269
- /** Whether a plan is safe to apply automatically — true when it has no unexecutable
270
- * steps. Warnings do not block auto-apply; only unexecutable steps do. */
271
- export function isAutoApplicable(classification) {
272
- return classification.unexecutable.length === 0;
273
- }
274
- /**
275
- * Reports whether a supplied backfill resolves this blocker. Only the two
276
- * row-dependent blockers — `required_field_added` and `made_required` — can be
277
- * resolved with a backfill; a data-loss warning cannot, and must be accepted
278
- * explicitly instead.
279
- */
280
- export function isBlockerResolved(signal, backfills) {
281
- if (signal.code !== 'required_field_added' && signal.code !== 'made_required')
282
- return false;
283
- return backfills.some((b) => b.model === signal.model && b.field === signal.field);
284
- }
285
- /** The unexecutable signals that the supplied backfills do not cover. An empty
286
- * result means no blocker remains, though any warnings are still gated separately. */
287
- export function unresolvedBlockers(classification, backfills) {
288
- return classification.unexecutable.filter((s) => !isBlockerResolved(s, backfills));
289
- }
@@ -1,19 +0,0 @@
1
- /**
2
- * Generates TypeScript types from a serialized schema. Given the schema, it produces
3
- * the source text of a `.ts` module containing one row interface per model plus an
4
- * `AbloSchema` map, so an app is typed against the same schema the database and sync
5
- * layer enforce. This function is pure and returns the source as a string; the
6
- * command-line tool writes it to disk.
7
- *
8
- * It is the counterpart to the migration planner in {@link diffSchema}: you write one
9
- * schema definition, push it (which migrates the database), and generate types from
10
- * that same schema, so the types you code against, the rows the database stores, and
11
- * the entities the sync layer moves all describe the same thing.
12
- *
13
- * The generated interface covers the base columns plus each declared field, with
14
- * enums emitted as string-literal unions. Relations are not expanded here — the
15
- * runtime SDK resolves those through its typed accessors.
16
- */
17
- import type { SchemaJSON } from './serialize.js';
18
- /** Emit a TypeScript module of row interfaces + the `AbloSchema` map. */
19
- export declare function generateTypes(schema: SchemaJSON): string;
@@ -1,86 +0,0 @@
1
- /**
2
- * Generates TypeScript types from a serialized schema. Given the schema, it produces
3
- * the source text of a `.ts` module containing one row interface per model plus an
4
- * `AbloSchema` map, so an app is typed against the same schema the database and sync
5
- * layer enforce. This function is pure and returns the source as a string; the
6
- * command-line tool writes it to disk.
7
- *
8
- * It is the counterpart to the migration planner in {@link diffSchema}: you write one
9
- * schema definition, push it (which migrates the database), and generate types from
10
- * that same schema, so the types you code against, the rows the database stores, and
11
- * the entities the sync layer moves all describe the same thing.
12
- *
13
- * The generated interface covers the base columns plus each declared field, with
14
- * enums emitted as string-literal unions. Relations are not expanded here — the
15
- * runtime SDK resolves those through its typed accessors.
16
- */
17
- import { BASE_FIELDS } from '../transaction/schema/schema.js';
18
- function tsType(meta) {
19
- switch (meta.type) {
20
- case 'string':
21
- return 'string';
22
- case 'number':
23
- return 'number';
24
- case 'boolean':
25
- return 'boolean';
26
- case 'date':
27
- // `baseFieldsSchema` uses `z.date()` and the driver hydrates timestamptz
28
- // to Date — declared date fields match.
29
- return 'Date';
30
- case 'json':
31
- return 'unknown';
32
- case 'enum':
33
- return meta.enumValues && meta.enumValues.length > 0
34
- ? meta.enumValues.map((v) => `'${v.replace(/'/g, "\\'")}'`).join(' | ')
35
- : 'string';
36
- default:
37
- return 'unknown';
38
- }
39
- }
40
- /** A valid PascalCase TS identifier from a model's typename (or its key). */
41
- function interfaceName(model, key) {
42
- const raw = model.typename && model.typename.trim() ? model.typename : key;
43
- const id = raw
44
- .replace(/[^A-Za-z0-9]+/g, ' ')
45
- .trim()
46
- .split(/\s+/)
47
- .map((p) => p.charAt(0).toUpperCase() + p.slice(1))
48
- .join('');
49
- return /^[A-Za-z_]/.test(id) ? id : `Model${id}`;
50
- }
51
- /** Emit a TypeScript module of row interfaces + the `AbloSchema` map. */
52
- export function generateTypes(schema) {
53
- const lines = [
54
- '// Generated by `ablo generate` — do not edit by hand.',
55
- '// Re-run `ablo generate` after pushing a schema change.',
56
- '',
57
- ];
58
- const nameByKey = new Map();
59
- for (const [key, model] of Object.entries(schema.models)) {
60
- nameByKey.set(key, interfaceName(model, key));
61
- }
62
- for (const [key, model] of Object.entries(schema.models)) {
63
- lines.push(`export interface ${nameByKey.get(key)} {`);
64
- lines.push(' id: string;');
65
- lines.push(' createdAt: Date;');
66
- lines.push(' updatedAt: Date;');
67
- lines.push(' organizationId?: string;');
68
- lines.push(' createdBy?: string;');
69
- for (const [fieldName, meta] of Object.entries(model.fields)) {
70
- // A model that redeclares a base column doesn't double-emit it.
71
- if (BASE_FIELDS.includes(fieldName))
72
- continue;
73
- lines.push(` ${fieldName}${meta.isOptional ? '?' : ''}: ${tsType(meta)};`);
74
- }
75
- lines.push('}');
76
- lines.push('');
77
- }
78
- // The model map — parameterize the Ablo client with this for typed access.
79
- lines.push('export interface AbloSchema {');
80
- for (const key of Object.keys(schema.models)) {
81
- lines.push(` ${JSON.stringify(key)}: ${nameByKey.get(key)};`);
82
- }
83
- lines.push('}');
84
- lines.push('');
85
- return lines.join('\n');
86
- }
@@ -1,41 +0,0 @@
1
- /**
2
- * @abloatai/ablo/schema — Schema Definition DSL
3
- *
4
- * Define your data models with Zod. Types are inferred automatically.
5
- *
6
- * ```ts
7
- * import { z } from 'zod';
8
- * import { defineSchema, model, relation } from '@abloatai/ablo/schema';
9
- *
10
- * export const schema = defineSchema({
11
- * tasks: model({
12
- * title: z.string(),
13
- * status: z.enum(['todo', 'doing', 'done']).default('todo'),
14
- * projectId: z.string().optional(),
15
- * }, {
16
- * project: relation.belongsTo('projects', 'projectId'),
17
- * }),
18
- * });
19
- *
20
- * type Task = Model<typeof schema, 'tasks'>;
21
- * ```
22
- */
23
- export { z } from 'zod';
24
- export { field, indexed, getFieldMeta, type FieldBuilder, type FieldMeta } from '../transaction/schema/field.js';
25
- export { relation, type RelationDef, type RelationType } from '../transaction/schema/relation.js';
26
- export { tenancySchema, scopedViaRefSchema, policyInputSchema, resolvePolicy, resolveTenancy, tenancyColumn, DEFAULT_ORG_COLUMN, type Tenancy, type ScopedViaRef, type PolicyInput, } from '../transaction/schema/tenancy.js';
27
- export { residencySchema, DEFAULT_RESIDENCY, type ModelResidency, } from '../transaction/schema/residency.js';
28
- export { syncDeltaCoreSchema, deltaAttributionSchema, syncDeltaRowSchema, participantKindSchema, confirmationStateSchema, backfillProvenanceSchema, DELTA_DATA_CLASSIFICATION, DELTA_PHYSICAL_STORAGE, type SyncDeltaCore, type DeltaAttribution, type SyncDeltaRow, type ParticipantKind, type ConfirmationState, type BackfillProvenance, } from './syncDeltaRow.js';
29
- export { syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, type SyncDeltaAction, type WireDeltaData, type ParticipantRef, type SyncDeltaWireCore, type ClientSyncDelta, type ServerSyncDelta, } from '../transaction/wire/delta.js';
30
- export { model, scopeKindOf, LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap, type ModelDef, type ModelOptions, type PersistOptions, type RelationRecord, type GrantsRef, type ConflictAxis, } from '../transaction/schema/model.js';
31
- export { coordination, humansOverwrite, humansReject, humansNotify, agentsOverwrite, agentsReject, agentsNotify, systemOverwrite, systemReject, systemNotify, type ConflictRule, } from './coordination.js';
32
- export { mutable, readOnly, type SugarOptions } from './sugar.js';
33
- export { defineSchema, composeIdentitySyncGroups, type Schema, type SchemaRecord, type Model, type Row, type InferCreate, type InferRow, type InferModelNames, type BaseModelFields, type InsertValue, type UpsertValue, type UpdateValue, type DeleteId, type DefineSchemaOptions, type Casing, type CasingConvention, type CasingFn, composeEntitySyncGroups, intersectRequestedWithAllowed, type IdentityRole, type IdentityContext, type IdentityRoleSource, type EntityRole, type EntityContext, type EntityRoleSource, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, type SessionSettings, type SessionSettingSource, RESERVED_SESSION_SETTINGS, } from '../transaction/schema/schema.js';
34
- export { serializeSchema, parseSchema, toSchemaJSON, fromSchemaJSON, schemaHash, modelHash, type SchemaJSON, type ModelJSON, type RelationJSON, } from './serialize.js';
35
- export { selectModels, omitModels } from './select.js';
36
- export { generateProvisionPlan, generateMigrationPlan, appSchemaName, camelToSnake, snakeToCamel, q, sqlType, type ProvisionPlan, type MigrationPlan, } from './ddl.js';
37
- export { PG_LOCK_NOT_AVAILABLE, resolveDdlLockTimeout, resolveDdlMaxLockAttempts, ddlLockRetryBackoffMs, type DdlLockEnv, } from './ddlLock.js';
38
- export { diffSchema, classifyMigration, classifyCast, isAutoApplicable, isBlockerResolved, unresolvedBlockers, type BackfillValue, type MigrationStep, type FieldChanges, type FieldColumnChange, type FieldTypeChange, type NullabilityChange, type EnumValuesChange, type IndexChange, type CastSafety, type FieldType, type RenameHints, type MigrationSignal, type MigrationClassification, type WarningCode, type BlockerCode, } from './diff.js';
39
- export { generateTypes } from './generate.js';
40
- export { query, defineQueries, type QueryDef, type QueryRecord, type Queries, type InferQueryInput, type InferQueryResult, } from './queries.js';
41
- export { abloOpenApi, schemaToOpenApi, type SchemaToOpenApiOptions } from '../transaction/schema/openapi.js';