@abloatai/transaction 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 (723) hide show
  1. package/CONVENTIONS.md +83 -0
  2. package/README.md +48 -0
  3. package/dist/ablo.d.ts +90 -0
  4. package/dist/ablo.d.ts.map +1 -0
  5. package/dist/ablo.js +34 -0
  6. package/dist/ablo.js.map +1 -0
  7. package/dist/ai-sdk/coordinatedTool.d.ts +123 -0
  8. package/dist/ai-sdk/coordinatedTool.d.ts.map +1 -0
  9. package/dist/ai-sdk/coordinatedTool.js +135 -0
  10. package/dist/ai-sdk/coordinatedTool.js.map +1 -0
  11. package/dist/ai-sdk/index.d.ts +2 -0
  12. package/dist/ai-sdk/index.d.ts.map +1 -0
  13. package/dist/ai-sdk/index.js +2 -0
  14. package/dist/ai-sdk/index.js.map +1 -0
  15. package/dist/auth/apiKey.d.ts +154 -0
  16. package/dist/auth/apiKey.d.ts.map +1 -0
  17. package/dist/auth/apiKey.js +408 -0
  18. package/dist/auth/apiKey.js.map +1 -0
  19. package/dist/auth/bootstrapScope.d.ts +16 -0
  20. package/dist/auth/bootstrapScope.d.ts.map +1 -0
  21. package/dist/auth/bootstrapScope.js +2 -0
  22. package/dist/auth/bootstrapScope.js.map +1 -0
  23. package/dist/auth/browserCredentialSafety.d.ts +7 -0
  24. package/dist/auth/browserCredentialSafety.d.ts.map +1 -0
  25. package/dist/auth/browserCredentialSafety.js +29 -0
  26. package/dist/auth/browserCredentialSafety.js.map +1 -0
  27. package/dist/auth/capability.d.ts +241 -0
  28. package/dist/auth/capability.d.ts.map +1 -0
  29. package/dist/auth/capability.js +253 -0
  30. package/dist/auth/capability.js.map +1 -0
  31. package/dist/auth/capabilityLifecycle.d.ts +47 -0
  32. package/dist/auth/capabilityLifecycle.d.ts.map +1 -0
  33. package/dist/auth/capabilityLifecycle.js +108 -0
  34. package/dist/auth/capabilityLifecycle.js.map +1 -0
  35. package/dist/auth/credentialEndpoint.d.ts +10 -0
  36. package/dist/auth/credentialEndpoint.d.ts.map +1 -0
  37. package/dist/auth/credentialEndpoint.js +58 -0
  38. package/dist/auth/credentialEndpoint.js.map +1 -0
  39. package/dist/auth/credentialEndpointProtocol.d.ts +24 -0
  40. package/dist/auth/credentialEndpointProtocol.d.ts.map +1 -0
  41. package/dist/auth/credentialEndpointProtocol.js +34 -0
  42. package/dist/auth/credentialEndpointProtocol.js.map +1 -0
  43. package/dist/auth/credentialKind.d.ts +4 -0
  44. package/dist/auth/credentialKind.d.ts.map +1 -0
  45. package/dist/auth/credentialKind.js +15 -0
  46. package/dist/auth/credentialKind.js.map +1 -0
  47. package/dist/auth/credentialPolicy.d.ts +141 -0
  48. package/dist/auth/credentialPolicy.d.ts.map +1 -0
  49. package/dist/auth/credentialPolicy.js +113 -0
  50. package/dist/auth/credentialPolicy.js.map +1 -0
  51. package/dist/auth/credentialResult.d.ts +7 -0
  52. package/dist/auth/credentialResult.d.ts.map +1 -0
  53. package/dist/auth/credentialResult.js +9 -0
  54. package/dist/auth/credentialResult.js.map +1 -0
  55. package/dist/auth/credentialSource.d.ts +31 -0
  56. package/dist/auth/credentialSource.d.ts.map +1 -0
  57. package/dist/auth/credentialSource.js +56 -0
  58. package/dist/auth/credentialSource.js.map +1 -0
  59. package/dist/auth/hostedEndpoints.d.ts +22 -0
  60. package/dist/auth/hostedEndpoints.d.ts.map +1 -0
  61. package/dist/auth/hostedEndpoints.js +22 -0
  62. package/dist/auth/hostedEndpoints.js.map +1 -0
  63. package/dist/auth/identity.d.ts +62 -0
  64. package/dist/auth/identity.d.ts.map +1 -0
  65. package/dist/auth/identity.js +224 -0
  66. package/dist/auth/identity.js.map +1 -0
  67. package/dist/auth/index.d.ts +189 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +312 -0
  70. package/dist/auth/index.js.map +1 -0
  71. package/dist/auth/schemas.d.ts +41 -0
  72. package/dist/auth/schemas.d.ts.map +1 -0
  73. package/dist/auth/schemas.js +69 -0
  74. package/dist/auth/schemas.js.map +1 -0
  75. package/dist/auth/sessionMint.d.ts +29 -0
  76. package/dist/auth/sessionMint.d.ts.map +1 -0
  77. package/dist/auth/sessionMint.js +92 -0
  78. package/dist/auth/sessionMint.js.map +1 -0
  79. package/dist/auth/token.d.ts +4 -0
  80. package/dist/auth/token.d.ts.map +1 -0
  81. package/dist/auth/token.js +4 -0
  82. package/dist/auth/token.js.map +1 -0
  83. package/dist/batching/index.d.ts +56 -0
  84. package/dist/batching/index.d.ts.map +1 -0
  85. package/dist/batching/index.js +148 -0
  86. package/dist/batching/index.js.map +1 -0
  87. package/dist/coordination/awaitClaimGrant.d.ts +57 -0
  88. package/dist/coordination/awaitClaimGrant.d.ts.map +1 -0
  89. package/dist/coordination/awaitClaimGrant.js +138 -0
  90. package/dist/coordination/awaitClaimGrant.js.map +1 -0
  91. package/dist/coordination/claimHeartbeatLoop.d.ts +85 -0
  92. package/dist/coordination/claimHeartbeatLoop.d.ts.map +1 -0
  93. package/dist/coordination/claimHeartbeatLoop.js +109 -0
  94. package/dist/coordination/claimHeartbeatLoop.js.map +1 -0
  95. package/dist/coordination/claimMeta.d.ts +50 -0
  96. package/dist/coordination/claimMeta.d.ts.map +1 -0
  97. package/dist/coordination/claimMeta.js +53 -0
  98. package/dist/coordination/claimMeta.js.map +1 -0
  99. package/dist/coordination/events.d.ts +75 -0
  100. package/dist/coordination/events.d.ts.map +1 -0
  101. package/dist/coordination/events.js +8 -0
  102. package/dist/coordination/events.js.map +1 -0
  103. package/dist/coordination/index.d.ts +20 -0
  104. package/dist/coordination/index.d.ts.map +1 -0
  105. package/dist/coordination/index.js +46 -0
  106. package/dist/coordination/index.js.map +1 -0
  107. package/dist/coordination/locator.d.ts +106 -0
  108. package/dist/coordination/locator.d.ts.map +1 -0
  109. package/dist/coordination/locator.js +110 -0
  110. package/dist/coordination/locator.js.map +1 -0
  111. package/dist/coordination/schema.d.ts +1332 -0
  112. package/dist/coordination/schema.d.ts.map +1 -0
  113. package/dist/coordination/schema.js +1137 -0
  114. package/dist/coordination/schema.js.map +1 -0
  115. package/dist/coordination/targetConflict.d.ts +3 -0
  116. package/dist/coordination/targetConflict.d.ts.map +1 -0
  117. package/dist/coordination/targetConflict.js +74 -0
  118. package/dist/coordination/targetConflict.js.map +1 -0
  119. package/dist/coordination/trace.d.ts +79 -0
  120. package/dist/coordination/trace.d.ts.map +1 -0
  121. package/dist/coordination/trace.js +139 -0
  122. package/dist/coordination/trace.js.map +1 -0
  123. package/dist/docs/catalog.d.ts +73 -0
  124. package/dist/docs/catalog.d.ts.map +1 -0
  125. package/dist/docs/catalog.js +231 -0
  126. package/dist/docs/catalog.js.map +1 -0
  127. package/dist/docs/index.d.ts +11 -0
  128. package/dist/docs/index.d.ts.map +1 -0
  129. package/dist/docs/index.js +11 -0
  130. package/dist/docs/index.js.map +1 -0
  131. package/dist/durableWrites.d.ts +63 -0
  132. package/dist/durableWrites.d.ts.map +1 -0
  133. package/dist/durableWrites.js +72 -0
  134. package/dist/durableWrites.js.map +1 -0
  135. package/dist/environment.d.ts +106 -0
  136. package/dist/environment.d.ts.map +1 -0
  137. package/dist/environment.js +109 -0
  138. package/dist/environment.js.map +1 -0
  139. package/dist/errorCodes.d.ts +411 -0
  140. package/dist/errorCodes.d.ts.map +1 -0
  141. package/dist/errorCodes.js +500 -0
  142. package/dist/errorCodes.js.map +1 -0
  143. package/dist/errors.d.ts +429 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +687 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/footprint.d.ts +112 -0
  148. package/dist/footprint.d.ts.map +1 -0
  149. package/dist/footprint.js +0 -0
  150. package/dist/footprint.js.map +1 -0
  151. package/dist/headlessClient.d.ts +10 -0
  152. package/dist/headlessClient.d.ts.map +1 -0
  153. package/dist/headlessClient.js +114 -0
  154. package/dist/headlessClient.js.map +1 -0
  155. package/dist/index.d.ts +21 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +21 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/keys/index.d.ts +88 -0
  160. package/dist/keys/index.d.ts.map +1 -0
  161. package/dist/keys/index.js +208 -0
  162. package/dist/keys/index.js.map +1 -0
  163. package/dist/log/syncDeltaRow.d.ts +159 -0
  164. package/dist/log/syncDeltaRow.d.ts.map +1 -0
  165. package/dist/log/syncDeltaRow.js +96 -0
  166. package/dist/log/syncDeltaRow.js.map +1 -0
  167. package/dist/logger.d.ts +17 -0
  168. package/dist/logger.d.ts.map +1 -0
  169. package/dist/logger.js +8 -0
  170. package/dist/logger.js.map +1 -0
  171. package/dist/observability.d.ts +54 -0
  172. package/dist/observability.d.ts.map +1 -0
  173. package/dist/observability.js +20 -0
  174. package/dist/observability.js.map +1 -0
  175. package/dist/policy/types.d.ts +218 -0
  176. package/dist/policy/types.d.ts.map +1 -0
  177. package/dist/policy/types.js +127 -0
  178. package/dist/policy/types.js.map +1 -0
  179. package/dist/resources/functionalUpdate.d.ts +80 -0
  180. package/dist/resources/functionalUpdate.d.ts.map +1 -0
  181. package/dist/resources/functionalUpdate.js +88 -0
  182. package/dist/resources/functionalUpdate.js.map +1 -0
  183. package/dist/resources/httpResources.d.ts +449 -0
  184. package/dist/resources/httpResources.d.ts.map +1 -0
  185. package/dist/resources/httpResources.js +8 -0
  186. package/dist/resources/httpResources.js.map +1 -0
  187. package/dist/resources/modelOperations.d.ts +380 -0
  188. package/dist/resources/modelOperations.d.ts.map +1 -0
  189. package/dist/resources/modelOperations.js +13 -0
  190. package/dist/resources/modelOperations.js.map +1 -0
  191. package/dist/resources/mutationOptions.d.ts +67 -0
  192. package/dist/resources/mutationOptions.d.ts.map +1 -0
  193. package/dist/resources/mutationOptions.js +10 -0
  194. package/dist/resources/mutationOptions.js.map +1 -0
  195. package/dist/resources/where.d.ts +102 -0
  196. package/dist/resources/where.d.ts.map +1 -0
  197. package/dist/resources/where.js +116 -0
  198. package/dist/resources/where.js.map +1 -0
  199. package/dist/resources/writeOptionsSchema.d.ts +48 -0
  200. package/dist/resources/writeOptionsSchema.d.ts.map +1 -0
  201. package/dist/resources/writeOptionsSchema.js +74 -0
  202. package/dist/resources/writeOptionsSchema.js.map +1 -0
  203. package/dist/schema/coordination.d.ts +113 -0
  204. package/dist/schema/coordination.d.ts.map +1 -0
  205. package/dist/schema/coordination.js +134 -0
  206. package/dist/schema/coordination.js.map +1 -0
  207. package/dist/schema/ddl.d.ts +98 -0
  208. package/dist/schema/ddl.d.ts.map +1 -0
  209. package/dist/schema/ddl.js +492 -0
  210. package/dist/schema/ddl.js.map +1 -0
  211. package/dist/schema/ddlLock.d.ts +36 -0
  212. package/dist/schema/ddlLock.d.ts.map +1 -0
  213. package/dist/schema/ddlLock.js +47 -0
  214. package/dist/schema/ddlLock.js.map +1 -0
  215. package/dist/schema/diff.d.ts +226 -0
  216. package/dist/schema/diff.d.ts.map +1 -0
  217. package/dist/schema/diff.js +290 -0
  218. package/dist/schema/diff.js.map +1 -0
  219. package/dist/schema/field.d.ts +121 -0
  220. package/dist/schema/field.d.ts.map +1 -0
  221. package/dist/schema/field.js +266 -0
  222. package/dist/schema/field.js.map +1 -0
  223. package/dist/schema/fieldRef.d.ts +58 -0
  224. package/dist/schema/fieldRef.d.ts.map +1 -0
  225. package/dist/schema/fieldRef.js +26 -0
  226. package/dist/schema/fieldRef.js.map +1 -0
  227. package/dist/schema/generate.d.ts +20 -0
  228. package/dist/schema/generate.d.ts.map +1 -0
  229. package/dist/schema/generate.js +87 -0
  230. package/dist/schema/generate.js.map +1 -0
  231. package/dist/schema/index.d.ts +43 -0
  232. package/dist/schema/index.d.ts.map +1 -0
  233. package/dist/schema/index.js +81 -0
  234. package/dist/schema/index.js.map +1 -0
  235. package/dist/schema/loadStrategy.d.ts +46 -0
  236. package/dist/schema/loadStrategy.d.ts.map +1 -0
  237. package/dist/schema/loadStrategy.js +47 -0
  238. package/dist/schema/loadStrategy.js.map +1 -0
  239. package/dist/schema/model.d.ts +380 -0
  240. package/dist/schema/model.d.ts.map +1 -0
  241. package/dist/schema/model.js +124 -0
  242. package/dist/schema/model.js.map +1 -0
  243. package/dist/schema/openapi.d.ts +59 -0
  244. package/dist/schema/openapi.d.ts.map +1 -0
  245. package/dist/schema/openapi.js +508 -0
  246. package/dist/schema/openapi.js.map +1 -0
  247. package/dist/schema/queries.d.ts +202 -0
  248. package/dist/schema/queries.d.ts.map +1 -0
  249. package/dist/schema/queries.js +144 -0
  250. package/dist/schema/queries.js.map +1 -0
  251. package/dist/schema/relation.d.ts +205 -0
  252. package/dist/schema/relation.d.ts.map +1 -0
  253. package/dist/schema/relation.js +105 -0
  254. package/dist/schema/relation.js.map +1 -0
  255. package/dist/schema/residency.d.ts +30 -0
  256. package/dist/schema/residency.d.ts.map +1 -0
  257. package/dist/schema/residency.js +26 -0
  258. package/dist/schema/residency.js.map +1 -0
  259. package/dist/schema/roles.d.ts +250 -0
  260. package/dist/schema/roles.d.ts.map +1 -0
  261. package/dist/schema/roles.js +231 -0
  262. package/dist/schema/roles.js.map +1 -0
  263. package/dist/schema/schema.d.ts +352 -0
  264. package/dist/schema/schema.d.ts.map +1 -0
  265. package/dist/schema/schema.js +326 -0
  266. package/dist/schema/schema.js.map +1 -0
  267. package/dist/schema/select.d.ts +41 -0
  268. package/dist/schema/select.d.ts.map +1 -0
  269. package/dist/schema/select.js +91 -0
  270. package/dist/schema/select.js.map +1 -0
  271. package/dist/schema/serialize.d.ts +116 -0
  272. package/dist/schema/serialize.d.ts.map +1 -0
  273. package/dist/schema/serialize.js +278 -0
  274. package/dist/schema/serialize.js.map +1 -0
  275. package/dist/schema/sugar.d.ts +110 -0
  276. package/dist/schema/sugar.d.ts.map +1 -0
  277. package/dist/schema/sugar.js +84 -0
  278. package/dist/schema/sugar.js.map +1 -0
  279. package/dist/schema/tenancy.d.ts +140 -0
  280. package/dist/schema/tenancy.d.ts.map +1 -0
  281. package/dist/schema/tenancy.js +191 -0
  282. package/dist/schema/tenancy.js.map +1 -0
  283. package/dist/server/adapter.d.ts +174 -0
  284. package/dist/server/adapter.d.ts.map +1 -0
  285. package/dist/server/adapter.js +19 -0
  286. package/dist/server/adapter.js.map +1 -0
  287. package/dist/server/commit.d.ts +108 -0
  288. package/dist/server/commit.d.ts.map +1 -0
  289. package/dist/server/commit.js +2 -0
  290. package/dist/server/commit.js.map +1 -0
  291. package/dist/server/index.d.ts +15 -0
  292. package/dist/server/index.d.ts.map +1 -0
  293. package/dist/server/index.js +3 -0
  294. package/dist/server/index.js.map +1 -0
  295. package/dist/server/readConfig.d.ts +81 -0
  296. package/dist/server/readConfig.d.ts.map +1 -0
  297. package/dist/server/readConfig.js +9 -0
  298. package/dist/server/readConfig.js.map +1 -0
  299. package/dist/server/storageMode.d.ts +24 -0
  300. package/dist/server/storageMode.d.ts.map +1 -0
  301. package/dist/server/storageMode.js +18 -0
  302. package/dist/server/storageMode.js.map +1 -0
  303. package/dist/source/adapter.d.ts +84 -0
  304. package/dist/source/adapter.d.ts.map +1 -0
  305. package/dist/source/adapter.js +25 -0
  306. package/dist/source/adapter.js.map +1 -0
  307. package/dist/source/adapters/drizzle.d.ts +49 -0
  308. package/dist/source/adapters/drizzle.d.ts.map +1 -0
  309. package/dist/source/adapters/drizzle.js +220 -0
  310. package/dist/source/adapters/drizzle.js.map +1 -0
  311. package/dist/source/adapters/kysely.d.ts +43 -0
  312. package/dist/source/adapters/kysely.d.ts.map +1 -0
  313. package/dist/source/adapters/kysely.js +206 -0
  314. package/dist/source/adapters/kysely.js.map +1 -0
  315. package/dist/source/adapters/kyselyMutationCore.d.ts +77 -0
  316. package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -0
  317. package/dist/source/adapters/kyselyMutationCore.js +126 -0
  318. package/dist/source/adapters/kyselyMutationCore.js.map +1 -0
  319. package/dist/source/adapters/memory.d.ts +14 -0
  320. package/dist/source/adapters/memory.d.ts.map +1 -0
  321. package/dist/source/adapters/memory.js +131 -0
  322. package/dist/source/adapters/memory.js.map +1 -0
  323. package/dist/source/adapters/prisma.d.ts +64 -0
  324. package/dist/source/adapters/prisma.d.ts.map +1 -0
  325. package/dist/source/adapters/prisma.js +203 -0
  326. package/dist/source/adapters/prisma.js.map +1 -0
  327. package/dist/source/conformance.d.ts +38 -0
  328. package/dist/source/conformance.d.ts.map +1 -0
  329. package/dist/source/conformance.js +216 -0
  330. package/dist/source/conformance.js.map +1 -0
  331. package/dist/source/connector.d.ts +96 -0
  332. package/dist/source/connector.d.ts.map +1 -0
  333. package/dist/source/connector.js +267 -0
  334. package/dist/source/connector.js.map +1 -0
  335. package/dist/source/connectorProtocol.d.ts +155 -0
  336. package/dist/source/connectorProtocol.d.ts.map +1 -0
  337. package/dist/source/connectorProtocol.js +164 -0
  338. package/dist/source/connectorProtocol.js.map +1 -0
  339. package/dist/source/contract.d.ts +196 -0
  340. package/dist/source/contract.d.ts.map +1 -0
  341. package/dist/source/contract.js +165 -0
  342. package/dist/source/contract.js.map +1 -0
  343. package/dist/source/drizzle.d.ts +2 -0
  344. package/dist/source/drizzle.d.ts.map +1 -0
  345. package/dist/source/drizzle.js +2 -0
  346. package/dist/source/drizzle.js.map +1 -0
  347. package/dist/source/factory.d.ts +93 -0
  348. package/dist/source/factory.d.ts.map +1 -0
  349. package/dist/source/factory.js +287 -0
  350. package/dist/source/factory.js.map +1 -0
  351. package/dist/source/idempotency.d.ts +62 -0
  352. package/dist/source/idempotency.d.ts.map +1 -0
  353. package/dist/source/idempotency.js +145 -0
  354. package/dist/source/idempotency.js.map +1 -0
  355. package/dist/source/index.d.ts +24 -0
  356. package/dist/source/index.d.ts.map +1 -0
  357. package/dist/source/index.js +29 -0
  358. package/dist/source/index.js.map +1 -0
  359. package/dist/source/kysely.d.ts +3 -0
  360. package/dist/source/kysely.d.ts.map +1 -0
  361. package/dist/source/kysely.js +3 -0
  362. package/dist/source/kysely.js.map +1 -0
  363. package/dist/source/migrations.d.ts +22 -0
  364. package/dist/source/migrations.d.ts.map +1 -0
  365. package/dist/source/migrations.js +104 -0
  366. package/dist/source/migrations.js.map +1 -0
  367. package/dist/source/next.d.ts +33 -0
  368. package/dist/source/next.d.ts.map +1 -0
  369. package/dist/source/next.js +26 -0
  370. package/dist/source/next.js.map +1 -0
  371. package/dist/source/pushQueue.d.ts +135 -0
  372. package/dist/source/pushQueue.d.ts.map +1 -0
  373. package/dist/source/pushQueue.js +257 -0
  374. package/dist/source/pushQueue.js.map +1 -0
  375. package/dist/source/signing.d.ts +93 -0
  376. package/dist/source/signing.d.ts.map +1 -0
  377. package/dist/source/signing.js +163 -0
  378. package/dist/source/signing.js.map +1 -0
  379. package/dist/source/types.d.ts +402 -0
  380. package/dist/source/types.d.ts.map +1 -0
  381. package/dist/source/types.js +60 -0
  382. package/dist/source/types.js.map +1 -0
  383. package/dist/syncLog/contract.d.ts +21 -0
  384. package/dist/syncLog/contract.d.ts.map +1 -0
  385. package/dist/syncLog/contract.js +20 -0
  386. package/dist/syncLog/contract.js.map +1 -0
  387. package/dist/syncLog/index.d.ts +2 -0
  388. package/dist/syncLog/index.d.ts.map +1 -0
  389. package/dist/syncLog/index.js +2 -0
  390. package/dist/syncLog/index.js.map +1 -0
  391. package/dist/testing/fixtures/httpResponses.d.ts +74 -0
  392. package/dist/testing/fixtures/httpResponses.d.ts.map +1 -0
  393. package/dist/testing/fixtures/httpResponses.js +102 -0
  394. package/dist/testing/fixtures/httpResponses.js.map +1 -0
  395. package/dist/transactionLayer.d.ts +110 -0
  396. package/dist/transactionLayer.d.ts.map +1 -0
  397. package/dist/transactionLayer.js +25 -0
  398. package/dist/transactionLayer.js.map +1 -0
  399. package/dist/transactions/settlement/commitEnvelope.d.ts +144 -0
  400. package/dist/transactions/settlement/commitEnvelope.d.ts.map +1 -0
  401. package/dist/transactions/settlement/commitEnvelope.js +162 -0
  402. package/dist/transactions/settlement/commitEnvelope.js.map +1 -0
  403. package/dist/transactions/settlement/httpCommitEnvelope.d.ts +54 -0
  404. package/dist/transactions/settlement/httpCommitEnvelope.d.ts.map +1 -0
  405. package/dist/transactions/settlement/httpCommitEnvelope.js +208 -0
  406. package/dist/transactions/settlement/httpCommitEnvelope.js.map +1 -0
  407. package/dist/transactions/settlement/idempotencyKey.d.ts +11 -0
  408. package/dist/transactions/settlement/idempotencyKey.d.ts.map +1 -0
  409. package/dist/transactions/settlement/idempotencyKey.js +10 -0
  410. package/dist/transactions/settlement/idempotencyKey.js.map +1 -0
  411. package/dist/transactions/settlement/pendingWrite.d.ts +113 -0
  412. package/dist/transactions/settlement/pendingWrite.d.ts.map +1 -0
  413. package/dist/transactions/settlement/pendingWrite.js +21 -0
  414. package/dist/transactions/settlement/pendingWrite.js.map +1 -0
  415. package/dist/transport/commitFrames.d.ts +91 -0
  416. package/dist/transport/commitFrames.d.ts.map +1 -0
  417. package/dist/transport/commitFrames.js +135 -0
  418. package/dist/transport/commitFrames.js.map +1 -0
  419. package/dist/transport/connectionManager.d.ts +216 -0
  420. package/dist/transport/connectionManager.d.ts.map +1 -0
  421. package/dist/transport/connectionManager.js +674 -0
  422. package/dist/transport/connectionManager.js.map +1 -0
  423. package/dist/transport/credentialLifecycle.d.ts +178 -0
  424. package/dist/transport/credentialLifecycle.d.ts.map +1 -0
  425. package/dist/transport/credentialLifecycle.js +324 -0
  426. package/dist/transport/credentialLifecycle.js.map +1 -0
  427. package/dist/transport/heartbeat.d.ts +66 -0
  428. package/dist/transport/heartbeat.d.ts.map +1 -0
  429. package/dist/transport/heartbeat.js +94 -0
  430. package/dist/transport/heartbeat.js.map +1 -0
  431. package/dist/transport/httpClient.d.ts +143 -0
  432. package/dist/transport/httpClient.d.ts.map +1 -0
  433. package/dist/transport/httpClient.js +150 -0
  434. package/dist/transport/httpClient.js.map +1 -0
  435. package/dist/transport/httpFeed.d.ts +4 -0
  436. package/dist/transport/httpFeed.d.ts.map +1 -0
  437. package/dist/transport/httpFeed.js +94 -0
  438. package/dist/transport/httpFeed.js.map +1 -0
  439. package/dist/transport/httpOptions.d.ts +34 -0
  440. package/dist/transport/httpOptions.d.ts.map +1 -0
  441. package/dist/transport/httpOptions.js +13 -0
  442. package/dist/transport/httpOptions.js.map +1 -0
  443. package/dist/transport/httpTransport.d.ts +68 -0
  444. package/dist/transport/httpTransport.d.ts.map +1 -0
  445. package/dist/transport/httpTransport.js +1433 -0
  446. package/dist/transport/httpTransport.js.map +1 -0
  447. package/dist/transport/networkProbe.d.ts +85 -0
  448. package/dist/transport/networkProbe.d.ts.map +1 -0
  449. package/dist/transport/networkProbe.js +208 -0
  450. package/dist/transport/networkProbe.js.map +1 -0
  451. package/dist/transport/wsFrameHandlers.d.ts +129 -0
  452. package/dist/transport/wsFrameHandlers.d.ts.map +1 -0
  453. package/dist/transport/wsFrameHandlers.js +429 -0
  454. package/dist/transport/wsFrameHandlers.js.map +1 -0
  455. package/dist/transport/wsTransport.d.ts +575 -0
  456. package/dist/transport/wsTransport.d.ts.map +1 -0
  457. package/dist/transport/wsTransport.js +1024 -0
  458. package/dist/transport/wsTransport.js.map +1 -0
  459. package/dist/types/assertExact.d.ts +18 -0
  460. package/dist/types/assertExact.d.ts.map +1 -0
  461. package/dist/types/assertExact.js +2 -0
  462. package/dist/types/assertExact.js.map +1 -0
  463. package/dist/types/global.d.ts +108 -0
  464. package/dist/types/global.d.ts.map +1 -0
  465. package/dist/types/global.js +41 -0
  466. package/dist/types/global.js.map +1 -0
  467. package/dist/types/index.d.ts +206 -0
  468. package/dist/types/index.d.ts.map +1 -0
  469. package/dist/types/index.js +57 -0
  470. package/dist/types/index.js.map +1 -0
  471. package/dist/types/modelData.d.ts +11 -0
  472. package/dist/types/modelData.d.ts.map +1 -0
  473. package/dist/types/modelData.js +10 -0
  474. package/dist/types/modelData.js.map +1 -0
  475. package/dist/types/participant.d.ts +21 -0
  476. package/dist/types/participant.d.ts.map +1 -0
  477. package/dist/types/participant.js +11 -0
  478. package/dist/types/participant.js.map +1 -0
  479. package/dist/types/streams.d.ts +545 -0
  480. package/dist/types/streams.d.ts.map +1 -0
  481. package/dist/types/streams.js +12 -0
  482. package/dist/types/streams.js.map +1 -0
  483. package/dist/utils/asyncIterator.d.ts +35 -0
  484. package/dist/utils/asyncIterator.d.ts.map +1 -0
  485. package/dist/utils/asyncIterator.js +136 -0
  486. package/dist/utils/asyncIterator.js.map +1 -0
  487. package/dist/utils/duration.d.ts +51 -0
  488. package/dist/utils/duration.d.ts.map +1 -0
  489. package/dist/utils/duration.js +78 -0
  490. package/dist/utils/duration.js.map +1 -0
  491. package/dist/utils/json.d.ts +58 -0
  492. package/dist/utils/json.d.ts.map +1 -0
  493. package/dist/utils/json.js +277 -0
  494. package/dist/utils/json.js.map +1 -0
  495. package/dist/webhooks/events.d.ts +44 -0
  496. package/dist/webhooks/events.d.ts.map +1 -0
  497. package/dist/webhooks/events.js +43 -0
  498. package/dist/webhooks/events.js.map +1 -0
  499. package/dist/webhooks/index.d.ts +9 -0
  500. package/dist/webhooks/index.d.ts.map +1 -0
  501. package/dist/webhooks/index.js +9 -0
  502. package/dist/webhooks/index.js.map +1 -0
  503. package/dist/wire/accountResponses.d.ts +463 -0
  504. package/dist/wire/accountResponses.d.ts.map +1 -0
  505. package/dist/wire/accountResponses.js +294 -0
  506. package/dist/wire/accountResponses.js.map +1 -0
  507. package/dist/wire/auth.d.ts +57 -0
  508. package/dist/wire/auth.d.ts.map +1 -0
  509. package/dist/wire/auth.js +71 -0
  510. package/dist/wire/auth.js.map +1 -0
  511. package/dist/wire/bootstrapReason.d.ts +10 -0
  512. package/dist/wire/bootstrapReason.d.ts.map +1 -0
  513. package/dist/wire/bootstrapReason.js +9 -0
  514. package/dist/wire/bootstrapReason.js.map +1 -0
  515. package/dist/wire/claimEvent.d.ts +70 -0
  516. package/dist/wire/claimEvent.d.ts.map +1 -0
  517. package/dist/wire/claimEvent.js +74 -0
  518. package/dist/wire/claimEvent.js.map +1 -0
  519. package/dist/wire/claims.d.ts +475 -0
  520. package/dist/wire/claims.d.ts.map +1 -0
  521. package/dist/wire/claims.js +326 -0
  522. package/dist/wire/claims.js.map +1 -0
  523. package/dist/wire/commit.d.ts +604 -0
  524. package/dist/wire/commit.d.ts.map +1 -0
  525. package/dist/wire/commit.js +322 -0
  526. package/dist/wire/commit.js.map +1 -0
  527. package/dist/wire/delta.d.ts +251 -0
  528. package/dist/wire/delta.d.ts.map +1 -0
  529. package/dist/wire/delta.js +148 -0
  530. package/dist/wire/delta.js.map +1 -0
  531. package/dist/wire/errorEnvelope.d.ts +73 -0
  532. package/dist/wire/errorEnvelope.d.ts.map +1 -0
  533. package/dist/wire/errorEnvelope.js +124 -0
  534. package/dist/wire/errorEnvelope.js.map +1 -0
  535. package/dist/wire/feedCursor.d.ts +61 -0
  536. package/dist/wire/feedCursor.d.ts.map +1 -0
  537. package/dist/wire/feedCursor.js +83 -0
  538. package/dist/wire/feedCursor.js.map +1 -0
  539. package/dist/wire/feedEvent.d.ts +264 -0
  540. package/dist/wire/feedEvent.d.ts.map +1 -0
  541. package/dist/wire/feedEvent.js +66 -0
  542. package/dist/wire/feedEvent.js.map +1 -0
  543. package/dist/wire/frames.d.ts +195 -0
  544. package/dist/wire/frames.d.ts.map +1 -0
  545. package/dist/wire/frames.js +51 -0
  546. package/dist/wire/frames.js.map +1 -0
  547. package/dist/wire/inboundFrames.d.ts +490 -0
  548. package/dist/wire/inboundFrames.d.ts.map +1 -0
  549. package/dist/wire/inboundFrames.js +117 -0
  550. package/dist/wire/inboundFrames.js.map +1 -0
  551. package/dist/wire/index.d.ts +55 -0
  552. package/dist/wire/index.d.ts.map +1 -0
  553. package/dist/wire/index.js +84 -0
  554. package/dist/wire/index.js.map +1 -0
  555. package/dist/wire/listEnvelope.d.ts +38 -0
  556. package/dist/wire/listEnvelope.d.ts.map +1 -0
  557. package/dist/wire/listEnvelope.js +43 -0
  558. package/dist/wire/listEnvelope.js.map +1 -0
  559. package/dist/wire/modelMutations.d.ts +32 -0
  560. package/dist/wire/modelMutations.d.ts.map +1 -0
  561. package/dist/wire/modelMutations.js +53 -0
  562. package/dist/wire/modelMutations.js.map +1 -0
  563. package/dist/wire/modelResponses.d.ts +79 -0
  564. package/dist/wire/modelResponses.d.ts.map +1 -0
  565. package/dist/wire/modelResponses.js +44 -0
  566. package/dist/wire/modelResponses.js.map +1 -0
  567. package/dist/wire/modelShape.d.ts +79 -0
  568. package/dist/wire/modelShape.d.ts.map +1 -0
  569. package/dist/wire/modelShape.js +75 -0
  570. package/dist/wire/modelShape.js.map +1 -0
  571. package/dist/wire/protocol.d.ts +39 -0
  572. package/dist/wire/protocol.d.ts.map +1 -0
  573. package/dist/wire/protocol.js +39 -0
  574. package/dist/wire/protocol.js.map +1 -0
  575. package/dist/wire/protocolVersion.d.ts +74 -0
  576. package/dist/wire/protocolVersion.d.ts.map +1 -0
  577. package/dist/wire/protocolVersion.js +84 -0
  578. package/dist/wire/protocolVersion.js.map +1 -0
  579. package/package.json +187 -0
  580. package/src/ablo.ts +139 -0
  581. package/src/ai-sdk/coordinatedTool.ts +214 -0
  582. package/src/ai-sdk/index.ts +7 -0
  583. package/src/auth/apiKey.ts +540 -0
  584. package/src/auth/bootstrapScope.ts +15 -0
  585. package/src/auth/browserCredentialSafety.ts +48 -0
  586. package/src/auth/capability.ts +326 -0
  587. package/src/auth/capabilityLifecycle.ts +174 -0
  588. package/src/auth/credentialEndpoint.ts +79 -0
  589. package/src/auth/credentialEndpointProtocol.ts +51 -0
  590. package/src/auth/credentialKind.ts +20 -0
  591. package/src/auth/credentialPolicy.ts +244 -0
  592. package/src/auth/credentialResult.ts +23 -0
  593. package/src/auth/credentialSource.ts +99 -0
  594. package/src/auth/hostedEndpoints.ts +24 -0
  595. package/src/auth/identity.ts +330 -0
  596. package/src/auth/index.ts +592 -0
  597. package/src/auth/schemas.ts +94 -0
  598. package/src/auth/sessionMint.ts +126 -0
  599. package/src/auth/token.ts +4 -0
  600. package/src/batching/index.ts +200 -0
  601. package/src/coordination/awaitClaimGrant.ts +243 -0
  602. package/src/coordination/claimHeartbeatLoop.ts +165 -0
  603. package/src/coordination/claimMeta.ts +56 -0
  604. package/src/coordination/events.ts +86 -0
  605. package/src/coordination/index.ts +181 -0
  606. package/src/coordination/locator.ts +200 -0
  607. package/src/coordination/schema.ts +1346 -0
  608. package/src/coordination/targetConflict.ts +85 -0
  609. package/src/coordination/trace.ts +173 -0
  610. package/src/docs/catalog.ts +274 -0
  611. package/src/docs/index.ts +18 -0
  612. package/src/durableWrites.ts +134 -0
  613. package/src/environment.ts +132 -0
  614. package/src/errorCodes.ts +1591 -0
  615. package/src/errors.ts +918 -0
  616. package/src/footprint.ts +0 -0
  617. package/src/headlessClient.ts +161 -0
  618. package/src/index.ts +52 -0
  619. package/src/keys/index.ts +254 -0
  620. package/src/log/syncDeltaRow.ts +119 -0
  621. package/src/logger.ts +22 -0
  622. package/src/observability.ts +85 -0
  623. package/src/policy/types.ts +292 -0
  624. package/src/resources/functionalUpdate.ts +151 -0
  625. package/src/resources/httpResources.ts +520 -0
  626. package/src/resources/modelOperations.ts +444 -0
  627. package/src/resources/mutationOptions.ts +66 -0
  628. package/src/resources/where.ts +160 -0
  629. package/src/resources/writeOptionsSchema.ts +91 -0
  630. package/src/schema/coordination.ts +161 -0
  631. package/src/schema/ddl.ts +593 -0
  632. package/src/schema/ddlLock.ts +53 -0
  633. package/src/schema/diff.ts +489 -0
  634. package/src/schema/field.ts +321 -0
  635. package/src/schema/fieldRef.ts +88 -0
  636. package/src/schema/generate.ts +95 -0
  637. package/src/schema/index.ts +278 -0
  638. package/src/schema/loadStrategy.ts +52 -0
  639. package/src/schema/model.ts +476 -0
  640. package/src/schema/openapi.ts +658 -0
  641. package/src/schema/queries.ts +273 -0
  642. package/src/schema/relation.ts +291 -0
  643. package/src/schema/residency.ts +30 -0
  644. package/src/schema/roles.ts +325 -0
  645. package/src/schema/schema.ts +825 -0
  646. package/src/schema/select.ts +115 -0
  647. package/src/schema/serialize.ts +373 -0
  648. package/src/schema/sugar.ts +194 -0
  649. package/src/schema/tenancy.ts +221 -0
  650. package/src/server/adapter.ts +203 -0
  651. package/src/server/commit.ts +109 -0
  652. package/src/server/index.ts +26 -0
  653. package/src/server/readConfig.ts +82 -0
  654. package/src/server/storageMode.ts +20 -0
  655. package/src/source/adapter.ts +85 -0
  656. package/src/source/adapters/drizzle.ts +291 -0
  657. package/src/source/adapters/kysely.ts +346 -0
  658. package/src/source/adapters/kyselyMutationCore.ts +220 -0
  659. package/src/source/adapters/memory.ts +154 -0
  660. package/src/source/adapters/prisma.ts +282 -0
  661. package/src/source/conformance.ts +287 -0
  662. package/src/source/connector.ts +394 -0
  663. package/src/source/connectorProtocol.ts +189 -0
  664. package/src/source/contract.ts +221 -0
  665. package/src/source/drizzle.ts +1 -0
  666. package/src/source/factory.ts +444 -0
  667. package/src/source/idempotency.ts +189 -0
  668. package/src/source/index.ts +182 -0
  669. package/src/source/kysely.ts +2 -0
  670. package/src/source/migrations.ts +109 -0
  671. package/src/source/next.ts +38 -0
  672. package/src/source/pushQueue.ts +368 -0
  673. package/src/source/signing.ts +279 -0
  674. package/src/source/types.ts +502 -0
  675. package/src/syncLog/contract.ts +32 -0
  676. package/src/syncLog/index.ts +1 -0
  677. package/src/testing/fixtures/httpResponses.ts +155 -0
  678. package/src/transactionLayer.ts +122 -0
  679. package/src/transactions/settlement/commitEnvelope.ts +192 -0
  680. package/src/transactions/settlement/httpCommitEnvelope.ts +250 -0
  681. package/src/transactions/settlement/idempotencyKey.ts +11 -0
  682. package/src/transactions/settlement/pendingWrite.ts +24 -0
  683. package/src/transport/commitFrames.ts +225 -0
  684. package/src/transport/connectionManager.ts +856 -0
  685. package/src/transport/credentialLifecycle.ts +389 -0
  686. package/src/transport/heartbeat.ts +118 -0
  687. package/src/transport/httpClient.ts +354 -0
  688. package/src/transport/httpFeed.ts +111 -0
  689. package/src/transport/httpOptions.ts +41 -0
  690. package/src/transport/httpTransport.ts +1976 -0
  691. package/src/transport/networkProbe.ts +249 -0
  692. package/src/transport/wsFrameHandlers.ts +619 -0
  693. package/src/transport/wsTransport.ts +1491 -0
  694. package/src/types/assertExact.ts +17 -0
  695. package/src/types/global.ts +123 -0
  696. package/src/types/index.ts +270 -0
  697. package/src/types/modelData.ts +11 -0
  698. package/src/types/participant.ts +22 -0
  699. package/src/types/streams.ts +702 -0
  700. package/src/utils/asyncIterator.ts +141 -0
  701. package/src/utils/duration.ts +88 -0
  702. package/src/utils/json.ts +281 -0
  703. package/src/webhooks/events.ts +96 -0
  704. package/src/webhooks/index.ts +12 -0
  705. package/src/wire/accountResponses.ts +328 -0
  706. package/src/wire/auth.ts +86 -0
  707. package/src/wire/bootstrapReason.ts +10 -0
  708. package/src/wire/claimEvent.ts +85 -0
  709. package/src/wire/claims.ts +370 -0
  710. package/src/wire/commit.ts +379 -0
  711. package/src/wire/delta.ts +173 -0
  712. package/src/wire/errorEnvelope.ts +133 -0
  713. package/src/wire/feedCursor.ts +91 -0
  714. package/src/wire/feedEvent.ts +74 -0
  715. package/src/wire/frames.ts +77 -0
  716. package/src/wire/inboundFrames.ts +182 -0
  717. package/src/wire/index.ts +328 -0
  718. package/src/wire/listEnvelope.ts +51 -0
  719. package/src/wire/modelMutations.ts +55 -0
  720. package/src/wire/modelResponses.ts +48 -0
  721. package/src/wire/modelShape.ts +83 -0
  722. package/src/wire/protocol.ts +39 -0
  723. package/src/wire/protocolVersion.ts +97 -0
