@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,115 @@
1
+ /**
2
+ * `selectModels` projects a schema down to a subset of its models.
3
+ *
4
+ * It lets one canonical schema serve several apps, each subscribing only to the
5
+ * models it needs. Rather than re-declare a model's fields in a second schema —
6
+ * which you would then have to keep identical by hand — an app selects the
7
+ * models it wants from the canonical schema. Field shapes, resolved foreign-key
8
+ * columns, computed getters, typenames, and identity roles all come from the
9
+ * source, so a subset cannot drift from the canonical definition.
10
+ *
11
+ * ```ts
12
+ * import { schema as full } from './schema';
13
+ * import { selectModels } from '@abloatai/transaction/schema';
14
+ *
15
+ * // Subscribe to identity and document content only.
16
+ * export const schema = selectModels(full, ['users', 'organizations', 'workspaces', 'folders', 'files']);
17
+ * ```
18
+ *
19
+ * Relations whose target falls outside the selected set are dropped, so the
20
+ * subset sees only its own models. Dropping a relation that carries `parent`
21
+ * scope-inheritance throws instead, because silently losing it would mis-route
22
+ * a record's fan-out — the selected set must be closed under `parent` edges.
23
+ */
24
+
25
+ import type { Schema, SchemaRecord } from './schema.js';
26
+ import { buildFieldRefs } from './schema.js';
27
+ import type { ModelDef } from './model.js';
28
+ import type { RelationDef } from './relation.js';
29
+ import { AbloValidationError } from '../errors.js';
30
+ import { schemaHash } from './serialize.js';
31
+
32
+ export function selectModels<S extends SchemaRecord, K extends keyof S & string>(
33
+ schema: Schema<S>,
34
+ keys: readonly K[],
35
+ ): Schema<Pick<S, K>> {
36
+ const keep = new Set<string>(keys as readonly string[]);
37
+ const models: Record<string, ModelDef> = {};
38
+ const validators: Record<string, unknown> = {};
39
+
40
+ for (const key of keys) {
41
+ const def = schema.models[key];
42
+ if (!def) {
43
+ throw new AbloValidationError(
44
+ `selectModels: "${key}" is not a model in the source schema`,
45
+ { code: 'invalid_schema', param: key },
46
+ );
47
+ }
48
+
49
+ // Prune relations whose target isn't in the selected set. A pruned
50
+ // `parent` edge is a routing error, not a silent drop.
51
+ const relations: Record<string, RelationDef> = {};
52
+ for (const [relName, rel] of Object.entries(def.relations as Record<string, RelationDef>)) {
53
+ if (keep.has(rel.target)) {
54
+ relations[relName] = rel;
55
+ continue;
56
+ }
57
+ if (rel.options?.parent) {
58
+ throw new AbloValidationError(
59
+ `selectModels: model "${key}" has a parent relation "${relName}" → "${rel.target}", ` +
60
+ `which is not in the selected set. Include "${rel.target}" so scope inheritance still routes.`,
61
+ { code: 'invalid_schema', param: `${key}.${relName}` },
62
+ );
63
+ }
64
+ }
65
+
66
+ models[key] = { ...def, relations };
67
+ validators[key] = (schema.validators as Record<string, unknown>)[key];
68
+ }
69
+
70
+ return {
71
+ models: models as unknown as Pick<S, K>,
72
+ // References for exactly the models this projection kept.
73
+ fields: buildFieldRefs(models) as Schema<Pick<S, K>>['fields'],
74
+ validators: validators as Schema<Pick<S, K>>['validators'],
75
+ identityRoles: schema.identityRoles,
76
+ sessionSettings: schema.sessionSettings,
77
+ // Record the full source's hash so the drift check can recognize this subset
78
+ // as current against a server running that full schema. Prefer the source's
79
+ // OWN `sourceSchemaHash` when it is itself a projection, so a subset-of-a-
80
+ // subset still points at the original full schema rather than an intermediate
81
+ // one. `schemaHash` ignores this field, so re-projecting stays deterministic.
82
+ sourceSchemaHash: schema.sourceSchemaHash ?? schemaHash(schema),
83
+ };
84
+ }
85
+
86
+ /**
87
+ * `omitModels` is `selectModels` from the other side: keep every model EXCEPT
88
+ * the named ones. Use it when an app is the general case and a separate app
89
+ * owns the omitted models — the suite shell drops a specialized store that the
90
+ * standalone app selects for itself:
91
+ *
92
+ * ```ts
93
+ * export const schema = omitModels(full, ['reports', 'reportSections']);
94
+ * ```
95
+ *
96
+ * Same validation as `selectModels`: relations into the omitted set are
97
+ * dropped, and a dropped `parent` edge throws — so a model whose scope routes
98
+ * through an omitted parent cannot be silently kept.
99
+ */
100
+ export function omitModels<S extends SchemaRecord, K extends keyof S & string>(
101
+ schema: Schema<S>,
102
+ keys: readonly K[],
103
+ ): Schema<Omit<S, K>> {
104
+ const drop = new Set<string>(keys as readonly string[]);
105
+ for (const key of keys) {
106
+ if (!schema.models[key]) {
107
+ throw new AbloValidationError(
108
+ `omitModels: "${key}" is not a model in the source schema`,
109
+ { code: 'invalid_schema', param: key },
110
+ );
111
+ }
112
+ }
113
+ const kept = Object.keys(schema.models).filter((k) => !drop.has(k));
114
+ return selectModels(schema, kept as (keyof S & string)[]) as Schema<Omit<S, K>>;
115
+ }
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Schema ⇄ JSON.
3
+ *
4
+ * A `Schema` is fully serializable apart from its client-only closures — the
5
+ * Zod validators and computed getters. {@link serializeSchema} emits the
6
+ * plain-data JSON form and {@link parseSchema} reconstructs a working `Schema`
7
+ * from it: one `Schema` type with two representations.
8
+ *
9
+ * A hosted, multi-tenant server loads a tenant's schema with `parseSchema(json)`
10
+ * rather than importing it in process. The JSON is what `ablo push` sends and
11
+ * what the server stores per tenant and version.
12
+ *
13
+ * What round-trips:
14
+ * - all model routing and scoping metadata: typename, tableName, load,
15
+ * mutable, the `tenancy` descriptor, bootstrap hints, scope, grants,
16
+ * entityRoles, the `conflict` disposition map, persist, autoFill,
17
+ * requiredFields, and lazyObservable. The authoring shorthands (`policy`
18
+ * and `groups`) are normalized into these canonical fields when the model
19
+ * is built, so only the canonical fields cross here.
20
+ * - relations, including the resolved `foreignKeyColumn`
21
+ * - field metadata (names and type tags), from which validators are rebuilt
22
+ * - identity roles
23
+ *
24
+ * What does not round-trip, because the server never needs it:
25
+ * - computed getters, which are closures and are dropped
26
+ * - exact Zod refinements, which are rebuilt as permissive validators from
27
+ * {@link FieldMeta}; the server does no field-shape validation
28
+ */
29
+
30
+ import { z } from 'zod';
31
+ import { AbloValidationError } from '../errors.js';
32
+ import type { FieldMeta } from './field.js';
33
+ import { buildFieldRefs } from './schema.js';
34
+ import type { Tenancy } from './tenancy.js';
35
+ import type { ModelResidency } from './residency.js';
36
+ import type {
37
+ ModelDef,
38
+ RelationRecord,
39
+ GrantsRef,
40
+ LoadStrategy,
41
+ PersistOptions,
42
+ AutoFillRule,
43
+ ConflictAxis,
44
+ } from './model.js';
45
+ import {
46
+ relation,
47
+ type RelationDef,
48
+ type RelationType,
49
+ } from './relation.js';
50
+ import {
51
+ baseFieldsSchema,
52
+ type Schema,
53
+ type SchemaRecord,
54
+ type IdentityRole,
55
+ type EntityRole,
56
+ type SessionSettings,
57
+ } from './schema.js';
58
+
59
+ /** Current schema-JSON envelope version. Bump this on a breaking change to the
60
+ * JSON shape itself — not to a user's schema. */
61
+ const SCHEMA_JSON_VERSION = 3 as const;
62
+
63
+ // ── Wire types ──────────────────────────────────────────────────────────────
64
+
65
+ /** A relation in JSON form. Mirrors the serializable members of {@link RelationDef}. */
66
+ export interface RelationJSON {
67
+ readonly type: RelationType;
68
+ readonly target: string;
69
+ readonly foreignKey: string;
70
+ readonly foreignKeyColumn: string;
71
+ readonly options?: Record<string, boolean>;
72
+ readonly orderBy?: string;
73
+ }
74
+
75
+ /** A model in JSON form. Everything on {@link ModelDef} except closures. */
76
+ export interface ModelJSON {
77
+ readonly fields: Record<string, FieldMeta>;
78
+ readonly relations: Record<string, RelationJSON>;
79
+ readonly load: LoadStrategy;
80
+ readonly typename: string;
81
+ readonly tableName?: string;
82
+ readonly tenancy: Tenancy;
83
+ /** The database plane the model's rows live in. Optional for backward
84
+ * compatibility: when absent (an artifact written before this field existed)
85
+ * it reads as `tenant`, the default. See {@link ModelResidency}. */
86
+ readonly plane?: ModelResidency;
87
+ readonly scope?: boolean | string;
88
+ readonly grants?: GrantsRef;
89
+ readonly entityRoles?: readonly EntityRole[];
90
+ /** The declared write-conflict disposition per committer kind. When absent,
91
+ * the engine falls back to its default. */
92
+ readonly conflict?: ConflictAxis;
93
+ readonly bootstrapLimit?: number;
94
+ readonly bootstrapOrderBy?: string;
95
+ readonly mutable?: boolean;
96
+ readonly lazyObservable?: boolean;
97
+ readonly persist?: PersistOptions;
98
+ readonly autoFill?: readonly AutoFillRule[];
99
+ readonly requiredFields?: readonly string[];
100
+ }
101
+
102
+ /** The JSON form of a {@link Schema}. The `ablo push` payload. */
103
+ export interface SchemaJSON {
104
+ readonly v: typeof SCHEMA_JSON_VERSION;
105
+ readonly models: Record<string, ModelJSON>;
106
+ readonly identityRoles: readonly IdentityRole[];
107
+ /** Optional so schemas pushed before ADR 0011 still parse (defaults to `{}`). */
108
+ readonly sessionSettings?: SessionSettings;
109
+ }
110
+
111
+ // ── Serialize ────────────────────────────────────────────────────────────────
112
+
113
+ function relationToJSON(rel: RelationDef): RelationJSON {
114
+ const options = rel.options as Record<string, boolean> | undefined;
115
+ return {
116
+ type: rel.type,
117
+ target: rel.target,
118
+ foreignKey: rel.foreignKey,
119
+ foreignKeyColumn: rel.foreignKeyColumn,
120
+ options: options && Object.keys(options).length > 0 ? { ...options } : undefined,
121
+ orderBy: rel._orderBy,
122
+ };
123
+ }
124
+
125
+ function modelToJSON(def: ModelDef): ModelJSON {
126
+ const relations: Record<string, RelationJSON> = {};
127
+ for (const [name, rel] of Object.entries(def.relations)) {
128
+ relations[name] = relationToJSON(rel);
129
+ }
130
+ return {
131
+ fields: def.fields,
132
+ relations,
133
+ load: def.load,
134
+ // `defineSchema` always resolves `typename` to the schema key when unset,
135
+ // so it is present on a built ModelDef; fall back defensively anyway.
136
+ typename: def.typename ?? '',
137
+ tableName: def.tableName,
138
+ tenancy: def.tenancy,
139
+ plane: def.plane,
140
+ scope: def.scope,
141
+ grants: def.grants,
142
+ entityRoles: def.entityRoles,
143
+ conflict: def.conflict,
144
+ bootstrapLimit: def.bootstrapLimit,
145
+ bootstrapOrderBy: def.bootstrapOrderBy,
146
+ mutable: def.mutable,
147
+ lazyObservable: def.lazyObservable,
148
+ persist: def.persist,
149
+ autoFill: def.autoFill,
150
+ requiredFields: def.requiredFields,
151
+ };
152
+ }
153
+
154
+ /**
155
+ * Project a `Schema` to its JSON form. Drops the client-only closures
156
+ * (validators, `computed`); keeps everything the server and a faithful
157
+ * rebuild need. The result is plain data — `JSON.stringify`-safe.
158
+ */
159
+ export function toSchemaJSON(schema: Schema): SchemaJSON {
160
+ const models: Record<string, ModelJSON> = {};
161
+ for (const [key, def] of Object.entries(schema.models)) {
162
+ if (def.typename === '' || def.typename === undefined) {
163
+ // typename '' only happens for a malformed def; surface it loudly
164
+ // rather than ship a model the server can't route.
165
+ models[key] = { ...modelToJSON(def), typename: key };
166
+ } else {
167
+ models[key] = modelToJSON(def);
168
+ }
169
+ }
170
+ return {
171
+ v: SCHEMA_JSON_VERSION,
172
+ models,
173
+ identityRoles: schema.identityRoles,
174
+ ...(Object.keys(schema.sessionSettings).length > 0
175
+ ? { sessionSettings: schema.sessionSettings }
176
+ : {}),
177
+ };
178
+ }
179
+
180
+ /** Serialize a `Schema` to a JSON string (the `ablo push` payload). */
181
+ export function serializeSchema(schema: Schema): string {
182
+ return JSON.stringify(toSchemaJSON(schema));
183
+ }
184
+
185
+ // ── Parse ──────────────────────────────────────────────────────────────────
186
+
187
+ /** Rebuild a Zod validator for a field from its metadata. Permissive by
188
+ * design — the server does no field-shape validation; this exists so a
189
+ * parsed `Schema` is structurally a real `Schema`. */
190
+ function zodForField(meta: FieldMeta): z.ZodType {
191
+ let base: z.ZodType;
192
+ switch (meta.type) {
193
+ case 'string':
194
+ base = z.string();
195
+ break;
196
+ case 'number':
197
+ base = z.number();
198
+ break;
199
+ case 'boolean':
200
+ base = z.boolean();
201
+ break;
202
+ case 'date':
203
+ base = z.date();
204
+ break;
205
+ case 'enum':
206
+ base =
207
+ meta.enumValues && meta.enumValues.length > 0
208
+ ? z.enum(meta.enumValues as [string, ...string[]])
209
+ : z.string();
210
+ break;
211
+ case 'json':
212
+ default:
213
+ base = z.unknown();
214
+ break;
215
+ }
216
+ return meta.isOptional ? base.optional() : base;
217
+ }
218
+
219
+ function relationFromJSON(rel: RelationJSON): RelationDef {
220
+ const setColumn = <R extends RelationDef>(definition: R): R => {
221
+ // The builder normally derives this from schema casing. Serialized schemas
222
+ // already carry the resolved database column, so restore that runtime field.
223
+ Reflect.set(definition, 'foreignKeyColumn', rel.foreignKeyColumn);
224
+ return definition;
225
+ };
226
+
227
+ switch (rel.type) {
228
+ case 'belongsTo': {
229
+ const options = rel.options;
230
+ return setColumn(relation.belongsTo(rel.target, rel.foreignKey, {
231
+ ...(options?.index === undefined ? {} : { index: options.index }),
232
+ ...(options?.enrich === undefined ? {} : { enrich: options.enrich }),
233
+ ...(options?.defer === undefined ? {} : { defer: options.defer }),
234
+ ...(options?.parent === undefined ? {} : { parent: options.parent }),
235
+ ...(options?.fk === undefined ? {} : { fk: options.fk }),
236
+ }));
237
+ }
238
+ case 'hasMany':
239
+ return setColumn(
240
+ relation.hasMany(
241
+ rel.target,
242
+ rel.foreignKey,
243
+ rel.orderBy === undefined ? undefined : { orderBy: rel.orderBy },
244
+ ),
245
+ );
246
+ case 'hasOne':
247
+ return setColumn(relation.hasOne(rel.target, rel.foreignKey));
248
+ }
249
+ }
250
+
251
+ function modelFromJSON(json: ModelJSON): ModelDef {
252
+ // `z.ZodRawShape` is a readonly index signature in Zod v4, so build a
253
+ // mutable record and cast once when handing it to `z.object`/`ModelDef`.
254
+ const shapeMut: Record<string, z.ZodType> = {};
255
+ for (const [name, meta] of Object.entries(json.fields)) {
256
+ shapeMut[name] = zodForField(meta);
257
+ }
258
+ const shape = shapeMut as z.ZodRawShape;
259
+ const relations: RelationRecord = {};
260
+ for (const [name, rel] of Object.entries(json.relations)) {
261
+ relations[name] = relationFromJSON(rel);
262
+ }
263
+ return {
264
+ schema: z.object(shape),
265
+ shape,
266
+ fields: json.fields,
267
+ relations,
268
+ load: json.load,
269
+ bootstrapLimit: json.bootstrapLimit,
270
+ bootstrapOrderBy: json.bootstrapOrderBy,
271
+ typename: json.typename,
272
+ persist: json.persist,
273
+ tableName: json.tableName,
274
+ tenancy: json.tenancy,
275
+ // Absent in older artifacts → default `tenant`, matching the model builder
276
+ // and provisioning defaults so the round-trip stays stable.
277
+ plane: json.plane ?? 'tenant',
278
+ scope: json.scope,
279
+ grants: json.grants,
280
+ entityRoles: json.entityRoles,
281
+ // Absent in older artifacts → undefined, so the commit path falls through to
282
+ // the function registry or the engine default.
283
+ conflict: json.conflict,
284
+ mutable: json.mutable,
285
+ lazyObservable: json.lazyObservable,
286
+ // computed getters are closures and intentionally not serialized; a
287
+ // parsed schema (server-side) has none.
288
+ computed: undefined,
289
+ autoFill: json.autoFill,
290
+ requiredFields: json.requiredFields,
291
+ };
292
+ }
293
+
294
+ /**
295
+ * Reconstruct a working `Schema` from its JSON form. Validators are rebuilt
296
+ * permissively from field metadata (the server never validates field shapes);
297
+ * `computed` getters are absent. Everything the server reads — routing,
298
+ * scoping, relations, identity roles — is restored exactly.
299
+ */
300
+ export function fromSchemaJSON(json: SchemaJSON): Schema {
301
+ const models: Record<string, ModelDef> = {};
302
+ const validators: Record<string, z.ZodObject<z.ZodRawShape>> = {};
303
+ for (const [key, modelJson] of Object.entries(json.models)) {
304
+ const def = modelFromJSON(modelJson);
305
+ models[key] = def;
306
+ validators[key] = baseFieldsSchema.merge(def.schema);
307
+ }
308
+ return {
309
+ models: models,
310
+ // A schema rebuilt from JSON carries references too — the shapes are here.
311
+ fields: buildFieldRefs(models),
312
+ validators: validators as Schema['validators'],
313
+ identityRoles: json.identityRoles,
314
+ sessionSettings: json.sessionSettings ?? {},
315
+ };
316
+ }
317
+
318
+ /** Parse a `Schema` from a JSON string (inverse of {@link serializeSchema}). */
319
+ export function parseSchema(json: string): Schema {
320
+ const parsed = JSON.parse(json) as SchemaJSON;
321
+ if (parsed.v !== SCHEMA_JSON_VERSION) {
322
+ throw new AbloValidationError(
323
+ `parseSchema: unsupported schema-JSON version ${parsed.v} (expected ${SCHEMA_JSON_VERSION})`,
324
+ { code: 'schema_definition_invalid' },
325
+ );
326
+ }
327
+ return fromSchemaJSON(parsed);
328
+ }
329
+
330
+ // ── Hash ─────────────────────────────────────────────────────────────────────
331
+
332
+ /**
333
+ * Stable content hash of a `Schema`'s JSON form. FNV-1a over a canonical
334
+ * (sorted-key) encoding — deterministic across runs and order-invariant, no
335
+ * `crypto` dependency. Used for connect-time version gating: the client sends
336
+ * the hash it was built against, the server compares it to the tenant's
337
+ * active schema hash. Not a security primitive.
338
+ */
339
+ export function schemaHash(schema: Schema): string {
340
+ return fnv1a(canonicalJson(toSchemaJSON(schema)));
341
+ }
342
+
343
+ /**
344
+ * Content hash of ONE serialized model — the unit of the semantic drift check.
345
+ * Two schemas agree on a model exactly when these match, which is what lets a
346
+ * client compare only the models it declares instead of welding itself to the
347
+ * whole-schema hash (where any additive push reads as drift). Computed over the
348
+ * model's `SchemaJSON` entry with the same canonicalization and hash as
349
+ * {@link schemaHash}, on both the client and the server's `GET /api/schema`.
350
+ */
351
+ export function modelHash(modelJson: unknown): string {
352
+ return fnv1a(canonicalJson(modelJson));
353
+ }
354
+
355
+ /** FNV-1a over an already-canonical string — shared by both hashes above. */
356
+ function fnv1a(canonical: string): string {
357
+ let h = 0x811c9dc5;
358
+ for (let i = 0; i < canonical.length; i++) {
359
+ h ^= canonical.charCodeAt(i);
360
+ h = Math.imul(h, 0x01000193);
361
+ }
362
+ return (h >>> 0).toString(16).padStart(8, '0');
363
+ }
364
+
365
+ /** Stable JSON: object keys sorted recursively, `undefined` dropped. */
366
+ function canonicalJson(value: unknown): string {
367
+ if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';
368
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;
369
+ const entries = Object.entries(value as Record<string, unknown>)
370
+ .filter(([, v]) => v !== undefined)
371
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
372
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
373
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * A concise, claim-first way to declare a model. Each verb is shorthand for a
3
+ * {@link model} call with two decisions already made, so a reader learns the two
4
+ * facts that matter most about an entity before scanning its fields:
5
+ *
6
+ * - Writability: `mutable.*` lets clients send create, update, and delete
7
+ * operations over the commit protocol. `readOnly.*` means the server owns the
8
+ * model — its changes stream to clients as deltas, but clients cannot mutate it.
9
+ * - Load strategy: `.instant` loads the model at bootstrap, `.lazy` loads it on
10
+ * first access, and `.manual` loads it only when you query it explicitly.
11
+ *
12
+ * The two-token form (`mutable.lazy({...})`) states the safety claim in the first
13
+ * token and the load shape in the second. The plain {@link model} factory remains
14
+ * available; these verbs are a convenience layered over it.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * tasks: mutable.lazy({ title: z.string() }, {
19
+ * typename: 'Task', tableName: 'tasks',
20
+ * relations: { ... },
21
+ * computed: tasksComputed,
22
+ * }),
23
+ * ```
24
+ */
25
+
26
+ import type { z } from 'zod';
27
+ import {
28
+ model,
29
+ type ModelDef,
30
+ type ModelOptions,
31
+ type ComputedRecord,
32
+ type RelationRecord,
33
+ } from './model.js';
34
+
35
+ /**
36
+ * Options accepted by every sugar verb. A strict subset of
37
+ * {@link ModelOptions} — anything the verb infers (`mutable`, `load`,
38
+ * `lazyObservable`) is deliberately absent so the call site can't
39
+ * contradict its verb.
40
+ */
41
+ export interface SugarOptions<
42
+ R extends RelationRecord = RelationRecord,
43
+ C extends ComputedRecord = ComputedRecord,
44
+ > {
45
+ /** Relations to other models. Same shape as `model()`'s second arg. */
46
+ relations?: R;
47
+ /** Computed getters installed on the model class prototype. */
48
+ computed?: C;
49
+ /**
50
+ * Wire `__typename` (PascalCase, e.g. `'Task'`). Defaults to the schema
51
+ * key via `defineSchema` — override when the wire shape differs from
52
+ * the camelCase schema key.
53
+ */
54
+ typename?: string;
55
+ /**
56
+ * The physical table name. Override it when the table name differs from the
57
+ * snake_case of the typename — for example, a `Member` type stored in a table
58
+ * named `'member'` rather than `'members'`.
59
+ */
60
+ tableName?: string;
61
+ /**
62
+ * The row-access policy for tenant isolation — the rule deciding who may read a
63
+ * row. A discriminated union on `by` (`column`, `parent`, or `none`). See
64
+ * {@link ModelOptions.policy}.
65
+ */
66
+ policy?: ModelOptions['policy'];
67
+ /**
68
+ * Sync-group routing — which delta *channels* a row fans into
69
+ * (`root` / `grants` / `roles`). See {@link ModelOptions.groups}.
70
+ */
71
+ groups?: ModelOptions['groups'];
72
+ /** Max rows loaded during bootstrap. Only applies to `.instant`. */
73
+ bootstrapLimit?: number;
74
+ /** Bootstrap sort order (e.g. `'created_at DESC'`). */
75
+ bootstrapOrderBy?: string;
76
+ /** IndexedDB persistence hints — see {@link ModelOptions.persist}. */
77
+ persist?: ModelOptions['persist'];
78
+ /**
79
+ * Defer MobX observability to first access. Override the verb's
80
+ * default when a `.lazy` model is small enough that eager MobX setup
81
+ * is fine, or a `.instant` model is hot enough to justify deferral.
82
+ */
83
+ lazyObservable?: boolean;
84
+ }
85
+
86
+ /** Internal helper — builds a ModelDef with baseline safety+load flags applied. */
87
+ function build<
88
+ Shape extends z.ZodRawShape,
89
+ R extends RelationRecord,
90
+ C extends ComputedRecord,
91
+ >(
92
+ shape: Shape,
93
+ opts: SugarOptions<R, C> | undefined,
94
+ baseline: Pick<ModelOptions, 'mutable' | 'load' | 'lazyObservable'>,
95
+ ): ModelDef<Shape, R, C> {
96
+ return model(shape, { relations: (opts?.relations ?? {}) as R, mutable: baseline.mutable,
97
+ load: baseline.load,
98
+ lazyObservable: opts?.lazyObservable ?? baseline.lazyObservable,
99
+ typename: opts?.typename,
100
+ tableName: opts?.tableName,
101
+ policy: opts?.policy,
102
+ groups: opts?.groups,
103
+ bootstrapLimit: opts?.bootstrapLimit,
104
+ bootstrapOrderBy: opts?.bootstrapOrderBy,
105
+ persist: opts?.persist,
106
+ computed: opts?.computed, });
107
+ }
108
+
109
+ /**
110
+ * Client-writable entities. `mutable.*` is the opt-in signal for wire
111
+ * mutations via `commit` — equivalent to setting
112
+ * `{ mutable: true, load: X }` on `model()`.
113
+ *
114
+ * Pick the load suffix by data-access pattern:
115
+ * - `.instant` — small, always-needed (Theme, Layout, StatusGroup)
116
+ * - `.lazy` — large collections fetched on first query
117
+ * (Block, Message, Task)
118
+ */
119
+ export const mutable = {
120
+ instant: <
121
+ Shape extends z.ZodRawShape,
122
+ R extends RelationRecord = Record<string, never>,
123
+ C extends ComputedRecord = Record<string, never>,
124
+ >(
125
+ shape: Shape,
126
+ opts?: SugarOptions<R, C>,
127
+ ): ModelDef<Shape, R, C> =>
128
+ // Reactive by default (see readonly.instant note): opt out with
129
+ // `lazyObservable: false` only for very large read-only list models.
130
+ build(shape, opts, { mutable: true, load: 'instant', lazyObservable: true }),
131
+
132
+ lazy: <
133
+ Shape extends z.ZodRawShape,
134
+ R extends RelationRecord = Record<string, never>,
135
+ C extends ComputedRecord = Record<string, never>,
136
+ >(
137
+ shape: Shape,
138
+ opts?: SugarOptions<R, C>,
139
+ ): ModelDef<Shape, R, C> =>
140
+ build(shape, opts, { mutable: true, load: 'lazy', lazyObservable: true }),
141
+ };
142
+
143
+ /**
144
+ * Server-managed entities. `readOnly.*` means clients subscribe to
145
+ * deltas but cannot emit mutations — any `commit` op for this model
146
+ * is rejected at the server with "Unknown model."
147
+ *
148
+ * Use for:
149
+ * - Server-written state: `sync_deltas`, `presence`, version vectors
150
+ * - Ingestion pipelines: digest entries, filing jobs
151
+ * - Audit surfaces: anything where clients watch but only the server
152
+ * writes
153
+ */
154
+ export const readOnly = {
155
+ instant: <
156
+ Shape extends z.ZodRawShape,
157
+ R extends RelationRecord = Record<string, never>,
158
+ C extends ComputedRecord = Record<string, never>,
159
+ >(
160
+ shape: Shape,
161
+ opts?: SugarOptions<R, C>,
162
+ ): ModelDef<Shape, R, C> =>
163
+ // Reactive by default, like every variant: a remote delta that mutates a row
164
+ // in place must re-render reactive reads. Opt out per-model with
165
+ // `lazyObservable: false` for very large read-only lists where per-field
166
+ // atoms cost more than the QueryView's entry-replaced reactivity.
167
+ build(shape, opts, { mutable: false, load: 'instant', lazyObservable: true }),
168
+
169
+ lazy: <
170
+ Shape extends z.ZodRawShape,
171
+ R extends RelationRecord = Record<string, never>,
172
+ C extends ComputedRecord = Record<string, never>,
173
+ >(
174
+ shape: Shape,
175
+ opts?: SugarOptions<R, C>,
176
+ ): ModelDef<Shape, R, C> =>
177
+ build(shape, opts, { mutable: false, load: 'lazy', lazyObservable: true }),
178
+
179
+ /**
180
+ * Internal-only: kept out of bootstrap and never written by clients. The
181
+ * strongest safety posture — use for tables the SDK must know about (for type
182
+ * inference) but that no client should be able to write. Rows still reach a
183
+ * client that reads the model, so this is a write boundary, not a read one.
184
+ */
185
+ internal: <
186
+ Shape extends z.ZodRawShape,
187
+ R extends RelationRecord = Record<string, never>,
188
+ C extends ComputedRecord = Record<string, never>,
189
+ >(
190
+ shape: Shape,
191
+ opts?: SugarOptions<R, C>,
192
+ ): ModelDef<Shape, R, C> =>
193
+ build(shape, opts, { mutable: false, load: 'lazy', lazyObservable: true }),
194
+ };