@abloatai/ablo 0.26.0 → 0.28.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 (418) hide show
  1. package/CHANGELOG.md +42 -2
  2. package/README.md +102 -86
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +134 -151
  5. package/dist/Database.d.ts +68 -69
  6. package/dist/Database.js +316 -135
  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 +54 -52
  12. package/dist/Model.js +78 -62
  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 +122 -118
  18. package/dist/SyncClient.js +541 -245
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +10 -9
  22. package/dist/adapters/inMemoryStorage.js +21 -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 +173 -121
  50. package/dist/client/Ablo.d.ts +97 -74
  51. package/dist/client/Ablo.js +129 -163
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +442 -81
  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 +16 -17
  61. package/dist/client/createInternalComponents.js +26 -31
  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 +59 -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 +78 -87
  76. package/dist/client/options.d.ts +157 -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 +16 -20
  91. package/dist/client/wsMutationExecutor.js +18 -23
  92. package/dist/commit/contract.d.ts +493 -0
  93. package/dist/commit/contract.js +187 -0
  94. package/dist/commit/index.d.ts +6 -0
  95. package/dist/commit/index.js +5 -0
  96. package/dist/context.d.ts +6 -4
  97. package/dist/context.js +6 -4
  98. package/dist/coordination/index.d.ts +10 -8
  99. package/dist/coordination/index.js +14 -12
  100. package/dist/coordination/schema.d.ts +176 -128
  101. package/dist/coordination/schema.js +197 -133
  102. package/dist/coordination/trace.d.ts +9 -10
  103. package/dist/coordination/trace.js +13 -14
  104. package/dist/core/DatabaseManager.d.ts +5 -7
  105. package/dist/core/DatabaseManager.js +15 -19
  106. package/dist/core/QueryProcessor.d.ts +7 -9
  107. package/dist/core/QueryProcessor.js +22 -28
  108. package/dist/core/QueryView.d.ts +8 -8
  109. package/dist/core/QueryView.js +2 -2
  110. package/dist/core/StoreManager.d.ts +14 -14
  111. package/dist/core/StoreManager.js +33 -24
  112. package/dist/core/ViewRegistry.d.ts +5 -5
  113. package/dist/core/ViewRegistry.js +4 -4
  114. package/dist/core/index.d.ts +17 -12
  115. package/dist/core/index.js +32 -26
  116. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  117. package/dist/core/openIDBWithTimeout.js +42 -43
  118. package/dist/core/queryUtils.d.ts +45 -0
  119. package/dist/core/queryUtils.js +69 -0
  120. package/dist/core/storeContract.d.ts +63 -61
  121. package/dist/core/storeContract.js +8 -12
  122. package/dist/environment.d.ts +28 -0
  123. package/dist/environment.js +21 -0
  124. package/dist/errorCodes.d.ts +107 -99
  125. package/dist/errorCodes.js +137 -134
  126. package/dist/errors.d.ts +160 -166
  127. package/dist/errors.js +155 -158
  128. package/dist/index.d.ts +36 -27
  129. package/dist/index.js +91 -86
  130. package/dist/interfaces/index.d.ts +102 -113
  131. package/dist/interfaces/index.js +5 -4
  132. package/dist/keys/index.d.ts +27 -29
  133. package/dist/keys/index.js +41 -40
  134. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  135. package/dist/mutators/RecordingTransaction.js +31 -37
  136. package/dist/mutators/Transaction.d.ts +18 -26
  137. package/dist/mutators/Transaction.js +14 -20
  138. package/dist/mutators/UndoManager.d.ts +124 -131
  139. package/dist/mutators/UndoManager.js +177 -156
  140. package/dist/mutators/defineMutators.d.ts +23 -34
  141. package/dist/mutators/defineMutators.js +14 -20
  142. package/dist/mutators/inverseOp.d.ts +12 -15
  143. package/dist/mutators/inverseOp.js +12 -15
  144. package/dist/mutators/mutateActions.d.ts +10 -9
  145. package/dist/mutators/mutateActions.js +1 -1
  146. package/dist/mutators/readerActions.d.ts +9 -8
  147. package/dist/mutators/readerActions.js +2 -2
  148. package/dist/mutators/undoApply.d.ts +31 -27
  149. package/dist/mutators/undoApply.js +26 -24
  150. package/dist/policy/index.d.ts +5 -3
  151. package/dist/policy/index.js +5 -3
  152. package/dist/policy/types.d.ts +104 -100
  153. package/dist/policy/types.js +67 -66
  154. package/dist/query/client.d.ts +28 -23
  155. package/dist/query/client.js +45 -43
  156. package/dist/query/types.d.ts +37 -60
  157. package/dist/query/types.js +13 -33
  158. package/dist/react/AbloProvider.d.ts +1 -1
  159. package/dist/react/AbloProvider.js +2 -2
  160. package/dist/react/context.d.ts +25 -28
  161. package/dist/react/context.js +9 -10
  162. package/dist/react/index.d.ts +41 -42
  163. package/dist/react/index.js +37 -38
  164. package/dist/react/internalContext.d.ts +17 -19
  165. package/dist/react/useAblo.d.ts +28 -25
  166. package/dist/react/useAblo.js +41 -17
  167. package/dist/react/useCurrentUserId.d.ts +8 -7
  168. package/dist/react/useCurrentUserId.js +8 -7
  169. package/dist/react/useErrorListener.d.ts +7 -7
  170. package/dist/react/useErrorListener.js +10 -11
  171. package/dist/react/useMutationFailureListener.d.ts +8 -8
  172. package/dist/react/useMutationFailureListener.js +8 -8
  173. package/dist/react/useMutators.d.ts +11 -11
  174. package/dist/react/useMutators.js +3 -3
  175. package/dist/react/useReactive.js +2 -2
  176. package/dist/react/useSyncStatus.d.ts +4 -6
  177. package/dist/react/useUndoScope.d.ts +7 -9
  178. package/dist/react/useUndoScope.js +1 -1
  179. package/dist/schema/coordination.d.ts +21 -25
  180. package/dist/schema/coordination.js +21 -25
  181. package/dist/schema/ddl.d.ts +43 -39
  182. package/dist/schema/ddl.js +75 -68
  183. package/dist/schema/ddlLock.d.ts +20 -24
  184. package/dist/schema/ddlLock.js +18 -23
  185. package/dist/schema/diff.d.ts +99 -61
  186. package/dist/schema/diff.js +43 -34
  187. package/dist/schema/field.d.ts +37 -42
  188. package/dist/schema/field.js +35 -48
  189. package/dist/schema/generate.d.ts +12 -12
  190. package/dist/schema/generate.js +12 -12
  191. package/dist/schema/index.d.ts +3 -3
  192. package/dist/schema/index.js +21 -23
  193. package/dist/schema/model.d.ts +118 -143
  194. package/dist/schema/model.js +22 -33
  195. package/dist/schema/openapi.d.ts +10 -9
  196. package/dist/schema/openapi.js +5 -3
  197. package/dist/schema/queries.d.ts +29 -31
  198. package/dist/schema/queries.js +23 -25
  199. package/dist/schema/relation.d.ts +89 -99
  200. package/dist/schema/relation.js +13 -13
  201. package/dist/schema/residency.d.ts +16 -13
  202. package/dist/schema/residency.js +16 -13
  203. package/dist/schema/roles.d.ts +36 -43
  204. package/dist/schema/roles.js +31 -37
  205. package/dist/schema/schema.d.ts +64 -43
  206. package/dist/schema/schema.js +31 -32
  207. package/dist/schema/select.d.ts +13 -13
  208. package/dist/schema/select.js +13 -13
  209. package/dist/schema/serialize.d.ts +28 -31
  210. package/dist/schema/serialize.js +27 -31
  211. package/dist/schema/sugar.d.ts +17 -32
  212. package/dist/schema/sugar.js +14 -29
  213. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  214. package/dist/schema/syncDeltaRow.js +89 -0
  215. package/dist/schema/tenancy.d.ts +44 -46
  216. package/dist/schema/tenancy.js +46 -48
  217. package/dist/server/adapter.d.ts +58 -58
  218. package/dist/server/adapter.js +13 -14
  219. package/dist/server/commit.d.ts +60 -64
  220. package/dist/server/index.d.ts +9 -10
  221. package/dist/server/index.js +1 -1
  222. package/dist/server/readConfig.d.ts +70 -0
  223. package/dist/server/readConfig.js +8 -0
  224. package/dist/server/storageMode.d.ts +23 -0
  225. package/dist/server/storageMode.js +17 -0
  226. package/dist/source/adapter.d.ts +30 -25
  227. package/dist/source/adapter.js +10 -10
  228. package/dist/source/adapters/drizzle.d.ts +28 -23
  229. package/dist/source/adapters/drizzle.js +30 -25
  230. package/dist/source/adapters/kysely.d.ts +27 -25
  231. package/dist/source/adapters/kysely.js +24 -23
  232. package/dist/source/adapters/memory.d.ts +8 -7
  233. package/dist/source/adapters/memory.js +9 -8
  234. package/dist/source/adapters/prisma.d.ts +13 -12
  235. package/dist/source/adapters/prisma.js +22 -25
  236. package/dist/source/conformance.d.ts +18 -11
  237. package/dist/source/conformance.js +17 -11
  238. package/dist/source/connector.d.ts +31 -32
  239. package/dist/source/connector.js +28 -28
  240. package/dist/source/connectorProtocol.d.ts +160 -0
  241. package/dist/source/connectorProtocol.js +162 -0
  242. package/dist/source/contract.d.ts +26 -27
  243. package/dist/source/contract.js +28 -29
  244. package/dist/source/factory.d.ts +46 -58
  245. package/dist/source/factory.js +22 -27
  246. package/dist/source/index.d.ts +7 -9
  247. package/dist/source/index.js +12 -14
  248. package/dist/source/migrations.d.ts +9 -9
  249. package/dist/source/migrations.js +9 -9
  250. package/dist/source/next.d.ts +9 -10
  251. package/dist/source/next.js +6 -7
  252. package/dist/source/pushQueue.d.ts +69 -47
  253. package/dist/source/pushQueue.js +32 -28
  254. package/dist/source/signing.d.ts +46 -17
  255. package/dist/source/signing.js +28 -11
  256. package/dist/source/types.d.ts +121 -104
  257. package/dist/source/types.js +13 -14
  258. package/dist/stores/ObjectStore.d.ts +24 -12
  259. package/dist/stores/ObjectStore.js +38 -16
  260. package/dist/stores/ObjectStoreContract.d.ts +14 -15
  261. package/dist/stores/SyncActionStore.d.ts +7 -11
  262. package/dist/stores/SyncActionStore.js +13 -17
  263. package/dist/surface.d.ts +28 -21
  264. package/dist/surface.js +29 -20
  265. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  266. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  267. package/dist/sync/ConnectionManager.d.ts +39 -50
  268. package/dist/sync/ConnectionManager.js +55 -66
  269. package/dist/sync/NetworkProbe.d.ts +24 -29
  270. package/dist/sync/NetworkProbe.js +63 -69
  271. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  272. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  273. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  274. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  275. package/dist/sync/SyncWebSocket.d.ts +141 -166
  276. package/dist/sync/SyncWebSocket.js +191 -223
  277. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  278. package/dist/sync/awaitClaimGrant.js +11 -11
  279. package/dist/sync/bootstrapApply.d.ts +34 -24
  280. package/dist/sync/bootstrapApply.js +27 -19
  281. package/dist/sync/commitFrames.d.ts +21 -20
  282. package/dist/sync/commitFrames.js +18 -18
  283. package/dist/sync/createClaimStream.d.ts +23 -22
  284. package/dist/sync/createClaimStream.js +105 -23
  285. package/dist/sync/createPresenceStream.d.ts +19 -18
  286. package/dist/sync/createPresenceStream.js +25 -26
  287. package/dist/sync/createSnapshot.d.ts +12 -14
  288. package/dist/sync/createSnapshot.js +20 -26
  289. package/dist/sync/credentialLifecycle.d.ts +104 -104
  290. package/dist/sync/credentialLifecycle.js +140 -147
  291. package/dist/sync/deltaPipeline.d.ts +36 -34
  292. package/dist/sync/deltaPipeline.js +64 -65
  293. package/dist/sync/groupChange.d.ts +63 -61
  294. package/dist/sync/groupChange.js +74 -78
  295. package/dist/sync/heartbeat.d.ts +34 -33
  296. package/dist/sync/heartbeat.js +31 -31
  297. package/dist/sync/participants.d.ts +19 -19
  298. package/dist/sync/persistedPrefix.d.ts +12 -0
  299. package/dist/sync/persistedPrefix.js +22 -0
  300. package/dist/sync/schemas.d.ts +3 -2
  301. package/dist/sync/schemas.js +14 -10
  302. package/dist/sync/syncCursor.d.ts +17 -21
  303. package/dist/sync/syncCursor.js +17 -21
  304. package/dist/sync/syncPlan.d.ts +28 -36
  305. package/dist/sync/syncPlan.js +18 -19
  306. package/dist/sync/syncPosition.d.ts +54 -49
  307. package/dist/sync/syncPosition.js +57 -52
  308. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  309. package/dist/sync/wsFrameHandlers.js +63 -67
  310. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  311. package/dist/testing/fixtures/bootstrap.js +12 -6
  312. package/dist/testing/fixtures/deltas.d.ts +30 -33
  313. package/dist/testing/fixtures/deltas.js +30 -33
  314. package/dist/testing/fixtures/models.d.ts +11 -10
  315. package/dist/testing/fixtures/models.js +11 -10
  316. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  317. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  318. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  319. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  320. package/dist/testing/helpers/wait.d.ts +13 -8
  321. package/dist/testing/helpers/wait.js +13 -8
  322. package/dist/testing/index.d.ts +5 -3
  323. package/dist/testing/index.js +3 -2
  324. package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
  325. package/dist/testing/mocks/FakeDatabase.js +10 -0
  326. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  327. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  328. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  329. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  330. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  331. package/dist/testing/mocks/MockSyncContext.js +15 -13
  332. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  333. package/dist/testing/mocks/MockSyncStore.js +11 -11
  334. package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
  335. package/dist/testing/mocks/MockWebSocket.js +22 -21
  336. package/dist/transactions/TransactionQueue.d.ts +244 -181
  337. package/dist/transactions/TransactionQueue.js +929 -423
  338. package/dist/transactions/TransactionStore.d.ts +6 -4
  339. package/dist/transactions/TransactionStore.js +6 -4
  340. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  341. package/dist/transactions/UnconfirmedWrites.js +104 -0
  342. package/dist/transactions/coalesceRules.d.ts +41 -17
  343. package/dist/transactions/coalesceRules.js +40 -17
  344. package/dist/transactions/commitEnvelope.d.ts +132 -0
  345. package/dist/transactions/commitEnvelope.js +139 -0
  346. package/dist/transactions/commitOutboxStore.d.ts +32 -0
  347. package/dist/transactions/commitOutboxStore.js +26 -0
  348. package/dist/transactions/commitPayload.d.ts +63 -52
  349. package/dist/transactions/commitPayload.js +54 -57
  350. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  351. package/dist/transactions/deltaConfirmation.js +37 -45
  352. package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
  353. package/dist/transactions/httpCommitEnvelope.js +179 -0
  354. package/dist/transactions/optimisticApply.d.ts +49 -0
  355. package/dist/transactions/optimisticApply.js +65 -0
  356. package/dist/transactions/replayValidation.d.ts +182 -0
  357. package/dist/transactions/replayValidation.js +156 -0
  358. package/dist/types/global.d.ts +46 -41
  359. package/dist/types/global.js +20 -19
  360. package/dist/types/index.d.ts +71 -77
  361. package/dist/types/index.js +22 -22
  362. package/dist/types/modelData.d.ts +6 -8
  363. package/dist/types/modelData.js +5 -7
  364. package/dist/types/participant.d.ts +10 -11
  365. package/dist/types/participant.js +6 -8
  366. package/dist/types/streams.d.ts +208 -195
  367. package/dist/types/streams.js +7 -7
  368. package/dist/utils/asyncIterator.d.ts +25 -32
  369. package/dist/utils/asyncIterator.js +25 -32
  370. package/dist/utils/duration.d.ts +12 -15
  371. package/dist/utils/duration.js +12 -15
  372. package/dist/utils/mobxSetup.d.ts +53 -0
  373. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  374. package/dist/webhooks/events.d.ts +21 -16
  375. package/dist/webhooks/events.js +10 -8
  376. package/dist/webhooks/index.d.ts +5 -7
  377. package/dist/webhooks/index.js +5 -7
  378. package/dist/wire/bootstrapReason.d.ts +9 -0
  379. package/dist/wire/bootstrapReason.js +8 -0
  380. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  381. package/dist/wire/delta.js +114 -0
  382. package/dist/wire/errorEnvelope.d.ts +30 -31
  383. package/dist/wire/errorEnvelope.js +34 -40
  384. package/dist/wire/frames.d.ts +315 -86
  385. package/dist/wire/frames.js +47 -33
  386. package/dist/wire/index.d.ts +18 -14
  387. package/dist/wire/index.js +32 -27
  388. package/dist/wire/listEnvelope.d.ts +16 -23
  389. package/dist/wire/listEnvelope.js +7 -6
  390. package/dist/wire/protocol.d.ts +25 -32
  391. package/dist/wire/protocol.js +25 -32
  392. package/dist/wire/protocolVersion.d.ts +44 -40
  393. package/dist/wire/protocolVersion.js +44 -40
  394. package/docs/api.md +10 -10
  395. package/docs/coordination.md +59 -0
  396. package/docs/mcp.md +1 -1
  397. package/package.json +17 -11
  398. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  399. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  400. package/dist/core/query-utils.d.ts +0 -34
  401. package/dist/core/query-utils.js +0 -59
  402. package/dist/schema/sync-delta-row.js +0 -103
  403. package/dist/schema/sync-delta-wire.js +0 -102
  404. package/dist/server/read-config.d.ts +0 -67
  405. package/dist/server/read-config.js +0 -8
  406. package/dist/server/storage-mode.d.ts +0 -8
  407. package/dist/server/storage-mode.js +0 -28
  408. package/dist/source/connector-protocol.d.ts +0 -159
  409. package/dist/source/connector-protocol.js +0 -161
  410. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  411. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  412. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  413. package/dist/transactions/mutation-error-handler.js +0 -39
  414. package/dist/transactions/optimistic.d.ts +0 -24
  415. package/dist/transactions/optimistic.js +0 -45
  416. package/dist/transactions/persistedReplay.d.ts +0 -93
  417. package/dist/transactions/persistedReplay.js +0 -105
  418. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,30 +1,25 @@
