@homeflare/alchemy 0.43.0 → 0.45.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 (612) hide show
  1. package/README.md +10 -1
  2. package/dist/caddy/index.js +35 -1
  3. package/dist/caddy/index.js.map +3 -3
  4. package/dist/launchd/index.js +35 -1
  5. package/dist/launchd/index.js.map +3 -3
  6. package/dist/linux/index.js +35 -1
  7. package/dist/linux/index.js.map +3 -3
  8. package/dist/litellm/access-group-form.d.ts +26 -0
  9. package/dist/litellm/access-group-form.d.ts.map +1 -0
  10. package/dist/litellm/access-group-operations.d.ts +37 -0
  11. package/dist/litellm/access-group-operations.d.ts.map +1 -0
  12. package/dist/litellm/access-group-types.d.ts +49 -0
  13. package/dist/litellm/access-group-types.d.ts.map +1 -0
  14. package/dist/litellm/access-group.d.ts +55 -0
  15. package/dist/litellm/access-group.d.ts.map +1 -0
  16. package/dist/litellm/credential-errors.d.ts +131 -0
  17. package/dist/litellm/credential-errors.d.ts.map +1 -0
  18. package/dist/litellm/credential-form.d.ts +79 -0
  19. package/dist/litellm/credential-form.d.ts.map +1 -0
  20. package/dist/litellm/credential-operations.d.ts +84 -0
  21. package/dist/litellm/credential-operations.d.ts.map +1 -0
  22. package/dist/litellm/credential-rewrite.d.ts +6 -0
  23. package/dist/litellm/credential-rewrite.d.ts.map +1 -0
  24. package/dist/litellm/credential-types.d.ts +87 -0
  25. package/dist/litellm/credential-types.d.ts.map +1 -0
  26. package/dist/litellm/credential-values.d.ts +53 -0
  27. package/dist/litellm/credential-values.d.ts.map +1 -0
  28. package/dist/litellm/credential.d.ts +83 -0
  29. package/dist/litellm/credential.d.ts.map +1 -0
  30. package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
  31. package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
  32. package/dist/litellm/fake-credential-litellm.d.ts +54 -0
  33. package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
  34. package/dist/litellm/fake-keys.d.ts +53 -0
  35. package/dist/litellm/fake-keys.d.ts.map +1 -0
  36. package/dist/litellm/fake-litellm.d.ts +4 -1
  37. package/dist/litellm/fake-litellm.d.ts.map +1 -1
  38. package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
  39. package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
  40. package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
  41. package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
  42. package/dist/litellm/fake-model-litellm.d.ts +48 -0
  43. package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
  44. package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
  45. package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
  46. package/dist/litellm/fake-policy-litellm.d.ts +32 -0
  47. package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
  48. package/dist/litellm/fake-registry-base.d.ts +42 -0
  49. package/dist/litellm/fake-registry-base.d.ts.map +1 -0
  50. package/dist/litellm/fake-stack.d.ts +8 -1
  51. package/dist/litellm/fake-stack.d.ts.map +1 -1
  52. package/dist/litellm/fake-team-litellm.d.ts +47 -0
  53. package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
  54. package/dist/litellm/fake-tool-litellm.d.ts +28 -0
  55. package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
  56. package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
  57. package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
  58. package/dist/litellm/index.d.ts +18 -0
  59. package/dist/litellm/index.d.ts.map +1 -1
  60. package/dist/litellm/index.js +3078 -2
  61. package/dist/litellm/index.js.map +65 -4
  62. package/dist/litellm/key-errors.d.ts +169 -0
  63. package/dist/litellm/key-errors.d.ts.map +1 -0
  64. package/dist/litellm/key-form.d.ts +119 -0
  65. package/dist/litellm/key-form.d.ts.map +1 -0
  66. package/dist/litellm/key-harness.d.ts +41 -0
  67. package/dist/litellm/key-harness.d.ts.map +1 -0
  68. package/dist/litellm/key-metadata-errors.d.ts +30 -0
  69. package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
  70. package/dist/litellm/key-metadata.d.ts +22 -0
  71. package/dist/litellm/key-metadata.d.ts.map +1 -0
  72. package/dist/litellm/key-operations.d.ts +63 -0
  73. package/dist/litellm/key-operations.d.ts.map +1 -0
  74. package/dist/litellm/key-secret.d.ts +33 -0
  75. package/dist/litellm/key-secret.d.ts.map +1 -0
  76. package/dist/litellm/key.d.ts +78 -0
  77. package/dist/litellm/key.d.ts.map +1 -0
  78. package/dist/litellm/mcp-server-credential.d.ts +50 -0
  79. package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
  80. package/dist/litellm/mcp-server-errors.d.ts +101 -0
  81. package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
  82. package/dist/litellm/mcp-server-form.d.ts +56 -0
  83. package/dist/litellm/mcp-server-form.d.ts.map +1 -0
  84. package/dist/litellm/mcp-server-locate.d.ts +26 -0
  85. package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
  86. package/dist/litellm/mcp-server-operations.d.ts +63 -0
  87. package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
  88. package/dist/litellm/mcp-server-shadow.d.ts +24 -0
  89. package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
  90. package/dist/litellm/mcp-server-types.d.ts +118 -0
  91. package/dist/litellm/mcp-server-types.d.ts.map +1 -0
  92. package/dist/litellm/mcp-server-url.d.ts +11 -0
  93. package/dist/litellm/mcp-server-url.d.ts.map +1 -0
  94. package/dist/litellm/mcp-server.d.ts +95 -0
  95. package/dist/litellm/mcp-server.d.ts.map +1 -0
  96. package/dist/litellm/model-claim.d.ts +24 -0
  97. package/dist/litellm/model-claim.d.ts.map +1 -0
  98. package/dist/litellm/model-credential.d.ts +12 -0
  99. package/dist/litellm/model-credential.d.ts.map +1 -0
  100. package/dist/litellm/model-errors.d.ts +119 -0
  101. package/dist/litellm/model-errors.d.ts.map +1 -0
  102. package/dist/litellm/model-form.d.ts +78 -0
  103. package/dist/litellm/model-form.d.ts.map +1 -0
  104. package/dist/litellm/model-locate.d.ts +13 -0
  105. package/dist/litellm/model-locate.d.ts.map +1 -0
  106. package/dist/litellm/model-operations.d.ts +59 -0
  107. package/dist/litellm/model-operations.d.ts.map +1 -0
  108. package/dist/litellm/model-types.d.ts +91 -0
  109. package/dist/litellm/model-types.d.ts.map +1 -0
  110. package/dist/litellm/model.d.ts +88 -0
  111. package/dist/litellm/model.d.ts.map +1 -0
  112. package/dist/litellm/policy-attachment-form.d.ts +19 -0
  113. package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
  114. package/dist/litellm/policy-attachment-operations.d.ts +31 -0
  115. package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
  116. package/dist/litellm/policy-attachment-types.d.ts +48 -0
  117. package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
  118. package/dist/litellm/policy-attachment.d.ts +61 -0
  119. package/dist/litellm/policy-attachment.d.ts.map +1 -0
  120. package/dist/litellm/policy-form.d.ts +22 -0
  121. package/dist/litellm/policy-form.d.ts.map +1 -0
  122. package/dist/litellm/policy-operations.d.ts +42 -0
  123. package/dist/litellm/policy-operations.d.ts.map +1 -0
  124. package/dist/litellm/policy-types.d.ts +57 -0
  125. package/dist/litellm/policy-types.d.ts.map +1 -0
  126. package/dist/litellm/policy.d.ts +65 -0
  127. package/dist/litellm/policy.d.ts.map +1 -0
  128. package/dist/litellm/providers.d.ts +1 -1
  129. package/dist/litellm/providers.d.ts.map +1 -1
  130. package/dist/litellm/registry-errors.d.ts +62 -0
  131. package/dist/litellm/registry-errors.d.ts.map +1 -0
  132. package/dist/litellm/registry-support.d.ts +42 -0
  133. package/dist/litellm/registry-support.d.ts.map +1 -0
  134. package/dist/litellm/team-form.d.ts +26 -0
  135. package/dist/litellm/team-form.d.ts.map +1 -0
  136. package/dist/litellm/team-members.d.ts +10 -0
  137. package/dist/litellm/team-members.d.ts.map +1 -0
  138. package/dist/litellm/team-operations.d.ts +38 -0
  139. package/dist/litellm/team-operations.d.ts.map +1 -0
  140. package/dist/litellm/team-permission.d.ts +35 -0
  141. package/dist/litellm/team-permission.d.ts.map +1 -0
  142. package/dist/litellm/team-types.d.ts +101 -0
  143. package/dist/litellm/team-types.d.ts.map +1 -0
  144. package/dist/litellm/team.d.ts +67 -0
  145. package/dist/litellm/team.d.ts.map +1 -0
  146. package/dist/litellm/tool-policy-form.d.ts +21 -0
  147. package/dist/litellm/tool-policy-form.d.ts.map +1 -0
  148. package/dist/litellm/tool-policy-operations.d.ts +30 -0
  149. package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
  150. package/dist/litellm/tool-policy-types.d.ts +46 -0
  151. package/dist/litellm/tool-policy-types.d.ts.map +1 -0
  152. package/dist/litellm/tool-policy.d.ts +62 -0
  153. package/dist/litellm/tool-policy.d.ts.map +1 -0
  154. package/dist/litellm/toolset-form.d.ts +20 -0
  155. package/dist/litellm/toolset-form.d.ts.map +1 -0
  156. package/dist/litellm/toolset-operations.d.ts +39 -0
  157. package/dist/litellm/toolset-operations.d.ts.map +1 -0
  158. package/dist/litellm/toolset-types.d.ts +46 -0
  159. package/dist/litellm/toolset-types.d.ts.map +1 -0
  160. package/dist/litellm/toolset.d.ts +55 -0
  161. package/dist/litellm/toolset.d.ts.map +1 -0
  162. package/dist/openbao/index.js +35 -1
  163. package/dist/openbao/index.js.map +3 -3
  164. package/dist/ownership/rows.d.ts +11 -0
  165. package/dist/ownership/rows.d.ts.map +1 -1
  166. package/dist/postgres/connection.d.ts +14 -2
  167. package/dist/postgres/connection.d.ts.map +1 -1
  168. package/dist/postgres/database-sql.d.ts +27 -8
  169. package/dist/postgres/database-sql.d.ts.map +1 -1
  170. package/dist/postgres/fake-grants-parse.d.ts +37 -0
  171. package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
  172. package/dist/postgres/fake-grants-read.d.ts +61 -0
  173. package/dist/postgres/fake-grants-read.d.ts.map +1 -0
  174. package/dist/postgres/fake-grants-sql.d.ts +46 -0
  175. package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
  176. package/dist/postgres/fake-grants-write.d.ts +29 -0
  177. package/dist/postgres/fake-grants-write.d.ts.map +1 -0
  178. package/dist/postgres/fake-role-sql.d.ts +41 -0
  179. package/dist/postgres/fake-role-sql.d.ts.map +1 -0
  180. package/dist/postgres/fake-schema-sql.d.ts +42 -0
  181. package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
  182. package/dist/postgres/fake-sql-parse.d.ts +23 -0
  183. package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
  184. package/dist/postgres/fake-sql-quote.d.ts +12 -0
  185. package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
  186. package/dist/postgres/fake-sql.d.ts +42 -0
  187. package/dist/postgres/fake-sql.d.ts.map +1 -1
  188. package/dist/postgres/grants-attrs.d.ts +115 -0
  189. package/dist/postgres/grants-attrs.d.ts.map +1 -0
  190. package/dist/postgres/grants-declare.d.ts +88 -0
  191. package/dist/postgres/grants-declare.d.ts.map +1 -0
  192. package/dist/postgres/grants-diff.d.ts +25 -0
  193. package/dist/postgres/grants-diff.d.ts.map +1 -0
  194. package/dist/postgres/grants-errors.d.ts +137 -0
  195. package/dist/postgres/grants-errors.d.ts.map +1 -0
  196. package/dist/postgres/grants-existence.d.ts +14 -0
  197. package/dist/postgres/grants-existence.d.ts.map +1 -0
  198. package/dist/postgres/grants-ops.d.ts +65 -0
  199. package/dist/postgres/grants-ops.d.ts.map +1 -0
  200. package/dist/postgres/grants-ownership.d.ts +18 -0
  201. package/dist/postgres/grants-ownership.d.ts.map +1 -0
  202. package/dist/postgres/grants-plan-restore.d.ts +22 -0
  203. package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
  204. package/dist/postgres/grants-plan.d.ts +65 -0
  205. package/dist/postgres/grants-plan.d.ts.map +1 -0
  206. package/dist/postgres/grants-read-defaults.d.ts +17 -0
  207. package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
  208. package/dist/postgres/grants-read.d.ts +77 -0
  209. package/dist/postgres/grants-read.d.ts.map +1 -0
  210. package/dist/postgres/grants-refuse.d.ts +25 -0
  211. package/dist/postgres/grants-refuse.d.ts.map +1 -0
  212. package/dist/postgres/grants-sql.d.ts +42 -0
  213. package/dist/postgres/grants-sql.d.ts.map +1 -0
  214. package/dist/postgres/grants-words.d.ts +29 -0
  215. package/dist/postgres/grants-words.d.ts.map +1 -0
  216. package/dist/postgres/grants.d.ts +37 -0
  217. package/dist/postgres/grants.d.ts.map +1 -0
  218. package/dist/postgres/index.d.ts +31 -6
  219. package/dist/postgres/index.d.ts.map +1 -1
  220. package/dist/postgres/index.js +1998 -37
  221. package/dist/postgres/index.js.map +46 -7
  222. package/dist/postgres/installed-classifier.d.ts +13 -0
  223. package/dist/postgres/installed-classifier.d.ts.map +1 -0
  224. package/dist/postgres/providers.d.ts +16 -8
  225. package/dist/postgres/providers.d.ts.map +1 -1
  226. package/dist/postgres/psql-executor.d.ts +4 -0
  227. package/dist/postgres/psql-executor.d.ts.map +1 -1
  228. package/dist/postgres/role-attrs.d.ts +112 -0
  229. package/dist/postgres/role-attrs.d.ts.map +1 -0
  230. package/dist/postgres/role-diff.d.ts +22 -0
  231. package/dist/postgres/role-diff.d.ts.map +1 -0
  232. package/dist/postgres/role-errors.d.ts +132 -0
  233. package/dist/postgres/role-errors.d.ts.map +1 -0
  234. package/dist/postgres/role-membership-sql.d.ts +78 -0
  235. package/dist/postgres/role-membership-sql.d.ts.map +1 -0
  236. package/dist/postgres/role-provider.d.ts +11 -0
  237. package/dist/postgres/role-provider.d.ts.map +1 -0
  238. package/dist/postgres/role-scram.d.ts +8 -0
  239. package/dist/postgres/role-scram.d.ts.map +1 -0
  240. package/dist/postgres/role-secrets.d.ts +38 -0
  241. package/dist/postgres/role-secrets.d.ts.map +1 -0
  242. package/dist/postgres/role-sql.d.ts +68 -0
  243. package/dist/postgres/role-sql.d.ts.map +1 -0
  244. package/dist/postgres/role.d.ts +57 -0
  245. package/dist/postgres/role.d.ts.map +1 -0
  246. package/dist/postgres/schema-assert.d.ts +50 -0
  247. package/dist/postgres/schema-assert.d.ts.map +1 -0
  248. package/dist/postgres/schema-attrs.d.ts +51 -0
  249. package/dist/postgres/schema-attrs.d.ts.map +1 -0
  250. package/dist/postgres/schema-delete.d.ts +28 -0
  251. package/dist/postgres/schema-delete.d.ts.map +1 -0
  252. package/dist/postgres/schema-diff.d.ts +14 -0
  253. package/dist/postgres/schema-diff.d.ts.map +1 -0
  254. package/dist/postgres/schema-errors.d.ts +139 -0
  255. package/dist/postgres/schema-errors.d.ts.map +1 -0
  256. package/dist/postgres/schema-identity.d.ts +8 -0
  257. package/dist/postgres/schema-identity.d.ts.map +1 -0
  258. package/dist/postgres/schema-reconcile.d.ts +12 -0
  259. package/dist/postgres/schema-reconcile.d.ts.map +1 -0
  260. package/dist/postgres/schema-sql.d.ts +45 -0
  261. package/dist/postgres/schema-sql.d.ts.map +1 -0
  262. package/dist/postgres/schema-test-kit.d.ts +67 -0
  263. package/dist/postgres/schema-test-kit.d.ts.map +1 -0
  264. package/dist/postgres/schema.d.ts +54 -0
  265. package/dist/postgres/schema.d.ts.map +1 -0
  266. package/dist/proxmox/index.js +35 -1
  267. package/dist/proxmox/index.js.map +3 -3
  268. package/dist/release/fake-engine.d.ts +10 -0
  269. package/dist/release/fake-engine.d.ts.map +1 -1
  270. package/dist/release/index.js +35 -1
  271. package/dist/release/index.js.map +3 -3
  272. package/dist/valkey/acl-attrs.d.ts +94 -0
  273. package/dist/valkey/acl-attrs.d.ts.map +1 -0
  274. package/dist/valkey/acl-compare.d.ts +28 -0
  275. package/dist/valkey/acl-compare.d.ts.map +1 -0
  276. package/dist/valkey/acl-connection.d.ts +6 -0
  277. package/dist/valkey/acl-connection.d.ts.map +1 -0
  278. package/dist/valkey/acl-form.d.ts +62 -0
  279. package/dist/valkey/acl-form.d.ts.map +1 -0
  280. package/dist/valkey/acl-managed.d.ts +4 -0
  281. package/dist/valkey/acl-managed.d.ts.map +1 -0
  282. package/dist/valkey/acl-ops.d.ts +37 -0
  283. package/dist/valkey/acl-ops.d.ts.map +1 -0
  284. package/dist/valkey/acl-profiles.d.ts +53 -0
  285. package/dist/valkey/acl-profiles.d.ts.map +1 -0
  286. package/dist/valkey/acl-reconcile.d.ts +26 -0
  287. package/dist/valkey/acl-reconcile.d.ts.map +1 -0
  288. package/dist/valkey/acl.d.ts +24 -0
  289. package/dist/valkey/acl.d.ts.map +1 -0
  290. package/dist/valkey/connection-service.d.ts +22 -0
  291. package/dist/valkey/connection-service.d.ts.map +1 -0
  292. package/dist/valkey/connection.d.ts +59 -0
  293. package/dist/valkey/connection.d.ts.map +1 -0
  294. package/dist/valkey/errors.d.ts +165 -0
  295. package/dist/valkey/errors.d.ts.map +1 -0
  296. package/dist/valkey/fake-acl.d.ts +29 -0
  297. package/dist/valkey/fake-acl.d.ts.map +1 -0
  298. package/dist/valkey/fake-valkey.d.ts +35 -0
  299. package/dist/valkey/fake-valkey.d.ts.map +1 -0
  300. package/dist/valkey/handler-test-fixture.d.ts +20 -0
  301. package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
  302. package/dist/valkey/index.d.ts +18 -0
  303. package/dist/valkey/index.d.ts.map +1 -0
  304. package/dist/valkey/index.js +964 -0
  305. package/dist/valkey/index.js.map +27 -0
  306. package/dist/valkey/instance-attrs.d.ts +46 -0
  307. package/dist/valkey/instance-attrs.d.ts.map +1 -0
  308. package/dist/valkey/instance-form.d.ts +22 -0
  309. package/dist/valkey/instance-form.d.ts.map +1 -0
  310. package/dist/valkey/instance.d.ts +48 -0
  311. package/dist/valkey/instance.d.ts.map +1 -0
  312. package/dist/valkey/provider-socket-fixture.d.ts +8 -0
  313. package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
  314. package/dist/valkey/providers.d.ts +16 -0
  315. package/dist/valkey/providers.d.ts.map +1 -0
  316. package/dist/valkey/resp.d.ts +38 -0
  317. package/dist/valkey/resp.d.ts.map +1 -0
  318. package/dist/valkey/transport-error.d.ts +36 -0
  319. package/dist/valkey/transport-error.d.ts.map +1 -0
  320. package/dist/valkey/transport.d.ts +50 -0
  321. package/dist/valkey/transport.d.ts.map +1 -0
  322. package/docs/litellm-access-group.md +105 -0
  323. package/docs/litellm-credential.md +60 -0
  324. package/docs/litellm-key-metadata.md +56 -0
  325. package/docs/litellm-key.md +194 -0
  326. package/docs/litellm-mcp.md +187 -0
  327. package/docs/litellm-model.md +111 -0
  328. package/docs/litellm-policy-attachment.md +86 -0
  329. package/docs/litellm-policy.md +103 -0
  330. package/docs/litellm-team.md +117 -0
  331. package/docs/litellm-tool-policy.md +90 -0
  332. package/docs/litellm-toolset.md +92 -0
  333. package/docs/litellm.md +16 -9
  334. package/docs/peers.md +15 -6
  335. package/docs/postgres-grants-example.md +55 -0
  336. package/docs/postgres-grants.md +157 -0
  337. package/docs/postgres-role.md +126 -0
  338. package/docs/postgres-schema.md +139 -0
  339. package/docs/postgres.md +20 -3
  340. package/docs/valkey-transport.md +29 -0
  341. package/docs/valkey.md +187 -0
  342. package/package.json +6 -2
  343. package/src/ceph/ceph-argv.test.ts +1 -1
  344. package/src/launchd/sudo-allowlist.test.ts +2 -2
  345. package/src/linux/sudo-allowlist.test.ts +3 -3
  346. package/src/linux/sudo-runner.test.ts +2 -2
  347. package/src/litellm/access-group-form.ts +105 -0
  348. package/src/litellm/access-group-operations.ts +92 -0
  349. package/src/litellm/access-group-types.ts +49 -0
  350. package/src/litellm/access-group.test.ts +197 -0
  351. package/src/litellm/access-group.ts +151 -0
  352. package/src/litellm/credential-errors.ts +183 -0
  353. package/src/litellm/credential-form.test.ts +151 -0
  354. package/src/litellm/credential-form.ts +211 -0
  355. package/src/litellm/credential-guards.test.ts +241 -0
  356. package/src/litellm/credential-operations.ts +208 -0
  357. package/src/litellm/credential-recovery.test.ts +93 -0
  358. package/src/litellm/credential-rewrite.test.ts +164 -0
  359. package/src/litellm/credential-rewrite.ts +50 -0
  360. package/src/litellm/credential-types.ts +117 -0
  361. package/src/litellm/credential-values.ts +94 -0
  362. package/src/litellm/credential.test.ts +218 -0
  363. package/src/litellm/credential.ts +227 -0
  364. package/src/litellm/fake-access-group-litellm.ts +127 -0
  365. package/src/litellm/fake-credential-litellm.ts +216 -0
  366. package/src/litellm/fake-keys.ts +190 -0
  367. package/src/litellm/fake-litellm.ts +19 -9
  368. package/src/litellm/fake-mcp-litellm.ts +214 -0
  369. package/src/litellm/fake-model-litellm-post-update.ts +103 -0
  370. package/src/litellm/fake-model-litellm.ts +233 -0
  371. package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
  372. package/src/litellm/fake-policy-litellm.ts +186 -0
  373. package/src/litellm/fake-registry-base.ts +69 -0
  374. package/src/litellm/fake-stack.ts +17 -1
  375. package/src/litellm/fake-team-litellm.ts +229 -0
  376. package/src/litellm/fake-tool-litellm.ts +88 -0
  377. package/src/litellm/fake-toolset-litellm.ts +110 -0
  378. package/src/litellm/index.ts +140 -0
  379. package/src/litellm/key-delete.test.ts +212 -0
  380. package/src/litellm/key-errors.ts +241 -0
  381. package/src/litellm/key-form.ts +200 -0
  382. package/src/litellm/key-harness.ts +121 -0
  383. package/src/litellm/key-metadata-errors.ts +49 -0
  384. package/src/litellm/key-metadata.test.ts +156 -0
  385. package/src/litellm/key-metadata.ts +74 -0
  386. package/src/litellm/key-operations.ts +184 -0
  387. package/src/litellm/key-rotation.test.ts +110 -0
  388. package/src/litellm/key-scope.test.ts +135 -0
  389. package/src/litellm/key-secret.test.ts +248 -0
  390. package/src/litellm/key-secret.ts +137 -0
  391. package/src/litellm/key-transport.test.ts +166 -0
  392. package/src/litellm/key.test.ts +231 -0
  393. package/src/litellm/key.ts +213 -0
  394. package/src/litellm/mcp-server-adopt.test.ts +86 -0
  395. package/src/litellm/mcp-server-alias.test.ts +184 -0
  396. package/src/litellm/mcp-server-credential.ts +85 -0
  397. package/src/litellm/mcp-server-errors.ts +141 -0
  398. package/src/litellm/mcp-server-exports.test.ts +15 -0
  399. package/src/litellm/mcp-server-form.test.ts +241 -0
  400. package/src/litellm/mcp-server-form.ts +233 -0
  401. package/src/litellm/mcp-server-handlers.test.ts +150 -0
  402. package/src/litellm/mcp-server-locate.ts +66 -0
  403. package/src/litellm/mcp-server-operations.ts +111 -0
  404. package/src/litellm/mcp-server-registry.test.ts +146 -0
  405. package/src/litellm/mcp-server-retype.test.ts +114 -0
  406. package/src/litellm/mcp-server-shadow.test.ts +91 -0
  407. package/src/litellm/mcp-server-shadow.ts +45 -0
  408. package/src/litellm/mcp-server-tools.test.ts +85 -0
  409. package/src/litellm/mcp-server-types.ts +143 -0
  410. package/src/litellm/mcp-server-url.ts +66 -0
  411. package/src/litellm/mcp-server.test.ts +213 -0
  412. package/src/litellm/mcp-server.ts +225 -0
  413. package/src/litellm/model-claim.ts +69 -0
  414. package/src/litellm/model-credential.ts +45 -0
  415. package/src/litellm/model-errors.ts +168 -0
  416. package/src/litellm/model-foreign-row.test.ts +173 -0
  417. package/src/litellm/model-form.test.ts +228 -0
  418. package/src/litellm/model-form.ts +223 -0
  419. package/src/litellm/model-locate.test.ts +128 -0
  420. package/src/litellm/model-locate.ts +67 -0
  421. package/src/litellm/model-operations.test.ts +93 -0
  422. package/src/litellm/model-operations.ts +146 -0
  423. package/src/litellm/model-params-preserve.test.ts +119 -0
  424. package/src/litellm/model-recovery.test.ts +57 -0
  425. package/src/litellm/model-types.ts +112 -0
  426. package/src/litellm/model.test.ts +222 -0
  427. package/src/litellm/model.ts +237 -0
  428. package/src/litellm/policy-attachment-form.ts +103 -0
  429. package/src/litellm/policy-attachment-operations.ts +74 -0
  430. package/src/litellm/policy-attachment-types.ts +48 -0
  431. package/src/litellm/policy-attachment.test.ts +198 -0
  432. package/src/litellm/policy-attachment.ts +178 -0
  433. package/src/litellm/policy-form.ts +122 -0
  434. package/src/litellm/policy-operations.ts +112 -0
  435. package/src/litellm/policy-types.ts +58 -0
  436. package/src/litellm/policy.test.ts +214 -0
  437. package/src/litellm/policy.ts +146 -0
  438. package/src/litellm/providers.ts +24 -3
  439. package/src/litellm/registry-errors.ts +88 -0
  440. package/src/litellm/registry-exports.test.ts +66 -0
  441. package/src/litellm/registry-support.ts +109 -0
  442. package/src/litellm/team-form.ts +140 -0
  443. package/src/litellm/team-members.test.ts +150 -0
  444. package/src/litellm/team-members.ts +58 -0
  445. package/src/litellm/team-operations.ts +90 -0
  446. package/src/litellm/team-permission.ts +159 -0
  447. package/src/litellm/team-read.test.ts +89 -0
  448. package/src/litellm/team-types.ts +106 -0
  449. package/src/litellm/team.test.ts +206 -0
  450. package/src/litellm/team.ts +159 -0
  451. package/src/litellm/tool-policy-form.ts +94 -0
  452. package/src/litellm/tool-policy-operations.ts +58 -0
  453. package/src/litellm/tool-policy-types.ts +48 -0
  454. package/src/litellm/tool-policy.test.ts +172 -0
  455. package/src/litellm/tool-policy.ts +125 -0
  456. package/src/litellm/toolset-form.ts +104 -0
  457. package/src/litellm/toolset-operations.ts +90 -0
  458. package/src/litellm/toolset-types.ts +47 -0
  459. package/src/litellm/toolset.test.ts +198 -0
  460. package/src/litellm/toolset.ts +151 -0
  461. package/src/ownership/ownership.test.ts +33 -1
  462. package/src/ownership/rows.ts +53 -0
  463. package/src/postgres/connection.ts +42 -7
  464. package/src/postgres/database-bigint-serialization.test.ts +1 -0
  465. package/src/postgres/database-refusals.test.ts +2 -2
  466. package/src/postgres/database-sql.ts +36 -9
  467. package/src/postgres/fake-grants-parse.ts +189 -0
  468. package/src/postgres/fake-grants-read.ts +250 -0
  469. package/src/postgres/fake-grants-sql.ts +207 -0
  470. package/src/postgres/fake-grants-write.ts +90 -0
  471. package/src/postgres/fake-role-sql.ts +240 -0
  472. package/src/postgres/fake-schema-semantics.test.ts +36 -0
  473. package/src/postgres/fake-schema-sql.ts +146 -0
  474. package/src/postgres/fake-sql-parse.ts +86 -0
  475. package/src/postgres/fake-sql-quote.ts +36 -0
  476. package/src/postgres/fake-sql.ts +166 -46
  477. package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
  478. package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
  479. package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
  480. package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
  481. package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
  482. package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
  483. package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
  484. package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
  485. package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
  486. package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
  487. package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
  488. package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
  489. package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
  490. package/src/postgres/grants-acl.test.ts +61 -0
  491. package/src/postgres/grants-attrs.ts +185 -0
  492. package/src/postgres/grants-database.test.ts +158 -0
  493. package/src/postgres/grants-declare.ts +172 -0
  494. package/src/postgres/grants-delete-proof.test.ts +154 -0
  495. package/src/postgres/grants-diff.ts +101 -0
  496. package/src/postgres/grants-errors.ts +215 -0
  497. package/src/postgres/grants-existence-guards.test.ts +113 -0
  498. package/src/postgres/grants-existence.ts +101 -0
  499. package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
  500. package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
  501. package/src/postgres/grants-lifecycle.test.ts +181 -0
  502. package/src/postgres/grants-ops.ts +229 -0
  503. package/src/postgres/grants-owner-revoke.test.ts +121 -0
  504. package/src/postgres/grants-ownership.ts +49 -0
  505. package/src/postgres/grants-plan-collateral.test.ts +202 -0
  506. package/src/postgres/grants-plan-diff.test.ts +204 -0
  507. package/src/postgres/grants-plan-restore.ts +43 -0
  508. package/src/postgres/grants-plan-revocations.test.ts +69 -0
  509. package/src/postgres/grants-plan.test.ts +148 -0
  510. package/src/postgres/grants-plan.ts +245 -0
  511. package/src/postgres/grants-provenance.test.ts +134 -0
  512. package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
  513. package/src/postgres/grants-read-absent.test.ts +91 -0
  514. package/src/postgres/grants-read-defaults.ts +51 -0
  515. package/src/postgres/grants-read.ts +250 -0
  516. package/src/postgres/grants-refusals.test.ts +136 -0
  517. package/src/postgres/grants-refuse.ts +119 -0
  518. package/src/postgres/grants-relkind-wire.test.ts +111 -0
  519. package/src/postgres/grants-repair-plan.test.ts +201 -0
  520. package/src/postgres/grants-sql.test.ts +128 -0
  521. package/src/postgres/grants-sql.ts +144 -0
  522. package/src/postgres/grants-words.ts +34 -0
  523. package/src/postgres/grants.ts +110 -0
  524. package/src/postgres/index.ts +129 -5
  525. package/src/postgres/installed-classifier.ts +36 -0
  526. package/src/postgres/providers.ts +33 -9
  527. package/src/postgres/psql-executor-escaping.test.ts +67 -0
  528. package/src/postgres/psql-executor.test.ts +63 -2
  529. package/src/postgres/psql-executor.ts +74 -34
  530. package/src/postgres/role-adopt.test.ts +98 -0
  531. package/src/postgres/role-attrs.ts +137 -0
  532. package/src/postgres/role-diff.ts +93 -0
  533. package/src/postgres/role-errors.ts +206 -0
  534. package/src/postgres/role-guard.test.ts +60 -0
  535. package/src/postgres/role-identity.test.ts +197 -0
  536. package/src/postgres/role-lifecycle.test.ts +228 -0
  537. package/src/postgres/role-membership-options.test.ts +73 -0
  538. package/src/postgres/role-membership-repair.test.ts +153 -0
  539. package/src/postgres/role-membership-sql.ts +223 -0
  540. package/src/postgres/role-password-ascii.test.ts +53 -0
  541. package/src/postgres/role-password-transports.test.ts +123 -0
  542. package/src/postgres/role-password.test.ts +158 -0
  543. package/src/postgres/role-privilege.test.ts +107 -0
  544. package/src/postgres/role-provenance.test.ts +200 -0
  545. package/src/postgres/role-provider.ts +105 -0
  546. package/src/postgres/role-refusals.test.ts +225 -0
  547. package/src/postgres/role-scram.test.ts +38 -0
  548. package/src/postgres/role-scram.ts +40 -0
  549. package/src/postgres/role-secrets.ts +61 -0
  550. package/src/postgres/role-sql.ts +213 -0
  551. package/src/postgres/role-valid-until.test.ts +68 -0
  552. package/src/postgres/role.ts +226 -0
  553. package/src/postgres/schema-assert.ts +139 -0
  554. package/src/postgres/schema-attrs.ts +71 -0
  555. package/src/postgres/schema-delete-proofs.test.ts +192 -0
  556. package/src/postgres/schema-delete.ts +96 -0
  557. package/src/postgres/schema-diff.ts +44 -0
  558. package/src/postgres/schema-drop-2bp01.test.ts +146 -0
  559. package/src/postgres/schema-errors.ts +209 -0
  560. package/src/postgres/schema-handlers.test.ts +193 -0
  561. package/src/postgres/schema-identity.ts +39 -0
  562. package/src/postgres/schema-lifecycle.test.ts +246 -0
  563. package/src/postgres/schema-race.test.ts +70 -0
  564. package/src/postgres/schema-reconcile.ts +100 -0
  565. package/src/postgres/schema-refusals.test.ts +144 -0
  566. package/src/postgres/schema-socket.test.ts +162 -0
  567. package/src/postgres/schema-sql.ts +130 -0
  568. package/src/postgres/schema-takeover.test.ts +149 -0
  569. package/src/postgres/schema-test-kit.ts +85 -0
  570. package/src/postgres/schema.ts +130 -0
  571. package/src/release/binary-alias.test.ts +3 -3
  572. package/src/release/binary-claims.test.ts +3 -3
  573. package/src/release/binary-directory-umask.test.ts +65 -0
  574. package/src/release/fake-engine.ts +15 -0
  575. package/src/valkey/acl-attrs.ts +98 -0
  576. package/src/valkey/acl-compare.ts +57 -0
  577. package/src/valkey/acl-connection.ts +13 -0
  578. package/src/valkey/acl-delete.test.ts +127 -0
  579. package/src/valkey/acl-form.ts +239 -0
  580. package/src/valkey/acl-managed.ts +13 -0
  581. package/src/valkey/acl-ops.ts +122 -0
  582. package/src/valkey/acl-ownership.test.ts +118 -0
  583. package/src/valkey/acl-prefix.test.ts +38 -0
  584. package/src/valkey/acl-profiles.ts +81 -0
  585. package/src/valkey/acl-reconcile.ts +180 -0
  586. package/src/valkey/acl-reserved.test.ts +69 -0
  587. package/src/valkey/acl-revocation.test.ts +94 -0
  588. package/src/valkey/acl-seat-prefix.test.ts +111 -0
  589. package/src/valkey/acl-validation.test.ts +54 -0
  590. package/src/valkey/acl.test.ts +215 -0
  591. package/src/valkey/acl.ts +169 -0
  592. package/src/valkey/connection-service.ts +46 -0
  593. package/src/valkey/connection.ts +180 -0
  594. package/src/valkey/errors.ts +239 -0
  595. package/src/valkey/fake-acl.ts +128 -0
  596. package/src/valkey/fake-valkey.ts +224 -0
  597. package/src/valkey/handler-test-fixture.ts +43 -0
  598. package/src/valkey/handlers.test.ts +205 -0
  599. package/src/valkey/index.ts +54 -0
  600. package/src/valkey/instance-attrs.ts +48 -0
  601. package/src/valkey/instance-form.ts +104 -0
  602. package/src/valkey/instance.test.ts +108 -0
  603. package/src/valkey/instance.ts +160 -0
  604. package/src/valkey/provider-socket-fixture.ts +71 -0
  605. package/src/valkey/providers.test.ts +129 -0
  606. package/src/valkey/providers.ts +21 -0
  607. package/src/valkey/resp.ts +212 -0
  608. package/src/valkey/transport-bounds.test.ts +150 -0
  609. package/src/valkey/transport-error.ts +37 -0
  610. package/src/valkey/transport.test.ts +158 -0
  611. package/src/valkey/transport.ts +109 -0
  612. package/src/valkey/upstream-bounds.test.ts +14 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `Postgres.Role` — create / adopt / alter / drop of a LOGIN or NOLOGIN role on the same