@@ -0,0 +1,489 @@
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
+
32
+ import type { FieldMeta } from './field.js';
33
+ import type { SchemaJSON, ModelJSON } from './serialize.js';
34
+
35
+ export type FieldType = FieldMeta['type'];
36
+
37
+ /** Whether a Postgres `ALTER COLUMN … TYPE` can preserve the existing data. */
38
+ export type CastSafety = 'safe' | 'risky' | 'notCastable';
39
+
40
+ /** Records a column's type change and how safely Postgres can carry it out. */
41
+ export interface FieldTypeChange {
42
+ readonly from: FieldType;
43
+ readonly to: FieldType;
44
+ /** How the type change is carried out: `safe` runs a plain `ALTER COLUMN … TYPE`;
45
+ * `risky` runs one with a `USING` cast that may fail on some rows; `notCastable`
46
+ * drops and recreates the column, losing its data. */
47
+ readonly cast: CastSafety;
48
+ }
49
+
50
+ /** Records a change to whether a field is optional. Going from optional to required
51
+ * (`true → false`) is the dangerous direction: it fails if any existing row holds
52
+ * a null. */
53
+ export interface NullabilityChange {
54
+ readonly fromOptional: boolean;
55
+ readonly toOptional: boolean;
56
+ }
57
+
58
+ /** Records which allowed values an enum field gained and lost. Removing a value is
59
+ * the risky part — existing rows still holding it violate the new constraint. */
60
+ export interface EnumValuesChange {
61
+ readonly added: readonly string[];
62
+ readonly removed: readonly string[];
63
+ }
64
+
65
+ /** Records a change to whether a field is indexed (`from` was, `to` will be). */
66
+ export interface IndexChange {
67
+ readonly from: boolean;
68
+ readonly to: boolean;
69
+ }
70
+
71
+ /** Records a change to the physical database column name backing a field whose
72
+ * logical name stayed the same. */
73
+ export interface FieldColumnChange {
74
+ readonly from: string;
75
+ readonly to: string;
76
+ }
77
+
78
+ /** The set of facets of a single column that changed. Each optional member is
79
+ * present only when that facet actually changed, so one `alter_field` step can
80
+ * describe several simultaneous changes to the same column. */
81
+ export interface FieldChanges {
82
+ readonly column?: FieldColumnChange;
83
+ readonly type?: FieldTypeChange;
84
+ readonly nullability?: NullabilityChange;
85
+ readonly enumValues?: EnumValuesChange;
86
+ readonly indexed?: IndexChange;
87
+ }
88
+
89
+ /** One step in a migration plan. The `kind` tag names the operation and the
90
+ * remaining fields carry its target and payload. {@link diffSchema} emits these in
91
+ * expand-then-contract order, and the host implementation lowers each to SQL. */
92
+ export type MigrationStep =
93
+ | { readonly kind: 'create_model'; readonly model: string; readonly tableName: string }
94
+ | { readonly kind: 'drop_model'; readonly model: string; readonly tableName: string }
95
+ | { readonly kind: 'rename_model'; readonly from: string; readonly to: string }
96
+ | { readonly kind: 'add_field'; readonly model: string; readonly field: string; readonly meta: FieldMeta }
97
+ | { readonly kind: 'drop_field'; readonly model: string; readonly field: string }
98
+ | { readonly kind: 'rename_field'; readonly model: string; readonly from: string; readonly to: string }
99
+ | { readonly kind: 'alter_field'; readonly model: string; readonly field: string; readonly changes: FieldChanges };
100
+
101
+ /**
102
+ * Tells {@link diffSchema} which removed-and-added pairs are really renames. Supply
103
+ * these as data because the planner cannot safely guess: without a hint, a field
104
+ * that disappears and a field that appears read as a drop followed by an add, which
105
+ * loses the column's data. Each field rename names its model by the model's key in
106
+ * the new schema, after any model rename has been applied.
107
+ */
108
+ export interface RenameHints {
109
+ readonly models?: readonly { readonly from: string; readonly to: string }[];
110
+ readonly fields?: readonly { readonly model: string; readonly from: string; readonly to: string }[];
111
+ }
112
+
113
+ // ── Cast safety matrix ────────────────────────────────────────────────────────
114
+ // Keyed `${from}->${to}` over the 6 sync field types. Targets that map to TEXT
115
+ // (`string`) accept any scalar losslessly; tightening into an `enum` adds a CHECK
116
+ // that existing rows may violate (risky); narrowing into number/bool/date/json
117
+ // is risky (USING cast can fail per-row) or impossible (notCastable).
118
+ const CAST: Readonly<Record<string, CastSafety>> = {
119
+ // → string (TEXT): always safe
120
+ 'number->string': 'safe', 'boolean->string': 'safe', 'date->string': 'safe',
121
+ 'enum->string': 'safe', 'json->string': 'safe',
122
+ // → enum (TEXT + CHECK): constraint over existing data is risky
123
+ 'string->enum': 'risky', 'number->enum': 'risky', 'boolean->enum': 'risky',
124
+ 'date->enum': 'risky', 'json->enum': 'notCastable',
125
+ // → number (DOUBLE PRECISION)
126
+ 'string->number': 'risky', 'enum->number': 'risky', 'boolean->number': 'notCastable',
127
+ 'date->number': 'notCastable', 'json->number': 'notCastable',
128
+ // → boolean
129
+ 'string->boolean': 'risky', 'enum->boolean': 'risky', 'number->boolean': 'risky',
130
+ 'date->boolean': 'notCastable', 'json->boolean': 'notCastable',
131
+ // → date (TIMESTAMPTZ)
132
+ 'string->date': 'risky', 'enum->date': 'risky', 'number->date': 'notCastable',
133
+ 'boolean->date': 'notCastable', 'json->date': 'notCastable',
134
+ // → json (JSONB)
135
+ 'string->json': 'risky', 'enum->json': 'risky', 'number->json': 'notCastable',
136
+ 'boolean->json': 'notCastable', 'date->json': 'notCastable',
137
+ };
138
+
139
+ /** Reports how safely a field's type can change from `from` to `to`. The same type
140
+ * in and out is always safe; anything else is looked up in the cast-safety matrix
141
+ * and defaults to `notCastable` when no entry exists. */
142
+ export function classifyCast(from: FieldType, to: FieldType): CastSafety {
143
+ if (from === to) return 'safe';
144
+ return CAST[`${from}->${to}`] ?? 'notCastable';
145
+ }
146
+
147
+ // ── Diff ──────────────────────────────────────────────────────────────────────
148
+
149
+ function diffEnumValues(
150
+ from: readonly string[] | undefined,
151
+ to: readonly string[] | undefined,
152
+ ): EnumValuesChange | undefined {
153
+ const a = new Set(from ?? []);
154
+ const b = new Set(to ?? []);
155
+ const added = [...b].filter((v) => !a.has(v));
156
+ const removed = [...a].filter((v) => !b.has(v));
157
+ if (added.length === 0 && removed.length === 0) return undefined;
158
+ return { added, removed };
159
+ }
160
+
161
+ function camelToSnake(identifier: string): string {
162
+ return identifier.replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`);
163
+ }
164
+
165
+ function columnNameOf(fieldName: string, meta: FieldMeta): string {
166
+ return meta.column ?? camelToSnake(fieldName);
167
+ }
168
+
169
+ function diffField(prevFieldName: string, nextFieldName: string, prev: FieldMeta, next: FieldMeta): FieldChanges | null {
170
+ const changes: {
171
+ column?: FieldColumnChange;
172
+ type?: FieldTypeChange;
173
+ nullability?: NullabilityChange;
174
+ enumValues?: EnumValuesChange;
175
+ indexed?: IndexChange;
176
+ } = {};
177
+
178
+ const prevColumn = columnNameOf(prevFieldName, prev);
179
+ const nextColumn = columnNameOf(nextFieldName, next);
180
+ if (prevColumn !== nextColumn) {
181
+ changes.column = { from: prevColumn, to: nextColumn };
182
+ }
183
+ if (prev.type !== next.type) {
184
+ changes.type = { from: prev.type, to: next.type, cast: classifyCast(prev.type, next.type) };
185
+ }
186
+ if (prev.isOptional !== next.isOptional) {
187
+ changes.nullability = { fromOptional: prev.isOptional, toOptional: next.isOptional };
188
+ }
189
+ // Enum value drift only matters while the field is (still) an enum; a type
190
+ // change away from enum is already captured by `type`.
191
+ if (prev.type === 'enum' && next.type === 'enum') {
192
+ const ev = diffEnumValues(prev.enumValues, next.enumValues);
193
+ if (ev) changes.enumValues = ev;
194
+ }
195
+ if (prev.isIndexed !== next.isIndexed) {
196
+ changes.indexed = { from: prev.isIndexed, to: next.isIndexed };
197
+ }
198
+
199
+ return Object.keys(changes).length === 0 ? null : changes;
200
+ }
201
+
202
+ function tableNameOf(model: ModelJSON, key: string): string {
203
+ return model.tableName ?? key;
204
+ }
205
+
206
+ function diffModelFields(
207
+ model: string,
208
+ prev: ModelJSON,
209
+ next: ModelJSON,
210
+ fieldRenames: readonly { from: string; to: string }[],
211
+ ): MigrationStep[] {
212
+ const steps: MigrationStep[] = [];
213
+
214
+ const renameByNewName = new Map(fieldRenames.map((r) => [r.to, r.from]));
215
+ const renamedFromNames = new Set(fieldRenames.map((r) => r.from));
216
+
217
+ // Renames first (so subsequent alter steps reference the new name).
218
+ for (const { from, to } of fieldRenames) {
219
+ if (from in prev.fields && to in next.fields) {
220
+ steps.push({ kind: 'rename_field', model, from, to });
221
+ }
222
+ }
223
+
224
+ // Added (present in next, not in prev, and not the target of a rename).
225
+ for (const [name, meta] of Object.entries(next.fields)) {
226
+ if (name in prev.fields) continue;
227
+ if (renameByNewName.has(name)) continue;
228
+ steps.push({ kind: 'add_field', model, field: name, meta });
229
+ }
230
+
231
+ // Altered: every field present in both (directly or via rename).
232
+ for (const [name, nextMeta] of Object.entries(next.fields)) {
233
+ const prevName = renameByNewName.get(name) ?? name;
234
+ const prevMeta = prev.fields[prevName];
235
+ if (!prevMeta) continue;
236
+ const changes = diffField(prevName, name, prevMeta, nextMeta);
237
+ if (changes?.column && renameByNewName.has(name)) {
238
+ // A hinted logical field rename already emits `rename_field`, whose
239
+ // lowering renames the physical column when needed. Do not emit a
240
+ // second `alter_field.column` for the same transition.
241
+ delete (changes as { column?: FieldColumnChange }).column;
242
+ }
243
+ if (changes && Object.keys(changes).length > 0) {
244
+ steps.push({ kind: 'alter_field', model, field: name, changes });
245
+ }
246
+ }
247
+
248
+ // Dropped (present in prev, not in next, and not renamed away).
249
+ for (const name of Object.keys(prev.fields)) {
250
+ if (name in next.fields) continue;
251
+ if (renamedFromNames.has(name)) continue;
252
+ steps.push({ kind: 'drop_field', model, field: name });
253
+ }
254
+
255
+ return steps;
256
+ }
257
+
258
+ /**
259
+ * Diff two serialized schemas into an ordered, expand→contract migration plan.
260
+ * `prev` is the active schema (`null` for a first push → all creates). Rename
261
+ * decisions are supplied via {@link RenameHints}; anything not hinted reads as
262
+ * drop+add.
263
+ */
264
+ export function diffSchema(
265
+ prev: SchemaJSON | null,
266
+ next: SchemaJSON,
267
+ hints: RenameHints = {},
268
+ ): MigrationStep[] {
269
+ if (!prev) {
270
+ // First push: every model is created, with its fields carried in the
271
+ // create (no per-field add steps — the table is born with them).
272
+ return Object.entries(next.models).map(([model, def]) => ({
273
+ kind: 'create_model' as const,
274
+ model,
275
+ tableName: tableNameOf(def, model),
276
+ }));
277
+ }
278
+
279
+ const modelRenames = hints.models ?? [];
280
+ const renameByNewModel = new Map(modelRenames.map((r) => [r.to, r.from]));
281
+ const renamedFromModels = new Set(modelRenames.map((r) => r.from));
282
+ const fieldHints = hints.fields ?? [];
283
+
284
+ const creates: MigrationStep[] = [];
285
+ const renames: MigrationStep[] = [];
286
+ const fieldSteps: MigrationStep[] = [];
287
+ const drops: MigrationStep[] = [];
288
+
289
+ // New + renamed models, and per-model field diffs.
290
+ for (const [model, nextDef] of Object.entries(next.models)) {
291
+ const prevModelKey = renameByNewModel.get(model) ?? model;
292
+ const prevDef = prev.models[prevModelKey];
293
+
294
+ if (!prevDef) {
295
+ creates.push({ kind: 'create_model', model, tableName: tableNameOf(nextDef, model) });
296
+ continue;
297
+ }
298
+
299
+ if (renameByNewModel.has(model)) {
300
+ renames.push({ kind: 'rename_model', from: prevModelKey, to: model });
301
+ }
302
+
303
+ const myFieldRenames = fieldHints
304
+ .filter((f) => f.model === model)
305
+ .map((f) => ({ from: f.from, to: f.to }));
306
+ fieldSteps.push(...diffModelFields(model, prevDef, nextDef, myFieldRenames));
307
+ }
308
+
309
+ // Dropped models (in prev, not in next, not renamed away).
310
+ for (const [model, prevDef] of Object.entries(prev.models)) {
311
+ if (model in next.models) continue;
312
+ if (renamedFromModels.has(model)) continue;
313
+ drops.push({ kind: 'drop_model', model, tableName: tableNameOf(prevDef, model) });
314
+ }
315
+
316
+ // Expand → contract ordering. Within fieldSteps the per-model helper already
317
+ // emits rename → add → alter → drop_field, which preserves the same invariant.
318
+ return [...creates, ...renames, ...fieldSteps, ...drops];
319
+ }
320
+
321
+ // ── Destructive-change classification ───────────────────────────────────────────
322
+
323
+ /**
324
+ * Why a migration step is flagged as a warning — a change that runs but may lose or
325
+ * risk data on a non-empty table. Each code corresponds to one destructive step
326
+ * kind that {@link classifyMigration} recognizes.
327
+ */
328
+ export type WarningCode =
329
+ | 'drop_model'
330
+ | 'drop_field'
331
+ | 'risky_cast'
332
+ | 'lossy_recreate'
333
+ | 'enum_value_removed'
334
+ /** A model stops being served to readers even though no table is dropped. This is
335
+ * raised when a push is accepted, not by {@link classifyMigration}, and the loss
336
+ * is visibility, not data — the underlying rows are left untouched. */
337
+ | 'remove_model';
338
+
339
+ /** Why a migration step is unexecutable — it fails on a non-empty table unless a
340
+ * default or backfill is supplied. Both cases introduce a requirement that existing
341
+ * rows might not satisfy. */
342
+ export type BlockerCode = 'required_field_added' | 'made_required';
343
+
344
+ /**
345
+ * One flagged change in a classified migration plan. {@link code} says what kind of
346
+ * risk it is, {@link model} and the optional {@link field} say where, and
347
+ * {@link detail} is a human-readable explanation suitable for showing to a
348
+ * developer.
349
+ */
350
+ export interface MigrationSignal {
351
+ readonly code: WarningCode | BlockerCode;
352
+ readonly model: string;
353
+ readonly field?: string;
354
+ readonly detail: string;
355
+ /**
356
+ * Extra context for a removal signal: the previously active schema this push was
357
+ * compared against. Tools use it to show which baseline made the push look
358
+ * incompatible — its version and when it was pushed — so the warning is not a
359
+ * mystery.
360
+ */
361
+ readonly shadowed?: {
362
+ readonly environment: string;
363
+ readonly version: number;
364
+ /** ISO 8601 timestamp when the compared-against schema was pushed, or null. */
365
+ readonly pushedAt: string | null;
366
+ /** Who pushed the compared-against schema, or null. */
367
+ readonly pushedBy: string | null;
368
+ };
369
+ }
370
+
371
+ /** The result of classifying a migration plan: its flagged changes split by
372
+ * severity. Produced by {@link classifyMigration} and read by
373
+ * {@link isAutoApplicable} and {@link unresolvedBlockers}. */
374
+ export interface MigrationClassification {
375
+ /** Changes that run but may lose or risk data on a non-empty table. */
376
+ readonly warnings: readonly MigrationSignal[];
377
+ /** Changes that fail on a non-empty table unless a default or backfill is supplied. */
378
+ readonly unexecutable: readonly MigrationSignal[];
379
+ }
380
+
381
+ /**
382
+ * Sorts a plan's steps into {@link MigrationClassification.warnings} and
383
+ * {@link MigrationClassification.unexecutable}. Because a step carries no per-field
384
+ * default, adding a required field is treated conservatively as unexecutable — the
385
+ * classifier cannot prove a default exists, so a backfill or default must resolve
386
+ * it. The classification is derived from the schema alone; whoever runs the plan can
387
+ * still downgrade a flagged step to a no-op once it finds the target table is empty.
388
+ */
389
+ export function classifyMigration(steps: readonly MigrationStep[]): MigrationClassification {
390
+ const warnings: MigrationSignal[] = [];
391
+ const unexecutable: MigrationSignal[] = [];
392
+
393
+ for (const step of steps) {
394
+ switch (step.kind) {
395
+ case 'drop_model':
396
+ warnings.push({ code: 'drop_model', model: step.model, detail: `drops table for "${step.model}" (data loss)` });
397
+ break;
398
+ case 'drop_field':
399
+ warnings.push({ code: 'drop_field', model: step.model, field: step.field, detail: `drops column "${step.field}" (data loss)` });
400
+ break;
401
+ case 'add_field':
402
+ if (!step.meta.isOptional) {
403
+ unexecutable.push({
404
+ code: 'required_field_added',
405
+ model: step.model,
406
+ field: step.field,
407
+ detail: `adds required column "${step.field}" — needs a default or backfill on a non-empty table`,
408
+ });
409
+ }
410
+ break;
411
+ case 'alter_field': {
412
+ const { changes } = step;
413
+ if (changes.nullability && changes.nullability.fromOptional && !changes.nullability.toOptional) {
414
+ unexecutable.push({
415
+ code: 'made_required',
416
+ model: step.model,
417
+ field: step.field,
418
+ detail: `makes "${step.field}" required — fails if existing rows are NULL`,
419
+ });
420
+ }
421
+ if (changes.type) {
422
+ if (changes.type.cast === 'risky') {
423
+ warnings.push({ code: 'risky_cast', model: step.model, field: step.field, detail: `${changes.type.from} → ${changes.type.to} may fail per-row` });
424
+ } else if (changes.type.cast === 'notCastable') {
425
+ warnings.push({ code: 'lossy_recreate', model: step.model, field: step.field, detail: `${changes.type.from} → ${changes.type.to} requires drop-and-recreate (data loss)` });
426
+ }
427
+ }
428
+ if (changes.enumValues && changes.enumValues.removed.length > 0) {
429
+ warnings.push({
430
+ code: 'enum_value_removed',
431
+ model: step.model,
432
+ field: step.field,
433
+ detail: `removes enum value(s) ${changes.enumValues.removed.join(', ')} — rows using them violate the new CHECK`,
434
+ });
435
+ }
436
+ break;
437
+ }
438
+ // create_model, rename_model, rename_field, add optional field: non-destructive.
439
+ default:
440
+ break;
441
+ }
442
+ }
443
+
444
+ return { warnings, unexecutable };
445
+ }
446
+
447
+ /** Whether a plan is safe to apply automatically — true when it has no unexecutable
448
+ * steps. Warnings do not block auto-apply; only unexecutable steps do. */
449
+ export function isAutoApplicable(classification: MigrationClassification): boolean {
450
+ return classification.unexecutable.length === 0;
451
+ }
452
+
453
+ // ── Backfill ────────────────────────────────────────────────────────────────
454
+
455
+ /**
456
+ * A constant value to write into existing rows so an otherwise-unexecutable step can
457
+ * run: a required field added to a non-empty table, or a field made required while
458
+ * some rows hold null. This is intentionally a single constant, not an SQL
459
+ * expression — it covers the common "new column defaults to X" case; anything more
460
+ * elaborate is out of scope.
461
+ */
462
+ export interface BackfillValue {
463
+ readonly model: string;
464
+ readonly field: string;
465
+ readonly value: string | number | boolean;
466
+ }
467
+
468
+ /**
469
+ * Reports whether a supplied backfill resolves this blocker. Only the two
470
+ * row-dependent blockers — `required_field_added` and `made_required` — can be
471
+ * resolved with a backfill; a data-loss warning cannot, and must be accepted
472
+ * explicitly instead.
473
+ */
474
+ export function isBlockerResolved(
475
+ signal: MigrationSignal,
476
+ backfills: readonly BackfillValue[],
477
+ ): boolean {
478
+ if (signal.code !== 'required_field_added' && signal.code !== 'made_required') return false;
479
+ return backfills.some((b) => b.model === signal.model && b.field === signal.field);
480
+ }
481
+
482
+ /** The unexecutable signals that the supplied backfills do not cover. An empty
483
+ * result means no blocker remains, though any warnings are still gated separately. */
484
+ export function unresolvedBlockers(
485
+ classification: MigrationClassification,
486
+ backfills: readonly BackfillValue[],
487
+ ): readonly MigrationSignal[] {
488
+ return classification.unexecutable.filter((s) => !isBlockerResolved(s, backfills));
489
+ }