@homeflare/alchemy 0.46.0 → 0.47.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 (773) hide show
  1. package/README.md +10 -10
  2. package/dist/argocd/cluster.d.ts +5 -5
  3. package/dist/argocd/cluster.d.ts.map +1 -1
  4. package/dist/argocd/fake-argocd.d.ts +1 -1
  5. package/dist/argocd/fake-argocd.d.ts.map +1 -1
  6. package/dist/argocd/index.js.map +1 -1
  7. package/dist/argocd/providers.d.ts +1 -1
  8. package/dist/argocd/providers.d.ts.map +1 -1
  9. package/dist/argocd/repo-creds.d.ts +5 -5
  10. package/dist/argocd/repo-creds.d.ts.map +1 -1
  11. package/dist/argocd/repository.d.ts +5 -5
  12. package/dist/argocd/repository.d.ts.map +1 -1
  13. package/dist/argocd/resource.d.ts +1 -1
  14. package/dist/argocd/resource.d.ts.map +1 -1
  15. package/dist/caddy/admin.d.ts +1 -1
  16. package/dist/caddy/admin.d.ts.map +1 -1
  17. package/dist/caddy/caddy-http-client.d.ts +2 -2
  18. package/dist/caddy/caddy-http-client.d.ts.map +1 -1
  19. package/dist/caddy/format.d.ts +1 -1
  20. package/dist/caddy/format.d.ts.map +1 -1
  21. package/dist/caddy/index.js +6 -6
  22. package/dist/caddy/index.js.map +4 -4
  23. package/dist/ceph/auth-entity.d.ts +1 -1
  24. package/dist/ceph/auth-entity.d.ts.map +1 -1
  25. package/dist/ceph/ceph-auth-reconcile.d.ts +1 -1
  26. package/dist/ceph/ceph-auth-reconcile.d.ts.map +1 -1
  27. package/dist/ceph/index.js +5 -5
  28. package/dist/ceph/index.js.map +4 -4
  29. package/dist/cloudflare/fake-mesh.d.ts +2 -2
  30. package/dist/cloudflare/fake-mesh.d.ts.map +1 -1
  31. package/dist/cloudflare/fake-r2-lock.d.ts +1 -1
  32. package/dist/cloudflare/fake-r2-lock.d.ts.map +1 -1
  33. package/dist/cloudflare/index.js +3 -3
  34. package/dist/cloudflare/index.js.map +3 -3
  35. package/dist/cloudflare/mesh-node-token.d.ts +1 -1
  36. package/dist/cloudflare/mesh-node-token.d.ts.map +1 -1
  37. package/dist/cloudflare/mesh-node.d.ts +1 -1
  38. package/dist/cloudflare/mesh-node.d.ts.map +1 -1
  39. package/dist/cloudflare/providers.d.ts +1 -1
  40. package/dist/cloudflare/providers.d.ts.map +1 -1
  41. package/dist/cloudflare/r2-bucket-lock.d.ts +1 -1
  42. package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -1
  43. package/dist/discord/application-command.d.ts +6 -6
  44. package/dist/discord/application-command.d.ts.map +1 -1
  45. package/dist/discord/fake-discord.d.ts +1 -1
  46. package/dist/discord/fake-discord.d.ts.map +1 -1
  47. package/dist/discord/guild-application-command.d.ts +6 -6
  48. package/dist/discord/guild-application-command.d.ts.map +1 -1
  49. package/dist/discord/index.js.map +1 -1
  50. package/dist/discord/providers.d.ts +1 -1
  51. package/dist/discord/providers.d.ts.map +1 -1
  52. package/dist/discord/resource.d.ts +1 -1
  53. package/dist/discord/resource.d.ts.map +1 -1
  54. package/dist/forgejo/branch-protection.d.ts +5 -5
  55. package/dist/forgejo/branch-protection.d.ts.map +1 -1
  56. package/dist/forgejo/fake-forgejo.d.ts +1 -1
  57. package/dist/forgejo/fake-forgejo.d.ts.map +1 -1
  58. package/dist/forgejo/index.js.map +1 -1
  59. package/dist/forgejo/org-actions-secrets.d.ts +5 -5
  60. package/dist/forgejo/org-actions-secrets.d.ts.map +1 -1
  61. package/dist/forgejo/org-label.d.ts +5 -5
  62. package/dist/forgejo/org-label.d.ts.map +1 -1
  63. package/dist/forgejo/org-team.d.ts +5 -5
  64. package/dist/forgejo/org-team.d.ts.map +1 -1
  65. package/dist/forgejo/repo-webhook.d.ts +5 -5
  66. package/dist/forgejo/repo-webhook.d.ts.map +1 -1
  67. package/dist/forgejo/repository.d.ts +5 -5
  68. package/dist/forgejo/repository.d.ts.map +1 -1
  69. package/dist/forgejo/resource.d.ts +1 -1
  70. package/dist/forgejo/resource.d.ts.map +1 -1
  71. package/dist/forgejo/team-member.d.ts +5 -5
  72. package/dist/forgejo/team-member.d.ts.map +1 -1
  73. package/dist/github/repository-ruleset-providers.d.ts +1 -1
  74. package/dist/github/repository-ruleset-providers.d.ts.map +1 -1
  75. package/dist/google-workspace/domain-alias.d.ts +5 -5
  76. package/dist/google-workspace/domain-alias.d.ts.map +1 -1
  77. package/dist/google-workspace/fake-google-workspace.d.ts +1 -1
  78. package/dist/google-workspace/fake-google-workspace.d.ts.map +1 -1
  79. package/dist/google-workspace/group-member.d.ts +5 -5
  80. package/dist/google-workspace/group-member.d.ts.map +1 -1
  81. package/dist/google-workspace/group.d.ts +5 -5
  82. package/dist/google-workspace/group.d.ts.map +1 -1
  83. package/dist/google-workspace/index.js.map +1 -1
  84. package/dist/google-workspace/org-unit.d.ts +5 -5
  85. package/dist/google-workspace/org-unit.d.ts.map +1 -1
  86. package/dist/google-workspace/providers.d.ts +1 -1
  87. package/dist/google-workspace/providers.d.ts.map +1 -1
  88. package/dist/google-workspace/resource.d.ts +1 -1
  89. package/dist/google-workspace/resource.d.ts.map +1 -1
  90. package/dist/grafana/alert-rule-group.d.ts +4 -4
  91. package/dist/grafana/alert-rule-group.d.ts.map +1 -1
  92. package/dist/grafana/contact-point.d.ts +4 -4
  93. package/dist/grafana/dashboard.d.ts +4 -4
  94. package/dist/grafana/datasource.d.ts +4 -4
  95. package/dist/grafana/fake-grafana.d.ts +1 -1
  96. package/dist/grafana/fake-grafana.d.ts.map +1 -1
  97. package/dist/grafana/folder.d.ts +4 -4
  98. package/dist/grafana/message-template.d.ts +4 -4
  99. package/dist/grafana/mute-timing.d.ts +4 -4
  100. package/dist/grafana/notification-policy.d.ts +4 -4
  101. package/dist/grafana/notification-policy.d.ts.map +1 -1
  102. package/dist/grafana/providers.d.ts +1 -1
  103. package/dist/grafana/providers.d.ts.map +1 -1
  104. package/dist/litellm/access-group.d.ts +1 -1
  105. package/dist/litellm/budget-operations.d.ts +1 -1
  106. package/dist/litellm/budget-operations.d.ts.map +1 -1
  107. package/dist/litellm/budget.d.ts +2 -2
  108. package/dist/litellm/credential-errors.d.ts +1 -1
  109. package/dist/litellm/credential-errors.d.ts.map +1 -1
  110. package/dist/litellm/credential.d.ts +1 -1
  111. package/dist/litellm/index.js +26 -5
  112. package/dist/litellm/index.js.map +8 -8
  113. package/dist/litellm/key-errors.d.ts +1 -1
  114. package/dist/litellm/key-errors.d.ts.map +1 -1
  115. package/dist/litellm/key.d.ts +2 -2
  116. package/dist/litellm/mcp-server-locate.d.ts +1 -1
  117. package/dist/litellm/mcp-server-locate.d.ts.map +1 -1
  118. package/dist/litellm/mcp-server.d.ts +2 -2
  119. package/dist/litellm/model-operations.d.ts +1 -1
  120. package/dist/litellm/model-operations.d.ts.map +1 -1
  121. package/dist/litellm/model.d.ts +2 -2
  122. package/dist/litellm/operations.d.ts +1 -1
  123. package/dist/litellm/operations.d.ts.map +1 -1
  124. package/dist/litellm/policy-attachment.d.ts +1 -1
  125. package/dist/litellm/policy.d.ts +1 -1
  126. package/dist/litellm/providers.d.ts +1 -1
  127. package/dist/litellm/providers.d.ts.map +1 -1
  128. package/dist/litellm/team-operations.d.ts +1 -1
  129. package/dist/litellm/team-operations.d.ts.map +1 -1
  130. package/dist/litellm/team.d.ts +1 -1
  131. package/dist/litellm/tool-policy-operations.d.ts +1 -1
  132. package/dist/litellm/tool-policy-operations.d.ts.map +1 -1
  133. package/dist/litellm/tool-policy.d.ts +1 -1
  134. package/dist/litellm/toolset.d.ts +1 -1
  135. package/dist/netbox/fake-netbox.d.ts +1 -1
  136. package/dist/netbox/fake-netbox.d.ts.map +1 -1
  137. package/dist/netbox/index.js.map +1 -1
  138. package/dist/netbox/prefix.d.ts +5 -5
  139. package/dist/netbox/prefix.d.ts.map +1 -1
  140. package/dist/netbox/resource.d.ts +1 -1
  141. package/dist/netbox/resource.d.ts.map +1 -1
  142. package/dist/openbao/approle-login.d.ts +1 -1
  143. package/dist/openbao/approle-login.d.ts.map +1 -1
  144. package/dist/openbao/auth-method-reconcile.d.ts +1 -1
  145. package/dist/openbao/auth-method-reconcile.d.ts.map +1 -1
  146. package/dist/openbao/auth-method-wire.d.ts +4 -4
  147. package/dist/openbao/auth-method-wire.d.ts.map +1 -1
  148. package/dist/openbao/auth-method.d.ts +1 -1
  149. package/dist/openbao/auth-method.d.ts.map +1 -1
  150. package/dist/openbao/auth-role-identity.d.ts +1 -1
  151. package/dist/openbao/auth-role-identity.d.ts.map +1 -1
  152. package/dist/openbao/auth-role-wire.d.ts +4 -4
  153. package/dist/openbao/auth-role-wire.d.ts.map +1 -1
  154. package/dist/openbao/auth-role.d.ts +1 -1
  155. package/dist/openbao/auth-role.d.ts.map +1 -1
  156. package/dist/openbao/bao-http.d.ts +1 -1
  157. package/dist/openbao/bao-http.d.ts.map +1 -1
  158. package/dist/openbao/bao-identity.d.ts +1 -1
  159. package/dist/openbao/bao-identity.d.ts.map +1 -1
  160. package/dist/openbao/cloudflare-permission-groups.d.ts +1 -1
  161. package/dist/openbao/cloudflare-permission-groups.d.ts.map +1 -1
  162. package/dist/openbao/cloudflare-role-wire.d.ts +1 -1
  163. package/dist/openbao/cloudflare-role-wire.d.ts.map +1 -1
  164. package/dist/openbao/cloudflare-role.d.ts +1 -1
  165. package/dist/openbao/cloudflare-role.d.ts.map +1 -1
  166. package/dist/openbao/distilled.d.ts +1 -1
  167. package/dist/openbao/distilled.d.ts.map +1 -1
  168. package/dist/openbao/fake-bao.d.ts +1 -1
  169. package/dist/openbao/fake-bao.d.ts.map +1 -1
  170. package/dist/openbao/fake-core.d.ts +1 -1
  171. package/dist/openbao/fake-core.d.ts.map +1 -1
  172. package/dist/openbao/fake-engines.d.ts +1 -1
  173. package/dist/openbao/fake-engines.d.ts.map +1 -1
  174. package/dist/openbao/fake-families.d.ts +2 -2
  175. package/dist/openbao/fake-families.d.ts.map +1 -1
  176. package/dist/openbao/fake-stack.d.ts +5 -0
  177. package/dist/openbao/fake-stack.d.ts.map +1 -1
  178. package/dist/openbao/forgejo-bootstrap.d.ts +1 -1
  179. package/dist/openbao/forgejo-bootstrap.d.ts.map +1 -1
  180. package/dist/openbao/index.js +31 -10
  181. package/dist/openbao/index.js.map +31 -31
  182. package/dist/openbao/jwt-config.d.ts +1 -1
  183. package/dist/openbao/jwt-config.d.ts.map +1 -1
  184. package/dist/openbao/jwt-role.d.ts +1 -1
  185. package/dist/openbao/jwt-role.d.ts.map +1 -1
  186. package/dist/openbao/kubernetes-role.d.ts +1 -1
  187. package/dist/openbao/kubernetes-role.d.ts.map +1 -1
  188. package/dist/openbao/mfa-enforcement.d.ts +1 -1
  189. package/dist/openbao/mfa-enforcement.d.ts.map +1 -1
  190. package/dist/openbao/mfa-totp.d.ts +1 -1
  191. package/dist/openbao/mfa-totp.d.ts.map +1 -1
  192. package/dist/openbao/mfa-wire.d.ts +1 -1
  193. package/dist/openbao/mfa-wire.d.ts.map +1 -1
  194. package/dist/openbao/mount-move.d.ts +1 -1
  195. package/dist/openbao/mount-move.d.ts.map +1 -1
  196. package/dist/openbao/mount-reconcile.d.ts +1 -1
  197. package/dist/openbao/mount-reconcile.d.ts.map +1 -1
  198. package/dist/openbao/mount-wire.d.ts +4 -4
  199. package/dist/openbao/mount-wire.d.ts.map +1 -1
  200. package/dist/openbao/mount.d.ts +1 -1
  201. package/dist/openbao/mount.d.ts.map +1 -1
  202. package/dist/openbao/pki-role.d.ts +1 -1
  203. package/dist/openbao/pki-role.d.ts.map +1 -1
  204. package/dist/openbao/plugin-reconcile.d.ts +1 -1
  205. package/dist/openbao/plugin-reconcile.d.ts.map +1 -1
  206. package/dist/openbao/plugin-wire.d.ts +1 -1
  207. package/dist/openbao/plugin-wire.d.ts.map +1 -1
  208. package/dist/openbao/plugin.d.ts +1 -1
  209. package/dist/openbao/plugin.d.ts.map +1 -1
  210. package/dist/openbao/policy-identity.d.ts +1 -1
  211. package/dist/openbao/policy-identity.d.ts.map +1 -1
  212. package/dist/openbao/policy-wire.d.ts +4 -4
  213. package/dist/openbao/policy-wire.d.ts.map +1 -1
  214. package/dist/openbao/policy.d.ts +1 -1
  215. package/dist/openbao/policy.d.ts.map +1 -1
  216. package/dist/openbao/proxmox-role-wire.d.ts +1 -1
  217. package/dist/openbao/proxmox-role-wire.d.ts.map +1 -1
  218. package/dist/openbao/proxmox-role.d.ts +1 -1
  219. package/dist/openbao/proxmox-role.d.ts.map +1 -1
  220. package/dist/openbao/remount-wire.d.ts +1 -1
  221. package/dist/openbao/remount-wire.d.ts.map +1 -1
  222. package/dist/openbao/rename-identity.d.ts +1 -1
  223. package/dist/openbao/rename-identity.d.ts.map +1 -1
  224. package/dist/openbao/rename.d.ts +1 -1
  225. package/dist/openbao/rename.d.ts.map +1 -1
  226. package/dist/openbao/role-reconcile.d.ts +1 -1
  227. package/dist/openbao/role-reconcile.d.ts.map +1 -1
  228. package/dist/openbao/ssh-role.d.ts +1 -1
  229. package/dist/openbao/ssh-role.d.ts.map +1 -1
  230. package/dist/opnsense/alias.d.ts +5 -5
  231. package/dist/opnsense/alias.d.ts.map +1 -1
  232. package/dist/opnsense/category.d.ts +5 -5
  233. package/dist/opnsense/category.d.ts.map +1 -1
  234. package/dist/opnsense/fake-opnsense.d.ts +1 -1
  235. package/dist/opnsense/fake-opnsense.d.ts.map +1 -1
  236. package/dist/opnsense/group.d.ts +5 -5
  237. package/dist/opnsense/group.d.ts.map +1 -1
  238. package/dist/opnsense/index.js.map +1 -1
  239. package/dist/opnsense/providers.d.ts +1 -1
  240. package/dist/opnsense/providers.d.ts.map +1 -1
  241. package/dist/opnsense/resource.d.ts +1 -1
  242. package/dist/opnsense/resource.d.ts.map +1 -1
  243. package/dist/ownership/probe.d.ts.map +1 -1
  244. package/dist/paperless/custom-field.d.ts +5 -5
  245. package/dist/paperless/custom-field.d.ts.map +1 -1
  246. package/dist/paperless/document-type.d.ts +5 -5
  247. package/dist/paperless/document-type.d.ts.map +1 -1
  248. package/dist/paperless/fake-paperless.d.ts +1 -1
  249. package/dist/paperless/fake-paperless.d.ts.map +1 -1
  250. package/dist/paperless/matching-types.d.ts +1 -1
  251. package/dist/paperless/matching-types.d.ts.map +1 -1
  252. package/dist/paperless/matching.d.ts +4 -4
  253. package/dist/paperless/providers.d.ts +1 -1
  254. package/dist/paperless/providers.d.ts.map +1 -1
  255. package/dist/paperless/storage-path.d.ts +5 -5
  256. package/dist/paperless/storage-path.d.ts.map +1 -1
  257. package/dist/paperless/tag.d.ts +5 -5
  258. package/dist/paperless/tag.d.ts.map +1 -1
  259. package/dist/postgres/connection.d.ts +2 -2
  260. package/dist/postgres/connection.d.ts.map +1 -1
  261. package/dist/postgres/database-sql.d.ts +1 -1
  262. package/dist/postgres/database-sql.d.ts.map +1 -1
  263. package/dist/postgres/database.d.ts +1 -1
  264. package/dist/postgres/database.d.ts.map +1 -1
  265. package/dist/postgres/fake-grants-read.d.ts +1 -1
  266. package/dist/postgres/fake-grants-read.d.ts.map +1 -1
  267. package/dist/postgres/fake-grants-write.d.ts +1 -1
  268. package/dist/postgres/fake-grants-write.d.ts.map +1 -1
  269. package/dist/postgres/fake-role-sql.d.ts +1 -1
  270. package/dist/postgres/fake-role-sql.d.ts.map +1 -1
  271. package/dist/postgres/fake-schema-drop.d.ts +13 -0
  272. package/dist/postgres/fake-schema-drop.d.ts.map +1 -0
  273. package/dist/postgres/fake-schema-sql.d.ts +6 -1
  274. package/dist/postgres/fake-schema-sql.d.ts.map +1 -1
  275. package/dist/postgres/fake-sql.d.ts +4 -0
  276. package/dist/postgres/fake-sql.d.ts.map +1 -1
  277. package/dist/postgres/grants-existence.d.ts +1 -1
  278. package/dist/postgres/grants-existence.d.ts.map +1 -1
  279. package/dist/postgres/grants-ops.d.ts +1 -1
  280. package/dist/postgres/grants-ops.d.ts.map +1 -1
  281. package/dist/postgres/grants-ownership.d.ts +1 -1
  282. package/dist/postgres/grants-ownership.d.ts.map +1 -1
  283. package/dist/postgres/grants-read-defaults.d.ts +1 -1
  284. package/dist/postgres/grants-read-defaults.d.ts.map +1 -1
  285. package/dist/postgres/grants-read.d.ts +1 -1
  286. package/dist/postgres/grants-read.d.ts.map +1 -1
  287. package/dist/postgres/index.d.ts +2 -1
  288. package/dist/postgres/index.d.ts.map +1 -1
  289. package/dist/postgres/index.js +523 -324
  290. package/dist/postgres/index.js.map +26 -22
  291. package/dist/postgres/installed-classifier.d.ts +1 -1
  292. package/dist/postgres/installed-classifier.d.ts.map +1 -1
  293. package/dist/postgres/psql-executor.d.ts.map +1 -1
  294. package/dist/postgres/role-membership-sql.d.ts +1 -1
  295. package/dist/postgres/role-membership-sql.d.ts.map +1 -1
  296. package/dist/postgres/role-sql.d.ts +1 -1
  297. package/dist/postgres/role-sql.d.ts.map +1 -1
  298. package/dist/postgres/role.d.ts +1 -1
  299. package/dist/postgres/role.d.ts.map +1 -1
  300. package/dist/postgres/schema-assert.d.ts +1 -1
  301. package/dist/postgres/schema-assert.d.ts.map +1 -1
  302. package/dist/postgres/schema-closure-sql.d.ts +45 -0
  303. package/dist/postgres/schema-closure-sql.d.ts.map +1 -0
  304. package/dist/postgres/schema-delete.d.ts +18 -9
  305. package/dist/postgres/schema-delete.d.ts.map +1 -1
  306. package/dist/postgres/schema-drop-sql.d.ts +66 -0
  307. package/dist/postgres/schema-drop-sql.d.ts.map +1 -0
  308. package/dist/postgres/schema-errors.d.ts +19 -1
  309. package/dist/postgres/schema-errors.d.ts.map +1 -1
  310. package/dist/postgres/schema-reconcile.d.ts +1 -1
  311. package/dist/postgres/schema-reconcile.d.ts.map +1 -1
  312. package/dist/postgres/schema-sequence-error.d.ts +29 -0
  313. package/dist/postgres/schema-sequence-error.d.ts.map +1 -0
  314. package/dist/postgres/schema-sql.d.ts +17 -1
  315. package/dist/postgres/schema-sql.d.ts.map +1 -1
  316. package/dist/postgres/schema-test-kit.d.ts +3 -1
  317. package/dist/postgres/schema-test-kit.d.ts.map +1 -1
  318. package/dist/postgres/schema.d.ts +1 -1
  319. package/dist/postgres/schema.d.ts.map +1 -1
  320. package/dist/postgres/search-path.d.ts +38 -0
  321. package/dist/postgres/search-path.d.ts.map +1 -0
  322. package/dist/proxmox/acl.d.ts +1 -1
  323. package/dist/proxmox/acl.d.ts.map +1 -1
  324. package/dist/proxmox/api-token.d.ts +1 -1
  325. package/dist/proxmox/api-token.d.ts.map +1 -1
  326. package/dist/proxmox/backup-job-distilled.d.ts +2 -2
  327. package/dist/proxmox/backup-job-distilled.d.ts.map +1 -1
  328. package/dist/proxmox/backup-job.d.ts +1 -1
  329. package/dist/proxmox/backup-job.d.ts.map +1 -1
  330. package/dist/proxmox/ceph-daemon-wire.d.ts +3 -3
  331. package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -1
  332. package/dist/proxmox/ceph-daemon.d.ts +2 -2
  333. package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
  334. package/dist/proxmox/ceph-flag-wire.d.ts +3 -3
  335. package/dist/proxmox/ceph-flag-wire.d.ts.map +1 -1
  336. package/dist/proxmox/ceph-flag.d.ts +1 -1
  337. package/dist/proxmox/ceph-flag.d.ts.map +1 -1
  338. package/dist/proxmox/ceph-fs-distilled.d.ts +3 -3
  339. package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -1
  340. package/dist/proxmox/ceph-fs.d.ts +1 -1
  341. package/dist/proxmox/ceph-fs.d.ts.map +1 -1
  342. package/dist/proxmox/ceph-osd-tree.d.ts +1 -1
  343. package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
  344. package/dist/proxmox/ceph-osd-write.d.ts +2 -2
  345. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  346. package/dist/proxmox/ceph-osd.d.ts +1 -1
  347. package/dist/proxmox/ceph-osd.d.ts.map +1 -1
  348. package/dist/proxmox/ceph-pool-settle.d.ts +2 -2
  349. package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
  350. package/dist/proxmox/ceph-pool-wire.d.ts +1 -1
  351. package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -1
  352. package/dist/proxmox/ceph-pool.d.ts +1 -1
  353. package/dist/proxmox/ceph-pool.d.ts.map +1 -1
  354. package/dist/proxmox/client.d.ts +1 -1
  355. package/dist/proxmox/client.d.ts.map +1 -1
  356. package/dist/proxmox/distilled-pbs.d.ts +1 -1
  357. package/dist/proxmox/distilled-pbs.d.ts.map +1 -1
  358. package/dist/proxmox/distilled-pve.d.ts +1 -1
  359. package/dist/proxmox/distilled-pve.d.ts.map +1 -1
  360. package/dist/proxmox/fake-pbs-jobs.d.ts +1 -1
  361. package/dist/proxmox/fake-pve.d.ts +1 -1
  362. package/dist/proxmox/fake-pve.d.ts.map +1 -1
  363. package/dist/proxmox/firewall-alias-lifecycle.d.ts +6 -6
  364. package/dist/proxmox/firewall-alias-lifecycle.d.ts.map +1 -1
  365. package/dist/proxmox/firewall-alias.d.ts +1 -1
  366. package/dist/proxmox/firewall-alias.d.ts.map +1 -1
  367. package/dist/proxmox/group-wire.d.ts +2 -2
  368. package/dist/proxmox/group-wire.d.ts.map +1 -1
  369. package/dist/proxmox/group.d.ts +1 -1
  370. package/dist/proxmox/group.d.ts.map +1 -1
  371. package/dist/proxmox/ha-resource.d.ts +1 -1
  372. package/dist/proxmox/ha-resource.d.ts.map +1 -1
  373. package/dist/proxmox/ha-rule.d.ts +1 -1
  374. package/dist/proxmox/ha-rule.d.ts.map +1 -1
  375. package/dist/proxmox/index.js +38 -17
  376. package/dist/proxmox/index.js.map +9 -9
  377. package/dist/proxmox/lease-cache.d.ts +2 -2
  378. package/dist/proxmox/lease-cache.d.ts.map +1 -1
  379. package/dist/proxmox/live-core-fixtures.d.ts +1 -1
  380. package/dist/proxmox/live-core-fixtures.d.ts.map +1 -1
  381. package/dist/proxmox/lxc-lifecycle.d.ts +3 -3
  382. package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -1
  383. package/dist/proxmox/lxc-read.d.ts +1 -1
  384. package/dist/proxmox/lxc-read.d.ts.map +1 -1
  385. package/dist/proxmox/lxc-task.d.ts +1 -1
  386. package/dist/proxmox/lxc-task.d.ts.map +1 -1
  387. package/dist/proxmox/lxc.d.ts +1 -1
  388. package/dist/proxmox/lxc.d.ts.map +1 -1
  389. package/dist/proxmox/members.d.ts +3 -3
  390. package/dist/proxmox/members.d.ts.map +1 -1
  391. package/dist/proxmox/metric-server-distilled.d.ts +3 -3
  392. package/dist/proxmox/metric-server-distilled.d.ts.map +1 -1
  393. package/dist/proxmox/metric-server.d.ts +1 -1
  394. package/dist/proxmox/metric-server.d.ts.map +1 -1
  395. package/dist/proxmox/mint.d.ts +1 -1
  396. package/dist/proxmox/mint.d.ts.map +1 -1
  397. package/dist/proxmox/network-apply-read.d.ts +3 -3
  398. package/dist/proxmox/network-apply-read.d.ts.map +1 -1
  399. package/dist/proxmox/network-apply-run.d.ts +1 -1
  400. package/dist/proxmox/network-apply-run.d.ts.map +1 -1
  401. package/dist/proxmox/network-apply.d.ts +1 -1
  402. package/dist/proxmox/network-apply.d.ts.map +1 -1
  403. package/dist/proxmox/node-network-wire.d.ts +2 -2
  404. package/dist/proxmox/node-network-wire.d.ts.map +1 -1
  405. package/dist/proxmox/node-network.d.ts +1 -1
  406. package/dist/proxmox/node-network.d.ts.map +1 -1
  407. package/dist/proxmox/notification-matcher-distilled.d.ts +4 -4
  408. package/dist/proxmox/notification-matcher-distilled.d.ts.map +1 -1
  409. package/dist/proxmox/notification-matcher-lifecycle.d.ts +4 -4
  410. package/dist/proxmox/notification-matcher.d.ts +1 -1
  411. package/dist/proxmox/notification-matcher.d.ts.map +1 -1
  412. package/dist/proxmox/notification-target-distilled.d.ts +4 -4
  413. package/dist/proxmox/notification-target-distilled.d.ts.map +1 -1
  414. package/dist/proxmox/notification-target-lifecycle.d.ts +4 -4
  415. package/dist/proxmox/notification-target.d.ts +1 -1
  416. package/dist/proxmox/notification-target.d.ts.map +1 -1
  417. package/dist/proxmox/pbs-datastore-lifecycle.d.ts +4 -4
  418. package/dist/proxmox/pbs-datastore-wire.d.ts +4 -4
  419. package/dist/proxmox/pbs-datastore-wire.d.ts.map +1 -1
  420. package/dist/proxmox/pbs-datastore.d.ts +1 -1
  421. package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
  422. package/dist/proxmox/pbs-notification-matcher-distilled.d.ts +4 -4
  423. package/dist/proxmox/pbs-notification-matcher-distilled.d.ts.map +1 -1
  424. package/dist/proxmox/pbs-notification-matcher.d.ts +1 -1
  425. package/dist/proxmox/pbs-notification-matcher.d.ts.map +1 -1
  426. package/dist/proxmox/pbs-notification-target-distilled.d.ts +4 -4
  427. package/dist/proxmox/pbs-notification-target-distilled.d.ts.map +1 -1
  428. package/dist/proxmox/pbs-notification-target-lifecycle.d.ts +4 -4
  429. package/dist/proxmox/pbs-notification-target.d.ts +1 -1
  430. package/dist/proxmox/pbs-notification-target.d.ts.map +1 -1
  431. package/dist/proxmox/pbs-prune-job-lifecycle.d.ts +4 -4
  432. package/dist/proxmox/pbs-prune-job-wire.d.ts +4 -4
  433. package/dist/proxmox/pbs-prune-job-wire.d.ts.map +1 -1
  434. package/dist/proxmox/pbs-prune-job.d.ts +1 -1
  435. package/dist/proxmox/pbs-prune-job.d.ts.map +1 -1
  436. package/dist/proxmox/pbs-sync-job-lifecycle.d.ts +4 -4
  437. package/dist/proxmox/pbs-sync-job-wire.d.ts +4 -4
  438. package/dist/proxmox/pbs-sync-job-wire.d.ts.map +1 -1
  439. package/dist/proxmox/pbs-sync-job.d.ts +1 -1
  440. package/dist/proxmox/pbs-sync-job.d.ts.map +1 -1
  441. package/dist/proxmox/pbs-verify-job-lifecycle.d.ts +4 -4
  442. package/dist/proxmox/pbs-verify-job-wire.d.ts +4 -4
  443. package/dist/proxmox/pbs-verify-job-wire.d.ts.map +1 -1
  444. package/dist/proxmox/pbs-verify-job.d.ts +1 -1
  445. package/dist/proxmox/pbs-verify-job.d.ts.map +1 -1
  446. package/dist/proxmox/pool.d.ts +3 -3
  447. package/dist/proxmox/pool.d.ts.map +1 -1
  448. package/dist/proxmox/provision-declare.d.ts +1 -1
  449. package/dist/proxmox/provision-declare.d.ts.map +1 -1
  450. package/dist/proxmox/qemu-lifecycle.d.ts +3 -3
  451. package/dist/proxmox/qemu-lifecycle.d.ts.map +1 -1
  452. package/dist/proxmox/qemu-read.d.ts +1 -1
  453. package/dist/proxmox/qemu-read.d.ts.map +1 -1
  454. package/dist/proxmox/qemu-resize.d.ts +1 -1
  455. package/dist/proxmox/qemu-resize.d.ts.map +1 -1
  456. package/dist/proxmox/qemu-task.d.ts +1 -1
  457. package/dist/proxmox/qemu-task.d.ts.map +1 -1
  458. package/dist/proxmox/qemu.d.ts +1 -1
  459. package/dist/proxmox/qemu.d.ts.map +1 -1
  460. package/dist/proxmox/replication-job-lifecycle.d.ts +6 -6
  461. package/dist/proxmox/replication-job-lifecycle.d.ts.map +1 -1
  462. package/dist/proxmox/replication-job.d.ts +1 -1
  463. package/dist/proxmox/replication-job.d.ts.map +1 -1
  464. package/dist/proxmox/resource-spec.d.ts +1 -1
  465. package/dist/proxmox/resource-spec.d.ts.map +1 -1
  466. package/dist/proxmox/resource.d.ts +8 -8
  467. package/dist/proxmox/role.d.ts +1 -1
  468. package/dist/proxmox/role.d.ts.map +1 -1
  469. package/dist/proxmox/sdn-apply-read.d.ts +1 -1
  470. package/dist/proxmox/sdn-apply-read.d.ts.map +1 -1
  471. package/dist/proxmox/sdn-apply.d.ts +1 -1
  472. package/dist/proxmox/sdn-apply.d.ts.map +1 -1
  473. package/dist/proxmox/sdn-subnet.d.ts +1 -1
  474. package/dist/proxmox/sdn-subnet.d.ts.map +1 -1
  475. package/dist/proxmox/sdn-vnet.d.ts +1 -1
  476. package/dist/proxmox/sdn-vnet.d.ts.map +1 -1
  477. package/dist/proxmox/sdn-zone.d.ts +1 -1
  478. package/dist/proxmox/sdn-zone.d.ts.map +1 -1
  479. package/dist/proxmox/storage-download-lifecycle.d.ts +6 -6
  480. package/dist/proxmox/storage-download-lifecycle.d.ts.map +1 -1
  481. package/dist/proxmox/storage-download-task.d.ts +1 -1
  482. package/dist/proxmox/storage-download-task.d.ts.map +1 -1
  483. package/dist/proxmox/storage-download.d.ts +1 -1
  484. package/dist/proxmox/storage-download.d.ts.map +1 -1
  485. package/dist/proxmox/storage-wire.d.ts +2 -2
  486. package/dist/proxmox/storage-wire.d.ts.map +1 -1
  487. package/dist/proxmox/storage.d.ts +1 -1
  488. package/dist/proxmox/storage.d.ts.map +1 -1
  489. package/dist/proxmox/user-wire.d.ts +2 -2
  490. package/dist/proxmox/user-wire.d.ts.map +1 -1
  491. package/dist/proxmox/user.d.ts +1 -1
  492. package/dist/proxmox/user.d.ts.map +1 -1
  493. package/dist/proxmox/zfs-pool-form.d.ts +2 -2
  494. package/dist/proxmox/zfs-pool-form.d.ts.map +1 -1
  495. package/dist/proxmox/zfs-pool-wire.d.ts +2 -2
  496. package/dist/proxmox/zfs-pool-wire.d.ts.map +1 -1
  497. package/dist/proxmox/zfs-pool.d.ts +1 -1
  498. package/dist/proxmox/zfs-pool.d.ts.map +1 -1
  499. package/dist/release/binary.d.ts +1 -1
  500. package/dist/release/binary.d.ts.map +1 -1
  501. package/dist/release/download.d.ts +1 -1
  502. package/dist/release/download.d.ts.map +1 -1
  503. package/dist/release/index.js +6 -5
  504. package/dist/release/index.js.map +5 -5
  505. package/dist/talos/credentials-write.d.ts +1 -1
  506. package/dist/talos/credentials-write.d.ts.map +1 -1
  507. package/dist/talos/credentials.d.ts +1 -1
  508. package/dist/talos/credentials.d.ts.map +1 -1
  509. package/dist/talos/fake-process.d.ts +2 -2
  510. package/dist/talos/fake-process.d.ts.map +1 -1
  511. package/dist/talos/index.js +7 -7
  512. package/dist/talos/index.js.map +4 -4
  513. package/dist/talos/kubeconfig.d.ts +4 -4
  514. package/dist/talos/kubeconfig.d.ts.map +1 -1
  515. package/dist/talos/machine-config-fixtures.d.ts +1 -1
  516. package/dist/talos/machine-config-fixtures.d.ts.map +1 -1
  517. package/dist/talos/machine-config-read.d.ts +3 -3
  518. package/dist/talos/machine-config-read.d.ts.map +1 -1
  519. package/dist/talos/resource.d.ts +1 -1
  520. package/dist/talos/resource.d.ts.map +1 -1
  521. package/dist/talos/talos-bootstrap-etcd.d.ts +2 -2
  522. package/dist/talos/talos-bootstrap-etcd.d.ts.map +1 -1
  523. package/dist/talos/talos-bootstrap.d.ts +4 -4
  524. package/dist/talos/talos-bootstrap.d.ts.map +1 -1
  525. package/dist/talos/talos-cluster-health.d.ts +4 -4
  526. package/dist/talos/talos-cluster-health.d.ts.map +1 -1
  527. package/dist/talos/talos-machine-config.d.ts +2 -2
  528. package/dist/talos/talos-machine-config.d.ts.map +1 -1
  529. package/dist/talos/talosctl.d.ts +1 -1
  530. package/dist/talos/talosctl.d.ts.map +1 -1
  531. package/dist/telemetry/index.js +4 -4
  532. package/dist/telemetry/index.js.map +3 -3
  533. package/dist/telemetry/redact-serialization.d.ts +2 -2
  534. package/dist/telemetry/redact-serialization.d.ts.map +1 -1
  535. package/dist/unifi/acl-rule-ordering.d.ts +6 -6
  536. package/dist/unifi/acl-rule-ordering.d.ts.map +1 -1
  537. package/dist/unifi/acl-rule.d.ts +6 -6
  538. package/dist/unifi/acl-rule.d.ts.map +1 -1
  539. package/dist/unifi/dns-policy.d.ts +6 -6
  540. package/dist/unifi/dns-policy.d.ts.map +1 -1
  541. package/dist/unifi/fake-unifi.d.ts +1 -1
  542. package/dist/unifi/fake-unifi.d.ts.map +1 -1
  543. package/dist/unifi/firewall-policy-ordering.d.ts +6 -6
  544. package/dist/unifi/firewall-policy-ordering.d.ts.map +1 -1
  545. package/dist/unifi/firewall-policy.d.ts +6 -6
  546. package/dist/unifi/firewall-policy.d.ts.map +1 -1
  547. package/dist/unifi/firewall-zone.d.ts +6 -6
  548. package/dist/unifi/firewall-zone.d.ts.map +1 -1
  549. package/dist/unifi/index.js +2 -2
  550. package/dist/unifi/index.js.map +2 -2
  551. package/dist/unifi/network.d.ts +6 -6
  552. package/dist/unifi/network.d.ts.map +1 -1
  553. package/dist/unifi/providers.d.ts +1 -1
  554. package/dist/unifi/providers.d.ts.map +1 -1
  555. package/dist/unifi/resource.d.ts +1 -1
  556. package/dist/unifi/resource.d.ts.map +1 -1
  557. package/dist/unifi/traffic-matching-list.d.ts +6 -6
  558. package/dist/unifi/traffic-matching-list.d.ts.map +1 -1
  559. package/dist/unifi/wifi-broadcast.d.ts +6 -6
  560. package/dist/unifi/wifi-broadcast.d.ts.map +1 -1
  561. package/dist/verify/cli.js.map +1 -1
  562. package/dist/verify/index.js.map +1 -1
  563. package/docs/distilled-interim.md +1 -1
  564. package/docs/mesh-node.md +1 -1
  565. package/docs/paperless.md +1 -1
  566. package/docs/peers.md +8 -8
  567. package/docs/postgres-schema.md +22 -1
  568. package/docs/telemetry.md +1 -1
  569. package/package.json +20 -20
  570. package/src/argocd/fake-argocd.ts +1 -1
  571. package/src/argocd/resource.ts +1 -1
  572. package/src/caddy/admin-transport-scope.test.ts +2 -2
  573. package/src/caddy/admin.ts +1 -1
  574. package/src/caddy/caddy-http-client.ts +5 -5
  575. package/src/caddy/config-adopt.test.ts +2 -2
  576. package/src/caddy/format.ts +2 -2
  577. package/src/caddy/local-admin.test.ts +1 -1
  578. package/src/ceph/auth-entity.ts +1 -1
  579. package/src/ceph/ceph-auth-reconcile.ts +1 -1
  580. package/src/cloudflare/fake-mesh.ts +1 -1
  581. package/src/cloudflare/fake-r2-lock.ts +1 -1
  582. package/src/cloudflare/mesh-node-harness.ts +1 -1
  583. package/src/cloudflare/mesh-node.ts +1 -1
  584. package/src/cloudflare/r2-bucket-lock.ts +1 -1
  585. package/src/discord/fake-discord.ts +1 -1
  586. package/src/discord/resource.ts +1 -1
  587. package/src/forgejo/fake-forgejo.ts +1 -1
  588. package/src/forgejo/resource.ts +1 -1
  589. package/src/google-workspace/fake-google-workspace.ts +1 -1
  590. package/src/google-workspace/resource.ts +1 -1
  591. package/src/grafana/fake-grafana.ts +1 -1
  592. package/src/litellm/access-group.test.ts +1 -1
  593. package/src/litellm/credential-errors.ts +1 -1
  594. package/src/litellm/credential-guards.test.ts +1 -1
  595. package/src/litellm/credential-operations.ts +1 -1
  596. package/src/litellm/credential-rewrite.test.ts +1 -1
  597. package/src/litellm/fake-stack.ts +1 -1
  598. package/src/litellm/key-errors.ts +1 -1
  599. package/src/litellm/key-harness.ts +1 -1
  600. package/src/litellm/key-operations.ts +1 -1
  601. package/src/litellm/key.test.ts +2 -1
  602. package/src/litellm/mcp-server-handlers.test.ts +1 -1
  603. package/src/litellm/mcp-server-registry.test.ts +1 -1
  604. package/src/litellm/model-operations.test.ts +1 -1
  605. package/src/litellm/operations.ts +1 -1
  606. package/src/litellm/pass-through-endpoint-delete-swallow.test.ts +1 -1
  607. package/src/litellm/pass-through-endpoint.test.ts +1 -1
  608. package/src/litellm/pass-through-fetch-client.test.ts +2 -2
  609. package/src/litellm/policy-attachment.test.ts +1 -1
  610. package/src/litellm/policy.test.ts +1 -1
  611. package/src/litellm/team-members.test.ts +1 -1
  612. package/src/litellm/team-read.test.ts +1 -1
  613. package/src/litellm/tool-policy.test.ts +1 -1
  614. package/src/litellm/toolset.test.ts +1 -1
  615. package/src/netbox/fake-netbox.ts +1 -1
  616. package/src/netbox/resource.ts +1 -1
  617. package/src/openbao/adopt-core.test.ts +4 -1
  618. package/src/openbao/adopt-families.test.ts +4 -1
  619. package/src/openbao/adopt-holes.test.ts +1 -1
  620. package/src/openbao/adopt-recovery.test.ts +24 -0
  621. package/src/openbao/approle-login.ts +2 -2
  622. package/src/openbao/auth-method-reconcile.ts +1 -1
  623. package/src/openbao/auth-method.ts +1 -1
  624. package/src/openbao/auth-role-sdk.test.ts +1 -1
  625. package/src/openbao/auth-role.ts +1 -1
  626. package/src/openbao/bao-http.test.ts +3 -3
  627. package/src/openbao/bao-http.ts +4 -4
  628. package/src/openbao/bao-identity.ts +2 -2
  629. package/src/openbao/cloudflare-permission-groups.ts +1 -1
  630. package/src/openbao/cloudflare-role-wire.ts +1 -1
  631. package/src/openbao/cloudflare-role.ts +1 -1
  632. package/src/openbao/distilled-retry.test.ts +3 -3
  633. package/src/openbao/distilled.test.ts +3 -3
  634. package/src/openbao/distilled.ts +2 -2
  635. package/src/openbao/fake-bao.ts +2 -2
  636. package/src/openbao/fake-core.ts +1 -1
  637. package/src/openbao/fake-engines.ts +1 -1
  638. package/src/openbao/fake-families.ts +1 -1
  639. package/src/openbao/fake-stack.ts +13 -3
  640. package/src/openbao/jwt-config.ts +1 -1
  641. package/src/openbao/jwt-role.ts +1 -1
  642. package/src/openbao/kubernetes-role.ts +1 -1
  643. package/src/openbao/mfa-enforcement.ts +1 -1
  644. package/src/openbao/mfa-totp.ts +1 -1
  645. package/src/openbao/mfa-wire.ts +1 -1
  646. package/src/openbao/mount-move.ts +1 -1
  647. package/src/openbao/mount-reconcile.ts +1 -1
  648. package/src/openbao/mount.ts +1 -1
  649. package/src/openbao/pki-role.ts +1 -1
  650. package/src/openbao/plugin-reconcile.ts +1 -1
  651. package/src/openbao/plugin-wire.ts +1 -1
  652. package/src/openbao/plugin.ts +1 -1
  653. package/src/openbao/policy.ts +1 -1
  654. package/src/openbao/proxmox-role.ts +1 -1
  655. package/src/openbao/remount-wire.ts +1 -1
  656. package/src/openbao/rename-occupied.test.ts +1 -1
  657. package/src/openbao/role-reconcile.ts +1 -1
  658. package/src/openbao/role-rename.test.ts +1 -1
  659. package/src/openbao/ssh-role.ts +1 -1
  660. package/src/opnsense/fake-opnsense.ts +1 -1
  661. package/src/opnsense/resource.ts +1 -1
  662. package/src/ownership/probe.ts +51 -2
  663. package/src/paperless/fake-paperless.ts +1 -1
  664. package/src/paperless/matching-types.ts +1 -1
  665. package/src/postgres/connection.ts +11 -15
  666. package/src/postgres/database-bigint-serialization.test.ts +3 -3
  667. package/src/postgres/database-sql.ts +7 -7
  668. package/src/postgres/database.ts +1 -1
  669. package/src/postgres/fake-grants-read.ts +4 -4
  670. package/src/postgres/fake-grants-sql.ts +1 -1
  671. package/src/postgres/fake-grants-write.ts +1 -1
  672. package/src/postgres/fake-role-sql.ts +3 -3
  673. package/src/postgres/fake-schema-drop.ts +75 -0
  674. package/src/postgres/fake-schema-sql.ts +11 -2
  675. package/src/postgres/fake-sql.ts +11 -4
  676. package/src/postgres/grants-database.test.ts +5 -5
  677. package/src/postgres/grants-existence.ts +8 -8
  678. package/src/postgres/grants-ops.ts +1 -1
  679. package/src/postgres/grants-ownership.ts +6 -6
  680. package/src/postgres/grants-psql-lifecycle.test.ts +7 -3
  681. package/src/postgres/grants-read-defaults.ts +6 -6
  682. package/src/postgres/grants-read.ts +17 -17
  683. package/src/postgres/grants-relkind-wire.test.ts +6 -4
  684. package/src/postgres/index.ts +2 -0
  685. package/src/postgres/installed-classifier.ts +1 -1
  686. package/src/postgres/psql-executor-escaping.test.ts +3 -1
  687. package/src/postgres/psql-executor.test.ts +11 -5
  688. package/src/postgres/psql-executor.ts +5 -7
  689. package/src/postgres/role-adopt.test.ts +3 -1
  690. package/src/postgres/role-membership-options.test.ts +3 -1
  691. package/src/postgres/role-membership-repair.test.ts +3 -3
  692. package/src/postgres/role-membership-sql.ts +5 -5
  693. package/src/postgres/role-password-transports.test.ts +6 -4
  694. package/src/postgres/role-sql.ts +2 -2
  695. package/src/postgres/role.ts +1 -1
  696. package/src/postgres/schema-assert.ts +1 -1
  697. package/src/postgres/schema-closure-sql.ts +108 -0
  698. package/src/postgres/schema-delete-proofs.test.ts +7 -7
  699. package/src/postgres/schema-delete.ts +89 -47
  700. package/src/postgres/schema-drop-2bp01.test.ts +30 -18
  701. package/src/postgres/schema-drop-real.test.ts +190 -0
  702. package/src/postgres/schema-drop-sql.ts +135 -0
  703. package/src/postgres/schema-drop.test.ts +241 -0
  704. package/src/postgres/schema-errors.ts +26 -0
  705. package/src/postgres/schema-handlers.test.ts +21 -14
  706. package/src/postgres/schema-lifecycle.test.ts +6 -60
  707. package/src/postgres/schema-reconcile.ts +1 -1
  708. package/src/postgres/schema-sequence-error.ts +38 -0
  709. package/src/postgres/schema-socket.test.ts +20 -6
  710. package/src/postgres/schema-sql.ts +17 -12
  711. package/src/postgres/schema-takeover.test.ts +7 -4
  712. package/src/postgres/schema-test-kit.ts +18 -4
  713. package/src/postgres/search-path.test.ts +100 -0
  714. package/src/postgres/search-path.ts +62 -0
  715. package/src/proxmox/ceph-flag-wire.test.ts +1 -1
  716. package/src/proxmox/ceph-fs-destroy-sdk.test.ts +1 -1
  717. package/src/proxmox/ceph-pool-write.test.ts +1 -1
  718. package/src/proxmox/client.test.ts +2 -2
  719. package/src/proxmox/client.ts +2 -2
  720. package/src/proxmox/credentials.test.ts +1 -1
  721. package/src/proxmox/distilled-pbs.test.ts +1 -1
  722. package/src/proxmox/distilled-pbs.ts +1 -1
  723. package/src/proxmox/distilled-pve.test.ts +2 -2
  724. package/src/proxmox/distilled-pve.ts +1 -1
  725. package/src/proxmox/fake-pbs-jobs.ts +1 -1
  726. package/src/proxmox/fake-pve.ts +1 -1
  727. package/src/proxmox/lease-cache-mint.test.ts +1 -1
  728. package/src/proxmox/live-core-fixtures.ts +1 -1
  729. package/src/proxmox/lxc-distilled.test.ts +1 -1
  730. package/src/proxmox/lxc-harness.ts +1 -1
  731. package/src/proxmox/members-timeout.test.ts +3 -3
  732. package/src/proxmox/members.test.ts +1 -1
  733. package/src/proxmox/members.ts +4 -4
  734. package/src/proxmox/mint.ts +4 -4
  735. package/src/proxmox/node-network-read-failure.test.ts +1 -1
  736. package/src/proxmox/qemu-lifecycle.ts +1 -1
  737. package/src/proxmox/read-failure-propagation.test.ts +1 -1
  738. package/src/proxmox/resource-spec.ts +1 -1
  739. package/src/proxmox/storage-read-failure.test.ts +1 -1
  740. package/src/proxmox/typed-absence.test.ts +2 -2
  741. package/src/proxmox/unreadable-read.test.ts +1 -1
  742. package/src/proxmox/user.test.ts +1 -1
  743. package/src/proxmox/zfs-pool-read-failure.test.ts +1 -1
  744. package/src/release/adopt-parity.test.ts +3 -1
  745. package/src/release/apply-pins.test.ts +2 -2
  746. package/src/release/binary-root.test.ts +2 -2
  747. package/src/release/binary.ts +9 -2
  748. package/src/release/download.test.ts +3 -3
  749. package/src/release/download.ts +1 -1
  750. package/src/release/fake-deploy.ts +2 -2
  751. package/src/release/fake-engine.ts +2 -2
  752. package/src/release/fake-provider.ts +2 -2
  753. package/src/release/plan.test.ts +2 -2
  754. package/src/release/providers.ts +1 -1
  755. package/src/talos/credentials-write.test.ts +1 -1
  756. package/src/talos/credentials-write.ts +2 -2
  757. package/src/talos/credentials.test.ts +1 -1
  758. package/src/talos/credentials.ts +2 -2
  759. package/src/talos/fake-process.ts +2 -2
  760. package/src/talos/kubeconfig.test.ts +1 -1
  761. package/src/talos/machine-config-fixtures.ts +1 -1
  762. package/src/talos/resource.ts +1 -1
  763. package/src/talos/talos-bootstrap.test.ts +1 -1
  764. package/src/talos/talos-cluster-health.test.ts +1 -1
  765. package/src/talos/talosctl.ts +2 -2
  766. package/src/telemetry/http-client-sealing.test.ts +2 -2
  767. package/src/telemetry/layer.test.ts +3 -3
  768. package/src/telemetry/layer.ts +2 -2
  769. package/src/telemetry/redact-serialization.ts +2 -2
  770. package/src/unifi/fake-unifi.ts +1 -1
  771. package/src/unifi/get-only-guard.test.ts +3 -3
  772. package/src/unifi/resource.ts +1 -1
  773. package/src/verify/args.ts +1 -1