1
1
  /**
2
- * Safe-DDL LOCKING knobs the ONE reader for how a schema change acquires
3
- * (and retries for) table locks, shared by BOTH executors of the provision
4
- * plan:
2
+ * Lock settings for schema-change (DDL) statements. When a schema push alters a
3
+ * table, these values control how quickly the change gives up on a contended
4
+ * lock and how many times it retries. The command-line `ablo migrate` and the
5
+ * host that applies a schema push both resolve their lock behavior through this
6
+ * module, so tuning the environment variables below changes both paths the same
7
+ * way.
5
8
  *
6
- * - `ablo migrate` (cli/migrate.ts) the customer runs the DDL themselves
7
- * - the hosted executor (`apps/sync-server/src/schema/ddlExec.ts`)
9
+ * The defaults follow the standard safe-migration recipe: a short `lock_timeout`
10
+ * so a blocked `ALTER` aborts quickly instead of parking an `ACCESS EXCLUSIVE`
11
+ * lock request at the head of the queue — which would freeze every other query
12
+ * on that table behind it — paired with a bounded retry-and-backoff on the
13
+ * resulting timeout.
8
14
  *
9
- * The two used to carry copy-pasted constants and had already drifted: the
10
- * server honored `ABLO_SCHEMA_LOCK_ATTEMPTS` while the CLI hardcoded 5, so an
11
- * operator tuning the knob got it applied by hosted push but silently ignored
12
- * by `ablo migrate`. Both now resolve through here.
13
- *
14
- * The settings themselves are the battle-tested ones every mature migration
15
- * tool uses (GitLab `with_lock_retries`, Strong Migrations, Doctolib
16
- * `safe-pg-migrations`): a LOW `lock_timeout` so a blocked ALTER aborts fast
17
- * instead of parking an ACCESS EXCLUSIVE request at the head of the lock
18
- * queue (which would freeze every query on that table behind it), plus a
19
- * bounded retry-with-backoff on the `55P03` abort.
20
- *
21
- * Env knobs (read at CALL time, not import time, so tests and long-lived
22
- * processes see updates): `ABLO_SCHEMA_LOCK_TIMEOUT` / `ABLO_SCHEMA_LOCK_ATTEMPTS`
23
- * — the older `ABLO_DDL_*` names are still honored so existing setups don't
24
- * break.
15
+ * The environment variables are read each time a resolver is called, not once
16
+ * at import, so a long-running process or a test that changes them sees the
17
+ * update: `ABLO_SCHEMA_LOCK_TIMEOUT` and `ABLO_SCHEMA_LOCK_ATTEMPTS`. The older
18
+ * `ABLO_DDL_*` names are also accepted.
25
19
  */