3
+ * self-hosted PostgreSQL 18 cluster `Postgres.Database` talks to, over the same transports
4
+ * (runner `psql` or socket). The seat-wiring lane B12a's shape: one group role per seat
5
+ * (NOLOGIN, member of `hf_agent`), plus the LOGIN seat users.
6
+ *
7
+ * ★ ALTER-CAPABLE, UNLIKE `Postgres.Database`. Every scalar this resource asserts has a safe
8
+ * atomic `ALTER ROLE` form (`LOGIN`/`NOLOGIN`, `INHERIT`/`NOINHERIT`, `CONNECTION LIMIT`,
9
+ * `VALID UNTIL` — `alter_role.sgml`'s first synopsis variant), so a drifted live row is
10
+ * brought back to the declaration, never refused. Memberships move through one-parent
11
+ * `GRANT`/`REVOKE` statements (`alter_role.sgml`: "there are no options for adding or
12
+ * removing memberships; use GRANT and REVOKE").
13
+ * ⛔ THE PASSWORD IS A REFERENCE, NEVER A VALUE (S25). It is declared as
14
+ * `{ fromEnv: 'PG_SEAT_WIDGET_PASSWORD' }`; the NAME lands in state, the value is resolved
15
+ * from the deploying process's environment at reconcile time, held as `Redacted`, and sent only
16
+ * as the SCRAM-SHA-256 verifier inside the one `ALTER ROLE … PASSWORD` statement that needs it
17
+ * (`role-scram.ts` — the statement text reaching spans, `pg_stat_statements` and a failed
18
+ * `ALTER`'s server log never holds the plain value). What state remembers is a
19
+ * `scrypt:<salt>:<digest>` seal, so a reconcile sends the password only when the environment
20
+ * value differs from the one last written — a plan never re-sends a secret that already
21
+ * matches, and never stores one.
22
+ * ★ MEMBERSHIP IS `pg_auth_members`, compared as a sorted set. `memberOf` omitted leaves live
23
+ * memberships alone; `[]` ensures none.
24
+ * ★ `defaultRemovalPolicy: 'retain'` — a seat group role may own objects and be granted across
25
+ * databases; a destroy is still implemented in full (`DROP ROLE IF EXISTS`), opt in with
26
+ * `.pipe(RemovalPolicy.destroy())`. A role that still owns objects fails the drop with the
27
+ * server's own `2BP01` (`dependent_objects_still_exist`), surfaced as the client's `SqlError`.
28
+ */
29
+ import { Resource } from 'alchemy';
30
+ import * as Effect from 'effect/Effect';
31
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
32
+ import { type Environment } from '../secrets/write-only.ts';
33
+ import type { PostgresRoleAttributes, PostgresRoleProps } from './role-attrs.ts';
34
+ import { PostgresRoleCreateVanished, PostgresRoleIdentityRefused, type PostgresRoleMembershipUnrepaired, PostgresRoleNameRefused, type PostgresRoleParentMissing, PostgresRolePasswordEnvUnsetError, type PostgresRolePasswordNonAsciiRefused, PostgresRolePrivilegedRefused, PostgresRoleValidUntilRefused } from './role-errors.ts';
35
+ import { type PostgresConnection } from './connection.ts';
36
+ import type { PgExecutor } from './database-sql.ts';
37
+ export interface PostgresRole extends Resource<'Postgres.Role', PostgresRoleProps, PostgresRoleAttributes, never, PostgresConnection> {
38
+ }
39
+ export declare const PostgresRole: import("alchemy").ResourceClass<PostgresRole>;
40
+ /** Mirrors `isPostgresDatabase`: a resource constructor is a callable `Object.assign`ed
41
+ * function, not a plain object, so `typeof` must accept both. */
42
+ export declare const isPostgresRole: (value: unknown) => value is PostgresRole;
43
+ /**
44
+ * The core of `reconcile`, against any {@link PgExecutor} — the real client through `withPg`,
45
+ * or `fake-sql.ts`'s recording fake in tests. `env` defaults to `process.env`; tests pass a
46
+ * recording one. `previousSeal` is the seal in the engine's state — `''` when the role is
47
+ * being written for the first time — because `pg_roles` answers no password (S25), so the live
48
+ * row cannot say whether the environment value still matches the one last written.
49
+ */
50
+ export declare const reconcileWithClient: (pg: PgExecutor, props: PostgresRoleProps, env?: Environment, previousSeal?: string, storedOid?: number) => Effect.Effect<PostgresRoleAttributes, PostgresRolePasswordEnvUnsetError | PostgresRolePasswordNonAsciiRefused | PostgresRolePrivilegedRefused | PostgresRoleCreateVanished | PostgresRoleMembershipUnrepaired | PostgresRoleParentMissing | PostgresRoleIdentityRefused | SqlError>;
51
+ /** The core of `read`. Answers `undefined` when absent; ownership branding and the state-only
52
+ * `passwordSeal` merge are the caller's. */
53
+ export declare const readRole: (pg: PgExecutor, name: string) => Effect.Effect<Omit<PostgresRoleAttributes, "passwordSeal"> | undefined, SqlError, never>;
54
+ /** Every plan-time refusal this family makes, in one place so `diff` and `reconcile` check the
55
+ * same facts. Nothing here touches a client. */
56
+ export declare const refuseAtPlan: (props: PostgresRoleProps) => Effect.Effect<void, PostgresRoleNameRefused | PostgresRoleValidUntilRefused>;
57
+ //# sourceMappingURL=role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/postgres/role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAmBjF,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,gCAAgC,EACrC,uBAAuB,EACvB,KAAK,yBAAyB,EAC9B,iCAAiC,EACjC,KAAK,mCAAmC,EACxC,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,YAAa,SAAQ,QAAQ,CAC5C,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,EACL,kBAAkB,CACnB;CAAG;AAEJ,eAAO,MAAM,YAAY,+CAEvB,CAAC;AAEH;iEACiE;AACjE,eAAO,MAAM,cAAc,UAAW,OAAO,KAAG,KAAK,IAAI,YAGD,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,OAC1B,UAAU,SACP,iBAAiB,QACnB,WAAW,qCAEJ,MAAM,KACjB,MAAM,CAAC,MAAM,CACd,sBAAsB,EACpB,iCAAiC,GACjC,mCAAmC,GACnC,6BAA6B,GAC7B,0BAA0B,GAC1B,gCAAgC,GAChC,yBAAyB,GACzB,2BAA2B,GAC3B,QAAQ,CA0FR,CAAC;AAEL;4CAC4C;AAC5C,eAAO,MAAM,QAAQ,OAAQ,UAAU,QAAQ,MAAM,6FAAiC,CAAC;AAEvF;gDACgD;AAChD,eAAO,MAAM,YAAY,UAChB,iBAAiB,KACvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,uBAAuB,GAAG,6BAA6B,CAkB1E,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Assert a just-read `pg_namespace` row — and the connection that read it — against a
3
+ * `Postgres.Schema` declaration.
4
+ *
5
+ * ⛔ OWNER BEFORE COMMENT. `reconcile` calls `assertOwner` on the create re-read before any
6
+ * `COMMENT ON SCHEMA`. Measured before the 2026-10-01 fix: a concurrent creator could win
7
+ * `IF NOT EXISTS` (the `CREATE` did nothing). Plain CREATE now refuses that race. The kit role
8
+ * is superuser, so commenting first rewrites their schema, and the later drift failure does not roll that write back — the two statements are not one
9
+ * transaction.
10
+ * ⛔ AN OMITTED `owner` IS `current_user`, NOT "DON'T ASSERT". A fresh `CREATE SCHEMA` without
11
+ * `AUTHORIZATION` is owned by the role running it. Skipping the comparison when the prop is
12
+ * omitted returns that foreign row as reconciled, and a later `RemovalPolicy.destroy()` drops
13
+ * the other role's schema.
14
+ * ⛔ DELETE RE-READS AND PROVES OWNERSHIP (`deleteForeignRefusal`). `DROP SCHEMA` fires by
15
+ * name alone; the name is no proof the live schema is the one this resource created — the
16
+ * old row can be dropped out of band and the name recreated by another role, and the engine
17
+ * hands `delete` no re-read of its own once state exists. The persisted `oid` + `owner`
18
+ * (what the last reconcile asserted) are the proof: a live row that does not match them is
19
+ * refused, and nothing is dropped.
20
+ */
21
+ import * as Effect from 'effect/Effect';
22
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
23
+ import type { PgExecutor } from './database-sql.ts';
24
+ import { type PostgresSchemaAttributes, type PostgresSchemaProps } from './schema-attrs.ts';
25
+ import { PostgresSchemaDeleteForeignRefused, PostgresSchemaDrift, PostgresSchemaWrongDatabase } from './schema-errors.ts';
26
+ /** The connected database, proven equal to the declaration or refused — the guard every write
27
+ * path in this family runs first. */
28
+ export declare const assertDatabase: (props: PostgresSchemaProps, pg: PgExecutor) => Effect.Effect<void, PostgresSchemaWrongDatabase | SqlError>;
29
+ /** The role a fresh `CREATE SCHEMA` without `AUTHORIZATION` would be owned by. */
30
+ export declare const declaredOwner: (props: PostgresSchemaProps, executingRole: string) => string;
31
+ /** Owner, then comment. An omitted owner is `executingRole` (`current_user`), so a race
32
+ * winner owned by someone else is drift on every return path, not only the create path. */
33
+ export declare const liveDrift: (props: PostgresSchemaProps, live: PostgresSchemaAttributes, executingRole: string) => {
34
+ readonly prop: string;
35
+ readonly declared: unknown;
36
+ readonly live: unknown;
37
+ } | undefined;
38
+ /** Owner only — the check that runs before `COMMENT ON`, so a race winner is never commented. */
39
+ export declare const assertOwner: (props: PostgresSchemaProps, row: PostgresSchemaAttributes, executingRole: string) => Effect.Effect<void, PostgresSchemaDrift>;
40
+ /** Owner and comment. Every return path of `reconcile` passes through this. */
41
+ export declare const assertLive: (props: PostgresSchemaProps, row: PostgresSchemaAttributes, executingRole: string) => Effect.Effect<PostgresSchemaAttributes, PostgresSchemaDrift>;
42
+ /**
43
+ * The delete-time ownership proof: `undefined` when the live row is provably the one this
44
+ * resource created (same `oid` and `owner` as the persisted state handed to `delete`), else
45
+ * the typed refusal — with `lastOid`/`lastOwner` `undefined` when no state was handed over,
46
+ * the fail-closed shape (the handler type allows `output === undefined` even though the
47
+ * engine passes state whenever it calls delete).
48
+ */
49
+ export declare const deleteForeignRefusal: (props: PostgresSchemaProps, live: PostgresSchemaAttributes, output: PostgresSchemaAttributes | undefined) => PostgresSchemaDeleteForeignRefused | undefined;
50
+ //# sourceMappingURL=schema-assert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-assert.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-assert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kCAAkC,EAClC,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAG5B;qCACqC;AACrC,eAAO,MAAM,cAAc,UAClB,mBAAmB,MACtB,UAAU,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,QAAQ,CAW1D,CAAC;AAEJ,kFAAkF;AAClF,eAAO,MAAM,aAAa,UAAW,mBAAmB,iBAAiB,MAAM,KAAG,MACpD,CAAC;AAW/B;2FAC2F;AAC3F,eAAO,MAAM,SAAS,UACb,mBAAmB,QACpB,wBAAwB,iBACf,MAAM,KACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,SAQlF,CAAC;AAeF,iGAAiG;AACjG,eAAO,MAAM,WAAW,UACf,mBAAmB,OACrB,wBAAwB,iBACd,MAAM,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAGzC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,UAAU,UACd,mBAAmB,OACrB,wBAAwB,iBACd,MAAM,KACpB,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,mBAAmB,CAG7D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,UACxB,mBAAmB,QACpB,wBAAwB,UACtB,wBAAwB,GAAG,SAAS,KAC3C,kCAAkC,GAAG,SAYvC,CAAC"}
@@ -0,0 +1,51 @@
1
+ export interface PostgresSchemaProps {
2
+ /** Schema name. At most 63 UTF-8 bytes (`NAMEDATALEN`), refused at plan. */
3
+ readonly name: string;
4
+ /**
5
+ * The database the schema lives in. The family connection points at a maintenance database
6
+ * (`docs/postgres.md#measured-path` — a brand-new database cannot be connected to on a cold
7
+ * plan), so the schema handlers open THIS database instead and prove it with
8
+ * `current_database()` (`PostgresSchemaWrongDatabase`) before any write. A change is refused
9
+ * at plan (`PostgresSchemaDatabaseRefused`) the same way a rename is.
10
+ */
11
+ readonly database: string;
12
+ /** Owning role; becomes `AUTHORIZATION` in `CREATE SCHEMA`. The role must already exist. */
13
+ readonly owner?: string;
14
+ /**
15
+ * Optional `COMMENT ON SCHEMA`. Stored in `pg_description`. A declared `''` IS "no comment":
16
+ * Postgres stores an empty comment as NULL, so it is normalized to `undefined`
17
+ * (`normalizedComment`) rather than compared against a live NULL forever.
18
+ */
19
+ readonly comment?: string;
20
+ /**
21
+ * Whether `DELETE` with `RemovalPolicy.destroy()` may cascade into objects in the schema.
22
+ * Default `false`: `DROP SCHEMA` refuses when the schema is not empty.
23
+ */
24
+ readonly cascade?: boolean;
25
+ }
26
+ export interface PostgresSchemaAttributes {
27
+ /** Schema name (`pg_namespace.nspname`). */
28
+ readonly name: string;
29
+ /** The database the row was read from (`current_database()`), equal to the declared prop on
30
+ * every honest read — the row itself carries the proof of where the statement ran. */
31
+ readonly database: string;
32
+ /** Owner role name (`pg_get_userbyid(nspowner)`). */
33
+ readonly owner: string;
34
+ /** Comment from `obj_description`, `null` when none. */
35
+ readonly comment: string | null;
36
+ /** `pg_namespace` OID, read as a native `oid` number. */
37
+ readonly oid: number;
38
+ }
39
+ /**
40
+ * A declared `''` comment means "no comment": `COMMENT ON SCHEMA … IS ''` deletes the comment in
41
+ * Postgres (the stored value becomes NULL), so treating `''` as a value would drift against the
42
+ * live NULL on every later plan — a permanent update loop. Normalizing it to `undefined` keeps
43
+ * `''` and an absent comment identical everywhere they are compared.
44
+ */
45
+ export declare const normalizedComment: (comment: string | undefined) => string | undefined;
46
+ /** Refuse names PostgreSQL would silently truncate (see `database-attrs.ts`). */
47
+ export declare const schemaNameByteRefusal: (name: string) => {
48
+ readonly byteLength: number;
49
+ readonly limit: number;
50
+ } | undefined;
51
+ //# sourceMappingURL=schema-attrs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-attrs.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-attrs.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;0FACsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,YAAa,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SACnC,CAAC;AAEvC,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,SAC1B,MAAM,KACX;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAK5D,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `Postgres.Schema`'s drop path: prove the connection, prove the schema is still ours, then
3
+ * the guarded `DROP SCHEMA`.
4
+ *
5
+ * ⛔ THE ENGINE DOES NOT RE-READ BEFORE A DELETE THAT HAS STATE (alchemy `Apply.ts`). When
6
+ * persisted attributes exist, `delete` receives the LAST asserted `oid` + `owner` and no
7
+ * fresh row — a schema dropped out of band and recreated under the same name by another role
8
+ * would be dropped by name, `CASCADE` included, destroying their objects.
9
+ * `deleteWithClient` re-reads `pg_namespace` first: absent is idempotent success, and a live
10
+ * row that no longer matches the persisted proof fails with
11
+ * `PostgresSchemaDeleteForeignRefused` (`schema-assert.ts#deleteForeignRefusal`) before any
12
+ * `DROP` is issued.
13
+ */
14
+ import * as Effect from 'effect/Effect';
15
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
16
+ import type { PgExecutor } from './database-sql.ts';
17
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
18
+ import { type PostgresSchemaDeleteForeignRefused, PostgresSchemaDropNotEmptyError, type PostgresSchemaWrongDatabase } from './schema-errors.ts';
19
+ /** Prove the connected database, then the guarded drop — the drop core on its own, for the
20
+ * tests that drive it directly. */
21
+ export declare const dropWithClient: (pg: PgExecutor, props: PostgresSchemaProps) => Effect.Effect<void, PostgresSchemaWrongDatabase | PostgresSchemaDropNotEmptyError | SqlError>;
22
+ /**
23
+ * The core of `delete`: re-read first (see the file header), refuse a schema the persisted
24
+ * proof cannot vouch for, then the guarded drop. `output` is the persisted state the engine
25
+ * hands over — `undefined` is no proof and refuses too.
26
+ */
27
+ export declare const deleteWithClient: (pg: PgExecutor, props: PostgresSchemaProps, output: PostgresSchemaAttributes | undefined) => Effect.Effect<void, PostgresSchemaWrongDatabase | PostgresSchemaDeleteForeignRefused | PostgresSchemaDropNotEmptyError | SqlError>;
28
+ //# sourceMappingURL=schema-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-delete.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EACL,KAAK,kCAAkC,EACvC,+BAA+B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,oBAAoB,CAAC;AAuC5B;mCACmC;AACnC,eAAO,MAAM,cAAc,OACrB,UAAU,SACP,mBAAmB,KACzB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,+BAA+B,GAAG,QAAQ,CAI3F,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,OACvB,UAAU,SACP,mBAAmB,UAClB,wBAAwB,GAAG,SAAS,KAC3C,MAAM,CAAC,MAAM,CACd,IAAI,EACF,2BAA2B,GAC3B,kCAAkC,GAClC,+BAA+B,GAC/B,QAAQ,CASR,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Input } from 'alchemy/Input';
2
+ import * as Effect from 'effect/Effect';
3
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
4
+ import { PostgresSchemaNameRefused } from './schema-errors.ts';
5
+ /** Plan-time only: rename refused, over-long name refused, a database move refused; a `cascade`
6
+ * flip answers `update` so the new prop reaches state, and every other change answers `update`
7
+ * too (which `reconcileWithClient` then applies as create, or refuses as drift on a live
8
+ * schema). */
9
+ export declare const diffPostgresSchema: (news: Input<PostgresSchemaProps>, output: PostgresSchemaAttributes | undefined, olds?: PostgresSchemaProps) => Effect.Effect<{
10
+ readonly action: 'update';
11
+ } | {
12
+ readonly action: 'noop';
13
+ } | undefined, import("./schema-errors.ts").PostgresSchemaDatabaseRefused | PostgresSchemaNameRefused | import("./schema-errors.ts").PostgresSchemaRenameRefused, never>;
14
+ //# sourceMappingURL=schema-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-diff.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-diff.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;cAGc;AACd,eAAO,MAAM,kBAAkB,SACvB,KAAK,CAAC,mBAAmB,CAAC,UACxB,wBAAwB,GAAG,SAAS,SACrC,mBAAmB;qBAcI,QAAQ;;qBAA0B,MAAM;wKACpE,CAAC"}
@@ -0,0 +1,139 @@
1
+ declare const PostgresSchemaNameRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "PostgresSchemaNameRefused";
3
+ } & Readonly<A>;
4
+ /** A declared name would be silently truncated (same as `PostgresDatabaseNameRefused`). */
5
+ export declare class PostgresSchemaNameRefused extends PostgresSchemaNameRefused_base<{
6
+ readonly name: string;
7
+ readonly byteLength: number;
8
+ readonly limit: number;
9
+ }> {
10
+ get message(): string;
11
+ }
12
+ declare const PostgresSchemaRenameRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
13
+ readonly _tag: "PostgresSchemaRenameRefused";
14
+ } & Readonly<A>;
15
+ /** A logical id's `name` changed. A schema's name is its identity; this family has no
16
+ * `ALTER SCHEMA … RENAME`. */
17
+ export declare class PostgresSchemaRenameRefused extends PostgresSchemaRenameRefused_base<{
18
+ readonly from: string;
19
+ readonly to: string;
20
+ }> {
21
+ get message(): string;
22
+ }
23
+ declare const PostgresSchemaOwnerMissing_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
24
+ readonly _tag: "PostgresSchemaOwnerMissing";
25
+ } & Readonly<A>;
26
+ /** `owner` names a role `pg_roles` does not have, checked before the `CREATE SCHEMA`. */
27
+ export declare class PostgresSchemaOwnerMissing extends PostgresSchemaOwnerMissing_base<{
28
+ readonly schema: string;
29
+ readonly owner: string;
30
+ }> {
31
+ get message(): string;
32
+ }
33
+ declare const PostgresSchemaDrift_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
34
+ readonly _tag: "PostgresSchemaDrift";
35
+ } & Readonly<A>;
36
+ /** A live asserted prop no longer matches the declaration (`owner` or `comment`). */
37
+ export declare class PostgresSchemaDrift extends PostgresSchemaDrift_base<{
38
+ readonly schema: string;
39
+ readonly prop: string;
40
+ readonly declared: unknown;
41
+ readonly live: unknown;
42
+ }> {
43
+ get message(): string;
44
+ }
45
+ declare const PostgresSchemaCreateVanished_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
46
+ readonly _tag: "PostgresSchemaCreateVanished";
47
+ } & Readonly<A>;
48
+ /** `CREATE SCHEMA` raised no error, but the immediate re-read (S10) still finds nothing. */
49
+ export declare class PostgresSchemaCreateVanished extends PostgresSchemaCreateVanished_base<{
50
+ readonly schema: string;
51
+ }> {
52
+ get message(): string;
53
+ }
54
+ declare const PostgresSchemaDropNotEmptyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
55
+ readonly _tag: "PostgresSchemaDropNotEmptyError";
56
+ } & Readonly<A>;
57
+ /**
58
+ * `delete` with `cascade: false` refuses a schema that still has relations. The same refusal
59
+ * answers a plain `DROP SCHEMA` the server rejected with SQLSTATE `2BP01`
60
+ * (`dependent_objects_still_exist`) — an object kind the emptiness check's four catalogs do not
61
+ * cover (an extension, a collation) — so no "empty" path escapes the typed tag.
62
+ */
63
+ export declare class PostgresSchemaDropNotEmptyError extends PostgresSchemaDropNotEmptyError_base<{
64
+ readonly schema: string;
65
+ }> {
66
+ get message(): string;
67
+ }
68
+ declare const PostgresSchemaWrongDatabase_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
69
+ readonly _tag: "PostgresSchemaWrongDatabase";
70
+ } & Readonly<A>;
71
+ /** Every statement this resource issues must run against the DECLARED database. The family
72
+ * connection points at a maintenance database, so the schema handlers open `props.database`
73
+ * themselves (`withPg`'s database override); this failure means the server answered
74
+ * `current_database()` with something else — the override was ignored, and no read or write
75
+ * ran against the schema's real home. */
76
+ export declare class PostgresSchemaWrongDatabase extends PostgresSchemaWrongDatabase_base<{
77
+ readonly schema: string;
78
+ readonly declared: string;
79
+ readonly connected: string;
80
+ }> {
81
+ get message(): string;
82
+ }
83
+ declare const PostgresSchemaDeleteForeignRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
84
+ readonly _tag: "PostgresSchemaDeleteForeignRefused";
85
+ } & Readonly<A>;
86
+ /**
87
+ * `delete` refuses to drop a live schema that is not the one this resource created. The
88
+ * engine hands `delete` the persisted state (`output`, with the `oid` and `owner` the last
89
+ * assert proved), and the provider re-reads `pg_namespace` before any `DROP` — a live row that
90
+ * no longer matches that proof is someone else's schema wearing the same name (the old row was
91
+ * dropped out of band and the name recreated), and `DROP SCHEMA` would remove their objects.
92
+ * Nothing is dropped: clear the out-of-band schema by hand, or adopt it.
93
+ */
94
+ export declare class PostgresSchemaDeleteForeignRefused extends PostgresSchemaDeleteForeignRefused_base<{
95
+ readonly schema: string;
96
+ readonly database: string;
97
+ readonly liveOid: number;
98
+ readonly liveOwner: string;
99
+ /** The proof the persisted state carries; both `undefined` when no state was handed over. */
100
+ readonly lastOid: number | undefined;
101
+ readonly lastOwner: string | undefined;
102
+ }> {
103
+ get message(): string;
104
+ }
105
+ declare const PostgresSchemaDatabaseRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
106
+ readonly _tag: "PostgresSchemaDatabaseRefused";
107
+ } & Readonly<A>;
108
+ /** A logical id's `database` changed. A schema lives in one database and this family never
109
+ * moves one: `DROP SCHEMA` in the old database plus a new declaration is the only path. */
110
+ export declare class PostgresSchemaDatabaseRefused extends PostgresSchemaDatabaseRefused_base<{
111
+ readonly from: string;
112
+ readonly to: string;
113
+ }> {
114
+ get message(): string;
115
+ }
116
+ declare const PostgresSchemaExistsRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
117
+ readonly _tag: "PostgresSchemaExistsRefused";
118
+ } & Readonly<A>;
119
+ /** No persisted proof: even a same-owner schema needs explicit adoption, including recovery. */
120
+ export declare class PostgresSchemaExistsRefused extends PostgresSchemaExistsRefused_base<{
121
+ readonly schema: string;
122
+ readonly database: string;
123
+ }> {
124
+ get message(): string;
125
+ }
126
+ declare const PostgresSchemaIdentityRefused_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
127
+ readonly _tag: "PostgresSchemaIdentityRefused";
128
+ } & Readonly<A>;
129
+ /** Reconcile must not replace the oid delete relies on with an out-of-band replacement's oid. */
130
+ export declare class PostgresSchemaIdentityRefused extends PostgresSchemaIdentityRefused_base<{
131
+ readonly schema: string;
132
+ readonly storedOid: number;
133
+ readonly liveOid: number;
134
+ }> {
135
+ get message(): string;
136
+ }
137
+ export type PostgresSchemaError = PostgresSchemaExistsRefused | PostgresSchemaIdentityRefused | PostgresSchemaNameRefused | PostgresSchemaRenameRefused | PostgresSchemaOwnerMissing | PostgresSchemaDrift | PostgresSchemaCreateVanished | PostgresSchemaDropNotEmptyError | PostgresSchemaDeleteForeignRefused | PostgresSchemaWrongDatabase | PostgresSchemaDatabaseRefused;
138
+ export {};
139
+ //# sourceMappingURL=schema-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-errors.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-errors.ts"],"names":[],"mappings":";;;AAOA,2FAA2F;AAC3F,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAO7B;CACF;;;;AAED;8BAC8B;AAC9B,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED,yFAAyF;AACzF,qBAAa,0BAA2B,SAAQ,gCAA+C;IAC7F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED,qFAAqF;AACrF,qBAAa,mBAAoB,SAAQ,yBAAwC;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAO7B;CACF;;;;AAED,4FAA4F;AAC5F,qBAAa,4BAA6B,SAAQ,kCAAiD;IACjG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;;;GAKG;AACH,qBAAa,+BAAgC,SAAQ,qCAEnD;IACA,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;;yCAIyC;AACzC,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAO7B;CACF;;;;AAED;;;;;;;GAOG;AACH,qBAAa,kCAAmC,SAAQ,wCAEtD;IACA,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAW7B;CACF;;;;AAED;2FAC2F;AAC3F,qBAAa,6BAA8B,SAAQ,mCAEjD;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED,gGAAgG;AAChG,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED,iGAAiG;AACjG,qBAAa,6BAA8B,SAAQ,mCAEjD;IACA,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;AAED,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,6BAA6B,GAC7B,yBAAyB,GACzB,2BAA2B,GAC3B,0BAA0B,GAC1B,mBAAmB,GACnB,4BAA4B,GAC5B,+BAA+B,GAC/B,kCAAkC,GAClC,2BAA2B,GAC3B,6BAA6B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Apply repeats plan guards: unresolved Outputs can skip both diff and the adoption probe. */
2
+ import * as Effect from 'effect/Effect';
3
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
4
+ import { PostgresSchemaDatabaseRefused, PostgresSchemaIdentityRefused, PostgresSchemaRenameRefused } from './schema-errors.ts';
5
+ export declare const assertSchemaTarget: (props: PostgresSchemaProps, output: PostgresSchemaAttributes | undefined) => Effect.Effect<void, PostgresSchemaRenameRefused | PostgresSchemaDatabaseRefused>;
6
+ /** Like Role, refuse recycled names on read as well: drift must not refresh away the proof. */
7
+ export declare const assertSchemaIdentity: (live: PostgresSchemaAttributes, output: PostgresSchemaAttributes) => Effect.Effect<void, PostgresSchemaIdentityRefused>;
8
+ //# sourceMappingURL=schema-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-identity.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-identity.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,kBAAkB,UACtB,mBAAmB,UAClB,wBAAwB,GAAG,SAAS,KAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,6BAA6B,CAW9E,CAAC;AAEL,+FAA+F;AAC/F,eAAO,MAAM,oBAAoB,SACzB,wBAAwB,UACtB,wBAAwB,KAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,6BAA6B,CAS7C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Schema reconcile: prove the stored target and identity before asserting a live row. */
2
+ import * as Effect from 'effect/Effect';
3
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
4
+ import { type PgExecutor } from './database-sql.ts';
5
+ import { type PostgresSchemaAttributes, type PostgresSchemaProps } from './schema-attrs.ts';
6
+ import { PostgresSchemaCreateVanished, type PostgresSchemaDatabaseRefused, type PostgresSchemaDrift, PostgresSchemaExistsRefused, type PostgresSchemaIdentityRefused, PostgresSchemaOwnerMissing, type PostgresSchemaRenameRefused, type PostgresSchemaWrongDatabase } from './schema-errors.ts';
7
+ /**
8
+ * The core of `reconcile`, against any {@link PgExecutor} — the real pooled client through
9
+ * `withPg`, or `fake-sql.ts`'s recording fake in tests.
10
+ */
11
+ export declare const reconcileWithClient: (pg: PgExecutor, props: PostgresSchemaProps, output?: PostgresSchemaAttributes) => Effect.Effect<PostgresSchemaAttributes, PostgresSchemaWrongDatabase | PostgresSchemaOwnerMissing | PostgresSchemaDrift | PostgresSchemaCreateVanished | PostgresSchemaExistsRefused | PostgresSchemaIdentityRefused | PostgresSchemaRenameRefused | PostgresSchemaDatabaseRefused | SqlError>;
12
+ //# sourceMappingURL=schema-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-reconcile.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-reconcile.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EACL,4BAA4B,EAC5B,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,2BAA2B,EAC3B,KAAK,6BAA6B,EAClC,0BAA0B,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EACjC,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,mBAAmB,OAC1B,UAAU,SACP,mBAAmB,WACjB,wBAAwB,KAChC,MAAM,CAAC,MAAM,CACd,wBAAwB,EACtB,2BAA2B,GAC3B,0BAA0B,GAC1B,mBAAmB,GACnB,4BAA4B,GAC5B,2BAA2B,GAC3B,6BAA6B,GAC7B,2BAA2B,GAC3B,6BAA6B,GAC7B,QAAQ,CAoDR,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The statements `Postgres.Schema` issues and the quoting each needs.
3
+ *
4
+ * ⛔ `CREATE SCHEMA` TAKES NO BIND PARAMETERS. Measured at `gram.y@REL_18_6`:
5
+ * `CreateSchemaStmt: CREATE SCHEMA [IF NOT EXISTS] opt_schema_name AUTHORIZATION
6
+ * RoleSpec | create_schema_name opt_schema_element_list`. Neither the name nor the
7
+ * authorization role reaches `PARAM` (`$n`), so every free-form value is escaped by hand
8
+ * (`quoteIdent`) and the assembled text runs through `.unsafe()`.
9
+ * ★ The schema name is a single `ColId` token, so `quoteIdent` (single-token quoting) is
10
+ * correct — same rule as `Postgres.Database`'s name.
11
+ */
12
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
13
+ import * as Effect from 'effect/Effect';
14
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
15
+ import type { PgExecutor } from './database-sql.ts';
16
+ /** `CREATE SCHEMA "name" [AUTHORIZATION "owner"]` — the only create this family issues. */
17
+ export declare const buildCreateSchemaSql: (props: PostgresSchemaProps) => string;
18
+ /** `COMMENT ON SCHEMA "name" IS E'…'` — issued only when a comment is declared. */
19
+ export declare const buildCommentSchemaSql: (name: string, comment: string) => string;
20
+ /** `DROP SCHEMA IF EXISTS "name" [CASCADE]` — idempotent; `CASCADE` only when declared. */
21
+ export declare const buildDropSchemaSql: (name: string, cascade: boolean) => string;
22
+ /** The read: one bound `SELECT` on `pg_namespace`. `undefined` when absent. The row carries
23
+ * `current_database()` as `database`, so every caller can prove where the statement ran. */
24
+ export declare const selectSchema: (pg: PgExecutor, name: string) => Effect.Effect<PostgresSchemaAttributes | undefined, SqlError>;
25
+ /** Which database this executor actually reaches — checked before any `CREATE` or `DROP SCHEMA`,
26
+ * so a schema declared for `agents` can never quietly land in the maintenance database the
27
+ * family connection points at. */
28
+ export declare const currentDatabase: (pg: PgExecutor) => Effect.Effect<string, SqlError>;
29
+ export declare const currentUser: (pg: PgExecutor) => Effect.Effect<string, SqlError>;
30
+ /** `true` when the schema holds none of the four object catalogs above (used before a
31
+ * non-cascade `DROP SCHEMA`). */
32
+ export declare const schemaIsEmpty: (pg: PgExecutor, name: string) => Effect.Effect<boolean, SqlError>;
33
+ /** SQLSTATE `2BP01` (`dependent_objects_still_exist`): the non-cascade `DROP SCHEMA` refused
34
+ * because an object kind outside the emptiness check's four catalogs still exists.
35
+ *
36
+ * Measured at `@effect/sql-pg@4.0.0-rc.115` `src/internal/sqlError.ts#classifySqlState`: only
37
+ * class `42` becomes `SqlSyntaxError`. `2BP01` is class `2B`, so it falls through to
38
+ * `UnknownError` (`sqlError.ts:74`). `PgConnection.ts#classifyFields` still puts the raw code
39
+ * on `reason.cause.code`. The runner transport copies that rule (`psql-executor.ts#failure`):
40
+ * `SqlSyntaxError` only when `state.startsWith('42')`, otherwise `UnknownError` with the same
41
+ * `cause.code`. Reading the code, not the tag, is what makes a real server refusal match. */
42
+ export declare const isDependentObjectsError: (error: SqlError) => boolean;
43
+ /** REL_18_6 pg_namespace.c raises duplicate_schema; both transports retain cause.code. */
44
+ export declare const isDuplicateSchemaError: (error: SqlError) => boolean;
45
+ //# sourceMappingURL=schema-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-sql.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,UAAW,mBAAmB,KAAG,MAG9D,CAAC;AAEL,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,SAAU,MAAM,WAAW,MAAM,KAAG,MACK,CAAC;AAE5E,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,SAAU,MAAM,WAAW,OAAO,KAAG,MACK,CAAC;AAW1E;4FAC4F;AAC5F,eAAO,MAAM,YAAY,OACnB,UAAU,QACR,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,wBAAwB,GAAG,SAAS,EAAE,QAAQ,CACgC,CAAC;AAIhG;;kCAEkC;AAClC,eAAO,MAAM,eAAe,OAAQ,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAM5E,CAAC;AAUJ,eAAO,MAAM,WAAW,OAAQ,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAKxE,CAAC;AAyBJ;iCACiC;AACjC,eAAO,MAAM,aAAa,OAAQ,UAAU,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAIzF,CAAC;AAEJ;;;;;;;;6FAQ6F;AAC7F,eAAO,MAAM,uBAAuB,UAAW,QAAQ,KAAG,OAKzD,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,UAAW,QAAQ,KAAG,OAKxD,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Shared wiring for the runner-transport `Postgres.Schema` handler tests: the recording
3
+ * `PsqlRunner` (every stdin and its `psql` argv), the handler-argument builders, and the
4
+ * one SQL router they all answer through.
5
+ *
6
+ * ⚠️ THE ROUTER ORDER IS LOAD-BEARING (`schema-sql.ts`): the emptiness check's `WITH`
7
+ * contains `FROM pg_namespace`, and the schema row SELECT contains
8
+ * `current_database() AS database` — so `AS empty` must be matched before
9
+ * `FROM pg_namespace`, and `FROM pg_namespace` before `current_database()`. The database
10
+ * probe (`SELECT 1 AS present FROM pg_database`, `database-sql.ts`) carries no other
11
+ * branch's marker and matches its own.
12
+ */
13
+ import type { PsqlRunner } from './psql-executor.ts';
14
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
15
+ export declare const ok: (stdout: string) => Promise<{
16
+ code: number;
17
+ stdout: string;
18
+ stderr: string;
19
+ }>;
20
+ /** One answer per statement shape a handler issues; `undefined` falls through the router. */
21
+ export interface RouteAnswers {
22
+ /** `schemaIsEmpty` — the pre-DROP emptiness check (`cascade` unset). */
23
+ readonly empty?: string;
24
+ /** `selectSchema` — the schema row re-read, or `[]` for an absent schema. */
25
+ readonly schema?: string;
26
+ /** `databaseExists` — `[{\"present\":1}]` when the declared database exists, `[]` when not. */
27
+ readonly probe?: string;
28
+ /** `current_database()` — the proof that the override reached the declared database. */
29
+ readonly proof?: string;
30
+ }
31
+ /** Route one stdin to its answer by the markers above, `undefined` when no branch matches. */
32
+ export declare const route: (stdin: string, answers: RouteAnswers) => string | undefined;
33
+ /** A `router` that answers every stdin (unrouted statements answer the empty string). */
34
+ export declare const router: (answers: RouteAnswers) => (stdin: string) => string;
35
+ /**
36
+ * A recording `PsqlRunner`: every stdin and the `psql` argv are kept, each stdin answered by
37
+ * `answers`. The argv recording pins the `-d` database each statement ran against — the last
38
+ * element of the argv is the `psql -d` value (`psql-executor.ts`).
39
+ */
40
+ export declare const runnerWith: (answers: (stdin: string) => string) => {
41
+ run: PsqlRunner;
42
+ stdins: string[];
43
+ argvs: Array<readonly string[]>;
44
+ };
45
+ /** The handler inputs the engine passes on `delete`. `output` is the persisted state — the
46
+ * `oid` + `owner` the last reconcile asserted, which delete must prove the live row still
47
+ * matches before it drops (`schema-delete.ts`). */
48
+ export declare const deleteArgs: (olds: PostgresSchemaProps, output: PostgresSchemaAttributes) => {
49
+ id: string;
50
+ fqn: string;
51
+ instanceId: string;
52
+ olds: PostgresSchemaProps;
53
+ output: PostgresSchemaAttributes;
54
+ session: never;
55
+ bindings: never;
56
+ };
57
+ /** The handler inputs the engine passes on `read` (undefined output is the adopt path). */
58
+ export declare const readArgs: (olds: PostgresSchemaProps) => {
59
+ id: string;
60
+ fqn: string;
61
+ instanceId: string;
62
+ olds: PostgresSchemaProps;
63
+ output: undefined;
64
+ session: never;
65
+ bindings: never;
66
+ };
67
+ //# sourceMappingURL=schema-test-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-test-kit.d.ts","sourceRoot":"","sources":["../../src/postgres/schema-test-kit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,eAAO,MAAM,EAAE,WAAY,MAAM;;;;EAAqD,CAAC;AAEvF,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8FAA8F;AAC9F,eAAO,MAAM,KAAK,UAAW,MAAM,WAAW,YAAY,KAAG,MAAM,GAAG,SAMrE,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,MAAM,YAAa,YAAY,aAAa,MAAM,WAAgC,CAAC;AAEhG;;;;GAIG;AACH,eAAO,MAAM,UAAU,YACZ,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KACjC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;CAYtE,CAAC;AAEF;;mDAEmD;AACnD,eAAO,MAAM,UAAU,SAAU,mBAAmB,UAAU,wBAAwB;;;;;;aAM9D,KAAK;cACX,KAAK;CACrB,CAAC;AAEH,2FAA2F;AAC3F,eAAO,MAAM,QAAQ,SAAU,mBAAmB;;;;;;aAM1B,KAAK;cACX,KAAK;CACrB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `Postgres.Schema` — create-and-assert over one schema in a self-hosted PostgreSQL 18 cluster.
3
+ *
4
+ * ★ A SCHEMA CARRIES NO OWNERSHIP MARK, exactly like `Postgres.Database` (H1). `read` answers
5
+ * `Unowned` for a match, so every already-live schema needs `adopt(true)` in the stack that
6
+ * declares it.
7
+ * ⛔ NOT ALTER-CAPABLE. `ALTER SCHEMA` only renames or changes owner in Postgres; neither is
8
+ * implemented. An owner or comment mismatch against the live row is a typed
9
+ * `PostgresSchemaDrift` refusal, never an `ALTER SCHEMA` — same rule `Postgres.Database`
10
+ * applies to its own asserted props. An omitted `owner` is compared to `current_user`
11
+ * (`schema-assert.ts`): a fresh create without `AUTHORIZATION` would be owned by that role.
12
+ * ⛔ THE DECLARED `database` IS PROVEN, NEVER ASSUMED. The family connection points at a
13
+ * maintenance database (a brand-new database cannot be connected to on a cold plan —
14
+ * `docs/postgres.md#measured-path`), so the handlers below open `props.database` themselves
15
+ * (`withPg`'s database override) and `reconcile`/`drop` first compare `current_database()`
16
+ * against it (`PostgresSchemaWrongDatabase`). Without that proof a seat's schema would be
17
+ * created in whatever database the single connection happened to target.
18
+ * ⛔ `delete` DROPS ONLY WHAT IT CAN PROVE IT CREATED. Before any `DROP`, the handler re-reads
19
+ * the live row (`schema-delete.ts`) and matches it against the persisted `oid` + `owner`;
20
+ * a mismatch is `PostgresSchemaDeleteForeignRefused`, never a `DROP` (`CASCADE` included) —
21
+ * the schema under that name may be another role's, recreated out of band.
22
+ * ⛔ A MISSING DECLARED DATABASE IS "SCHEMA ABSENT" IN `read` AND `delete`. Both probe
23
+ * `pg_database` over the family connection first (`database-sql.ts#databaseExists`), so a
24
+ * cold plan against a not-yet-created database plans a create (`read` answers absent)
25
+ * instead of failing untyped on connect (`ConnectionError` over psql, `UnknownError` 3D000
26
+ * over the socket), and a delete of a dropped database stays idempotent. `reconcile` still
27
+ * requires the database to exist — that ordering is the declaration's job (`docs/
28
+ * postgres-schema.md`: pass `database: db.name`).
29
+ * ⛔ `delete` DROPS ONLY WHEN SAFE. `DROP SCHEMA` refuses a non-empty schema unless
30
+ * `cascade: true` is declared (`PostgresSchemaDropNotEmptyError`); the `cascade` prop
31
+ * defaults to `false` (retain policy by default — see `defaultRemovalPolicy: 'retain'`).
32
+ */
33
+ import { Resource } from 'alchemy';
34
+ import * as Provider from 'alchemy/Provider';
35
+ import * as Effect from 'effect/Effect';
36
+ import { type PostgresSchemaAttributes, type PostgresSchemaProps } from './schema-attrs.ts';
37
+ import { deleteWithClient, dropWithClient } from './schema-delete.ts';
38
+ import type { PgExecutor } from './database-sql.ts';
39
+ import { type PostgresConnection } from './connection.ts';
40
+ export interface PostgresSchema extends Resource<'Postgres.Schema', PostgresSchemaProps, PostgresSchemaAttributes, never, PostgresConnection> {
41
+ }
42
+ export declare const PostgresSchema: import("alchemy").ResourceClass<PostgresSchema>;
43
+ /** Same dual `typeof` guard as `isPostgresDatabase` (see `database.ts`): a resource constructor
44
+ * is a callable `Object.assign`ed function, not a plain object. */
45
+ export declare const isPostgresSchema: (value: unknown) => value is PostgresSchema;
46
+ /** The core of `read`: one bound `SELECT`, no ownership branding. */
47
+ export declare const readWithClient: (pg: PgExecutor, name: string) => Effect.Effect<PostgresSchemaAttributes | undefined, import("effect/unstable/sql/SqlError").SqlError, never>;
48
+ export { diffPostgresSchema } from './schema-diff.ts';
49
+ export { reconcileWithClient } from './schema-reconcile.ts';
50
+ export { deleteWithClient, dropWithClient };
51
+ /** The five lifecycle handlers. Exported on its own so a test drives the real implementation. */
52
+ export declare const postgresSchemaHandlers: Provider.ProviderService<PostgresSchema, PostgresConnection, never, never, PostgresConnection, PostgresConnection, never, never, never>;
53
+ export declare const PostgresSchemaProvider: () => import("effect/Layer").Layer<Provider.Provider<PostgresSchema>, never, PostgresConnection>;
54
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/postgres/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO5F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,kBAAkB,EAAU,MAAM,iBAAiB,CAAC;AAGlE,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,EACL,kBAAkB,CACnB;CAAG;AAEJ,eAAO,MAAM,cAAc,iDAEzB,CAAC;AAEH;mEACmE;AACnE,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,cAGD,CAAC;AAE3D,qEAAqE;AACrE,eAAO,MAAM,cAAc,OAAQ,UAAU,QAAQ,MAAM,gHAA2B,CAAC;AAEvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AAE5C,iGAAiG;AACjG,eAAO,MAAM,sBAAsB,yIAmDjC,CAAC;AAEH,eAAO,MAAM,sBAAsB,kGACuB,CAAC"}