@@ -1,17 +1,12 @@
1
1
  // src/postgres/connection.ts
2
2
  import * as PgClient from "@effect/sql-pg/PgClient";
3
3
  import * as Context from "effect/Context";
4
- import * as Effect3 from "effect/Effect";
4
+ import * as Effect4 from "effect/Effect";
5
5
  import * as Layer from "effect/Layer";
6
6
 
7
7
  // src/postgres/psql-executor.ts
8
- import * as Effect2 from "effect/Effect";
9
- import {
10
- ConnectionError,
11
- SqlError,
12
- SqlSyntaxError,
13
- UnknownError
14
- } from "effect/unstable/sql/SqlError";
8
+ import * as Effect3 from "effect/Effect";
9
+ import { ConnectionError, SqlError, SqlSyntaxError, UnknownError } from "effect/sql/SqlError";
15
10
 
16
11
  // src/postgres/database-sql.ts
17
12
  import * as Effect from "effect/Effect";
@@ -49,15 +44,15 @@ var isDuplicateDatabaseRace = (error) => {
49
44
  const cause = error.reason.cause;
50
45
  return typeof cause === "object" && cause !== null && cause.code === "42P04";
51
46
  };
52
- var ROLE_EXISTS_SQL = "SELECT 1 AS present FROM pg_roles WHERE rolname = $1";
47
+ var ROLE_EXISTS_SQL = "SELECT 1 AS present FROM pg_catalog.pg_roles WHERE rolname = $1";
53
48
  var roleExists = (pg, role) => Effect.map(pg.unsafe(ROLE_EXISTS_SQL, [role]), (rows) => rows.length > 0);