26
- /** Postgres SQLSTATE `lock_not_available` — a `lock_timeout` abort. The ONE
27
- * retryable DDL failure; everything else is a real error. */
20
+ /** The Postgres SQLSTATE `55P03` (`lock_not_available`), raised when a statement
21
+ * gives up waiting for a lock after `lock_timeout`. This is the one DDL failure
22
+ * worth retrying; any other error is a genuine problem. */
28
23
  export const PG_LOCK_NOT_AVAILABLE = '55P03';
29
24
  const DEFAULT_LOCK_TIMEOUT = '5s';
30
25
  const DEFAULT_MAX_LOCK_ATTEMPTS = 5;
@@ -1,61 +1,74 @@
1
1
  /**
2
- * Schema diff + migration planning the pure core of the managed-migration loop.
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.
3
12
  *
4
- * Given two serialized schemas (the active one and the one being pushed), produce
5
- * an ordered list of {@link MigrationStep}s describing how to evolve the database,
6
- * and a {@link MigrationClassification} splitting the risky parts into *warnings*
7
- * (execute but may lose/risk data) and *unexecutable* steps (fail on a non-empty
8
- * table without a backfill/default). SQL emission and execution live elsewhere
9
- * (server-side, where the type map + RLS live); this module is intentionally pure
10
- * and DB-free so it is exhaustively unit-testable and reusable by the CLI.
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.
11
25
  *
12
- * Design borrowed from mature tools:
13
- * - **Drizzle Kit**: keep the differ pure and inject RENAME decisions as data
14
- * (the {@link RenameHints} resolver seam) rather than guessing the same
15
- * engine is then headless-testable and drivable by an interactive prompt.
16
- * - **Prisma migration engine**: a two-tier destructive classification
17
- * (warning vs unexecutable) and a type-change sub-tier
18
- * (safe / risky / not-castable) that decides in-place `ALTER TYPE` vs a
19
- * lossy drop-and-recreate.
20
- * - **Atlas**: a single `alter_field` step carrying *which* facets changed
21
- * (type / nullability / enum / index) instead of N discrete alter steps.
22
- *
23
- * Step ordering is the expand→contract sequence (add before drop, widen before
24
- * narrow): create models → rename → add columns (always nullable) → alter →
25
- * drop columns → drop models. NOT NULL is never set on add — it is an
26
- * `alter_field` nullability change that a backfill must precede.
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.
27
30
  */