54
- var DATABASE_EXISTS_SQL = "SELECT 1 AS present FROM pg_database WHERE datname = $1";
49
+ var DATABASE_EXISTS_SQL = "SELECT 1 AS present FROM pg_catalog.pg_database WHERE datname = $1";
55
50
  var databaseExists = (pg, name) => Effect.map(pg.unsafe(DATABASE_EXISTS_SQL, [name]), (rows) => rows.length > 0);
56
51
  var SELECT_DATABASE_SQL = `SELECT
57
52
  d.oid AS oid,
58
53
  d.datname AS name,
59
- pg_get_userbyid(d.datdba) AS owner,
60
- pg_encoding_to_char(d.encoding) AS encoding,
54
+ pg_catalog.pg_get_userbyid(d.datdba) AS owner,
55
+ pg_catalog.pg_encoding_to_char(d.encoding) AS encoding,
61
56
  CASE d.datlocprovider
62
57
  WHEN 'b' THEN 'builtin' WHEN 'i' THEN 'icu' WHEN 'c' THEN 'libc'
63
58
  ELSE 'libc'
@@ -68,8 +63,8 @@ var SELECT_DATABASE_SQL = `SELECT
68
63
  d.datconnlimit AS "connectionLimit",
69
64
  d.datistemplate AS "isTemplate",
70
65
  t.spcname AS tablespace
71
- FROM pg_database d
72
- JOIN pg_tablespace t ON t.oid = d.dattablespace
66
+ FROM pg_catalog.pg_database d
67
+ JOIN pg_catalog.pg_tablespace t ON t.oid = d.dattablespace
73
68
  WHERE d.datname = $1`;
74
69
  var selectDatabase = (pg, name) => Effect.map(pg.unsafe(SELECT_DATABASE_SQL, [name]), (rows) => rows[0]);
75
70
  var firstDrift = (props, live) => {
@@ -90,6 +85,26 @@ var firstDrift = (props, live) => {
90
85
  return;
91
86
  };
92
87
 
88
+ // src/postgres/search-path.ts
89
+ import * as Effect2 from "effect/Effect";
90
+ var PIN_SEARCH_PATH_SQL = "SET search_path = pg_catalog, pg_temp";
91
+ var PIN_SCRIPT_PREFIX = `${PIN_SEARCH_PATH_SQL};
92
+ `;
93
+ var pinnedSocketExecutor = (pg) => Effect2.gen(function* () {
94
+ const connection = yield* pg.reserve;
95
+ const run = (sql, params) => Effect2.provideService(pg.unsafe(sql, params), pg.transactionService, [connection, 0]);
96
+ yield* run(PIN_SEARCH_PATH_SQL);
97
+ return {
98
+ unsafe: run,
99
+ transaction: (statements) => Effect2.gen(function* () {
100
+ yield* run("BEGIN");
101
+ for (const sql of statements)
102
+ yield* run(sql);
103
+ yield* run("COMMIT");
104
+ }).pipe(Effect2.onError(() => run("ROLLBACK").pipe(Effect2.ignore)), Effect2.asVoid)
105
+ };
106
+ });
107
+
93
108
  // src/postgres/psql-executor.ts
94
109
  var inlineParams = (sql, params) => params.length === 0 ? sql : sql.replace(/\$(\d+)/g, (_match, index) => {
95
110
  const value = params[Number(index) - 1];
@@ -113,8 +128,8 @@ var failure = (operation, result) => {
113
128
  const reason = state === undefined ? new ConnectionError(fields) : state.startsWith("42") ? new SqlSyntaxError(fields) : new UnknownError(fields);
114
129
  return new SqlError({ reason });
115
130
  };
116
- var runScript = (run, target, stdin, operation) => Effect2.gen(function* () {
117
- const result = yield* Effect2.tryPromise({
131
+ var runScript = (run, target, stdin, operation) => Effect3.gen(function* () {
132
+ const result = yield* Effect3.tryPromise({
118
133
  try: () => run({
119
134
  argv: [
120
135
  "psql",
@@ -131,18 +146,18 @@ var runScript = (run, target, stdin, operation) => Effect2.gen(function* () {
131
146
  "-d",
132
147
  target.database
133
148
  ],
134
- stdin
149
+ stdin: `${PIN_SCRIPT_PREFIX}${stdin}`
135
150
  }),
136
151
  catch: (cause) => new SqlError({ reason: new ConnectionError({ cause, operation: "psql exec" }) })
137
152
  });
138
153
  if (result.code !== 0) {
139
- return yield* Effect2.fail(failure(operation, result));
154
+ return yield* Effect3.fail(failure(operation, result));
140
155
  }
141
156
  return result;
142
157
  });
143
158
  var makePsqlExecutor = (run, target) => ({
144
- unsafe: (sql, params = []) => Effect2.gen(function* () {
145
- const inlined = yield* Effect2.try({
159
+ unsafe: (sql, params = []) => Effect3.gen(function* () {
160
+ const inlined = yield* Effect3.try({
146
161
  try: () => inlineParams(sql, params),
147
162
  catch: (cause) => new SqlError({ reason: new UnknownError({ cause, operation: "psql inline params" }) })
148
163
  });
@@ -150,13 +165,13 @@ var makePsqlExecutor = (run, target) => ({
150
165
  const result = yield* runScript(run, target, rows ? wrapRows(inlined) : `${inlined};`, redactPasswordLiterals(inlined).slice(0, 40));
151
166
  if (!rows)
152
167
  return [];
153
- const parsed = yield* Effect2.try({
168
+ const parsed = yield* Effect3.try({
154
169
  try: () => JSON.parse(result.stdout.trim() || "[]").map(normalizeRow),
155
170
  catch: (cause) => new SqlError({ reason: new UnknownError({ cause, operation: "psql parse output" }) })
156
171
  });
157
172
  return parsed;
158
173
  }),
159
- transaction: (statements) => Effect2.gen(function* () {
174
+ transaction: (statements) => Effect3.gen(function* () {
160
175
  const script = ["BEGIN", ...statements, "COMMIT"].join(`;
161
176
  `);
162
177
  yield* runScript(run, target, `${script};`, "BEGIN");
@@ -166,13 +181,13 @@ var makePsqlExecutor = (run, target) => ({
166
181
  // src/postgres/connection.ts
167
182
  class PostgresConnection extends Context.Service()("Postgres.Connection") {
168
183
  }
169
- var postgresConnection = (config) => Layer.succeed(PostgresConnection, Effect3.succeed(config));
170
- var postgresRunnerConnection = (config) => Layer.succeed(PostgresConnection, Effect3.succeed(config));
184
+ var postgresConnection = (config) => Layer.succeed(PostgresConnection, Effect4.succeed(config));
185
+ var postgresRunnerConnection = (config) => Layer.succeed(PostgresConnection, Effect4.succeed(config));
171
186
  var PostgresPool = Context.Reference("homeflare/postgres/Pool", {
172
187
  defaultValue: () => PgClient.layer
173
188
  });
174
189
  var isRunner = (c) => ("run" in c);
175
- var withPg = (build, database) => Effect3.gen(function* () {
190
+ var withPg = (build, database) => Effect4.gen(function* () {
176
191
  const resolveConfig = yield* PostgresConnection;
177
192
  const config = yield* resolveConfig;
178
193
  const target = database === undefined ? config : { ...config, database };
@@ -183,13 +198,7 @@ var withPg = (build, database) => Effect3.gen(function* () {
183
198
  });
184
199
  }
185
200
  const pool = yield* PostgresPool;
186
- return yield* Effect3.provide(Effect3.flatMap(PgClient.PgClient, (pg) => build({
187
- unsafe: (sql, params) => pg.unsafe(sql, params),
188
- transaction: (statements) => pg.withTransaction(Effect3.gen(function* () {
189
- for (const sql of statements)
190
- yield* pg.unsafe(sql).pipe(Effect3.asVoid);
191
- }))
192
- }, { database: target.database })), pool(target));
201
+ return yield* Effect4.provide(Effect4.scoped(Effect4.flatMap(PgClient.PgClient, (pg) => Effect4.flatMap(pinnedSocketExecutor(pg), (executor) => build(executor, { database: target.database })))), pool(target));
193
202
  });
194
203
  // src/postgres/database-attrs.ts
195
204
  var POSTGRES_NAME_MAX_BYTES = 63;
@@ -203,7 +212,7 @@ import { Resource } from "alchemy";
203
212
  import { Unowned } from "alchemy/AdoptPolicy";
204
213
  import { isResolved } from "alchemy/Diff";
205
214
  import * as Provider from "alchemy/Provider";
206
- import * as Effect4 from "effect/Effect";
215
+ import * as Effect5 from "effect/Effect";
207
216
 
208
217
  // src/postgres/errors.ts
209
218
  import * as Data from "effect/Data";
@@ -255,23 +264,23 @@ var liveDrift = (props, live) => {
255
264
  }
256
265
  return firstDrift(props, live);
257
266
  };
258
- var reconcileWithClient = (pg, props, template) => Effect4.gen(function* () {
267
+ var reconcileWithClient = (pg, props, template) => Effect5.gen(function* () {
259
268
  const observed = yield* selectDatabase(pg, props.name);
260
269
  if (observed === undefined) {
261
270
  const ownerPresent = yield* roleExists(pg, props.owner);
262
271
  if (!ownerPresent) {
263
- return yield* Effect4.fail(new PostgresDatabaseOwnerMissing({ database: props.name, owner: props.owner }));
272
+ return yield* Effect5.fail(new PostgresDatabaseOwnerMissing({ database: props.name, owner: props.owner }));
264
273
  }
265
- yield* pg.unsafe(buildCreateDatabaseSql(props, template)).pipe(Effect4.asVoid, Effect4.catchTag("SqlError", (error) => isDuplicateDatabaseRace(error) ? Effect4.succeed(undefined) : Effect4.fail(error)));
274
+ yield* pg.unsafe(buildCreateDatabaseSql(props, template)).pipe(Effect5.asVoid, Effect5.catchTag("SqlError", (error) => isDuplicateDatabaseRace(error) ? Effect5.succeed(undefined) : Effect5.fail(error)));
266
275
  const created = yield* selectDatabase(pg, props.name);
267
276
  if (created === undefined) {
268
- return yield* Effect4.fail(new PostgresDatabaseCreateVanished({ database: props.name }));
277
+ return yield* Effect5.fail(new PostgresDatabaseCreateVanished({ database: props.name }));
269
278
  }
270
279
  return created;
271
280
  }
272
281
  const drift = liveDrift(props, observed);
273
282
  if (drift !== undefined) {
274
- return yield* Effect4.fail(new PostgresDatabaseDrift({
283
+ return yield* Effect5.fail(new PostgresDatabaseDrift({
275
284
  database: props.name,
276
285
  prop: drift.prop,
277
286
  declared: drift.declared,
@@ -281,36 +290,36 @@ var reconcileWithClient = (pg, props, template) => Effect4.gen(function* () {
281
290
  return observed;
282
291
  });
283
292
  var readWithClient = (pg, name) => selectDatabase(pg, name);
284
- var diffPostgresDatabase = (news, output) => Effect4.gen(function* () {
293
+ var diffPostgresDatabase = (news, output) => Effect5.gen(function* () {
285
294
  if (output === undefined || !isResolved(news))
286
295
  return;
287
296
  if (news.name !== output.name) {
288
- return yield* Effect4.fail(new PostgresDatabaseRenameRefused({ from: output.name, to: news.name }));
297
+ return yield* Effect5.fail(new PostgresDatabaseRenameRefused({ from: output.name, to: news.name }));
289
298
  }
290
299
  const nameRefusal = nameByteRefusal(news.name);
291
300
  if (nameRefusal !== undefined) {
292
- return yield* Effect4.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
301
+ return yield* Effect5.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
293
302
  }
294
303
  const changed = news.owner !== output.owner || firstDrift(news, output) !== undefined;
295
304
  return changed ? { action: "update" } : { action: "noop" };
296
305
  });
297
306
  var postgresDatabaseHandlers = PostgresDatabase.Provider.of({
298
- list: () => Effect4.succeed([]),
307
+ list: () => Effect5.succeed([]),
299
308
  nuke: { skip: true },
300
- read: ({ olds, output }) => Effect4.gen(function* () {
309
+ read: ({ olds, output }) => Effect5.gen(function* () {
301
310
  const name = output?.name ?? olds.name;
302
311
  const live = yield* withPg((pg) => readWithClient(pg, name));
303
312
  return live === undefined ? undefined : Unowned(live);
304
313
  }),
305
314
  diff: ({ news, output }) => diffPostgresDatabase(news, output),
306
- reconcile: ({ news }) => Effect4.gen(function* () {
315
+ reconcile: ({ news }) => Effect5.gen(function* () {
307
316
  const nameRefusal = nameByteRefusal(news.name);
308
317
  if (nameRefusal !== undefined) {
309
- return yield* Effect4.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
318
+ return yield* Effect5.fail(new PostgresDatabaseNameRefused({ name: news.name, ...nameRefusal }));
310
319
  }
311
320
  return yield* withPg((pg, ctx) => reconcileWithClient(pg, news, ctx.template));
312
321
  }),
313
- delete: ({ olds }) => Effect4.fail(new PostgresDatabaseDropRefused({ database: olds.name }))
322
+ delete: ({ olds }) => Effect5.fail(new PostgresDatabaseDropRefused({ database: olds.name }))
314
323
  });
315
324
  var PostgresDatabaseProvider = () => Provider.succeed(PostgresDatabase, postgresDatabaseHandlers);
316
325
  // src/postgres/schema-attrs.ts
@@ -320,34 +329,35 @@ var schemaNameByteRefusal = (name) => {
320
329
  return byteLength > POSTGRES_NAME_MAX_BYTES ? { byteLength, limit: POSTGRES_NAME_MAX_BYTES } : undefined;
321
330
  };
322
331
  // src/postgres/schema-sql.ts
323
- import * as Effect5 from "effect/Effect";
332
+ import * as Effect6 from "effect/Effect";
324
333
  var buildCreateSchemaSql = (props) => `CREATE SCHEMA ${quoteIdent(props.name)}${props.owner === undefined ? "" : ` AUTHORIZATION ${quoteIdent(props.owner)}`}`;
325
334
  var buildCommentSchemaSql = (name, comment) => `COMMENT ON SCHEMA ${quoteIdent(name)} IS ${quoteStringLiteral(comment)}`;
326
335
  var buildDropSchemaSql = (name, cascade) => `DROP SCHEMA IF EXISTS ${quoteIdent(name)}${cascade ? " CASCADE" : ""}`;
327
336
  var SELECT_SCHEMA_SQL = `SELECT
328
337
  n.oid AS oid,
329
338
  n.nspname AS name,
330
- pg_get_userbyid(n.nspowner) AS owner,
331
- obj_description(n.oid, 'pg_namespace') AS comment,
339
+ pg_catalog.pg_get_userbyid(n.nspowner) AS owner,
340
+ pg_catalog.obj_description(n.oid, 'pg_namespace') AS comment,
332
341
  current_database() AS database