28
31
  import type { FieldMeta } from './field.js';
29
32
  import type { SchemaJSON } from './serialize.js';
30
33
  export type FieldType = FieldMeta['type'];
31
34
  /** Whether a Postgres `ALTER COLUMN … TYPE` can preserve the existing data. */
32
35
  export type CastSafety = 'safe' | 'risky' | 'notCastable';
36
+ /** Records a column's type change and how safely Postgres can carry it out. */
33
37
  export interface FieldTypeChange {
34
38
  readonly from: FieldType;
35
39
  readonly to: FieldType;
36
- /** `safe` plain ALTER TYPE; `risky` ALTER w/ USING (may fail per-row);
37
- * `notCastable` drop-and-recreate (data loss). */
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. */
38
43
  readonly cast: CastSafety;
39
44
  }
40
- /** `isOptional` transition. `true false` is the dangerous direction. */
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. */
41
48
  export interface NullabilityChange {
42
49
  readonly fromOptional: boolean;
43
50
  readonly toOptional: boolean;
44
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. */
45
54
  export interface EnumValuesChange {
46
55
  readonly added: readonly string[];
47
56
  readonly removed: readonly string[];
48
57
  }
58
+ /** Records a change to whether a field is indexed (`from` was, `to` will be). */
49
59
  export interface IndexChange {
50
60
  readonly from: boolean;
51
61
  readonly to: boolean;
52
62
  }
53
- /** Physical column-name transition for a stable logical field. */
63
+ /** Records a change to the physical database column name backing a field whose
64
+ * logical name stayed the same. */
54
65
  export interface FieldColumnChange {
55
66
  readonly from: string;
56
67
  readonly to: string;
57
68
  }
58
- /** The facets of a single column that changed (Atlas-style bitmask, as data). */
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. */
59
72
  export interface FieldChanges {
60
73
  readonly column?: FieldColumnChange;
61
74
  readonly type?: FieldTypeChange;
@@ -63,6 +76,9 @@ export interface FieldChanges {
63
76
  readonly enumValues?: EnumValuesChange;
64
77
  readonly indexed?: IndexChange;
65
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. */
66
82
  export type MigrationStep = {
67
83
  readonly kind: 'create_model';
68
84
  readonly model: string;
@@ -96,10 +112,11 @@ export type MigrationStep = {
96
112
  readonly changes: FieldChanges;
97
113
  };
98
114
  /**
99
- * Rename decisions, injected as data (Drizzle's resolver seam). Without a hint,
100
- * a removed+added pair reads as drop+add (lossy) the same safe default Prisma
101
- * takes. `field.model` refers to the model key in the NEXT schema (post any
102
- * model rename).
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.
103
120
  */
104
121
  export interface RenameHints {
105
122
  readonly models?: readonly {
@@ -112,6 +129,9 @@ export interface RenameHints {
112
129
  readonly to: string;
113
130
  }[];
114
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. */
115
135
  export declare function classifyCast(from: FieldType, to: FieldType): CastSafety;
116
136
  /**
117
137
  * Diff two serialized schemas into an ordered, expand→contract migration plan.
@@ -120,56 +140,73 @@ export declare function classifyCast(from: FieldType, to: FieldType): CastSafety
120
140
  * drop+add.
121
141
  */
122
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
+ */
123
148
  export type WarningCode = 'drop_model' | 'drop_field' | 'risky_cast' | 'lossy_recreate' | 'enum_value_removed'
124
- /** A model disappears from what this plane's READERS resolve, without any
125
- * table being dropped. Emitted by the server's push gate (not
126
- * `classifyMigration`) when a first sandbox push shadows the production
127
- * artifact that sandbox readers were served via the registry's sandbox→production
128
- * fallback. The data plane is untouched — the loss is visibility. */
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. */
129
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. */
130
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
+ */
131
163
  export interface MigrationSignal {
132
164
  readonly code: WarningCode | BlockerCode;
133
165
  readonly model: string;
134
166
  readonly field?: string;
135
167
  readonly detail: string;
136
168
  /**
137
- * Reader-visibility context for a removal that shadows an existing artifact:
138
- * the active schema this push is being diffed against. Lets the CLI show the
139
- * baseline — version + WHEN it was pushed — so "incompatible" isn't a mystery
140
- * (e.g. a first sandbox push diffed against a months-old production schema).
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
+ * incompatibleits version and when it was pushed — so the warning is not a
172
+ * mystery.
141
173
  */
142
174
  readonly shadowed?: {
143
175
  readonly environment: string;
144
176
  readonly version: number;
145
- /** ISO timestamp the shadowed artifact was activated/pushed, or null. */
177
+ /** ISO 8601 timestamp when the compared-against schema was pushed, or null. */
146
178
  readonly pushedAt: string | null;
147
- /** Who pushed it (e.g. `apikey:…`), or null. */
179
+ /** Who pushed the compared-against schema, or null. */
148
180
  readonly pushedBy: string | null;
149
181
  };
150
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}. */
151
186
  export interface MigrationClassification {
152
- /** Execute but may lose or risk data on a non-empty table. */
187
+ /** Changes that run but may lose or risk data on a non-empty table. */
153
188
  readonly warnings: readonly MigrationSignal[];
154
- /** Will fail on a non-empty table unless a default/backfill is supplied. */
189
+ /** Changes that fail on a non-empty table unless a default or backfill is supplied. */
155
190
  readonly unexecutable: readonly MigrationSignal[];
156
191
  }
157
192
  /**
158
- * Classify a plan's steps into Prisma-style warnings vs unexecutable. The IR
159
- * carries no per-field default, so a non-optional `add_field` is conservatively
160
- * unexecutable (a backfill or default resolves it) we cannot prove a default
161
- * exists. Classification is rule-based (schema-derived); the runtime layer can
162
- * downgrade a signal to a no-op when the target table is empty.
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.
163
199
  */
164
200
  export declare function classifyMigration(steps: readonly MigrationStep[]): MigrationClassification;
165
- /** Convenience: a plan is safe to auto-apply iff it has no unexecutable steps. */
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. */
166
203
  export declare function isAutoApplicable(classification: MigrationClassification): boolean;
167
204
  /**
168
- * A constant value to seed into existing rows so an otherwise-`unexecutable`
169
- * step becomes safe: a required field added to a non-empty table, or a field
170
- * made required while NULLs exist. Deliberately a CONSTANT (not an SQL
171
- * expression)arbitrary backfill logic is out of scope; this serves the
172
- * common "new column defaults to X" case only. `value` is typed to the field.
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.
173
210
  */
174
211
  export interface BackfillValue {
175
212
  readonly model: string;
@@ -177,11 +214,12 @@ export interface BackfillValue {
177
214
  readonly value: string | number | boolean;
178
215
  }
179
216
  /**
180
- * Does a provided backfill resolve this blocker? Only the two row-dependent
181
- * blockers (`required_field_added`, `made_required`) are backfill-resolvable; a
182
- * data-loss *warning* is not that always needs `force`.
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.
183
221
  */
184
222
  export declare function isBlockerResolved(signal: MigrationSignal, backfills: readonly BackfillValue[]): boolean;
185
- /** The unexecutable signals NOT covered by a supplied backfill. Empty → the push
186
- * can proceed (modulo the separate `warnings`/`force` gate). */
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. */
187
225
  export declare function unresolvedBlockers(classification: MigrationClassification, backfills: readonly BackfillValue[]): readonly MigrationSignal[];
@@ -1,29 +1,32 @@
1
1
  /**
2
- * Schema diff + migration planning the pure core of the managed-migration loop.
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.
3
12
  *
4
- * Given two serialized schemas (the active one and the one being pushed), produce
5
- * an ordered list of {@link MigrationStep}s describing how to evolve the database,
6
- * and a {@link MigrationClassification} splitting the risky parts into *warnings*
7
- * (execute but may lose/risk data) and *unexecutable* steps (fail on a non-empty
8
- * table without a backfill/default). SQL emission and execution live elsewhere
9
- * (server-side, where the type map + RLS live); this module is intentionally pure
10
- * and DB-free so it is exhaustively unit-testable and reusable by the CLI.
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.
11
25
  *
12
- * Design borrowed from mature tools:
13
- * - **Drizzle Kit**: keep the differ pure and inject RENAME decisions as data
14
- * (the {@link RenameHints} resolver seam) rather than guessing the same
15
- * engine is then headless-testable and drivable by an interactive prompt.
16
- * - **Prisma migration engine**: a two-tier destructive classification
17
- * (warning vs unexecutable) and a type-change sub-tier
18
- * (safe / risky / not-castable) that decides in-place `ALTER TYPE` vs a
19
- * lossy drop-and-recreate.
20
- * - **Atlas**: a single `alter_field` step carrying *which* facets changed
21
- * (type / nullability / enum / index) instead of N discrete alter steps.
22
- *
23
- * Step ordering is the expand→contract sequence (add before drop, widen before
24
- * narrow): create models → rename → add columns (always nullable) → alter →
25
- * drop columns → drop models. NOT NULL is never set on add — it is an
26
- * `alter_field` nullability change that a backfill must precede.
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.
27
30
  */
28
31
  // ── Cast safety matrix ────────────────────────────────────────────────────────
29
32
  // Keyed `${from}->${to}` over the 6 sync field types. Targets that map to TEXT
@@ -50,6 +53,9 @@ const CAST = {
50
53
  'string->json': 'risky', 'enum->json': 'risky', 'number->json': 'notCastable',
51
54
  'boolean->json': 'notCastable', 'date->json': 'notCastable',
52
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. */
53
59
  export function classifyCast(from, to) {
54
60
  if (from === to)
55
61
  return 'safe';
@@ -197,11 +203,12 @@ export function diffSchema(prev, next, hints = {}) {
197
203
  return [...creates, ...renames, ...fieldSteps, ...drops];
198
204
  }
199
205
  /**
200
- * Classify a plan's steps into Prisma-style warnings vs unexecutable. The IR
201
- * carries no per-field default, so a non-optional `add_field` is conservatively
202
- * unexecutable (a backfill or default resolves it) we cannot prove a default
203
- * exists. Classification is rule-based (schema-derived); the runtime layer can
204
- * downgrade a signal to a no-op when the target table is empty.
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.
205
212
  */
206
213
  export function classifyMigration(steps) {
207
214
  const warnings = [];
@@ -259,22 +266,24 @@ export function classifyMigration(steps) {
259
266
  }
260
267
  return { warnings, unexecutable };
261
268
  }
262
- /** Convenience: a plan is safe to auto-apply iff it has no unexecutable steps. */
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. */
263
271
  export function isAutoApplicable(classification) {
264
272
  return classification.unexecutable.length === 0;
265
273
  }
266
274
  /**
267
- * Does a provided backfill resolve this blocker? Only the two row-dependent
268
- * blockers (`required_field_added`, `made_required`) are backfill-resolvable; a
269
- * data-loss *warning* is not that always needs `force`.
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.
270
279
  */
271
280
  export function isBlockerResolved(signal, backfills) {
272
281
  if (signal.code !== 'required_field_added' && signal.code !== 'made_required')
273
282
  return false;
274
283
  return backfills.some((b) => b.model === signal.model && b.field === signal.field);
275
284
  }
276
- /** The unexecutable signals NOT covered by a supplied backfill. Empty → the push
277
- * can proceed (modulo the separate `warnings`/`force` gate). */
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. */
278
287
  export function unresolvedBlockers(classification, backfills) {
279
288
  return classification.unexecutable.filter((s) => !isBlockerResolved(s, backfills));
280
289
  }
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Schema Field Helpers
3
- *
4
- * Thin wrappers around Zod that add sync-engine metadata (type tag, indexed).
5
- * Metadata is stored in `z.describe()` as a JSON-encoded string so it
6
- * survives `.optional()`, `.nullable()`, and `.default()` chain calls.
2
+ * Field builders for schema definitions. Each helper — {@link field}.string(),
3
+ * .number(), .enum(), and so on — returns an ordinary Zod schema with a little
4
+ * sync-engine metadata attached (its type tag and whether it is indexed) plus a
5
+ * couple of chainable methods. The metadata is tucked into the schema's description
6
+ * as a JSON string so it survives `.optional()`, `.nullable()`, and `.default()`
7
+ * chaining, and {@link resolveFieldMeta} reads it back out as a {@link FieldMeta}.
7
8
  *
8
9
  * Usage:
9
10
  * import { field } from '@abloatai/ablo/schema';
@@ -23,9 +24,11 @@
23
24
  * });
24
25
  */
25
26
  import { z } from 'zod';
26
- /** Runtime metadata for a schema field, readable via `ModelDef.fields`. */
27
+ /** The sync-engine metadata describing one field, available at runtime through a
28
+ * model's `fields` map. The {@link field} builders attach it, and the migration
29
+ * planner, type generator, and OpenAPI generator all read it. */
27
30
  export interface FieldMeta {
28
- /** Sync-engine type tag (maps to storage/serialization hints). */
31
+ /** Sync-engine type tag, which maps to storage and serialization hints. */
29
32
  type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'json';
30
33
  /** Whether the field was marked optional via `.optional()` or `.nullable()`. */
31
34
  isOptional: boolean;
@@ -48,53 +51,44 @@ export interface FieldMeta {
48
51
  */
49
52
  export declare function getFieldMeta(schema: z.ZodType): FieldMeta | null;
50
53
  /**
51
- * Fallback: infer FieldMeta directly from a raw Zod schema when no
52
- * `field.*()` metadata was attached.
53
- *
54
- * Walks through `.optional()` / `.nullable()` / `.default()` wrappers
55
- * to find the inner primitive, then maps Zod's `_def.typeName` to
56
- * the sync-engine type tag. Used by `resolveFieldMeta` and by
57
- * `model()` / `query()` at definition time.
58
- *
59
- * Kept as an internal helper rather than exported directly — the
60
- * public API is `resolveFieldMeta`, which combines this fallback
61
- * with the `getFieldMeta` fast path.
54
+ * Infers a {@link FieldMeta} from a plain Zod schema that carries no field-builder
55
+ * metadata — for example a bare `z.string()`. It unwraps `.optional()`,
56
+ * `.nullable()`, and `.default()` to reach the inner type, then maps that Zod type
57
+ * to a sync-engine type tag. Most callers should use {@link resolveFieldMeta}
58
+ * instead, which tries the attached metadata first and falls back to this.
62
59
  */
63
60
  export declare function inferFieldMetaFromZod(schema: z.ZodType): FieldMeta;
64
61
  /**
65
- * Resolve FieldMeta for any Zod schema whether it was built with
66
- * `field.*()` (which attaches sync-engine metadata) or with raw Zod
67
- * (which requires fallback inference from `_def.typeName`).
68
- *
69
- * This is the single public entry point for "given a Zod field, tell
70
- * me its sync-engine type tag and optionality." Both `model()` and
71
- * `query()` use it to populate their `fields` / `inputFields` maps at
72
- * definition time, and the schema serializer reads those maps at
73
- * serialization time.
62
+ * Resolves a {@link FieldMeta} for any Zod schema, whether it was built with a
63
+ * {@link field} builder (which attaches metadata) or with plain Zod (which needs
64
+ * inference). This is the single entry point for "given a Zod field, tell me its
65
+ * sync-engine type tag and whether it is optional"; the model and query builders use
66
+ * it to populate their field maps, and the serializer reads those maps.
74
67
  *
75
- * Contract: always returns a value. Never returns null. Unknown Zod
76
- * types fall through to `'string'` this is intentional and matches
77
- * the existing behavior that was previously duplicated in
78
- * `model.ts:inferMetaFromZod`.
68
+ * It always returns a value and never returns null. A Zod type it does not recognize
69
+ * falls through to the `string` tag by design.
79
70
  */
80
71
  export declare function resolveFieldMeta(schema: z.ZodType): FieldMeta;
72
+ /** A Zod schema returned by a {@link field} builder — the underlying Zod type plus
73
+ * two chainable methods: `indexed()` marks the field for a database index, and
74
+ * `from(column)` overrides the physical column name it maps to. */
81
75
  export type FieldBuilder<T extends z.ZodType> = T & {
82
76
  indexed(): FieldBuilder<T>;
83
77
  from(column: string): FieldBuilder<T>;
84
78
  };
85
79
  export declare const field: {
86
- /** String field */
80
+ /** Defines a text field. */
87
81
  readonly string: () => FieldBuilder<z.ZodString>;
88
- /** Number field */
82
+ /** Defines a numeric field. */
89
83
  readonly number: () => FieldBuilder<z.ZodNumber>;
90
- /** Boolean field */
84
+ /** Defines a true/false field. */
91
85
  readonly boolean: () => FieldBuilder<z.ZodBoolean>;
92
- /** Date field */
86
+ /** Defines a timestamp field, represented as a JavaScript `Date`. */
93
87
  readonly date: () => FieldBuilder<z.ZodDate>;
94
- /** Enum field with constrained string values */
88
+ /** Defines a field constrained to a fixed set of string values. */
95
89
  readonly enum: <const T extends readonly [string, ...string[]]>(values: T) => FieldBuilder<z.ZodEnum<{ [k_1 in T[number]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>>;
96
90
  /**
97
- * JSON field. Three call shapes:
91
+ * Defines a JSON field, with three call shapes:
98
92
  *
99
93
  * ```ts
100
94
  * field.json() // unknown JSON blob
@@ -102,9 +96,9 @@ export declare const field: {
102
96
  * field.json({ icon: z.string().default('default') }) // typed sub-properties with defaults
103
97
  * ```
104
98
  *
105
- * The third form is the key DX feature for metadata fields. It wraps the
106
- * plain object in `z.object()` automatically, and the model runtime generates
107
- * a `${field}Json` getter that parses the JSON string on read, applies Zod
99
+ * The third form is especially handy for metadata fields. It wraps the plain
100
+ * object in `z.object()` automatically, and the model runtime adds a
101
+ * `${field}Json` getter that parses the JSON string on read, applies the Zod
108
102
  * defaults, and caches the result.
109
103
  *
110
104
  * Example:
@@ -124,8 +118,9 @@ export declare const field: {
124
118
  * ```
125
119
  */
126
120
  readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
127
- /** Indexed string field (shorthand for `field.string().indexed()`). */
121
+ /** Defines an indexed text field shorthand for `field.string().indexed()`. */
128
122
  readonly id: () => FieldBuilder<z.ZodString>;
129
123
  };
130
- /** Mark a Zod schema as indexed for fast lookups (function form). */
124
+ /** Marks a Zod schema as indexed so lookups on it use a database index. This is the
125
+ * standalone-function form of the `.indexed()` chain method. */
131
126
  export declare function indexed<T extends z.ZodType>(schema: T): T;