333
- FROM pg_namespace n
342
+ FROM pg_catalog.pg_namespace n
334
343
  WHERE n.nspname = $1`;
335
- var selectSchema = (pg, name) => Effect5.map(pg.unsafe(SELECT_SCHEMA_SQL, [name]), (rows) => rows[0]);
344
+ var selectSchema = (pg, name) => Effect6.map(pg.unsafe(SELECT_SCHEMA_SQL, [name]), (rows) => rows[0]);
336
345
  var CURRENT_DATABASE_SQL = "SELECT current_database() AS database";
337
- var currentDatabase = (pg) => Effect5.map(pg.unsafe(CURRENT_DATABASE_SQL), (rows) => rows[0]?.database ?? "");
346
+ var currentDatabase = (pg) => Effect6.map(pg.unsafe(CURRENT_DATABASE_SQL), (rows) => rows[0]?.database ?? "");
338
347
  var CURRENT_USER_SQL = "SELECT current_user AS role";
339
- var currentUser = (pg) => Effect5.map(pg.unsafe(CURRENT_USER_SQL), (rows) => rows[0]?.role ?? "");
340
- var SCHEMA_EMPTY_SQL = `WITH ns AS (SELECT oid FROM pg_namespace WHERE nspname = $1)
341
- SELECT NOT EXISTS (
342
- SELECT 1 FROM pg_class c WHERE c.relnamespace = (SELECT oid FROM ns)
348
+ var currentUser = (pg) => Effect6.map(pg.unsafe(CURRENT_USER_SQL), (rows) => rows[0]?.role ?? "");
349
+ var emptyPredicate = (ns) => `NOT EXISTS (
350
+ SELECT 1 FROM pg_catalog.pg_class c WHERE c.relnamespace = ${ns}
343
351
  ) AND NOT EXISTS (
344
- SELECT 1 FROM pg_proc p WHERE p.pronamespace = (SELECT oid FROM ns)
352
+ SELECT 1 FROM pg_catalog.pg_proc p WHERE p.pronamespace = ${ns}
345
353
  ) AND NOT EXISTS (
346
- SELECT 1 FROM pg_type t WHERE t.typnamespace = (SELECT oid FROM ns)
354
+ SELECT 1 FROM pg_catalog.pg_type t WHERE t.typnamespace = ${ns}
347
355
  ) AND NOT EXISTS (
348
- SELECT 1 FROM pg_operator o WHERE o.oprnamespace = (SELECT oid FROM ns)
349
- ) AS empty`;
350
- var schemaIsEmpty = (pg, name) => Effect5.map(pg.unsafe(SCHEMA_EMPTY_SQL, [name]), (rows) => rows[0]?.empty ?? true);
356
+ SELECT 1 FROM pg_catalog.pg_operator o WHERE o.oprnamespace = ${ns}
357
+ )`;
358
+ var SCHEMA_EMPTY_SQL = `WITH ns AS (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
359
+ SELECT ${emptyPredicate("(SELECT oid FROM ns)")} AS empty`;
360
+ var schemaIsEmpty = (pg, name) => Effect6.map(pg.unsafe(SCHEMA_EMPTY_SQL, [name]), (rows) => rows[0]?.empty ?? true);
351
361
  var isDependentObjectsError = (error) => {
352
362
  const cause = error.reason.cause;
353
363
  return typeof cause === "object" && cause !== null && cause.code === "2BP01";
@@ -360,10 +370,10 @@ var isDuplicateSchemaError = (error) => {
360
370
  import { Resource as Resource2 } from "alchemy";
361
371
  import { Unowned as Unowned2 } from "alchemy/AdoptPolicy";
362
372
  import * as Provider2 from "alchemy/Provider";
363
- import * as Effect11 from "effect/Effect";
373
+ import * as Effect12 from "effect/Effect";
364
374
 
365
375
  // src/postgres/schema-identity.ts
366
- import * as Effect6 from "effect/Effect";
376
+ import * as Effect7 from "effect/Effect";
367
377
 
368
378
  // src/postgres/schema-errors.ts
369
379
  import * as Data2 from "effect/Data";
@@ -404,6 +414,12 @@ class PostgresSchemaDropNotEmptyError extends Data2.TaggedError("PostgresSchemaD
404
414
  }
405
415
  }
406
416
 
417
+ class PostgresSchemaCascadeCrossSchemaRefused extends Data2.TaggedError("PostgresSchemaCascadeCrossSchemaRefused") {
418
+ get message() {
419
+ return `Postgres.Schema "${this.schema}": cascade: true refused — ${String(this.dependents)} ` + "dependent object(s) outside this schema would be dropped with it. No DROP was issued. " + "Remove or move those dependents first.";
420
+ }
421
+ }
422
+
407
423
  class PostgresSchemaWrongDatabase extends Data2.TaggedError("PostgresSchemaWrongDatabase") {
408
424
  get message() {
409
425
  return `Postgres.Schema "${this.schema}": declared in database "${this.declared}" but the ` + `connection answers current_database() "${this.connected}". The handlers open the declared ` + "database themselves, so this points at broken provider wiring — fix it before touching any " + "schema, or the next create would land in the wrong database.";
@@ -436,15 +452,15 @@ class PostgresSchemaIdentityRefused extends Data2.TaggedError("PostgresSchemaIde
436
452
  }
437
453
 
438
454
  // src/postgres/schema-identity.ts
439
- var assertSchemaTarget = (props, output) => Effect6.gen(function* () {
455
+ var assertSchemaTarget = (props, output) => Effect7.gen(function* () {
440
456
  if (output === undefined)
441
457
  return;
442
458
  if (props.name !== output.name)
443
- return yield* Effect6.fail(new PostgresSchemaRenameRefused({ from: output.name, to: props.name }));
459
+ return yield* Effect7.fail(new PostgresSchemaRenameRefused({ from: output.name, to: props.name }));
444
460
  if (props.database !== output.database)
445
- return yield* Effect6.fail(new PostgresSchemaDatabaseRefused({ from: output.database, to: props.database }));
461
+ return yield* Effect7.fail(new PostgresSchemaDatabaseRefused({ from: output.database, to: props.database }));
446
462
  });
447
- var assertSchemaIdentity = (live, output) => live.oid === output.oid ? Effect6.void : Effect6.fail(new PostgresSchemaIdentityRefused({
463
+ var assertSchemaIdentity = (live, output) => live.oid === output.oid ? Effect7.void : Effect7.fail(new PostgresSchemaIdentityRefused({
448
464
  schema: live.name,
449
465
  storedOid: output.oid,
450
466
  liveOid: live.oid
@@ -452,14 +468,14 @@ var assertSchemaIdentity = (live, output) => live.oid === output.oid ? Effect6.v
452
468
 
453
469
  // src/postgres/schema-diff.ts
454
470
  import { isResolved as isResolved2 } from "alchemy/Diff";
455
- import * as Effect7 from "effect/Effect";
456
- var diffPostgresSchema = (news, output, olds) => Effect7.gen(function* () {
471
+ import * as Effect8 from "effect/Effect";
472
+ var diffPostgresSchema = (news, output, olds) => Effect8.gen(function* () {
457
473
  if (output === undefined || !isResolved2(news))
458
474
  return;
459
475
  yield* assertSchemaTarget(news, output);
460
476
  const nameRefusal = schemaNameByteRefusal(news.name);
461
477
  if (nameRefusal !== undefined) {
462
- return yield* Effect7.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
478
+ return yield* Effect8.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
463
479
  }
464
480
  const comment = normalizedComment(news.comment);
465
481
  const changed = news.owner !== undefined && news.owner !== output.owner || comment !== undefined && comment !== (output.comment ?? undefined) || (news.cascade ?? false) !== (olds?.cascade ?? false);
@@ -467,11 +483,11 @@ var diffPostgresSchema = (news, output, olds) => Effect7.gen(function* () {
467
483
  });
468
484
 
469
485
  // src/postgres/schema-reconcile.ts
470
- import * as Effect9 from "effect/Effect";
486
+ import * as Effect10 from "effect/Effect";
471
487
 
472
488
  // src/postgres/schema-assert.ts
473
- import * as Effect8 from "effect/Effect";
474
- var assertDatabase = (props, pg) => Effect8.flatMap(currentDatabase(pg), (connected) => connected === props.database ? Effect8.void : Effect8.fail(new PostgresSchemaWrongDatabase({
489
+ import * as Effect9 from "effect/Effect";
490
+ var assertDatabase = (props, pg) => Effect9.flatMap(currentDatabase(pg), (connected) => connected === props.database ? Effect9.void : Effect9.fail(new PostgresSchemaWrongDatabase({
475
491
  schema: props.name,
476
492
  declared: props.database,
477
493
  connected
@@ -491,7 +507,7 @@ var liveDrift2 = (props, live, executingRole) => {
491
507
  }
492
508
  return;
493
509
  };
494
- var refuse = (props, drift) => Effect8.fail(new PostgresSchemaDrift({
510
+ var refuse = (props, drift) => Effect9.fail(new PostgresSchemaDrift({
495
511
  schema: props.name,
496
512
  prop: drift.prop,
497
513
  declared: drift.declared,
@@ -499,11 +515,11 @@ var refuse = (props, drift) => Effect8.fail(new PostgresSchemaDrift({
499
515
  }));
500
516
  var assertOwner = (props, row, executingRole) => {
501
517
  const drift = ownerDrift(props, row, executingRole);
502
- return drift === undefined ? Effect8.void : refuse(props, drift);
518
+ return drift === undefined ? Effect9.void : refuse(props, drift);
503
519
  };
504
520
  var assertLive = (props, row, executingRole) => {
505
521
  const drift = liveDrift2(props, row, executingRole);
506
- return drift === undefined ? Effect8.succeed(row) : refuse(props, drift);
522
+ return drift === undefined ? Effect9.succeed(row) : refuse(props, drift);
507
523
  };
508
524
  var deleteForeignRefusal = (props, live, output) => {
509
525
  if (output !== undefined && output.oid === live.oid && output.owner === live.owner) {
@@ -520,7 +536,7 @@ var deleteForeignRefusal = (props, live, output) => {
520
536
  };
521
537
 
522
538
  // src/postgres/schema-reconcile.ts
523
- var reconcileWithClient2 = (pg, props, output) => Effect9.gen(function* () {
539
+ var reconcileWithClient2 = (pg, props, output) => Effect10.gen(function* () {
524
540
  yield* assertSchemaTarget(props, output);
525
541
  yield* assertDatabase(props, pg);
526
542
  const executingRole = props.owner !== undefined ? props.owner : yield* currentUser(pg);
@@ -529,55 +545,215 @@ var reconcileWithClient2 = (pg, props, output) => Effect9.gen(function* () {
529
545
  if (props.owner !== undefined) {
530
546
  const ownerPresent = yield* roleExists(pg, props.owner);
531
547
  if (!ownerPresent) {
532
- return yield* Effect9.fail(new PostgresSchemaOwnerMissing({ schema: props.name, owner: props.owner }));
548
+ return yield* Effect10.fail(new PostgresSchemaOwnerMissing({ schema: props.name, owner: props.owner }));
533
549
  }
534
550
  }
535
551
  const createRefusal = (error) => isDuplicateSchemaError(error) ? new PostgresSchemaExistsRefused({ schema: props.name, database: props.database }) : error;
536
- yield* pg.unsafe(buildCreateSchemaSql(props)).pipe(Effect9.asVoid, Effect9.catchTag("SqlError", (error) => Effect9.fail(createRefusal(error))));
552
+ yield* pg.unsafe(buildCreateSchemaSql(props)).pipe(Effect10.asVoid, Effect10.catchTag("SqlError", (error) => Effect10.fail(createRefusal(error))));
537
553
  const created = yield* selectSchema(pg, props.name);
538
554
  if (created === undefined) {
539
- return yield* Effect9.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
555
+ return yield* Effect10.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
540
556
  }
541
557
  yield* assertOwner(props, created, executingRole);
542
558
  const comment = normalizedComment(props.comment);
543
559
  if (comment !== undefined && comment !== (created.comment ?? undefined)) {
544
- yield* pg.unsafe(buildCommentSchemaSql(props.name, comment)).pipe(Effect9.asVoid);
560
+ yield* pg.unsafe(buildCommentSchemaSql(props.name, comment)).pipe(Effect10.asVoid);
545
561
  const commented = yield* selectSchema(pg, props.name);
546
562
  if (commented === undefined) {
547
- return yield* Effect9.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
563
+ return yield* Effect10.fail(new PostgresSchemaCreateVanished({ schema: props.name }));
548
564
  }
549
565
  return yield* assertLive(props, commented, executingRole);
550
566
  }
551
567
  return yield* assertLive(props, created, executingRole);
552
568
  }
553
569
  if (output === undefined) {
554
- return yield* Effect9.fail(new PostgresSchemaExistsRefused({ schema: props.name, database: props.database }));
570
+ return yield* Effect10.fail(new PostgresSchemaExistsRefused({ schema: props.name, database: props.database }));
555
571
  }
556
572
  yield* assertSchemaIdentity(observed, output);
557
573
  return yield* assertLive(props, observed, executingRole);
558
574
  });
559
575
 
560
576
  // src/postgres/schema-delete.ts
561
- import * as Effect10 from "effect/Effect";
562
- var dropGuarded = (pg, props) => Effect10.gen(function* () {
563
- if (props.cascade !== true) {
564
- const empty = yield* schemaIsEmpty(pg, props.name);
565
- if (!empty) {
566
- return yield* Effect10.fail(new PostgresSchemaDropNotEmptyError({ schema: props.name }));
567
- }
577
+ import * as Effect11 from "effect/Effect";
578
+
579
+ // src/postgres/schema-closure-sql.ts
580
+ var cls = (name) => `'pg_catalog.${name}'::pg_catalog.regclass`;
581
+ var direct = (table, column) => `WHEN ${cls(table)} THEN (SELECT x.${column} FROM pg_catalog.${table} x WHERE x.oid = d.objid)`;
582
+ var viaRelation = (table, column) => `WHEN ${cls(table)} THEN (SELECT c.relnamespace FROM pg_catalog.${table} x JOIN pg_catalog.pg_class c ON c.oid = x.${column} WHERE x.oid = d.objid)`;
583
+ var viaFamily = (table, column) => `WHEN ${cls(table)} THEN (SELECT f.opfnamespace FROM pg_catalog.${table} x JOIN pg_catalog.pg_opfamily f ON f.oid = x.${column} WHERE x.oid = d.objid)`;
584
+ var RELATION_HOME = `WHEN ${cls("pg_class")} THEN COALESCE(
585
+ (SELECT o.relnamespace FROM pg_catalog.pg_class o
586
+ WHERE o.reltoastrelid <> 0
587
+ AND o.reltoastrelid IN (d.objid, (SELECT i.indrelid FROM pg_catalog.pg_index i WHERE i.indexrelid = d.objid))),
588
+ (SELECT x.relnamespace FROM pg_catalog.pg_class x WHERE x.oid = d.objid))`;
589
+ var HOME_OF_DEPENDENT = `CASE d.classid
590
+ WHEN ${cls("pg_namespace")} THEN d.objid
591
+ ${RELATION_HOME}
592
+ ${direct("pg_type", "typnamespace")}
593
+ ${direct("pg_proc", "pronamespace")}
594
+ ${direct("pg_operator", "oprnamespace")}
595
+ ${direct("pg_collation", "collnamespace")}
596
+ ${direct("pg_conversion", "connamespace")}
597
+ ${direct("pg_opclass", "opcnamespace")}
598
+ ${direct("pg_opfamily", "opfnamespace")}
599
+ ${direct("pg_ts_config", "cfgnamespace")}
600
+ ${direct("pg_ts_dict", "dictnamespace")}
601
+ ${direct("pg_ts_parser", "prsnamespace")}
602
+ ${direct("pg_ts_template", "tmplnamespace")}
603
+ ${direct("pg_statistic_ext", "stxnamespace")}
604
+ ${direct("pg_constraint", "connamespace")}
605
+ ${direct("pg_default_acl", "defaclnamespace")}
606
+ ${direct("pg_extension", "extnamespace")}
607
+ ${viaRelation("pg_trigger", "tgrelid")}
608
+ ${viaRelation("pg_rewrite", "ev_class")}
609
+ ${viaRelation("pg_attrdef", "adrelid")}
610
+ ${viaRelation("pg_policy", "polrelid")}
611
+ ${viaRelation("pg_publication_rel", "prrelid")}
612
+ ${viaFamily("pg_amop", "amopfamily")}
613
+ ${viaFamily("pg_amproc", "amprocfamily")}
614
+ END`;
615
+ var OUTSIDE_DEPENDENTS_SQL = `v_count := (
616
+ WITH RECURSIVE reach (classid, objid, inside) AS (
617
+ SELECT ${cls("pg_namespace")}::pg_catalog.oid, v_ns, true
618
+ UNION
619
+ SELECT d.classid, d.objid, (${HOME_OF_DEPENDENT}) IS NOT DISTINCT FROM v_ns
620
+ FROM pg_catalog.pg_depend d
621
+ JOIN reach r ON d.refclassid = r.classid AND d.refobjid = r.objid AND r.inside
622
+ WHERE d.deptype <> 'p'
623
+ )
624
+ SELECT (SELECT pg_catalog.count(*) FROM reach WHERE NOT inside)
625
+ + (SELECT pg_catalog.count(*) FROM pg_catalog.pg_depend e
626
+ JOIN reach r ON e.classid = r.classid AND e.objid = r.objid AND r.inside
627
+ WHERE e.deptype IN ('e', 'i') AND e.refobjid <> 0
628
+ AND NOT EXISTS (SELECT 1 FROM reach o
629
+ WHERE o.inside AND o.classid = e.refclassid AND o.objid = e.refobjid))
630
+ )`;
631
+
632
+ // src/postgres/schema-drop-sql.ts
633
+ var IDENTITY_CHANGED = "HF001";
634
+ var NOT_EMPTY = "HF002";
635
+ var CROSS_SCHEMA_DEPENDENTS = "HF003";
636
+ var CASCADE_SEQUENCES = "HF004";
637
+ var LOCK_TIMEOUT = "10s";
638
+ var buildAtomicDropSql = (drop) => {
639
+ const body = `DECLARE
640
+ v_name text := ${quoteStringLiteral(drop.name)};
641
+ v_oid oid := ${String(Math.trunc(drop.oid))};
642
+ v_owner text := ${quoteStringLiteral(drop.owner)};
643
+ v_cascade boolean := ${drop.cascade ? "true" : "false"};
644
+ v_ns oid;
645
+ v_count bigint;
646
+ v_comment text;
647
+ v_rel text;
648
+ BEGIN
649
+ SELECT n.oid INTO v_ns FROM pg_catalog.pg_namespace n WHERE n.nspname = v_name;
650
+ IF v_ns IS NULL THEN RETURN; END IF;
651
+ PERFORM pg_catalog.set_config('lock_timeout', '${LOCK_TIMEOUT}', true);
652
+ PERFORM pg_catalog.pg_advisory_xact_lock(v_ns::pg_catalog.int8);
653
+ v_comment := pg_catalog.obj_description(v_ns, 'pg_namespace');
654
+ EXECUTE pg_catalog.format('COMMENT ON SCHEMA %I IS %L', v_name, v_comment);
655
+ SELECT n.oid INTO v_ns FROM pg_catalog.pg_namespace n
656
+ WHERE n.nspname = v_name AND n.oid = v_oid
657
+ AND pg_catalog.pg_get_userbyid(n.nspowner) = v_owner;
658
+ IF v_ns IS NULL THEN
659
+ RAISE EXCEPTION 'schema identity changed' USING ERRCODE = '${IDENTITY_CHANGED}';
660
+ END IF;
661
+ IF NOT v_cascade THEN
662
+ IF NOT (${emptyPredicate("v_ns")}) THEN
663
+ RAISE EXCEPTION 'schema not empty' USING ERRCODE = '${NOT_EMPTY}';
664
+ END IF;
665
+ ELSE
666
+ SELECT count(*) INTO v_count FROM pg_catalog.pg_class c
667
+ WHERE c.relnamespace = v_ns AND c.relkind = 'S';
668
+ IF v_count > 0 THEN
669
+ RAISE EXCEPTION 'cascade sequences: %', v_count USING ERRCODE = '${CASCADE_SEQUENCES}';
670
+ END IF;
671
+ FOR v_rel IN SELECT c.oid::pg_catalog.regclass::pg_catalog.text FROM pg_catalog.pg_class c
672
+ WHERE c.relnamespace = v_ns AND c.relkind IN ('r', 'p', 'v', 'm', 'f') ORDER BY c.oid LOOP
673
+ EXECUTE pg_catalog.format('LOCK TABLE %s IN ACCESS EXCLUSIVE MODE', v_rel);
674
+ END LOOP;
675
+ ${OUTSIDE_DEPENDENTS_SQL};
676
+ IF v_count > 0 THEN
677
+ RAISE EXCEPTION 'cross-schema dependents: %', v_count USING ERRCODE = '${CROSS_SCHEMA_DEPENDENTS}';
678
+ END IF;
679
+ END IF;
680
+ PERFORM 1 FROM pg_catalog.pg_namespace n WHERE n.oid = v_oid AND n.nspname = v_name;
681
+ IF NOT FOUND THEN
682
+ RAISE EXCEPTION 'schema identity changed' USING ERRCODE = '${IDENTITY_CHANGED}';
683
+ END IF;
684
+ EXECUTE ${quoteStringLiteral(buildDropSchemaSql(drop.name, drop.cascade))};
685
+ END`;
686
+ return `DO ${quoteStringLiteral(body)}`;
687
+ };
688
+ var sqlStateOf = (error) => {
689
+ const cause = error.reason.cause;
690
+ const code = typeof cause === "object" && cause !== null ? cause.code : "";
691
+ return typeof code === "string" ? code : undefined;
692
+ };
693
+ var dependentsCount = (error) => {
694
+ const cause = error.reason.cause;
695
+ const message = typeof cause === "object" && cause !== null ? cause.message : "";
696
+ const parsed = /dependents:\s*(\d+)/.exec(message ?? "")?.[1];
697
+ return Math.max(1, Number(parsed ?? 1));
698
+ };
699
+
700
+ // src/postgres/schema-sequence-error.ts
701
+ import * as Data3 from "effect/Data";
702
+
703
+ class PostgresSchemaCascadeSequencesRefused extends Data3.TaggedError("PostgresSchemaCascadeSequencesRefused") {
704
+ get message() {
705
+ return `Postgres.Schema "${this.schema}": cascade: true refused — the schema holds ` + `${String(this.sequences)} sequence(s) (serial/identity columns own one), which cannot be ` + "locked, so a concurrent dependent could escape the cascade proof. No DROP was issued. " + "Drop the schema contents first, then declare cascade: false.";
568
706
  }
569
- const dropRefusal = (error) => props.cascade !== true && isDependentObjectsError(error) ? new PostgresSchemaDropNotEmptyError({ schema: props.name }) : error;
570
- yield* pg.unsafe(buildDropSchemaSql(props.name, props.cascade === true)).pipe(Effect10.asVoid, Effect10.catchTag("SqlError", (error) => Effect10.fail(dropRefusal(error))));
571
- });
572
- var deleteWithClient = (pg, props, output) => Effect10.gen(function* () {
707
+ }
708
+ var sequencesCount = (error) => {
709
+ const cause = error.reason.cause;
710
+ const message = typeof cause === "object" && cause !== null ? cause.message : "";
711
+ return Math.max(1, Number(/sequences:\s*(\d+)/.exec(message ?? "")?.[1] ?? 1));
712
+ };
713
+
714
+ // src/postgres/schema-delete.ts
715
+ var dropAtomic = (pg, props, live) => {
716
+ const cascade = props.cascade === true;
717
+ const classify = (error) => {
718
+ const state = sqlStateOf(error);
719
+ if (state === NOT_EMPTY || !cascade && isDependentObjectsError(error)) {
720
+ return Effect11.fail(new PostgresSchemaDropNotEmptyError({ schema: props.name }));
721
+ }
722
+ if (state === CROSS_SCHEMA_DEPENDENTS) {
723
+ return Effect11.fail(new PostgresSchemaCascadeCrossSchemaRefused({
724
+ schema: props.name,
725
+ dependents: dependentsCount(error)
726
+ }));
727
+ }
728
+ if (state === CASCADE_SEQUENCES) {
729
+ return Effect11.fail(new PostgresSchemaCascadeSequencesRefused({
730
+ schema: props.name,
731
+ sequences: sequencesCount(error)
732
+ }));
733
+ }
734
+ if (state === IDENTITY_CHANGED) {
735
+ return Effect11.flatMap(selectSchema(pg, props.name), (now) => now === undefined ? Effect11.void : Effect11.fail(new PostgresSchemaDeleteForeignRefused({
736
+ schema: props.name,
737
+ database: props.database,
738
+ liveOid: now.oid,
739
+ liveOwner: now.owner,
740
+ lastOid: live.oid,
741
+ lastOwner: live.owner
742
+ })));
743
+ }
744
+ return Effect11.fail(error);
745
+ };
746
+ return pg.unsafe(buildAtomicDropSql({ name: props.name, oid: live.oid, owner: live.owner, cascade })).pipe(Effect11.asVoid, Effect11.catchTag("SqlError", classify));
747
+ };
748
+ var deleteWithClient = (pg, props, output) => Effect11.gen(function* () {
573
749
  yield* assertDatabase(props, pg);
574
750
  const live = yield* selectSchema(pg, props.name);
575
751
  if (live === undefined)
576
752
  return;
577
753
  const refusal = deleteForeignRefusal(props, live, output);
578
754
  if (refusal !== undefined)
579
- return yield* Effect10.fail(refusal);
580
- yield* dropGuarded(pg, props);
755
+ return yield* Effect11.fail(refusal);
756
+ yield* dropAtomic(pg, props, live);
581
757
  });
582
758
 
583
759
  // src/postgres/schema.ts
@@ -587,9 +763,9 @@ var PostgresSchema = Resource2("Postgres.Schema", {
587
763
  var isPostgresSchema = (value) => (typeof value === "object" || typeof value === "function") && value !== null && value.Type === "Postgres.Schema";
588
764
  var readWithClient2 = (pg, name) => selectSchema(pg, name);
589
765
  var postgresSchemaHandlers = PostgresSchema.Provider.of({
590
- list: () => Effect11.succeed([]),
766
+ list: () => Effect12.succeed([]),
591
767
  nuke: { skip: true },
592
- read: ({ olds, output }) => Effect11.gen(function* () {
768
+ read: ({ olds, output }) => Effect12.gen(function* () {
593
769
  const name = output?.name ?? olds.name;
594
770
  const database = output?.database ?? olds.database;
595
771
  const present = yield* withPg((pg) => databaseExists(pg, database));
@@ -597,7 +773,7 @@ var postgresSchemaHandlers = PostgresSchema.Provider.of({
597
773
  return;
598
774
  const live = yield* withPg((pg) => readWithClient2(pg, name), database);
599
775
  if (live !== undefined && live.database !== database) {
600
- return yield* Effect11.fail(new PostgresSchemaWrongDatabase({
776
+ return yield* Effect12.fail(new PostgresSchemaWrongDatabase({
601
777
  schema: name,
602
778
  declared: database,
603
779
  connected: live.database
@@ -608,15 +784,15 @@ var postgresSchemaHandlers = PostgresSchema.Provider.of({
608
784
  return live === undefined ? undefined : Unowned2(live);
609
785
  }),
610
786
  diff: ({ news, output, olds }) => diffPostgresSchema(news, output, olds),
611
- reconcile: ({ news, output }) => Effect11.gen(function* () {
787
+ reconcile: ({ news, output }) => Effect12.gen(function* () {
612
788
  const nameRefusal = schemaNameByteRefusal(news.name);
613
789
  if (nameRefusal !== undefined) {
614
- return yield* Effect11.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
790
+ return yield* Effect12.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
615
791
  }
616
792
  yield* assertSchemaTarget(news, output);
617
793
  return yield* withPg((pg) => reconcileWithClient2(pg, news, output), news.database);
618
794
  }),
619
- delete: ({ olds, output }) => Effect11.gen(function* () {
795
+ delete: ({ olds, output }) => Effect12.gen(function* () {
620
796
  const present = yield* withPg((pg) => databaseExists(pg, olds.database));
621
797
  if (!present)
622
798
  return;
@@ -706,7 +882,7 @@ var revokePublicTablesSql = (schema) => `REVOKE ALL ON ALL TABLES IN SCHEMA ${qu
706
882
  import { Resource as Resource3 } from "alchemy";
707
883
  import { Unowned as Unowned3 } from "alchemy/AdoptPolicy";
708
884
  import * as Provider3 from "alchemy/Provider";
709
- import * as Effect17 from "effect/Effect";
885
+ import * as Effect18 from "effect/Effect";
710
886
 
711
887
  // src/postgres/grants-declare.ts
712
888
  var cleanWords = (words) => [...new Set(words)].sort();
@@ -781,7 +957,7 @@ var removedNames = (output, declared) => {
781
957
  };
782
958
 
783
959
  // src/postgres/grants-ops.ts
784
- import * as Effect16 from "effect/Effect";
960
+ import * as Effect17 from "effect/Effect";
785
961
  import { isResolved as isResolved3 } from "alchemy/Diff";
786
962
 
787
963
  // src/postgres/grants-refuse.ts
@@ -1038,72 +1214,72 @@ var grantsDiffer = (declared, live) => {
1038
1214
  };
1039
1215
 
1040
1216
  // src/postgres/grants-existence.ts
1041
- import * as Effect12 from "effect/Effect";
1217
+ import * as Effect13 from "effect/Effect";
1042
1218
 
1043
1219
  // src/postgres/grants-errors.ts
1044
- import * as Data3 from "effect/Data";
1220
+ import * as Data4 from "effect/Data";
1045
1221
 
1046
- class PostgresGrantsPrivilegeRefused extends Data3.TaggedError("PostgresGrantsPrivilegeRefused") {
1222
+ class PostgresGrantsPrivilegeRefused extends Data4.TaggedError("PostgresGrantsPrivilegeRefused") {
1047
1223
  get message() {
1048
1224
  return `Postgres.Grants: "${this.prop}" declares "${this.word}", which is not in the vocabulary ` + "PostgreSQL 18 grants on that object class (see grants-attrs.ts for the three sets, traced " + "to acl.h at REL_18_6). Column grants take select/insert/update/references only — TRUNCATE, " + "TRIGGER and MAINTAIN are table-wide.";
1049
1225
  }
1050
1226
  }
1051
1227
 
1052
- class PostgresGrantsNameRefused extends Data3.TaggedError("PostgresGrantsNameRefused") {
1228
+ class PostgresGrantsNameRefused extends Data4.TaggedError("PostgresGrantsNameRefused") {
1053
1229
  get message() {
1054
1230
  return `Postgres.Grants: the name "${this.name}" is ${String(this.byteLength)} UTF-8 bytes, over the ` + `${String(this.limit)}-byte limit (NAMEDATALEN 64, minus the terminator). PostgreSQL would ` + "accept the statement and silently truncate the name with only a NOTICE, so this plan refuses " + "it instead of granting on an object no later read will ever find again.";
1055
1231
  }
1056
1232
  }
1057
1233
 
1058
- class PostgresGrantsDuplicateObject extends Data3.TaggedError("PostgresGrantsDuplicateObject") {
1234
+ class PostgresGrantsDuplicateObject extends Data4.TaggedError("PostgresGrantsDuplicateObject") {
1059
1235
  get message() {
1060
1236
  return `Postgres.Grants: "${this.prop}" declares "${this.name}" twice. Merge the entries into one — ` + "the declaration must state each object at most once, and each privilege word in exactly one " + "form: plain, or WITH GRANT OPTION (`select` and `select*` cannot both hold, the server keeps " + "one aclitem per grantee per grantor).";
1061
1237
  }
1062
1238
  }
1063
1239
 
1064
- class PostgresGrantsRetargetRefused extends Data3.TaggedError("PostgresGrantsRetargetRefused") {
1240
+ class PostgresGrantsRetargetRefused extends Data4.TaggedError("PostgresGrantsRetargetRefused") {
1065
1241
  get message() {
1066
1242
  return `Postgres.Grants: the declared ${this.prop} changed from "${this.from}" to "${this.to}". A ` + "retarget is refused at plan — declare a new logical id for the new target and delete the old " + "one (its retain policy keeps the grants until a destroy revokes them).";
1067
1243
  }
1068
1244
  }
1069
1245
 
1070
- class PostgresGrantsDatabaseMismatch extends Data3.TaggedError("PostgresGrantsDatabaseMismatch") {
1246
+ class PostgresGrantsDatabaseMismatch extends Data4.TaggedError("PostgresGrantsDatabaseMismatch") {
1071
1247
  get message() {
1072
1248
  return `Postgres.Grants: the declaration names database "${this.declared}" but ` + `current_database() is "${this.connected}". The handlers open the declared database and ` + "prove it before any GRANT or REVOKE — a mismatch means that open did not land there.";
1073
1249
  }
1074
1250
  }
1075
1251
 
1076
- class PostgresGrantsSchemaMissing extends Data3.TaggedError("PostgresGrantsSchemaMissing") {
1252
+ class PostgresGrantsSchemaMissing extends Data4.TaggedError("PostgresGrantsSchemaMissing") {
1077
1253
  get message() {
1078
1254
  return `Postgres.Grants: schema "${this.schema}" is not in pg_namespace. Grants are written into a ` + "schema that already exists — declare a Postgres.Schema (or create it by hand) before the " + "grant set that scopes to it.";
1079
1255
  }
1080
1256
  }
1081
1257
 
1082
- class PostgresGrantsDatabaseMissing extends Data3.TaggedError("PostgresGrantsDatabaseMissing") {
1258
+ class PostgresGrantsDatabaseMissing extends Data4.TaggedError("PostgresGrantsDatabaseMissing") {
1083
1259
  get message() {
1084
1260
  return `Postgres.Grants: database "${this.database}" is not in pg_database. Grants are written into ` + "a database that already exists — declare a Postgres.Database (or create it by hand) before " + "the grant set that scopes to it.";
1085
1261
  }
1086
1262
  }
1087
1263
 
1088
- class PostgresGrantsRoleMissing extends Data3.TaggedError("PostgresGrantsRoleMissing") {
1264
+ class PostgresGrantsRoleMissing extends Data4.TaggedError("PostgresGrantsRoleMissing") {
1089
1265
  get message() {
1090
1266
  return `Postgres.Grants: role "${this.role}" is not in pg_roles. GRANT and ALTER DEFAULT PRIVILEGES ` + "would fail against it — create the role (a group role per seat, membership owned by a human) " + "before declaring its grants.";
1091
1267
  }
1092
1268
  }
1093
1269
 
1094
- class PostgresGrantsTableMissing extends Data3.TaggedError("PostgresGrantsTableMissing") {
1270
+ class PostgresGrantsTableMissing extends Data4.TaggedError("PostgresGrantsTableMissing") {
1095
1271
  get message() {
1096
1272
  return `Postgres.Grants: table "${this.schema}"."${this.table}" does not exist. The declaration ` + "names a relation before it is created; create the table (or fix the name) before granting.";
1097
1273
  }
1098
1274
  }
1099
1275
 
1100
- class PostgresGrantsColumnMissing extends Data3.TaggedError("PostgresGrantsColumnMissing") {
1276
+ class PostgresGrantsColumnMissing extends Data4.TaggedError("PostgresGrantsColumnMissing") {
1101
1277
  get message() {
1102
1278
  return `Postgres.Grants: column "${this.column}" of "${this.schema}"."${this.table}" does not ` + "exist. Declare the column (or fix its name) before granting on it.";
1103
1279
  }
1104
1280
  }
1105
1281
 
1106
- class PostgresGrantsRepairRefused extends Data3.TaggedError("PostgresGrantsRepairRefused") {
1282
+ class PostgresGrantsRepairRefused extends Data4.TaggedError("PostgresGrantsRepairRefused") {
1107
1283
  get message() {
1108
1284
  return `Postgres.Grants: the repair on schema "${this.schema}" for role "${this.role}" re-read as ` + `still drifted; these statements would run again: ${this.remaining.join(" ; ")}. A grant made ` + "by another role survives this resource’s REVOKE (only its grantor or the object’s " + "owner can revoke it) — revoke it as that grantor or the owner, or declare the privilege so " + "the set matches.";
1109
1285
  }
@@ -1112,39 +1288,39 @@ class PostgresGrantsRepairRefused extends Data3.TaggedError("PostgresGrantsRepai
1112
1288
  // src/postgres/grants-existence.ts
1113
1289
  var TABLES_PRESENT_SQL = `SELECT
1114
1290
  c.relname AS table
1115
- FROM pg_class c
1116
- WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1117
- AND c.relname::text IN (SELECT json_array_elements_text($2::json))`;
1118
- var findMissingTable = (pg, schema, tables) => tables.length === 0 ? Effect12.succeed(undefined) : Effect12.map(pg.unsafe(TABLES_PRESENT_SQL, [schema, JSON.stringify(tables)]), (rows) => {
1291
+ FROM pg_catalog.pg_class c
1292
+ WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1293
+ AND c.relname::text IN (SELECT pg_catalog.json_array_elements_text($2::json))`;
1294
+ var findMissingTable = (pg, schema, tables) => tables.length === 0 ? Effect13.succeed(undefined) : Effect13.map(pg.unsafe(TABLES_PRESENT_SQL, [schema, JSON.stringify(tables)]), (rows) => {
1119
1295
  const present = new Set(rows.map((row) => row.table));
1120
1296
  return tables.find((table) => !present.has(table));
1121
1297
  });
1122
1298
  var COLUMNS_PRESENT_SQL = `SELECT
1123
1299
  c.relname AS table,
1124
1300
  a.attname AS column
1125
- FROM pg_attribute a
1126
- JOIN pg_class c ON c.oid = a.attrelid
1127
- WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1301
+ FROM pg_catalog.pg_attribute a
1302
+ JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
1303
+ WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1128
1304
  AND a.attnum > 0
1129
1305
  AND NOT a.attisdropped
1130
1306
  AND (c.relname, a.attname) IN (
1131
- SELECT x->>0, x->>1 FROM json_array_elements($2::json) x
1307
+ SELECT x->>0, x->>1 FROM pg_catalog.json_array_elements($2::json) x
1132
1308
  )`;
1133
- var findMissingColumn = (pg, schema, columns) => columns.length === 0 ? Effect12.succeed(undefined) : Effect12.map(pg.unsafe(COLUMNS_PRESENT_SQL, [
1309
+ var findMissingColumn = (pg, schema, columns) => columns.length === 0 ? Effect13.succeed(undefined) : Effect13.map(pg.unsafe(COLUMNS_PRESENT_SQL, [
1134
1310
  schema,
1135
1311
  JSON.stringify(columns.map(({ table, column }) => [table, column]))
1136
1312
  ]), (rows) => {
1137
1313
  const present = new Set(rows.map((row) => `${row.table}\x00${row.column}`));
1138
1314
  return columns.find(({ table, column }) => !present.has(`${table}\x00${column}`));
1139
1315
  });
1140
- var requireDeclaredObjectsExist = (pg, declared) => Effect12.gen(function* () {
1316
+ var requireDeclaredObjectsExist = (pg, declared) => Effect13.gen(function* () {
1141
1317
  const missingTable = yield* findMissingTable(pg, declared.schema, declared.tables.map((table) => table.table));
1142
1318
  if (missingTable !== undefined) {
1143
- return yield* Effect12.fail(new PostgresGrantsTableMissing({ schema: declared.schema, table: missingTable }));
1319
+ return yield* Effect13.fail(new PostgresGrantsTableMissing({ schema: declared.schema, table: missingTable }));
1144
1320
  }
1145
1321
  const missingColumn = yield* findMissingColumn(pg, declared.schema, declared.columns.map((column) => ({ table: column.table, column: column.column })));
1146
1322
  if (missingColumn !== undefined) {
1147
- return yield* Effect12.fail(new PostgresGrantsColumnMissing({
1323
+ return yield* Effect13.fail(new PostgresGrantsColumnMissing({
1148
1324
  schema: declared.schema,
1149
1325
  table: missingColumn.table,
1150
1326
  column: missingColumn.column
@@ -1153,35 +1329,35 @@ var requireDeclaredObjectsExist = (pg, declared) => Effect12.gen(function* () {
1153
1329
  });
1154
1330
 
1155
1331
  // src/postgres/grants-read.ts
1156
- import * as Effect15 from "effect/Effect";
1332
+ import * as Effect16 from "effect/Effect";
1157
1333
 
1158
1334
  // src/postgres/grants-ownership.ts
1159
- import * as Effect13 from "effect/Effect";
1335
+ import * as Effect14 from "effect/Effect";
1160
1336
  var SCHEMA_OWNER_SQL = `SELECT
1161
- n.nspowner = (SELECT oid FROM pg_roles WHERE rolname = $2) AS role_owns
1162
- FROM pg_namespace n
1337
+ n.nspowner = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2) AS role_owns
1338
+ FROM pg_catalog.pg_namespace n
1163
1339
  WHERE n.nspname = $1`;
1164
- var readSchemaOwnership = (pg, schema, role) => Effect13.map(pg.unsafe(SCHEMA_OWNER_SQL, [schema, role]), (rows) => rows[0]?.role_owns === true);
1340
+ var readSchemaOwnership = (pg, schema, role) => Effect14.map(pg.unsafe(SCHEMA_OWNER_SQL, [schema, role]), (rows) => rows[0]?.role_owns === true);
1165
1341
  var OWNED_TABLES_SQL = `SELECT c.relname AS table
1166
- FROM pg_class c
1167
- WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1168
- AND c.relowner = (SELECT oid FROM pg_roles WHERE rolname = $2)
1342
+ FROM pg_catalog.pg_class c
1343
+ WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1344
+ AND c.relowner = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2)
1169
1345
  ORDER BY c.relname`;
1170
- var readOwnedTables = (pg, schema, role) => Effect13.map(pg.unsafe(OWNED_TABLES_SQL, [schema, role]), (rows) => rows.map((row) => row.table).sort((a, b) => a.localeCompare(b)));
1346
+ var readOwnedTables = (pg, schema, role) => Effect14.map(pg.unsafe(OWNED_TABLES_SQL, [schema, role]), (rows) => rows.map((row) => row.table).sort((a, b) => a.localeCompare(b)));
1171
1347
 
1172
1348
  // src/postgres/grants-read-defaults.ts
1173
- import * as Effect14 from "effect/Effect";
1349
+ import * as Effect15 from "effect/Effect";
1174
1350
  var DEFAULTS_SQL = `SELECT
1175
- pg_get_userbyid(d.defaclrole) AS for_role,
1351
+ pg_catalog.pg_get_userbyid(d.defaclrole) AS for_role,
1176
1352
  a.privilege_type AS privilege,
1177
1353
  a.is_grantable AS grantable
1178
- FROM pg_default_acl d
1179
- CROSS JOIN LATERAL aclexplode(d.defaclacl) AS a
1180
- WHERE d.defaclnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1354
+ FROM pg_catalog.pg_default_acl d
1355
+ CROSS JOIN LATERAL pg_catalog.aclexplode(d.defaclacl) AS a
1356
+ WHERE d.defaclnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1181
1357
  AND d.defaclobjtype = 'r'
1182
- AND a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2)
1358
+ AND a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2)
1183
1359
  ORDER BY for_role`;
1184
- var readDefaultAcls = (pg, schema, role) => Effect14.map(pg.unsafe(DEFAULTS_SQL, [schema, role]), (rows) => {
1360
+ var readDefaultAcls = (pg, schema, role) => Effect15.map(pg.unsafe(DEFAULTS_SQL, [schema, role]), (rows) => {
1185
1361
  const byRole = new Map;
1186
1362
  for (const row of rows) {
1187
1363
  const words = byRole.get(row.for_role) ?? [];
@@ -1192,17 +1368,17 @@ var readDefaultAcls = (pg, schema, role) => Effect14.map(pg.unsafe(DEFAULTS_SQL,
1192
1368
  });
1193
1369
 
1194
1370
  // src/postgres/grants-read.ts
1195
- var SCHEMA_PRESENT_SQL = "SELECT 1 AS present FROM pg_namespace WHERE nspname = $1";
1196
- var schemaExists = (pg, schema) => Effect15.map(pg.unsafe(SCHEMA_PRESENT_SQL, [schema]), (rows) => rows.length > 0);
1371
+ var SCHEMA_PRESENT_SQL = "SELECT 1 AS present FROM pg_catalog.pg_namespace WHERE nspname = $1";
1372
+ var schemaExists = (pg, schema) => Effect16.map(pg.unsafe(SCHEMA_PRESENT_SQL, [schema]), (rows) => rows.length > 0);
1197
1373
  var SCHEMA_ACL_SQL = `SELECT
1198
1374
  a.grantee = 0 AS public,
1199
1375
  a.privilege_type AS privilege,
1200
1376
  a.is_grantable AS grantable
1201
- FROM pg_namespace n
1202
- CROSS JOIN LATERAL aclexplode(n.nspacl) AS a
1377
+ FROM pg_catalog.pg_namespace n
1378
+ CROSS JOIN LATERAL pg_catalog.aclexplode(n.nspacl) AS a
1203
1379
  WHERE n.nspname = $1
1204
- AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))`;
1205
- var readSchemaAcl = (pg, schema, role) => Effect15.map(pg.unsafe(SCHEMA_ACL_SQL, [schema, role]), (rows) => ({
1380
+ AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))`;
1381
+ var readSchemaAcl = (pg, schema, role) => Effect16.map(pg.unsafe(SCHEMA_ACL_SQL, [schema, role]), (rows) => ({
1206
1382
  role: wordsOf(rows, false),
1207
1383
  public: wordsOf(rows, true)
1208
1384
  }));
@@ -1212,12 +1388,12 @@ var TABLES_SQL = `SELECT
1212
1388
  a.grantee = 0 AS public,
1213
1389
  a.privilege_type AS privilege,
1214
1390
  a.is_grantable AS grantable
1215
- FROM pg_class c
1216
- CROSS JOIN LATERAL aclexplode(c.relacl) AS a
1217
- WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1218
- AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))
1391
+ FROM pg_catalog.pg_class c
1392
+ CROSS JOIN LATERAL pg_catalog.aclexplode(c.relacl) AS a
1393
+ WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1394
+ AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))
1219
1395
  ORDER BY c.relname`;
1220
- var readTableAcls = (pg, schema, role) => Effect15.map(pg.unsafe(TABLES_SQL, [
1396
+ var readTableAcls = (pg, schema, role) => Effect16.map(pg.unsafe(TABLES_SQL, [
1221
1397
  schema,
1222
1398
  role
1223
1399
  ]), (rows) => {
@@ -1240,19 +1416,19 @@ var COLUMNS_SQL = `SELECT
1240
1416
  a.grantee = 0 AS public,
1241
1417
  a.privilege_type AS privilege,
1242
1418
  a.is_grantable AS grantable,
1243
- pg_get_userbyid(a.grantor) AS grantor,
1244
- pg_get_userbyid(c.relowner) AS owner,
1419
+ pg_catalog.pg_get_userbyid(a.grantor) AS grantor,
1420
+ pg_catalog.pg_get_userbyid(c.relowner) AS owner,
1245
1421
  current_user AS revoker,
1246
- pg_has_role(current_user, c.relowner, 'USAGE') AS revoker_as_owner
1247
- FROM pg_attribute v
1248
- JOIN pg_class c ON c.oid = v.attrelid
1249
- CROSS JOIN LATERAL aclexplode(v.attacl) AS a
1250
- WHERE c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = $1)
1422
+ pg_catalog.pg_has_role(current_user, c.relowner, 'USAGE') AS revoker_as_owner
1423
+ FROM pg_catalog.pg_attribute v
1424
+ JOIN pg_catalog.pg_class c ON c.oid = v.attrelid
1425
+ CROSS JOIN LATERAL pg_catalog.aclexplode(v.attacl) AS a
1426
+ WHERE c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = $1)
1251
1427
  AND v.attnum > 0
1252
1428
  AND NOT v.attisdropped
1253
- AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_roles WHERE rolname = $2))
1429
+ AND (a.grantee = 0 OR a.grantee = (SELECT oid FROM pg_catalog.pg_roles WHERE rolname = $2))
1254
1430
  ORDER BY c.relname, v.attname`;
1255
- var readColumnAcls = (pg, schema, role) => Effect15.map(pg.unsafe(COLUMNS_SQL, [schema, role]), (rows) => {
1431
+ var readColumnAcls = (pg, schema, role) => Effect16.map(pg.unsafe(COLUMNS_SQL, [schema, role]), (rows) => {
1256
1432
  const byColumn = new Map;
1257
1433
  for (const row of rows) {
1258
1434
  const key = `${row.table}\x00${row.column}`;
@@ -1275,7 +1451,7 @@ var readColumnAcls = (pg, schema, role) => Effect15.map(pg.unsafe(COLUMNS_SQL, [
1275
1451
  };
1276
1452
  }).sort((a, b) => a.table.localeCompare(b.table) || a.column.localeCompare(b.column));
1277
1453
  });
1278
- var readGrants = (pg, schema, role) => Effect15.all({
1454
+ var readGrants = (pg, schema, role) => Effect16.all({
1279
1455
  schemaExists: schemaExists(pg, schema),
1280
1456
  schema: readSchemaAcl(pg, schema, role),
1281
1457
  tables: readTableAcls(pg, schema, role),
@@ -1286,8 +1462,8 @@ var readGrants = (pg, schema, role) => Effect15.all({
1286
1462
  });
1287
1463
 
1288
1464
  // src/postgres/grants-ops.ts
1289
- var failRefusal = (refusal) => refusal.kind === "privilege" ? Effect16.fail(new PostgresGrantsPrivilegeRefused({ prop: refusal.prop, word: refusal.word })) : Effect16.fail(new PostgresGrantsDuplicateObject({ prop: refusal.prop, name: refusal.name }));
1290
- var proveDatabase = (pg, declared) => Effect16.flatMap(currentDatabase(pg), (connected) => connected === declared ? Effect16.void : Effect16.fail(new PostgresGrantsDatabaseMismatch({ declared, connected })));
1465
+ var failRefusal = (refusal) => refusal.kind === "privilege" ? Effect17.fail(new PostgresGrantsPrivilegeRefused({ prop: refusal.prop, word: refusal.word })) : Effect17.fail(new PostgresGrantsDuplicateObject({ prop: refusal.prop, name: refusal.name }));
1466
+ var proveDatabase = (pg, declared) => Effect17.flatMap(currentDatabase(pg), (connected) => connected === declared ? Effect17.void : Effect17.fail(new PostgresGrantsDatabaseMismatch({ declared, connected })));
1291
1467
  var refuseNames = (props) => {
1292
1468
  const declared = resolveProps(props);
1293
1469
  const names = grantsNamesRefusal(declared);
@@ -1297,30 +1473,30 @@ var refuseNames = (props) => {
1297
1473
  limit: names.limit
1298
1474
  });
1299
1475
  };
1300
- var reconcileWithClient3 = (pg, props, output) => Effect16.gen(function* () {
1476
+ var reconcileWithClient3 = (pg, props, output) => Effect17.gen(function* () {
1301
1477
  const declared = resolveProps(props);
1302
1478
  const declRefusal = declarationRefusal(declared);
1303
1479
  if (declRefusal !== undefined)
1304
1480
  return yield* failRefusal(declRefusal);
1305
1481
  const nameRefusal = refuseNames(props);
1306
1482
  if (nameRefusal !== undefined)
1307
- return yield* Effect16.fail(nameRefusal);
1483
+ return yield* Effect17.fail(nameRefusal);
1308
1484
  for (const [prop, from, to] of [
1309
1485
  ["role", output?.role, declared.role],
1310
1486
  ["database", output?.database, declared.database],
1311
1487
  ["schema", output?.schema, declared.schema]
1312
1488
  ]) {
1313
1489
  if (from !== undefined && from !== to) {
1314
- return yield* Effect16.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
1490
+ return yield* Effect17.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
1315
1491
  }
1316
1492
  }
1317
1493
  yield* proveDatabase(pg, declared.database);
1318
1494
  if (!(yield* schemaExists(pg, declared.schema))) {
1319
- return yield* Effect16.fail(new PostgresGrantsSchemaMissing({ schema: declared.schema }));
1495
+ return yield* Effect17.fail(new PostgresGrantsSchemaMissing({ schema: declared.schema }));
1320
1496
  }
1321
1497
  for (const role of [declared.role, ...declared.defaults.map((entry) => entry.forRole)]) {
1322
1498
  if (!(yield* roleExists(pg, role))) {
1323
- return yield* Effect16.fail(new PostgresGrantsRoleMissing({ role }));
1499
+ return yield* Effect17.fail(new PostgresGrantsRoleMissing({ role }));
1324
1500
  }
1325
1501
  }
1326
1502
  yield* requireDeclaredObjectsExist(pg, declared);
@@ -1332,7 +1508,7 @@ var reconcileWithClient3 = (pg, props, output) => Effect16.gen(function* () {
1332
1508
  const after = yield* readGrants(pg, declared.schema, declared.role);
1333
1509
  const remaining = planReconcile(declared, after, removed);
1334
1510
  if (remaining.length > 0) {
1335
- return yield* Effect16.fail(new PostgresGrantsRepairRefused({
1511
+ return yield* Effect17.fail(new PostgresGrantsRepairRefused({
1336
1512
  schema: declared.schema,
1337
1513
  role: declared.role,
1338
1514
  remaining
@@ -1340,7 +1516,7 @@ var reconcileWithClient3 = (pg, props, output) => Effect16.gen(function* () {
1340
1516
  }
1341
1517
  return attributesOf(after, declaredNames(declared));
1342
1518
  });
1343
- var readWithClient3 = (pg, names, stored) => Effect16.gen(function* () {
1519
+ var readWithClient3 = (pg, names, stored) => Effect17.gen(function* () {
1344
1520
  yield* proveDatabase(pg, names.database);
1345
1521
  if (!(yield* schemaExists(pg, names.schema)))
1346
1522
  return;
@@ -1349,7 +1525,7 @@ var readWithClient3 = (pg, names, stored) => Effect16.gen(function* () {
1349
1525
  const holdsAnything = projected.schemaPrivileges.length > 0 || projected.tables.some((table) => table.privileges.length > 0) || projected.columns.some((column) => column.privileges.length > 0) || projected.defaults.some((entry) => entry.privileges.length > 0);
1350
1526
  return stored || holdsAnything ? projected : undefined;
1351
1527
  });
1352
- var deleteWithClient2 = (pg, props) => Effect16.gen(function* () {
1528
+ var deleteWithClient2 = (pg, props) => Effect17.gen(function* () {
1353
1529
  yield* proveDatabase(pg, props.database);
1354
1530
  if (!(yield* roleExists(pg, props.role)))
1355
1531
  return;
@@ -1363,14 +1539,14 @@ var deleteWithClient2 = (pg, props) => Effect16.gen(function* () {
1363
1539
  const after = yield* readGrants(pg, cleared.schema, cleared.role);
1364
1540
  const remaining = planRepair(cleared, after);
1365
1541
  if (remaining.length > 0) {
1366
- return yield* Effect16.fail(new PostgresGrantsRepairRefused({
1542
+ return yield* Effect17.fail(new PostgresGrantsRepairRefused({
1367
1543
  schema: cleared.schema,
1368
1544
  role: cleared.role,
1369
1545
  remaining
1370
1546
  }));
1371
1547
  }
1372
1548
  });
1373
- var diffPostgresGrants = (news, output) => Effect16.gen(function* () {
1549
+ var diffPostgresGrants = (news, output) => Effect17.gen(function* () {
1374
1550
  if (output === undefined || !isResolved3(news))
1375
1551
  return;
1376
1552
  const declared = resolveProps(news);
@@ -1380,12 +1556,12 @@ var diffPostgresGrants = (news, output) => Effect16.gen(function* () {
1380
1556
  ["schema", output.schema, declared.schema]
1381
1557
  ]) {
1382
1558
  if (from !== to) {
1383
- return yield* Effect16.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
1559
+ return yield* Effect17.fail(new PostgresGrantsRetargetRefused({ prop, from, to }));
1384
1560
  }
1385
1561
  }
1386
1562
  const nameRefusal = refuseNames(news);
1387
1563
  if (nameRefusal !== undefined)
1388
- return yield* Effect16.fail(nameRefusal);
1564
+ return yield* Effect17.fail(nameRefusal);
1389
1565
  const declRefusal = declarationRefusal(declared);
1390
1566
  if (declRefusal !== undefined)
1391
1567
  return yield* failRefusal(declRefusal);
@@ -1398,9 +1574,9 @@ var PostgresGrants = Resource3("Postgres.Grants", {
1398
1574
  });
1399
1575
  var isPostgresGrants = (value) => (typeof value === "object" || typeof value === "function") && value !== null && value.Type === "Postgres.Grants";
1400
1576
  var postgresGrantsHandlers = PostgresGrants.Provider.of({
1401
- list: () => Effect17.succeed([]),
1577
+ list: () => Effect18.succeed([]),
1402
1578
  nuke: { skip: true },
1403
- read: ({ olds, output }) => Effect17.gen(function* () {
1579
+ read: ({ olds, output }) => Effect18.gen(function* () {
1404
1580
  const names = output !== undefined ? namesFromAttrs(output) : declaredNames(resolveProps(olds));
1405
1581
  const present = yield* withPg((pg) => databaseExists(pg, names.database));
1406
1582
  if (!present)
@@ -1409,14 +1585,14 @@ var postgresGrantsHandlers = PostgresGrants.Provider.of({
1409
1585
  return live === undefined ? undefined : Unowned3(live);
1410
1586
  }),
1411
1587
  diff: ({ news, output }) => diffPostgresGrants(news, output),
1412
- reconcile: ({ news, output }) => Effect17.gen(function* () {
1588
+ reconcile: ({ news, output }) => Effect18.gen(function* () {
1413
1589
  const present = yield* withPg((pg) => databaseExists(pg, news.database));
1414
1590
  if (!present) {
1415
- return yield* Effect17.fail(new PostgresGrantsDatabaseMissing({ database: news.database }));
1591
+ return yield* Effect18.fail(new PostgresGrantsDatabaseMissing({ database: news.database }));
1416
1592
  }
1417
1593
  return yield* withPg((pg) => reconcileWithClient3(pg, news, output), news.database);
1418
1594
  }),
1419
- delete: ({ olds }) => Effect17.gen(function* () {
1595
+ delete: ({ olds }) => Effect18.gen(function* () {
1420
1596
  const present = yield* withPg((pg) => databaseExists(pg, olds.database));
1421
1597
  if (!present)
1422
1598
  return;
@@ -1435,70 +1611,70 @@ var validUntilRefusal = (value) => {
1435
1611
  };
1436
1612
  var sameValidUntil = (declared, live) => live !== null && Date.parse(declared) === Date.parse(live);
1437
1613
  // src/postgres/role-sql.ts
1438
- import * as Effect19 from "effect/Effect";
1614
+ import * as Effect20 from "effect/Effect";
1439
1615
 
1440
1616
  // src/postgres/role-membership-sql.ts
1441
- import * as Effect18 from "effect/Effect";
1617
+ import * as Effect19 from "effect/Effect";
1442
1618
 
1443
1619
  // src/postgres/role-errors.ts
1444
- import * as Data4 from "effect/Data";
1620
+ import * as Data5 from "effect/Data";
1445
1621
 
1446
- class PostgresRoleNameRefused extends Data4.TaggedError("PostgresRoleNameRefused") {
1622
+ class PostgresRoleNameRefused extends Data5.TaggedError("PostgresRoleNameRefused") {
1447
1623
  get message() {
1448
1624
  return `Postgres.Role "${this.name}": ${String(this.byteLength)} UTF-8 bytes, over the ` + `${String(this.limit)}-byte limit (NAMEDATALEN 64, minus the terminator). PostgreSQL would ` + "accept the CREATE and silently truncate the name with only a NOTICE, so this plan refuses " + "it instead of creating a role no later read will ever find again.";
1449
1625
  }
1450
1626
  }
1451
1627
 
1452
- class PostgresRoleRenameRefused extends Data4.TaggedError("PostgresRoleRenameRefused") {
1628
+ class PostgresRoleRenameRefused extends Data5.TaggedError("PostgresRoleRenameRefused") {
1453
1629
  get message() {
1454
1630
  return `Postgres.Role: the declared name changed from "${this.from}" to "${this.to}". A ` + "rename is refused at plan — this provider never replaces a role (that is DROP then " + "CREATE, which loses memberships, grants and ownerships). Declare a new logical id for " + "the new name, and remove the old one once its objects have moved.";
1455
1631
  }
1456
1632
  }
1457
1633
 
1458
- class PostgresRolePasswordEnvUnsetError extends Data4.TaggedError("PostgresRolePasswordEnvUnsetError") {
1634
+ class PostgresRolePasswordEnvUnsetError extends Data5.TaggedError("PostgresRolePasswordEnvUnsetError") {
1459
1635
  get message() {
1460
1636
  return `Postgres.Role "${this.role}": password.fromEnv "${this.variable}" is unset or empty ` + "in the deploying process, but this write requires a password this stack has not sealed.";
1461
1637
  }
1462
1638
  }
1463
1639
 
1464
- class PostgresRolePrivilegedRefused extends Data4.TaggedError("PostgresRolePrivilegedRefused") {
1640
+ class PostgresRolePrivilegedRefused extends Data5.TaggedError("PostgresRolePrivilegedRefused") {
1465
1641
  get message() {
1466
1642
  return `Postgres.Role "${this.role}": the live role has ${this.flags.join(", ")} set. This ` + "family never declares those attributes (a create lands on the server default, all off), " + "and they are not inherited — a member who SET ROLEs to this role would exercise them. " + "Clear the flag on the cluster before this stack adopts the role.";
1467
1643
  }
1468
1644
  }
1469
1645
 
1470
- class PostgresRoleValidUntilRefused extends Data4.TaggedError("PostgresRoleValidUntilRefused") {
1646
+ class PostgresRoleValidUntilRefused extends Data5.TaggedError("PostgresRoleValidUntilRefused") {
1471
1647
  get message() {
1472
1648
  return `Postgres.Role "${this.role}": validUntil "${this.value}" is ${this.reason === "unparseable" ? "not a timestamp this kit can parse" : "missing its UTC designator or numeric offset"}. ` + 'Declare an explicit-zone ISO 8601 value such as "2027-01-01T00:00:00Z" — PostgreSQL would ' + "read a zone-free value in the session time zone while the plan compares UTC, and the two " + "would never agree.";
1473
1649
  }
1474
1650
  }
1475
1651
 
1476
- class PostgresRoleCreateVanished extends Data4.TaggedError("PostgresRoleCreateVanished") {
1652
+ class PostgresRoleCreateVanished extends Data5.TaggedError("PostgresRoleCreateVanished") {
1477
1653
  get message() {
1478
1654
  return `Postgres.Role "${this.role}": CREATE ROLE raised no error, but the role is still ` + "absent on the immediate re-read. Re-plan — this is not a state this provider expects to reach.";
1479
1655
  }
1480
1656
  }
1481
1657
 
1482
- class PostgresRoleMembershipUnrepaired extends Data4.TaggedError("PostgresRoleMembershipUnrepaired") {
1658
+ class PostgresRoleMembershipUnrepaired extends Data5.TaggedError("PostgresRoleMembershipUnrepaired") {
1483
1659
  get message() {
1484
1660
  const who = this.grantor === null ? "an unresolvable grantor (inconsistent catalog)" : `grantor "${this.grantor}"`;
1485
1661
  return `Postgres.Role "${this.role}": membership of "${this.parent}" ` + `(${this.declared ? "declared, options unsafe" : "not declared"}) could not be repaired ` + `under ${who}. The server refused the repair or the catalog re-read still found the row ` + "outside the declaration. pg_auth_members keys a membership on (parent, member, grantor). " + "Check dependent grants, executor permissions and grantor identity before re-planning.";
1486
1662
  }
1487
1663
  }
1488
1664
 
1489
- class PostgresRoleParentMissing extends Data4.TaggedError("PostgresRoleParentMissing") {
1665
+ class PostgresRoleParentMissing extends Data5.TaggedError("PostgresRoleParentMissing") {
1490
1666
  get message() {
1491
1667
  return `Postgres.Role "${this.role}": memberOf parent "${this.parent}" does not exist. ` + "Nothing was written — declare that role first (or drop it from memberOf). A GRANT of a " + "missing role fails only after CREATE ROLE has committed, and the next plan then needs " + "--adopt to finish the orphan.";
1492
1668
  }
1493
1669
  }
1494
1670
 
1495
- class PostgresRoleIdentityRefused extends Data4.TaggedError("PostgresRoleIdentityRefused") {
1671
+ class PostgresRoleIdentityRefused extends Data5.TaggedError("PostgresRoleIdentityRefused") {
1496
1672
  get message() {
1497
1673
  return `Postgres.Role "${this.role}": the live oid is ${String(this.liveOid)}, but state recorded ` + `${String(this.storedOid)}. The name was dropped and recreated outside this stack. Nothing ` + "was altered and the live role was not dropped — remove the stale state, or adopt the new " + "role under a new logical id once you mean to own it.";
1498
1674
  }
1499
1675
  }
1500
1676
 
1501
- class PostgresRolePasswordNonAsciiRefused extends Data4.TaggedError("PostgresRolePasswordNonAsciiRefused") {
1677
+ class PostgresRolePasswordNonAsciiRefused extends Data5.TaggedError("PostgresRolePasswordNonAsciiRefused") {
1502
1678
  get message() {
1503
1679
  return `Postgres.Role "${this.role}": password must be ASCII; this provider does not implement PostgreSQL SASLprep normalization. Nothing was written.`;
1504
1680
  }
@@ -1510,13 +1686,13 @@ var MEMBERSHIP_SQL = `SELECT parent.rolname AS parent,
1510
1686
  m.admin_option AS admin,
1511
1687
  m.set_option AS set,
1512
1688
  m.inherit_option AS inherit
1513
- FROM pg_auth_members m
1514
- JOIN pg_roles member ON member.oid = m.member
1515
- JOIN pg_roles parent ON parent.oid = m.roleid
1516
- LEFT JOIN pg_roles grantor ON grantor.oid = m.grantor
1689
+ FROM pg_catalog.pg_auth_members m
1690
+ JOIN pg_catalog.pg_roles member ON member.oid = m.member
1691
+ JOIN pg_catalog.pg_roles parent ON parent.oid = m.roleid
1692
+ LEFT JOIN pg_catalog.pg_roles grantor ON grantor.oid = m.grantor
1517
1693
  WHERE member.rolname = $1
1518
1694
  ORDER BY parent.rolname, grantor.rolname NULLS FIRST`;
1519
- var selectRoleMemberships = (pg, name) => Effect18.map(pg.unsafe(MEMBERSHIP_SQL, [name]), (rows) => rows);
1695
+ var selectRoleMemberships = (pg, name) => Effect19.map(pg.unsafe(MEMBERSHIP_SQL, [name]), (rows) => rows);
1520
1696
  var buildGrantMembershipSql = (member, parent) => `GRANT ${quoteIdent(parent)} TO ${quoteIdent(member)} WITH SET FALSE`;
1521
1697
  var buildRepairMembershipSql = (member, parent, grantor, option) => `REVOKE ${option} OPTION FOR ${quoteIdent(parent)} FROM ${quoteIdent(member)} GRANTED BY ${quoteIdent(grantor)} RESTRICT`;
1522
1698
  var buildRevokeGrantorMembershipSql = (member, parent, grantor) => `REVOKE ${quoteIdent(parent)} FROM ${quoteIdent(member)} GRANTED BY ${quoteIdent(grantor)}`;
@@ -1534,16 +1710,16 @@ var membershipDrift = (declared, live, unsafe = new Set) => {
1534
1710
  ]
1535
1711
  };
1536
1712
  };
1537
- var assertParentsExist = (pg, role, parents) => Effect18.gen(function* () {
1713
+ var assertParentsExist = (pg, role, parents) => Effect19.gen(function* () {
1538
1714
  if (parents === undefined)
1539
1715
  return;
1540
1716
  for (const parent of [...new Set(parents)].sort()) {
1541
1717
  if (!(yield* roleExists(pg, parent))) {
1542
- return yield* Effect18.fail(new PostgresRoleParentMissing({ role, parent }));
1718
+ return yield* Effect19.fail(new PostgresRoleParentMissing({ role, parent }));
1543
1719
  }
1544
1720
  }
1545
1721
  });
1546
- var syncMemberships = (pg, props, rows) => Effect18.gen(function* () {
1722
+ var syncMemberships = (pg, props, rows) => Effect19.gen(function* () {
1547
1723
  if (props.memberOf === undefined) {
1548
1724
  return [...new Set(rows.map((row) => row.parent))].sort();
1549
1725
  }
@@ -1568,10 +1744,10 @@ var syncMemberships = (pg, props, rows) => Effect18.gen(function* () {
1568
1744
  }
1569
1745
  }
1570
1746
  if (statements.length > 0)
1571
- yield* pg.transaction(statements).pipe(Effect18.catchTag("SqlError", (error) => {
1747
+ yield* pg.transaction(statements).pipe(Effect19.catchTag("SqlError", (error) => {
1572
1748
  const cause = error.reason.cause;
1573
1749
  const code = typeof cause === "object" && cause !== null ? cause.code : undefined;
1574
- return Effect18.fail(code === "2BP01" || code === "42501" ? new PostgresRoleMembershipUnrepaired({
1750
+ return Effect19.fail(code === "2BP01" || code === "42501" ? new PostgresRoleMembershipUnrepaired({
1575
1751
  role: props.name,
1576
1752
  parent: row.parent,
1577
1753
  grantor: row.grantor,
@@ -1584,7 +1760,7 @@ var syncMemberships = (pg, props, rows) => Effect18.gen(function* () {
1584
1760
  yield* pg.transaction(grants);
1585
1761
  for (const row of yield* selectRoleMemberships(pg, props.name)) {
1586
1762
  if (!wanted.includes(row.parent) || row.admin || row.set || row.inherit && !props.inherit) {
1587
- return yield* Effect18.fail(new PostgresRoleMembershipUnrepaired({
1763
+ return yield* Effect19.fail(new PostgresRoleMembershipUnrepaired({
1588
1764
  role: props.name,
1589
1765
  parent: row.parent,
1590
1766
  grantor: row.grantor,
@@ -1608,10 +1784,10 @@ var SELECT_ROLE_SQL = `SELECT
1608
1784
  r.rolreplication AS replication,
1609
1785
  r.rolbypassrls AS bypassrls,
1610
1786
  to_char(r.rolvaliduntil AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') AS "validUntil"
1611
- FROM pg_roles r
1787
+ FROM pg_catalog.pg_roles r
1612
1788
  WHERE r.rolname = $1`;
1613
- var selectRole = (pg, name) => Effect19.map(pg.unsafe(SELECT_ROLE_SQL, [name]), (rows) => rows[0]);
1614
- var readRoleWithClient = (pg, name) => Effect19.gen(function* () {
1789
+ var selectRole = (pg, name) => Effect20.map(pg.unsafe(SELECT_ROLE_SQL, [name]), (rows) => rows[0]);
1790
+ var readRoleWithClient = (pg, name) => Effect20.gen(function* () {
1615
1791
  const row = yield* selectRole(pg, name);
1616
1792
  if (row === undefined)
1617
1793
  return;
@@ -1692,12 +1868,12 @@ var privilegedFlags = (live) => {
1692
1868
  };
1693
1869
  // src/postgres/role.ts
1694
1870
  import { Resource as Resource4 } from "alchemy";
1695
- import * as Effect21 from "effect/Effect";
1871
+ import * as Effect22 from "effect/Effect";
1696
1872
  import * as Redacted2 from "effect/Redacted";
1697
1873
 
1698
1874
  // src/postgres/role-secrets.ts
1699
1875
  import * as Redacted from "effect/Redacted";
1700
- import * as Effect20 from "effect/Effect";
1876
+ import * as Effect21 from "effect/Effect";
1701
1877
 
1702
1878
  // src/secrets/write-only.ts
1703
1879
  import { Buffer } from "node:buffer";
@@ -1737,7 +1913,7 @@ var sealMatches = (sealed, values) => {
1737
1913
  };
1738
1914
 
1739
1915
  // src/postgres/role-secrets.ts
1740
- var assertPasswordAscii = (role, resolved) => resolved.value !== undefined && /[\u0080-\uffff]/.test(Redacted.value(resolved.value)) ? Effect20.fail(new PostgresRolePasswordNonAsciiRefused({ role })) : Effect20.void;
1916
+ var assertPasswordAscii = (role, resolved) => resolved.value !== undefined && /[\u0080-\uffff]/.test(Redacted.value(resolved.value)) ? Effect21.fail(new PostgresRolePasswordNonAsciiRefused({ role })) : Effect21.void;
1741
1917
  var resolvePassword = (props, env = process.env) => {
1742
1918
  if (props.password === undefined)
1743
1919
  return { variable: undefined, value: undefined };
@@ -1771,20 +1947,20 @@ var PostgresRole = Resource4("Postgres.Role", {
1771
1947
  defaultRemovalPolicy: "retain"
1772
1948
  });
1773
1949
  var isPostgresRole = (value3) => (typeof value3 === "object" || typeof value3 === "function") && value3 !== null && value3.Type === "Postgres.Role";
1774
- var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", storedOid) => Effect21.gen(function* () {
1950
+ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", storedOid) => Effect22.gen(function* () {
1775
1951
  const resolved = resolvePassword(props, env);
1776
1952
  yield* assertPasswordAscii(props.name, resolved);
1777
1953
  const observed = yield* readRoleWithClient(pg, props.name);
1778
1954
  if (observed === undefined) {
1779
1955
  if (resolved.variable !== undefined && resolved.value === undefined) {
1780
- return yield* Effect21.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
1956
+ return yield* Effect22.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
1781
1957
  }
1782
1958
  yield* assertParentsExist(pg, props.name, props.memberOf);
1783
1959
  const verifier = resolved.value === undefined ? undefined : scramSha256Verifier(Redacted2.value(resolved.value));
1784
1960
  yield* pg.transaction(buildCreateStatements(props, verifier));
1785
1961
  const created = yield* readRoleWithClient(pg, props.name);
1786
1962
  if (created === undefined) {
1787
- return yield* Effect21.fail(new PostgresRoleCreateVanished({ role: props.name }));
1963
+ return yield* Effect22.fail(new PostgresRoleCreateVanished({ role: props.name }));
1788
1964
  }
1789
1965
  return {
1790
1966
  ...storedAttributes(created),
@@ -1792,7 +1968,7 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
1792
1968
  };
1793
1969
  }
1794
1970
  if (storedOid !== undefined && observed.oid !== storedOid) {
1795
- return yield* Effect21.fail(new PostgresRoleIdentityRefused({
1971
+ return yield* Effect22.fail(new PostgresRoleIdentityRefused({
1796
1972
  role: props.name,
1797
1973
  storedOid,
1798
1974
  liveOid: observed.oid
@@ -1800,23 +1976,23 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
1800
1976
  }
1801
1977
  const flags = privilegedFlags(observed);
1802
1978
  if (flags.length > 0) {
1803
- return yield* Effect21.fail(new PostgresRolePrivilegedRefused({ role: props.name, flags }));
1979
+ return yield* Effect22.fail(new PostgresRolePrivilegedRefused({ role: props.name, flags }));
1804
1980
  }
1805
1981
  if (resolved.variable !== undefined && resolved.value === undefined && previousSeal === "") {
1806
- return yield* Effect21.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
1982
+ return yield* Effect22.fail(new PostgresRolePasswordEnvUnsetError({ role: props.name, variable: resolved.variable }));
1807
1983
  }
1808
1984
  yield* assertParentsExist(pg, props.name, props.memberOf);
1809
1985
  for (const change of scalarDrift(props, observed)) {
1810
- yield* pg.unsafe(buildAlterRoleSql(props.name, change)).pipe(Effect21.asVoid);
1986
+ yield* pg.unsafe(buildAlterRoleSql(props.name, change)).pipe(Effect22.asVoid);
1811
1987
  }
1812
1988
  const passwordMatched = resolved.value !== undefined && passwordMatchesSeal(resolved.value, previousSeal);
1813
1989
  if (resolved.value !== undefined && !passwordMatched) {
1814
- yield* pg.unsafe(buildSetPasswordSql(props.name, scramSha256Verifier(Redacted2.value(resolved.value)))).pipe(Effect21.asVoid);
1990
+ yield* pg.unsafe(buildSetPasswordSql(props.name, scramSha256Verifier(Redacted2.value(resolved.value)))).pipe(Effect22.asVoid);
1815
1991
  }
1816
1992
  yield* syncMemberships(pg, props, observed.memberships ?? []);
1817
1993
  const after = yield* readRoleWithClient(pg, props.name);
1818
1994
  if (after === undefined) {
1819
- return yield* Effect21.fail(new PostgresRoleCreateVanished({ role: props.name }));
1995
+ return yield* Effect22.fail(new PostgresRoleCreateVanished({ role: props.name }));
1820
1996
  }
1821
1997
  return {
1822
1998
  ...storedAttributes(after),
@@ -1824,15 +2000,15 @@ var reconcileWithClient4 = (pg, props, env = process.env, previousSeal = "", sto
1824
2000
  };
1825
2001
  });
1826
2002
  var readRole = (pg, name) => readRoleWithClient(pg, name);
1827
- var refuseAtPlan = (props) => Effect21.gen(function* () {
2003
+ var refuseAtPlan = (props) => Effect22.gen(function* () {
1828
2004
  const nameRefusal = nameByteRefusal(props.name);
1829
2005
  if (nameRefusal !== undefined) {
1830
- return yield* Effect21.fail(new PostgresRoleNameRefused({ name: props.name, ...nameRefusal }));
2006
+ return yield* Effect22.fail(new PostgresRoleNameRefused({ name: props.name, ...nameRefusal }));
1831
2007
  }
1832
2008
  if (props.validUntil !== undefined) {
1833
2009
  const untilRefusal = validUntilRefusal(props.validUntil);
1834
2010
  if (untilRefusal !== undefined) {
1835
- return yield* Effect21.fail(new PostgresRoleValidUntilRefused({
2011
+ return yield* Effect22.fail(new PostgresRoleValidUntilRefused({
1836
2012
  role: props.name,
1837
2013
  value: props.validUntil,
1838
2014
  reason: untilRefusal.reason
@@ -1843,22 +2019,65 @@ var refuseAtPlan = (props) => Effect21.gen(function* () {
1843
2019
  // src/postgres/role-provider.ts
1844
2020
  import * as Provider4 from "alchemy/Provider";
1845
2021
  import { isResolved as isResolved5 } from "alchemy/Diff";
1846
- import * as Effect28 from "effect/Effect";
2022
+ import * as Effect29 from "effect/Effect";
1847
2023
 
1848
2024
  // src/ownership/probe.ts
2025
+ import { Unowned as Unowned5 } from "alchemy/AdoptPolicy";
2026
+ import * as Effect26 from "effect/Effect";
2027
+ import * as Option4 from "effect/Option";
2028
+
2029
+ // src/ownership/resume.ts
1849
2030
  import { Unowned as Unowned4 } from "alchemy/AdoptPolicy";
1850
- import * as Effect24 from "effect/Effect";
2031
+ import { Artifacts } from "alchemy/Artifacts";
2032
+ import * as Effect23 from "effect/Effect";
2033
+ import * as Option from "effect/Option";
2034
+ var PROVEN = "homeflare/ownership/resumes";
2035
+ var UNFINISHED = "homeflare/ownership/unfinished";
2036
+ var note = (key, instanceId) => Effect23.gen(function* () {
2037
+ const bag = yield* Effect23.serviceOption(Artifacts);
2038
+ if (Option.isSome(bag))
2039
+ yield* bag.value.set(key, instanceId);
2040
+ });
2041
+ var noted = (key, instanceId) => Effect23.gen(function* () {
2042
+ const bag = yield* Effect23.serviceOption(Artifacts);
2043
+ if (Option.isNone(bag))
2044
+ return false;
2045
+ return (yield* bag.value.get(key)) === instanceId;
2046
+ });
2047
+ var noteUnfinished = (instanceId) => Effect23.as(note(UNFINISHED, instanceId), undefined);
2048
+ var noteResume = (instanceId, recovered) => Effect23.gen(function* () {
2049
+ yield* noteUnfinished(instanceId);
2050
+ const unproven = () => Effect23.succeed(undefined);
2051
+ const found = yield* recovered.pipe(Effect23.catch(unproven), Effect23.catchDefect(unproven));
2052
+ if (found === undefined || found === null || Unowned4.is(found))
2053
+ return;
2054
+ yield* note(PROVEN, instanceId);
2055
+ });
2056
+ var resumes = (instanceId) => noted(PROVEN, instanceId);
2057
+ var unfinished = (instanceId) => noted(UNFINISHED, instanceId);
2058
+ var provingResumes = (service) => {
2059
+ const { diff, read } = service;
2060
+ if (diff === undefined || read === undefined)
2061
+ return service;
2062
+ const proving = (input) => Effect23.gen(function* () {
2063
+ if (input.output === undefined) {
2064
+ yield* noteResume(input.instanceId, read({ ...input, output: undefined }));
2065
+ }
2066
+ return yield* diff(input);
2067
+ });
2068
+ return { ...service, diff: proving };
2069
+ };
1851
2070
 
1852
2071
  // src/ownership/rows.ts
1853
2072
  import { Stack as Stack2 } from "alchemy/Stack";
1854
2073
  import { State, isActionState } from "alchemy/State/State";
1855
- import * as Effect23 from "effect/Effect";
1856
- import * as Option2 from "effect/Option";
2074
+ import * as Effect25 from "effect/Effect";
2075
+ import * as Option3 from "effect/Option";
1857
2076
 
1858
2077
  // src/ownership/whole.ts
1859
2078
  import { Stack } from "alchemy/Stack";
1860
- import * as Effect22 from "effect/Effect";
1861
- import * as Option from "effect/Option";
2079
+ import * as Effect24 from "effect/Effect";
2080
+ import * as Option2 from "effect/Option";
1862
2081
  var absent = (value3) => value3 === undefined || value3 === null;
1863
2082
  var isPlainObject = (value3) => {
1864
2083
  if (typeof value3 !== "object" || value3 === null || Array.isArray(value3))
@@ -1883,22 +2102,22 @@ var carries = (declared, recorded) => {
1883
2102
  }
1884
2103
  return true;
1885
2104
  };
1886
- var wholeDeclaration = (fqn, props) => Effect22.map(Effect22.serviceOption(Stack), (stack) => {
1887
- const declared = Option.isSome(stack) ? stack.value.resources[fqn] : undefined;
2105
+ var wholeDeclaration = (fqn, props) => Effect24.map(Effect24.serviceOption(Stack), (stack) => {
2106
+ const declared = Option2.isSome(stack) ? stack.value.resources[fqn] : undefined;
1888
2107
  return declared !== undefined && carries(declared.Props, props);
1889
2108
  });
1890
2109
 
1891
2110
  // src/ownership/rows.ts
1892
- var storeOf = Effect23.gen(function* () {
1893
- const stack = yield* Effect23.serviceOption(Stack2);
1894
- const state = yield* Effect23.serviceOption(State);
1895
- if (Option2.isNone(stack) || Option2.isNone(state))
2111
+ var storeOf = Effect25.gen(function* () {
2112
+ const stack = yield* Effect25.serviceOption(Stack2);
2113
+ const state = yield* Effect25.serviceOption(State);
2114
+ if (Option3.isNone(stack) || Option3.isNone(state))
1896
2115
  return;
1897
2116
  const store = yield* state.value;
1898
2117
  const where = { stack: stack.value.name, stage: stack.value.stage };
1899
2118
  return { resources: stack.value.resources, store, where };
1900
2119
  });
1901
- var rowAt = (store, where, fqn) => store.get({ ...where, fqn }).pipe(Effect23.orElseSucceed(() => {
2120
+ var rowAt = (store, where, fqn) => store.get({ ...where, fqn }).pipe(Effect25.orElseSucceed(() => {
1902
2121
  return;
1903
2122
  }));
1904
2123
  var generationOf = (row, instanceId) => {
@@ -1911,7 +2130,7 @@ var generationOf = (row, instanceId) => {
1911
2130
  }
1912
2131
  return;
1913
2132
  };
1914
- var recordedGeneration = (fqn, instanceId) => Effect23.gen(function* () {
2133
+ var recordedGeneration = (fqn, instanceId) => Effect25.gen(function* () {
1915
2134
  const found = yield* storeOf;
1916
2135
  if (found === undefined)
1917
2136
  return;
@@ -1922,20 +2141,20 @@ var recordedGeneration = (fqn, instanceId) => Effect23.gen(function* () {
1922
2141
  }
1923
2142
  return;
1924
2143
  });
1925
- var recordedInstance = (fqn, instanceId) => Effect23.gen(function* () {
2144
+ var recordedInstance = (fqn, instanceId) => Effect25.gen(function* () {
1926
2145
  const generation = yield* recordedGeneration(fqn, instanceId);
1927
2146
  if (generation === undefined)
1928
2147
  return "absent";
1929
2148
  return (yield* wholeDeclaration(fqn, generation.props)) ? "whole" : "partial";
1930
2149
  });
1931
- var isCreate = (fqn, instanceId) => Effect23.map(recordedGeneration(fqn, instanceId), (generation) => generation?.status === "creating");
2150
+ var isCreate = (fqn, instanceId) => Effect25.map(recordedGeneration(fqn, instanceId), (generation) => generation?.status === "creating");
1932
2151
  var idOf = (attr) => {
1933
2152
  if (typeof attr !== "object" || attr === null)
1934
2153
  return;
1935
2154
  const id = attr.id;
1936
2155
  return typeof id === "string" && id !== "" ? id : undefined;
1937
2156
  };
1938
- var olderGenerationIds = (fqn, instanceId) => Effect23.gen(function* () {
2157
+ var olderGenerationIds = (fqn, instanceId) => Effect25.gen(function* () {
1939
2158
  const found = yield* storeOf;
1940
2159
  if (found === undefined)
1941
2160
  return [];
@@ -1963,7 +2182,7 @@ var collectOlder = (row, instanceId, ids) => {
1963
2182
  at = generation.old;
1964
2183
  }
1965
2184
  };
1966
- var forgetRefusedCreate = (fqn, instanceId) => Effect23.gen(function* () {
2185
+ var forgetRefusedCreate = (fqn, instanceId) => Effect25.gen(function* () {
1967
2186
  const found = yield* storeOf;
1968
2187
  if (found === undefined)
1969
2188
  return;
@@ -1972,97 +2191,75 @@ var forgetRefusedCreate = (fqn, instanceId) => Effect23.gen(function* () {
1972
2191
  if (mine?.status !== "creating" || mine.instanceId !== instanceId || mine.attr !== undefined) {
1973
2192
  return;
1974
2193
  }
1975
- yield* found.store.delete({ ...found.where, fqn }).pipe(Effect23.ignore);
2194
+ yield* found.store.delete({ ...found.where, fqn }).pipe(Effect25.ignore);
1976
2195
  });
1977
2196
 
1978
2197
  // src/ownership/probe.ts
1979
- var provenOurs = (ask, settled) => Effect24.gen(function* () {
2198
+ var inApplyResource = (span) => {
2199
+ let at = span;
2200
+ while (at !== undefined && at._tag === "Span") {
2201
+ if (at.name === "apply.resource")
2202
+ return true;
2203
+ at = Option4.getOrUndefined(at.parent);
2204
+ }
2205
+ return false;
2206
+ };
2207
+ var isCreatesRead = (span) => {
2208
+ const current = Option4.getOrUndefined(span);
2209
+ return current?.name === "provider.read" && inApplyResource(current);
2210
+ };
2211
+ var readsAtApply = Effect26.map(Effect26.option(Effect26.currentSpan), isCreatesRead);
2212
+ var provenOurs = (ask, settled) => Effect26.gen(function* () {
2213
+ if (yield* readsAtApply)
2214
+ return yield* resumes(ask.instanceId);
1980
2215
  const recorded = yield* recordedInstance(ask.fqn, ask.instanceId);
1981
2216
  if (recorded === "absent")
1982
2217
  return false;
1983
2218
  if (recorded === "partial") {
1984
- yield* Effect24.logWarning(`${ask.fqn}: the interrupted create's state row lacks part of the declaration (a prop ` + "was still an Output when it was written), so the live object is not proven ours");
2219
+ yield* Effect26.logWarning(`${ask.fqn}: the interrupted create's state row lacks part of the declaration (a prop ` + "was still an Output when it was written), so the live object is not proven ours");
1985
2220
  return false;
1986
2221
  }
1987
- const unproven = (reason) => Effect24.as(Effect24.logWarning(`${ask.fqn}: the interrupted create's object could not be compared with its props ` + `(${reason instanceof Error ? reason.message : String(reason)}), so it is not treated as ours`), false);
1988
- return yield* settled.pipe(Effect24.catch(unproven), Effect24.catchDefect(unproven));
2222
+ const unproven = (reason) => Effect26.as(Effect26.logWarning(`${ask.fqn}: the interrupted create's object could not be compared with its props ` + `(${reason instanceof Error ? reason.message : String(reason)}), so it is not treated as ours`), false);
2223
+ return yield* settled.pipe(Effect26.catch(unproven), Effect26.catchDefect(unproven));
1989
2224
  });
1990
- var ownedRead = (ask, found, settled) => Effect24.gen(function* () {
2225
+ var ownedRead = (ask, found, settled) => Effect26.gen(function* () {
1991
2226
  if (found === undefined || ask.output !== undefined)
1992
2227
  return found;
1993
- return (yield* provenOurs(ask, settled)) ? found : Unowned4(found);
1994
- });
1995
-
1996
- // src/ownership/resume.ts
1997
- import { Unowned as Unowned5 } from "alchemy/AdoptPolicy";
1998
- import { Artifacts } from "alchemy/Artifacts";
1999
- import * as Effect25 from "effect/Effect";
2000
- import * as Option3 from "effect/Option";
2001
- var PROVEN = "homeflare/ownership/resumes";
2002
- var UNFINISHED = "homeflare/ownership/unfinished";
2003
- var note = (key, instanceId) => Effect25.gen(function* () {
2004
- const bag = yield* Effect25.serviceOption(Artifacts);
2005
- if (Option3.isSome(bag))
2006
- yield* bag.value.set(key, instanceId);
2007
- });
2008
- var noted = (key, instanceId) => Effect25.gen(function* () {
2009
- const bag = yield* Effect25.serviceOption(Artifacts);
2010
- if (Option3.isNone(bag))
2011
- return false;
2012
- return (yield* bag.value.get(key)) === instanceId;
2013
- });
2014
- var noteUnfinished = (instanceId) => Effect25.as(note(UNFINISHED, instanceId), undefined);
2015
- var noteResume = (instanceId, recovered) => Effect25.gen(function* () {
2016
- yield* noteUnfinished(instanceId);
2017
- const unproven = () => Effect25.succeed(undefined);
2018
- const found = yield* recovered.pipe(Effect25.catch(unproven), Effect25.catchDefect(unproven));
2019
- if (found === undefined || found === null || Unowned5.is(found))
2020
- return;
2021
- yield* note(PROVEN, instanceId);
2228
+ if (yield* provenOurs(ask, settled))
2229
+ return found;
2230
+ if (yield* readsAtApply)
2231
+ yield* forgetRefusedCreate(ask.fqn, ask.instanceId);
2232
+ return Unowned5(found);
2022
2233
  });
2023
- var resumes = (instanceId) => noted(PROVEN, instanceId);
2024
- var unfinished = (instanceId) => noted(UNFINISHED, instanceId);
2025
- var provingResumes = (service) => {
2026
- const { diff, read } = service;
2027
- if (diff === undefined || read === undefined)
2028
- return service;
2029
- const proving = (input) => Effect25.gen(function* () {
2030
- if (input.output === undefined) {
2031
- yield* noteResume(input.instanceId, read({ ...input, output: undefined }));
2032
- }
2033
- return yield* diff(input);
2034
- });
2035
- return { ...service, diff: proving };
2036
- };
2037
2234
 
2038
2235
  // src/ownership/adopt.ts
2039
2236
  import { AdoptPolicy } from "alchemy/AdoptPolicy";
2040
2237
  import { AlchemyContext } from "alchemy/AlchemyContext";
2041
2238
  import { Stack as Stack3 } from "alchemy/Stack";
2042
- import * as Effect26 from "effect/Effect";
2043
- import * as Option4 from "effect/Option";
2044
- var adoptEnabled = (fqn) => Effect26.gen(function* () {
2045
- const stack = yield* Effect26.serviceOption(Stack3);
2046
- const scoped = Option4.isSome(stack) ? stack.value.resources[fqn]?.Adopt : undefined;
2047
- if (scoped !== undefined)
2048
- return scoped;
2049
- const policy = yield* Effect26.serviceOption(AdoptPolicy);
2050
- if (Option4.isSome(policy))
2239
+ import * as Effect27 from "effect/Effect";
2240
+ import * as Option5 from "effect/Option";
2241
+ var adoptEnabled = (fqn) => Effect27.gen(function* () {
2242
+ const stack = yield* Effect27.serviceOption(Stack3);
2243
+ const scoped2 = Option5.isSome(stack) ? stack.value.resources[fqn]?.Adopt : undefined;
2244
+ if (scoped2 !== undefined)
2245
+ return scoped2;
2246
+ const policy = yield* Effect27.serviceOption(AdoptPolicy);
2247
+ if (Option5.isSome(policy))
2051
2248
  return policy.value;
2052
- const context = yield* Effect26.serviceOption(AlchemyContext);
2053
- return Option4.isSome(context) ? context.value.adopt : false;
2249
+ const context = yield* Effect27.serviceOption(AlchemyContext);
2250
+ return Option5.isSome(context) ? context.value.adopt : false;
2054
2251
  });
2055
- var adoptable = (owner) => Effect26.gen(function* () {
2252
+ var adoptable = (owner) => Effect27.gen(function* () {
2056
2253
  if (yield* isCreate(owner.fqn, owner.instanceId))
2057
2254
  return true;
2058
2255
  return yield* unfinished(owner.instanceId);
2059
2256
  });
2060
- var adoptsAtApply = (owner) => Effect26.gen(function* () {
2257
+ var adoptsAtApply = (owner) => Effect27.gen(function* () {
2061
2258
  if (!(yield* adoptEnabled(owner.fqn)))
2062
2259
  return false;
2063
2260
  return yield* adoptable(owner);
2064
2261
  });
2065
- var refuseTakeover = (owner, what) => Effect26.gen(function* () {
2262
+ var refuseTakeover = (owner, what) => Effect27.gen(function* () {
2066
2263
  if (owner.output !== undefined)
2067
2264
  return;
2068
2265
  if (yield* resumes(owner.instanceId))
@@ -2072,23 +2269,23 @@ var refuseTakeover = (owner, what) => Effect26.gen(function* () {
2072
2269
  return;
2073
2270
  yield* forgetRefusedCreate(owner.fqn, owner.instanceId);
2074
2271
  const remedy = may ? "Deploy with --adopt (or wrap the resource in adopt(true)) to take it over, or remove it first." : "It is the new identity of a replace, which --adopt does not cover: remove it first.";
2075
- return yield* Effect26.die(new Error(`${what}: already exists, and this stack holds no state for it — the plan could not ask ` + "first (a prop was still an Output, a replace moved onto it, or it appeared after the " + `plan). Nothing was written. ${remedy}`));
2272
+ return yield* Effect27.die(new Error(`${what}: already exists, and this stack holds no state for it — the plan could not ask ` + "first (a prop was still an Output, a replace moved onto it, or it appeared after the " + `plan). Nothing was written. ${remedy}`));
2076
2273
  });
2077
2274
  var claimFor = (owner) => (what) => refuseTakeover(owner, what);
2078
2275
 
2079
2276
  // src/postgres/role-diff.ts
2080
2277
  import { isResolved as isResolved4 } from "alchemy/Diff";
2081
- import * as Effect27 from "effect/Effect";
2082
- var diffPostgresRole = (news, output, env = process.env, observation) => Effect27.gen(function* () {
2278
+ import * as Effect28 from "effect/Effect";
2279
+ var diffPostgresRole = (news, output, env = process.env, observation) => Effect28.gen(function* () {
2083
2280
  if (output === undefined || !isResolved4(news))
2084
2281
  return;
2085
2282
  if (news.name !== output.name) {
2086
- return yield* Effect27.fail(new PostgresRoleRenameRefused({ from: output.name, to: news.name }));
2283
+ return yield* Effect28.fail(new PostgresRoleRenameRefused({ from: output.name, to: news.name }));
2087
2284
  }
2088
2285
  yield* refuseAtPlan(news);
2089
2286
  const live = observation?.found;
2090
2287
  if (live !== undefined && live.oid !== output.oid) {
2091
- return yield* Effect27.fail(new PostgresRoleIdentityRefused({
2288
+ return yield* Effect28.fail(new PostgresRoleIdentityRefused({
2092
2289
  role: output.name,
2093
2290
  storedOid: output.oid,
2094
2291
  liveOid: live.oid
@@ -2107,15 +2304,15 @@ var diffPostgresRole = (news, output, env = process.env, observation) => Effect2
2107
2304
 
2108
2305
  // src/postgres/role-provider.ts
2109
2306
  var postgresRoleHandlers = PostgresRole.Provider.of({
2110
- list: () => Effect28.succeed([]),
2307
+ list: () => Effect29.succeed([]),
2111
2308
  nuke: { skip: true },
2112
- read: ({ fqn, instanceId, olds, output }) => Effect28.gen(function* () {
2309
+ read: ({ fqn, instanceId, olds, output }) => Effect29.gen(function* () {
2113
2310
  const name = output?.name ?? olds.name;
2114
2311
  const live = yield* withPg((pg) => readRole(pg, name));
2115
2312
  if (live === undefined)
2116
2313
  return;
2117
2314
  if (output !== undefined && live.oid !== output.oid) {
2118
- return yield* Effect28.fail(new PostgresRoleIdentityRefused({
2315
+ return yield* Effect29.fail(new PostgresRoleIdentityRefused({
2119
2316
  role: name,
2120
2317
  storedOid: output.oid,
2121
2318
  liveOid: live.oid
@@ -2123,9 +2320,9 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
2123
2320
  }
2124
2321
  const passwordSeal = output?.passwordSeal ?? "";
2125
2322
  const found = { ...storedAttributes(live), passwordSeal };
2126
- return yield* ownedRead({ fqn, instanceId, output }, found, Effect28.succeed(declarationMatches(olds, live)));
2323
+ return yield* ownedRead({ fqn, instanceId, output }, found, Effect29.succeed(declarationMatches(olds, live)));
2127
2324
  }),
2128
- diff: ({ news, output, instanceId }) => Effect28.gen(function* () {
2325
+ diff: ({ news, output, instanceId }) => Effect29.gen(function* () {
2129
2326
  if (output === undefined)
2130
2327
  return yield* noteUnfinished(instanceId);
2131
2328
  if (!isResolved5(news))
@@ -2133,9 +2330,9 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
2133
2330
  const found = yield* withPg((pg) => readRole(pg, output.name));
2134
2331
  return yield* diffPostgresRole(news, output, process.env, { found });
2135
2332
  }),
2136
- reconcile: ({ fqn, instanceId, news, output }) => Effect28.gen(function* () {
2333
+ reconcile: ({ fqn, instanceId, news, output }) => Effect29.gen(function* () {
2137
2334
  yield* refuseAtPlan(news);
2138
- return yield* withPg((pg) => Effect28.gen(function* () {
2335
+ return yield* withPg((pg) => Effect29.gen(function* () {
2139
2336
  const observed = yield* readRole(pg, news.name);
2140
2337
  if (observed !== undefined && output === undefined) {
2141
2338
  yield* refuseTakeover({ fqn, instanceId, output }, "Postgres.Role");
@@ -2143,20 +2340,20 @@ var postgresRoleHandlers = PostgresRole.Provider.of({
2143
2340
  return yield* reconcileWithClient4(pg, news, process.env, output?.passwordSeal, output?.oid);
2144
2341
  }));
2145
2342
  }),
2146
- delete: ({ output }) => withPg((pg) => Effect28.gen(function* () {
2343
+ delete: ({ output }) => withPg((pg) => Effect29.gen(function* () {
2147
2344
  if (output === undefined)
2148
2345
  return;
2149
2346
  const live = yield* readRole(pg, output.name);
2150
2347
  if (live === undefined)
2151
2348
  return;
2152
2349
  if (live.oid !== output.oid) {
2153
- return yield* Effect28.fail(new PostgresRoleIdentityRefused({
2350
+ return yield* Effect29.fail(new PostgresRoleIdentityRefused({
2154
2351
  role: output.name,
2155
2352
  storedOid: output.oid,
2156
2353
  liveOid: live.oid
2157
2354
  }));
2158
2355
  }
2159
- yield* pg.unsafe(buildDropRoleSql(output.name)).pipe(Effect28.asVoid);
2356
+ yield* pg.unsafe(buildDropRoleSql(output.name)).pipe(Effect29.asVoid);
2160
2357
  }))
2161
2358
  });
2162
2359
  var PostgresRoleProvider = () => Provider4.succeed(PostgresRole, postgresRoleHandlers);
@@ -2203,6 +2400,8 @@ export {
2203
2400
  PostgresRoleRenameRefused,
2204
2401
  PostgresRoleValidUntilRefused,
2205
2402
  PostgresSchema,
2403
+ PostgresSchemaCascadeCrossSchemaRefused,
2404
+ PostgresSchemaCascadeSequencesRefused,
2206
2405
  PostgresSchemaCreateVanished,
2207
2406
  PostgresSchemaDatabaseRefused,
2208
2407
  PostgresSchemaDeleteForeignRefused,
@@ -2281,5 +2480,5 @@ export {
2281
2480
  withPg
2282
2481
  };
2283
2482
 
2284
- //# debugId=584CB763916085BE64756E2164756E21
2483
+ //# debugId=DBF1833AF422AC3264756E2164756E21
2285
2484
  //# sourceMappingURL=index.js.map