@homeflare/alchemy 0.42.0 → 0.44.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 (648) hide show
  1. package/README.md +10 -1
  2. package/dist/caddy/index.js +35 -1
  3. package/dist/caddy/index.js.map +3 -3
  4. package/dist/launchd/index.js +35 -1
  5. package/dist/launchd/index.js.map +3 -3
  6. package/dist/linux/index.js +35 -1
  7. package/dist/linux/index.js.map +3 -3
  8. package/dist/litellm/access-group-form.d.ts +26 -0
  9. package/dist/litellm/access-group-form.d.ts.map +1 -0
  10. package/dist/litellm/access-group-operations.d.ts +37 -0
  11. package/dist/litellm/access-group-operations.d.ts.map +1 -0
  12. package/dist/litellm/access-group-types.d.ts +49 -0
  13. package/dist/litellm/access-group-types.d.ts.map +1 -0
  14. package/dist/litellm/access-group.d.ts +55 -0
  15. package/dist/litellm/access-group.d.ts.map +1 -0
  16. package/dist/litellm/budget-errors.d.ts +36 -0
  17. package/dist/litellm/budget-errors.d.ts.map +1 -0
  18. package/dist/litellm/budget-form.d.ts +50 -0
  19. package/dist/litellm/budget-form.d.ts.map +1 -0
  20. package/dist/litellm/budget-operations.d.ts +20 -0
  21. package/dist/litellm/budget-operations.d.ts.map +1 -0
  22. package/dist/litellm/budget.d.ts +61 -0
  23. package/dist/litellm/budget.d.ts.map +1 -0
  24. package/dist/litellm/credential-errors.d.ts +131 -0
  25. package/dist/litellm/credential-errors.d.ts.map +1 -0
  26. package/dist/litellm/credential-form.d.ts +79 -0
  27. package/dist/litellm/credential-form.d.ts.map +1 -0
  28. package/dist/litellm/credential-operations.d.ts +84 -0
  29. package/dist/litellm/credential-operations.d.ts.map +1 -0
  30. package/dist/litellm/credential-rewrite.d.ts +6 -0
  31. package/dist/litellm/credential-rewrite.d.ts.map +1 -0
  32. package/dist/litellm/credential-types.d.ts +87 -0
  33. package/dist/litellm/credential-types.d.ts.map +1 -0
  34. package/dist/litellm/credential-values.d.ts +53 -0
  35. package/dist/litellm/credential-values.d.ts.map +1 -0
  36. package/dist/litellm/credential.d.ts +83 -0
  37. package/dist/litellm/credential.d.ts.map +1 -0
  38. package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
  39. package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
  40. package/dist/litellm/fake-credential-litellm.d.ts +54 -0
  41. package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
  42. package/dist/litellm/fake-keys.d.ts +53 -0
  43. package/dist/litellm/fake-keys.d.ts.map +1 -0
  44. package/dist/litellm/fake-litellm.d.ts +9 -1
  45. package/dist/litellm/fake-litellm.d.ts.map +1 -1
  46. package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
  47. package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
  48. package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
  49. package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
  50. package/dist/litellm/fake-model-litellm.d.ts +48 -0
  51. package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
  52. package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
  53. package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
  54. package/dist/litellm/fake-policy-litellm.d.ts +32 -0
  55. package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
  56. package/dist/litellm/fake-registry-base.d.ts +42 -0
  57. package/dist/litellm/fake-registry-base.d.ts.map +1 -0
  58. package/dist/litellm/fake-stack.d.ts +8 -1
  59. package/dist/litellm/fake-stack.d.ts.map +1 -1
  60. package/dist/litellm/fake-team-litellm.d.ts +47 -0
  61. package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
  62. package/dist/litellm/fake-tool-litellm.d.ts +28 -0
  63. package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
  64. package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
  65. package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
  66. package/dist/litellm/index.d.ts +20 -0
  67. package/dist/litellm/index.d.ts.map +1 -1
  68. package/dist/litellm/index.js +3201 -2
  69. package/dist/litellm/index.js.map +70 -5
  70. package/dist/litellm/key-errors.d.ts +169 -0
  71. package/dist/litellm/key-errors.d.ts.map +1 -0
  72. package/dist/litellm/key-form.d.ts +119 -0
  73. package/dist/litellm/key-form.d.ts.map +1 -0
  74. package/dist/litellm/key-harness.d.ts +41 -0
  75. package/dist/litellm/key-harness.d.ts.map +1 -0
  76. package/dist/litellm/key-metadata-errors.d.ts +30 -0
  77. package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
  78. package/dist/litellm/key-metadata.d.ts +22 -0
  79. package/dist/litellm/key-metadata.d.ts.map +1 -0
  80. package/dist/litellm/key-operations.d.ts +63 -0
  81. package/dist/litellm/key-operations.d.ts.map +1 -0
  82. package/dist/litellm/key-secret.d.ts +33 -0
  83. package/dist/litellm/key-secret.d.ts.map +1 -0
  84. package/dist/litellm/key.d.ts +78 -0
  85. package/dist/litellm/key.d.ts.map +1 -0
  86. package/dist/litellm/mcp-server-credential.d.ts +50 -0
  87. package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
  88. package/dist/litellm/mcp-server-errors.d.ts +101 -0
  89. package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
  90. package/dist/litellm/mcp-server-form.d.ts +56 -0
  91. package/dist/litellm/mcp-server-form.d.ts.map +1 -0
  92. package/dist/litellm/mcp-server-locate.d.ts +26 -0
  93. package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
  94. package/dist/litellm/mcp-server-operations.d.ts +63 -0
  95. package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
  96. package/dist/litellm/mcp-server-shadow.d.ts +24 -0
  97. package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
  98. package/dist/litellm/mcp-server-types.d.ts +118 -0
  99. package/dist/litellm/mcp-server-types.d.ts.map +1 -0
  100. package/dist/litellm/mcp-server-url.d.ts +11 -0
  101. package/dist/litellm/mcp-server-url.d.ts.map +1 -0
  102. package/dist/litellm/mcp-server.d.ts +95 -0
  103. package/dist/litellm/mcp-server.d.ts.map +1 -0
  104. package/dist/litellm/model-claim.d.ts +24 -0
  105. package/dist/litellm/model-claim.d.ts.map +1 -0
  106. package/dist/litellm/model-credential.d.ts +12 -0
  107. package/dist/litellm/model-credential.d.ts.map +1 -0
  108. package/dist/litellm/model-errors.d.ts +119 -0
  109. package/dist/litellm/model-errors.d.ts.map +1 -0
  110. package/dist/litellm/model-form.d.ts +78 -0
  111. package/dist/litellm/model-form.d.ts.map +1 -0
  112. package/dist/litellm/model-locate.d.ts +13 -0
  113. package/dist/litellm/model-locate.d.ts.map +1 -0
  114. package/dist/litellm/model-operations.d.ts +59 -0
  115. package/dist/litellm/model-operations.d.ts.map +1 -0
  116. package/dist/litellm/model-types.d.ts +91 -0
  117. package/dist/litellm/model-types.d.ts.map +1 -0
  118. package/dist/litellm/model.d.ts +88 -0
  119. package/dist/litellm/model.d.ts.map +1 -0
  120. package/dist/litellm/operations.d.ts +22 -0
  121. package/dist/litellm/operations.d.ts.map +1 -1
  122. package/dist/litellm/policy-attachment-form.d.ts +19 -0
  123. package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
  124. package/dist/litellm/policy-attachment-operations.d.ts +31 -0
  125. package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
  126. package/dist/litellm/policy-attachment-types.d.ts +48 -0
  127. package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
  128. package/dist/litellm/policy-attachment.d.ts +61 -0
  129. package/dist/litellm/policy-attachment.d.ts.map +1 -0
  130. package/dist/litellm/policy-form.d.ts +22 -0
  131. package/dist/litellm/policy-form.d.ts.map +1 -0
  132. package/dist/litellm/policy-operations.d.ts +42 -0
  133. package/dist/litellm/policy-operations.d.ts.map +1 -0
  134. package/dist/litellm/policy-types.d.ts +57 -0
  135. package/dist/litellm/policy-types.d.ts.map +1 -0
  136. package/dist/litellm/policy.d.ts +65 -0
  137. package/dist/litellm/policy.d.ts.map +1 -0
  138. package/dist/litellm/providers.d.ts +1 -1
  139. package/dist/litellm/providers.d.ts.map +1 -1
  140. package/dist/litellm/registry-errors.d.ts +62 -0
  141. package/dist/litellm/registry-errors.d.ts.map +1 -0
  142. package/dist/litellm/registry-support.d.ts +42 -0
  143. package/dist/litellm/registry-support.d.ts.map +1 -0
  144. package/dist/litellm/team-form.d.ts +26 -0
  145. package/dist/litellm/team-form.d.ts.map +1 -0
  146. package/dist/litellm/team-members.d.ts +10 -0
  147. package/dist/litellm/team-members.d.ts.map +1 -0
  148. package/dist/litellm/team-operations.d.ts +38 -0
  149. package/dist/litellm/team-operations.d.ts.map +1 -0
  150. package/dist/litellm/team-permission.d.ts +35 -0
  151. package/dist/litellm/team-permission.d.ts.map +1 -0
  152. package/dist/litellm/team-types.d.ts +101 -0
  153. package/dist/litellm/team-types.d.ts.map +1 -0
  154. package/dist/litellm/team.d.ts +67 -0
  155. package/dist/litellm/team.d.ts.map +1 -0
  156. package/dist/litellm/tool-policy-form.d.ts +21 -0
  157. package/dist/litellm/tool-policy-form.d.ts.map +1 -0
  158. package/dist/litellm/tool-policy-operations.d.ts +30 -0
  159. package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
  160. package/dist/litellm/tool-policy-types.d.ts +46 -0
  161. package/dist/litellm/tool-policy-types.d.ts.map +1 -0
  162. package/dist/litellm/tool-policy.d.ts +62 -0
  163. package/dist/litellm/tool-policy.d.ts.map +1 -0
  164. package/dist/litellm/toolset-form.d.ts +20 -0
  165. package/dist/litellm/toolset-form.d.ts.map +1 -0
  166. package/dist/litellm/toolset-operations.d.ts +39 -0
  167. package/dist/litellm/toolset-operations.d.ts.map +1 -0
  168. package/dist/litellm/toolset-types.d.ts +46 -0
  169. package/dist/litellm/toolset-types.d.ts.map +1 -0
  170. package/dist/litellm/toolset.d.ts +55 -0
  171. package/dist/litellm/toolset.d.ts.map +1 -0
  172. package/dist/openbao/auth-role-form.d.ts +9 -0
  173. package/dist/openbao/auth-role-form.d.ts.map +1 -1
  174. package/dist/openbao/auth-role-wire.d.ts.map +1 -1
  175. package/dist/openbao/fake-engines-roles.d.ts.map +1 -1
  176. package/dist/openbao/index.js +43 -6
  177. package/dist/openbao/index.js.map +5 -5
  178. package/dist/ownership/rows.d.ts +11 -0
  179. package/dist/ownership/rows.d.ts.map +1 -1
  180. package/dist/postgres/connection.d.ts +32 -2
  181. package/dist/postgres/connection.d.ts.map +1 -1
  182. package/dist/postgres/database-sql.d.ts +28 -9
  183. package/dist/postgres/database-sql.d.ts.map +1 -1
  184. package/dist/postgres/database.d.ts +1 -1
  185. package/dist/postgres/database.d.ts.map +1 -1
  186. package/dist/postgres/fake-grants-parse.d.ts +37 -0
  187. package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
  188. package/dist/postgres/fake-grants-read.d.ts +61 -0
  189. package/dist/postgres/fake-grants-read.d.ts.map +1 -0
  190. package/dist/postgres/fake-grants-sql.d.ts +46 -0
  191. package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
  192. package/dist/postgres/fake-grants-write.d.ts +29 -0
  193. package/dist/postgres/fake-grants-write.d.ts.map +1 -0
  194. package/dist/postgres/fake-role-sql.d.ts +40 -0
  195. package/dist/postgres/fake-role-sql.d.ts.map +1 -0
  196. package/dist/postgres/fake-schema-sql.d.ts +42 -0
  197. package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
  198. package/dist/postgres/fake-sql-parse.d.ts +23 -0
  199. package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
  200. package/dist/postgres/fake-sql-quote.d.ts +12 -0
  201. package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
  202. package/dist/postgres/fake-sql.d.ts +42 -0
  203. package/dist/postgres/fake-sql.d.ts.map +1 -1
  204. package/dist/postgres/grants-attrs.d.ts +115 -0
  205. package/dist/postgres/grants-attrs.d.ts.map +1 -0
  206. package/dist/postgres/grants-declare.d.ts +88 -0
  207. package/dist/postgres/grants-declare.d.ts.map +1 -0
  208. package/dist/postgres/grants-diff.d.ts +25 -0
  209. package/dist/postgres/grants-diff.d.ts.map +1 -0
  210. package/dist/postgres/grants-errors.d.ts +137 -0
  211. package/dist/postgres/grants-errors.d.ts.map +1 -0
  212. package/dist/postgres/grants-existence.d.ts +14 -0
  213. package/dist/postgres/grants-existence.d.ts.map +1 -0
  214. package/dist/postgres/grants-ops.d.ts +65 -0
  215. package/dist/postgres/grants-ops.d.ts.map +1 -0
  216. package/dist/postgres/grants-ownership.d.ts +18 -0
  217. package/dist/postgres/grants-ownership.d.ts.map +1 -0
  218. package/dist/postgres/grants-plan-restore.d.ts +22 -0
  219. package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
  220. package/dist/postgres/grants-plan.d.ts +65 -0
  221. package/dist/postgres/grants-plan.d.ts.map +1 -0
  222. package/dist/postgres/grants-read-defaults.d.ts +17 -0
  223. package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
  224. package/dist/postgres/grants-read.d.ts +77 -0
  225. package/dist/postgres/grants-read.d.ts.map +1 -0
  226. package/dist/postgres/grants-refuse.d.ts +25 -0
  227. package/dist/postgres/grants-refuse.d.ts.map +1 -0
  228. package/dist/postgres/grants-sql.d.ts +42 -0
  229. package/dist/postgres/grants-sql.d.ts.map +1 -0
  230. package/dist/postgres/grants-words.d.ts +29 -0
  231. package/dist/postgres/grants-words.d.ts.map +1 -0
  232. package/dist/postgres/grants.d.ts +37 -0
  233. package/dist/postgres/grants.d.ts.map +1 -0
  234. package/dist/postgres/index.d.ts +35 -8
  235. package/dist/postgres/index.d.ts.map +1 -1
  236. package/dist/postgres/index.js +2063 -39
  237. package/dist/postgres/index.js.map +47 -7
  238. package/dist/postgres/installed-classifier.d.ts +13 -0
  239. package/dist/postgres/installed-classifier.d.ts.map +1 -0
  240. package/dist/postgres/providers.d.ts +17 -7
  241. package/dist/postgres/providers.d.ts.map +1 -1
  242. package/dist/postgres/psql-executor.d.ts +25 -0
  243. package/dist/postgres/psql-executor.d.ts.map +1 -0
  244. package/dist/postgres/role-attrs.d.ts +109 -0
  245. package/dist/postgres/role-attrs.d.ts.map +1 -0
  246. package/dist/postgres/role-diff.d.ts +22 -0
  247. package/dist/postgres/role-diff.d.ts.map +1 -0
  248. package/dist/postgres/role-errors.d.ts +126 -0
  249. package/dist/postgres/role-errors.d.ts.map +1 -0
  250. package/dist/postgres/role-membership-sql.d.ts +75 -0
  251. package/dist/postgres/role-membership-sql.d.ts.map +1 -0
  252. package/dist/postgres/role-provider.d.ts +11 -0
  253. package/dist/postgres/role-provider.d.ts.map +1 -0
  254. package/dist/postgres/role-scram.d.ts +6 -0
  255. package/dist/postgres/role-scram.d.ts.map +1 -0
  256. package/dist/postgres/role-secrets.d.ts +30 -0
  257. package/dist/postgres/role-secrets.d.ts.map +1 -0
  258. package/dist/postgres/role-sql.d.ts +68 -0
  259. package/dist/postgres/role-sql.d.ts.map +1 -0
  260. package/dist/postgres/role.d.ts +57 -0
  261. package/dist/postgres/role.d.ts.map +1 -0
  262. package/dist/postgres/schema-assert.d.ts +50 -0
  263. package/dist/postgres/schema-assert.d.ts.map +1 -0
  264. package/dist/postgres/schema-attrs.d.ts +51 -0
  265. package/dist/postgres/schema-attrs.d.ts.map +1 -0
  266. package/dist/postgres/schema-delete.d.ts +28 -0
  267. package/dist/postgres/schema-delete.d.ts.map +1 -0
  268. package/dist/postgres/schema-diff.d.ts +14 -0
  269. package/dist/postgres/schema-diff.d.ts.map +1 -0
  270. package/dist/postgres/schema-errors.d.ts +139 -0
  271. package/dist/postgres/schema-errors.d.ts.map +1 -0
  272. package/dist/postgres/schema-identity.d.ts +8 -0
  273. package/dist/postgres/schema-identity.d.ts.map +1 -0
  274. package/dist/postgres/schema-reconcile.d.ts +12 -0
  275. package/dist/postgres/schema-reconcile.d.ts.map +1 -0
  276. package/dist/postgres/schema-sql.d.ts +45 -0
  277. package/dist/postgres/schema-sql.d.ts.map +1 -0
  278. package/dist/postgres/schema-test-kit.d.ts +67 -0
  279. package/dist/postgres/schema-test-kit.d.ts.map +1 -0
  280. package/dist/postgres/schema.d.ts +54 -0
  281. package/dist/postgres/schema.d.ts.map +1 -0
  282. package/dist/proxmox/ceph-flag-types.d.ts +57 -0
  283. package/dist/proxmox/ceph-flag-types.d.ts.map +1 -0
  284. package/dist/proxmox/ceph-flag-wire.d.ts +77 -0
  285. package/dist/proxmox/ceph-flag-wire.d.ts.map +1 -0
  286. package/dist/proxmox/ceph-flag.d.ts +15 -50
  287. package/dist/proxmox/ceph-flag.d.ts.map +1 -1
  288. package/dist/proxmox/ceph-osd-write.d.ts +10 -13
  289. package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
  290. package/dist/proxmox/index.js +806 -740
  291. package/dist/proxmox/index.js.map +9 -8
  292. package/dist/release/fake-engine.d.ts +10 -0
  293. package/dist/release/fake-engine.d.ts.map +1 -1
  294. package/dist/release/index.js +35 -1
  295. package/dist/release/index.js.map +3 -3
  296. package/dist/valkey/acl-attrs.d.ts +94 -0
  297. package/dist/valkey/acl-attrs.d.ts.map +1 -0
  298. package/dist/valkey/acl-compare.d.ts +28 -0
  299. package/dist/valkey/acl-compare.d.ts.map +1 -0
  300. package/dist/valkey/acl-connection.d.ts +6 -0
  301. package/dist/valkey/acl-connection.d.ts.map +1 -0
  302. package/dist/valkey/acl-form.d.ts +62 -0
  303. package/dist/valkey/acl-form.d.ts.map +1 -0
  304. package/dist/valkey/acl-managed.d.ts +4 -0
  305. package/dist/valkey/acl-managed.d.ts.map +1 -0
  306. package/dist/valkey/acl-ops.d.ts +37 -0
  307. package/dist/valkey/acl-ops.d.ts.map +1 -0
  308. package/dist/valkey/acl-profiles.d.ts +53 -0
  309. package/dist/valkey/acl-profiles.d.ts.map +1 -0
  310. package/dist/valkey/acl-reconcile.d.ts +26 -0
  311. package/dist/valkey/acl-reconcile.d.ts.map +1 -0
  312. package/dist/valkey/acl.d.ts +24 -0
  313. package/dist/valkey/acl.d.ts.map +1 -0
  314. package/dist/valkey/connection-service.d.ts +22 -0
  315. package/dist/valkey/connection-service.d.ts.map +1 -0
  316. package/dist/valkey/connection.d.ts +59 -0
  317. package/dist/valkey/connection.d.ts.map +1 -0
  318. package/dist/valkey/errors.d.ts +165 -0
  319. package/dist/valkey/errors.d.ts.map +1 -0
  320. package/dist/valkey/fake-acl.d.ts +29 -0
  321. package/dist/valkey/fake-acl.d.ts.map +1 -0
  322. package/dist/valkey/fake-valkey.d.ts +35 -0
  323. package/dist/valkey/fake-valkey.d.ts.map +1 -0
  324. package/dist/valkey/handler-test-fixture.d.ts +20 -0
  325. package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
  326. package/dist/valkey/index.d.ts +18 -0
  327. package/dist/valkey/index.d.ts.map +1 -0
  328. package/dist/valkey/index.js +964 -0
  329. package/dist/valkey/index.js.map +27 -0
  330. package/dist/valkey/instance-attrs.d.ts +46 -0
  331. package/dist/valkey/instance-attrs.d.ts.map +1 -0
  332. package/dist/valkey/instance-form.d.ts +22 -0
  333. package/dist/valkey/instance-form.d.ts.map +1 -0
  334. package/dist/valkey/instance.d.ts +48 -0
  335. package/dist/valkey/instance.d.ts.map +1 -0
  336. package/dist/valkey/provider-socket-fixture.d.ts +8 -0
  337. package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
  338. package/dist/valkey/providers.d.ts +16 -0
  339. package/dist/valkey/providers.d.ts.map +1 -0
  340. package/dist/valkey/resp.d.ts +38 -0
  341. package/dist/valkey/resp.d.ts.map +1 -0
  342. package/dist/valkey/transport-error.d.ts +36 -0
  343. package/dist/valkey/transport-error.d.ts.map +1 -0
  344. package/dist/valkey/transport.d.ts +50 -0
  345. package/dist/valkey/transport.d.ts.map +1 -0
  346. package/docs/litellm-access-group.md +105 -0
  347. package/docs/litellm-budget.md +55 -0
  348. package/docs/litellm-credential.md +60 -0
  349. package/docs/litellm-key-metadata.md +56 -0
  350. package/docs/litellm-key.md +194 -0
  351. package/docs/litellm-mcp.md +187 -0
  352. package/docs/litellm-model.md +111 -0
  353. package/docs/litellm-policy-attachment.md +86 -0
  354. package/docs/litellm-policy.md +103 -0
  355. package/docs/litellm-team.md +117 -0
  356. package/docs/litellm-tool-policy.md +90 -0
  357. package/docs/litellm-toolset.md +92 -0
  358. package/docs/litellm.md +16 -8
  359. package/docs/peers.md +15 -6
  360. package/docs/postgres-grants-example.md +55 -0
  361. package/docs/postgres-grants.md +157 -0
  362. package/docs/postgres-role.md +114 -0
  363. package/docs/postgres-schema.md +139 -0
  364. package/docs/postgres.md +39 -0
  365. package/docs/proxmox-sdk-migration.md +45 -0
  366. package/docs/valkey-transport.md +29 -0
  367. package/docs/valkey.md +187 -0
  368. package/package.json +7 -3
  369. package/src/litellm/access-group-form.ts +105 -0
  370. package/src/litellm/access-group-operations.ts +92 -0
  371. package/src/litellm/access-group-types.ts +49 -0
  372. package/src/litellm/access-group.test.ts +197 -0
  373. package/src/litellm/access-group.ts +151 -0
  374. package/src/litellm/budget-errors.ts +38 -0
  375. package/src/litellm/budget-form.ts +94 -0
  376. package/src/litellm/budget-operations.ts +51 -0
  377. package/src/litellm/budget.test.ts +105 -0
  378. package/src/litellm/budget.ts +127 -0
  379. package/src/litellm/credential-errors.ts +183 -0
  380. package/src/litellm/credential-form.test.ts +151 -0
  381. package/src/litellm/credential-form.ts +211 -0
  382. package/src/litellm/credential-guards.test.ts +241 -0
  383. package/src/litellm/credential-operations.ts +208 -0
  384. package/src/litellm/credential-recovery.test.ts +93 -0
  385. package/src/litellm/credential-rewrite.test.ts +164 -0
  386. package/src/litellm/credential-rewrite.ts +50 -0
  387. package/src/litellm/credential-types.ts +117 -0
  388. package/src/litellm/credential-values.ts +94 -0
  389. package/src/litellm/credential.test.ts +218 -0
  390. package/src/litellm/credential.ts +227 -0
  391. package/src/litellm/fake-access-group-litellm.ts +127 -0
  392. package/src/litellm/fake-credential-litellm.ts +216 -0
  393. package/src/litellm/fake-keys.ts +190 -0
  394. package/src/litellm/fake-litellm.ts +66 -7
  395. package/src/litellm/fake-mcp-litellm.ts +214 -0
  396. package/src/litellm/fake-model-litellm-post-update.ts +103 -0
  397. package/src/litellm/fake-model-litellm.ts +233 -0
  398. package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
  399. package/src/litellm/fake-policy-litellm.ts +186 -0
  400. package/src/litellm/fake-registry-base.ts +69 -0
  401. package/src/litellm/fake-stack.ts +17 -1
  402. package/src/litellm/fake-team-litellm.ts +229 -0
  403. package/src/litellm/fake-tool-litellm.ts +88 -0
  404. package/src/litellm/fake-toolset-litellm.ts +110 -0
  405. package/src/litellm/index.ts +153 -0
  406. package/src/litellm/key-delete.test.ts +212 -0
  407. package/src/litellm/key-errors.ts +241 -0
  408. package/src/litellm/key-form.ts +200 -0
  409. package/src/litellm/key-harness.ts +121 -0
  410. package/src/litellm/key-metadata-errors.ts +49 -0
  411. package/src/litellm/key-metadata.test.ts +156 -0
  412. package/src/litellm/key-metadata.ts +74 -0
  413. package/src/litellm/key-operations.ts +184 -0
  414. package/src/litellm/key-rotation.test.ts +110 -0
  415. package/src/litellm/key-scope.test.ts +135 -0
  416. package/src/litellm/key-secret.test.ts +248 -0
  417. package/src/litellm/key-secret.ts +137 -0
  418. package/src/litellm/key-transport.test.ts +166 -0
  419. package/src/litellm/key.test.ts +231 -0
  420. package/src/litellm/key.ts +213 -0
  421. package/src/litellm/mcp-server-adopt.test.ts +86 -0
  422. package/src/litellm/mcp-server-alias.test.ts +184 -0
  423. package/src/litellm/mcp-server-credential.ts +85 -0
  424. package/src/litellm/mcp-server-errors.ts +141 -0
  425. package/src/litellm/mcp-server-exports.test.ts +15 -0
  426. package/src/litellm/mcp-server-form.test.ts +241 -0
  427. package/src/litellm/mcp-server-form.ts +233 -0
  428. package/src/litellm/mcp-server-handlers.test.ts +150 -0
  429. package/src/litellm/mcp-server-locate.ts +66 -0
  430. package/src/litellm/mcp-server-operations.ts +111 -0
  431. package/src/litellm/mcp-server-registry.test.ts +146 -0
  432. package/src/litellm/mcp-server-retype.test.ts +114 -0
  433. package/src/litellm/mcp-server-shadow.test.ts +91 -0
  434. package/src/litellm/mcp-server-shadow.ts +45 -0
  435. package/src/litellm/mcp-server-tools.test.ts +85 -0
  436. package/src/litellm/mcp-server-types.ts +143 -0
  437. package/src/litellm/mcp-server-url.ts +66 -0
  438. package/src/litellm/mcp-server.test.ts +213 -0
  439. package/src/litellm/mcp-server.ts +225 -0
  440. package/src/litellm/model-claim.ts +69 -0
  441. package/src/litellm/model-credential.ts +45 -0
  442. package/src/litellm/model-errors.ts +168 -0
  443. package/src/litellm/model-foreign-row.test.ts +173 -0
  444. package/src/litellm/model-form.test.ts +228 -0
  445. package/src/litellm/model-form.ts +223 -0
  446. package/src/litellm/model-locate.test.ts +128 -0
  447. package/src/litellm/model-locate.ts +67 -0
  448. package/src/litellm/model-operations.test.ts +93 -0
  449. package/src/litellm/model-operations.ts +146 -0
  450. package/src/litellm/model-params-preserve.test.ts +119 -0
  451. package/src/litellm/model-recovery.test.ts +57 -0
  452. package/src/litellm/model-types.ts +112 -0
  453. package/src/litellm/model.test.ts +222 -0
  454. package/src/litellm/model.ts +237 -0
  455. package/src/litellm/operations.ts +1 -1
  456. package/src/litellm/policy-attachment-form.ts +103 -0
  457. package/src/litellm/policy-attachment-operations.ts +74 -0
  458. package/src/litellm/policy-attachment-types.ts +48 -0
  459. package/src/litellm/policy-attachment.test.ts +198 -0
  460. package/src/litellm/policy-attachment.ts +178 -0
  461. package/src/litellm/policy-form.ts +122 -0
  462. package/src/litellm/policy-operations.ts +112 -0
  463. package/src/litellm/policy-types.ts +58 -0
  464. package/src/litellm/policy.test.ts +214 -0
  465. package/src/litellm/policy.ts +146 -0
  466. package/src/litellm/providers.ts +25 -1
  467. package/src/litellm/registry-errors.ts +88 -0
  468. package/src/litellm/registry-exports.test.ts +66 -0
  469. package/src/litellm/registry-support.ts +109 -0
  470. package/src/litellm/team-form.ts +140 -0
  471. package/src/litellm/team-members.test.ts +150 -0
  472. package/src/litellm/team-members.ts +58 -0
  473. package/src/litellm/team-operations.ts +90 -0
  474. package/src/litellm/team-permission.ts +159 -0
  475. package/src/litellm/team-read.test.ts +89 -0
  476. package/src/litellm/team-types.ts +106 -0
  477. package/src/litellm/team.test.ts +206 -0
  478. package/src/litellm/team.ts +159 -0
  479. package/src/litellm/tool-policy-form.ts +94 -0
  480. package/src/litellm/tool-policy-operations.ts +58 -0
  481. package/src/litellm/tool-policy-types.ts +48 -0
  482. package/src/litellm/tool-policy.test.ts +172 -0
  483. package/src/litellm/tool-policy.ts +125 -0
  484. package/src/litellm/toolset-form.ts +104 -0
  485. package/src/litellm/toolset-operations.ts +90 -0
  486. package/src/litellm/toolset-types.ts +47 -0
  487. package/src/litellm/toolset.test.ts +198 -0
  488. package/src/litellm/toolset.ts +151 -0
  489. package/src/openbao/auth-role-form.test.ts +37 -0
  490. package/src/openbao/auth-role-form.ts +12 -1
  491. package/src/openbao/auth-role-wire.test.ts +1 -0
  492. package/src/openbao/auth-role-wire.ts +13 -1
  493. package/src/openbao/distilled-retry.test.ts +1 -0
  494. package/src/openbao/fake-engines-roles.ts +7 -1
  495. package/src/ownership/ownership.test.ts +33 -1
  496. package/src/ownership/rows.ts +53 -0
  497. package/src/postgres/connection.ts +72 -3
  498. package/src/postgres/database-bigint-serialization.test.ts +1 -0
  499. package/src/postgres/database-refusals.test.ts +2 -2
  500. package/src/postgres/database-sql.ts +40 -12
  501. package/src/postgres/database.ts +3 -2
  502. package/src/postgres/fake-grants-parse.ts +189 -0
  503. package/src/postgres/fake-grants-read.ts +250 -0
  504. package/src/postgres/fake-grants-sql.ts +207 -0
  505. package/src/postgres/fake-grants-write.ts +90 -0
  506. package/src/postgres/fake-role-sql.ts +220 -0
  507. package/src/postgres/fake-schema-semantics.test.ts +36 -0
  508. package/src/postgres/fake-schema-sql.ts +146 -0
  509. package/src/postgres/fake-sql-parse.ts +86 -0
  510. package/src/postgres/fake-sql-quote.ts +36 -0
  511. package/src/postgres/fake-sql.ts +161 -46
  512. package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
  513. package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
  514. package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
  515. package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
  516. package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
  517. package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
  518. package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
  519. package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
  520. package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
  521. package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
  522. package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
  523. package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
  524. package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
  525. package/src/postgres/grants-acl.test.ts +61 -0
  526. package/src/postgres/grants-attrs.ts +185 -0
  527. package/src/postgres/grants-database.test.ts +158 -0
  528. package/src/postgres/grants-declare.ts +172 -0
  529. package/src/postgres/grants-delete-proof.test.ts +154 -0
  530. package/src/postgres/grants-diff.ts +101 -0
  531. package/src/postgres/grants-errors.ts +215 -0
  532. package/src/postgres/grants-existence-guards.test.ts +113 -0
  533. package/src/postgres/grants-existence.ts +101 -0
  534. package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
  535. package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
  536. package/src/postgres/grants-lifecycle.test.ts +181 -0
  537. package/src/postgres/grants-ops.ts +229 -0
  538. package/src/postgres/grants-owner-revoke.test.ts +121 -0
  539. package/src/postgres/grants-ownership.ts +49 -0
  540. package/src/postgres/grants-plan-collateral.test.ts +202 -0
  541. package/src/postgres/grants-plan-diff.test.ts +204 -0
  542. package/src/postgres/grants-plan-restore.ts +43 -0
  543. package/src/postgres/grants-plan-revocations.test.ts +69 -0
  544. package/src/postgres/grants-plan.test.ts +148 -0
  545. package/src/postgres/grants-plan.ts +245 -0
  546. package/src/postgres/grants-provenance.test.ts +134 -0
  547. package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
  548. package/src/postgres/grants-read-absent.test.ts +91 -0
  549. package/src/postgres/grants-read-defaults.ts +51 -0
  550. package/src/postgres/grants-read.ts +250 -0
  551. package/src/postgres/grants-refusals.test.ts +136 -0
  552. package/src/postgres/grants-refuse.ts +119 -0
  553. package/src/postgres/grants-relkind-wire.test.ts +111 -0
  554. package/src/postgres/grants-repair-plan.test.ts +201 -0
  555. package/src/postgres/grants-sql.test.ts +128 -0
  556. package/src/postgres/grants-sql.ts +144 -0
  557. package/src/postgres/grants-words.ts +34 -0
  558. package/src/postgres/grants.ts +110 -0
  559. package/src/postgres/index.ts +137 -7
  560. package/src/postgres/installed-classifier.ts +36 -0
  561. package/src/postgres/providers.ts +44 -7
  562. package/src/postgres/psql-executor-escaping.test.ts +67 -0
  563. package/src/postgres/psql-executor.test.ts +167 -0
  564. package/src/postgres/psql-executor.ts +170 -0
  565. package/src/postgres/role-adopt.test.ts +98 -0
  566. package/src/postgres/role-attrs.ts +134 -0
  567. package/src/postgres/role-diff.ts +89 -0
  568. package/src/postgres/role-errors.ts +198 -0
  569. package/src/postgres/role-guard.test.ts +60 -0
  570. package/src/postgres/role-identity.test.ts +185 -0
  571. package/src/postgres/role-lifecycle.test.ts +228 -0
  572. package/src/postgres/role-membership-sql.ts +198 -0
  573. package/src/postgres/role-password.test.ts +158 -0
  574. package/src/postgres/role-privilege.test.ts +80 -0
  575. package/src/postgres/role-provenance.test.ts +200 -0
  576. package/src/postgres/role-provider.ts +104 -0
  577. package/src/postgres/role-refusals.test.ts +250 -0
  578. package/src/postgres/role-scram.test.ts +38 -0
  579. package/src/postgres/role-scram.ts +38 -0
  580. package/src/postgres/role-secrets.ts +46 -0
  581. package/src/postgres/role-sql.ts +211 -0
  582. package/src/postgres/role-valid-until.test.ts +68 -0
  583. package/src/postgres/role.ts +218 -0
  584. package/src/postgres/schema-assert.ts +139 -0
  585. package/src/postgres/schema-attrs.ts +71 -0
  586. package/src/postgres/schema-delete-proofs.test.ts +192 -0
  587. package/src/postgres/schema-delete.ts +96 -0
  588. package/src/postgres/schema-diff.ts +44 -0
  589. package/src/postgres/schema-drop-2bp01.test.ts +146 -0
  590. package/src/postgres/schema-errors.ts +209 -0
  591. package/src/postgres/schema-handlers.test.ts +193 -0
  592. package/src/postgres/schema-identity.ts +39 -0
  593. package/src/postgres/schema-lifecycle.test.ts +246 -0
  594. package/src/postgres/schema-race.test.ts +70 -0
  595. package/src/postgres/schema-reconcile.ts +100 -0
  596. package/src/postgres/schema-refusals.test.ts +144 -0
  597. package/src/postgres/schema-socket.test.ts +161 -0
  598. package/src/postgres/schema-sql.ts +130 -0
  599. package/src/postgres/schema-takeover.test.ts +149 -0
  600. package/src/postgres/schema-test-kit.ts +85 -0
  601. package/src/postgres/schema.ts +130 -0
  602. package/src/proxmox/ceph-flag-types.ts +70 -0
  603. package/src/proxmox/ceph-flag-wire.test.ts +72 -0
  604. package/src/proxmox/ceph-flag-wire.ts +123 -0
  605. package/src/proxmox/ceph-flag.ts +77 -130
  606. package/src/proxmox/ceph-osd-write.ts +10 -13
  607. package/src/release/binary-alias.test.ts +3 -3
  608. package/src/release/binary-claims.test.ts +3 -3
  609. package/src/release/binary-directory-umask.test.ts +65 -0
  610. package/src/release/fake-engine.ts +15 -0
  611. package/src/valkey/acl-attrs.ts +98 -0
  612. package/src/valkey/acl-compare.ts +57 -0
  613. package/src/valkey/acl-connection.ts +13 -0
  614. package/src/valkey/acl-delete.test.ts +127 -0
  615. package/src/valkey/acl-form.ts +239 -0
  616. package/src/valkey/acl-managed.ts +13 -0
  617. package/src/valkey/acl-ops.ts +122 -0
  618. package/src/valkey/acl-ownership.test.ts +118 -0
  619. package/src/valkey/acl-prefix.test.ts +38 -0
  620. package/src/valkey/acl-profiles.ts +81 -0
  621. package/src/valkey/acl-reconcile.ts +180 -0
  622. package/src/valkey/acl-reserved.test.ts +69 -0
  623. package/src/valkey/acl-revocation.test.ts +94 -0
  624. package/src/valkey/acl-seat-prefix.test.ts +111 -0
  625. package/src/valkey/acl-validation.test.ts +54 -0
  626. package/src/valkey/acl.test.ts +215 -0
  627. package/src/valkey/acl.ts +169 -0
  628. package/src/valkey/connection-service.ts +46 -0
  629. package/src/valkey/connection.ts +180 -0
  630. package/src/valkey/errors.ts +239 -0
  631. package/src/valkey/fake-acl.ts +128 -0
  632. package/src/valkey/fake-valkey.ts +224 -0
  633. package/src/valkey/handler-test-fixture.ts +43 -0
  634. package/src/valkey/handlers.test.ts +205 -0
  635. package/src/valkey/index.ts +54 -0
  636. package/src/valkey/instance-attrs.ts +48 -0
  637. package/src/valkey/instance-form.ts +104 -0
  638. package/src/valkey/instance.test.ts +108 -0
  639. package/src/valkey/instance.ts +160 -0
  640. package/src/valkey/provider-socket-fixture.ts +71 -0
  641. package/src/valkey/providers.test.ts +129 -0
  642. package/src/valkey/providers.ts +21 -0
  643. package/src/valkey/resp.ts +212 -0
  644. package/src/valkey/transport-bounds.test.ts +150 -0
  645. package/src/valkey/transport-error.ts +37 -0
  646. package/src/valkey/transport.test.ts +158 -0
  647. package/src/valkey/transport.ts +109 -0
  648. package/src/valkey/upstream-bounds.test.ts +14 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * `Postgres.Schema`'s drop path: prove the connection, prove the schema is still ours, then
3
+ * the guarded `DROP SCHEMA`.
4
+ *
5
+ * ⛔ THE ENGINE DOES NOT RE-READ BEFORE A DELETE THAT HAS STATE (alchemy `Apply.ts`). When
6
+ * persisted attributes exist, `delete` receives the LAST asserted `oid` + `owner` and no
7
+ * fresh row — a schema dropped out of band and recreated under the same name by another role
8
+ * would be dropped by name, `CASCADE` included, destroying their objects.
9
+ * `deleteWithClient` re-reads `pg_namespace` first: absent is idempotent success, and a live
10
+ * row that no longer matches the persisted proof fails with
11
+ * `PostgresSchemaDeleteForeignRefused` (`schema-assert.ts#deleteForeignRefusal`) before any
12
+ * `DROP` is issued.
13
+ */
14
+ import * as Effect from 'effect/Effect';
15
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
16
+ import type { PgExecutor } from './database-sql.ts';
17
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
18
+ import { assertDatabase, deleteForeignRefusal } from './schema-assert.ts';
19
+ import {
20
+ type PostgresSchemaDeleteForeignRefused,
21
+ PostgresSchemaDropNotEmptyError,
22
+ type PostgresSchemaWrongDatabase,
23
+ } from './schema-errors.ts';
24
+ import {
25
+ buildDropSchemaSql,
26
+ isDependentObjectsError,
27
+ schemaIsEmpty,
28
+ selectSchema,
29
+ } from './schema-sql.ts';
30
+
31
+ /**
32
+ * The guarded `DROP SCHEMA`, against any {@link PgExecutor}: refuses a non-empty schema
33
+ * without `cascade`, and classifies the server's own `2BP01` refusal as the same typed tag —
34
+ * for an object kind the emptiness check's four catalogs do not cover. Callers have already
35
+ * proven the connected database (`assertDatabase`) and, on the delete path, the schema's
36
+ * ownership.
37
+ */
38
+ const dropGuarded = (
39
+ pg: PgExecutor,
40
+ props: PostgresSchemaProps,
41
+ ): Effect.Effect<void, PostgresSchemaDropNotEmptyError | SqlError> =>
42
+ Effect.gen(function* () {
43
+ if (props.cascade !== true) {
44
+ const empty = yield* schemaIsEmpty(pg, props.name);
45
+ if (!empty) {
46
+ return yield* Effect.fail(new PostgresSchemaDropNotEmptyError({ schema: props.name }));
47
+ }
48
+ }
49
+ // The server's own `2BP01` refusal (an object kind the four catalogs miss) is classified
50
+ // into the same typed tag the emptiness check raises — one fail branch, classified before
51
+ // the fail, exactly as `database-sql.ts` classifies the `42P04` race.
52
+ const dropRefusal = (error: SqlError): PostgresSchemaDropNotEmptyError | SqlError =>
53
+ props.cascade !== true && isDependentObjectsError(error)
54
+ ? new PostgresSchemaDropNotEmptyError({ schema: props.name })
55
+ : error;
56
+ yield* pg.unsafe(buildDropSchemaSql(props.name, props.cascade === true)).pipe(
57
+ Effect.asVoid,
58
+ Effect.catchTag('SqlError', (error) => Effect.fail(dropRefusal(error))),
59
+ );
60
+ });
61
+
62
+ /** Prove the connected database, then the guarded drop — the drop core on its own, for the
63
+ * tests that drive it directly. */
64
+ export const dropWithClient = (
65
+ pg: PgExecutor,
66
+ props: PostgresSchemaProps,
67
+ ): Effect.Effect<void, PostgresSchemaWrongDatabase | PostgresSchemaDropNotEmptyError | SqlError> =>
68
+ Effect.gen(function* () {
69
+ yield* assertDatabase(props, pg);
70
+ yield* dropGuarded(pg, props);
71
+ });
72
+
73
+ /**
74
+ * The core of `delete`: re-read first (see the file header), refuse a schema the persisted
75
+ * proof cannot vouch for, then the guarded drop. `output` is the persisted state the engine
76
+ * hands over — `undefined` is no proof and refuses too.
77
+ */
78
+ export const deleteWithClient = (
79
+ pg: PgExecutor,
80
+ props: PostgresSchemaProps,
81
+ output: PostgresSchemaAttributes | undefined,
82
+ ): Effect.Effect<
83
+ void,
84
+ | PostgresSchemaWrongDatabase
85
+ | PostgresSchemaDeleteForeignRefused
86
+ | PostgresSchemaDropNotEmptyError
87
+ | SqlError
88
+ > =>
89
+ Effect.gen(function* () {
90
+ yield* assertDatabase(props, pg);
91
+ const live = yield* selectSchema(pg, props.name);
92
+ if (live === undefined) return;
93
+ const refusal = deleteForeignRefusal(props, live, output);
94
+ if (refusal !== undefined) return yield* Effect.fail(refusal);
95
+ yield* dropGuarded(pg, props);
96
+ });
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `Postgres.Schema`'s plan-time diff — entirely offline: `news` (declared) against `output`
3
+ * (last-applied attributes) and `olds` (last-applied props), never a live query (that
4
+ * authoritative check is `reconcileWithClient`'s, per S10). Extracted from `schema.ts` to keep
5
+ * each file under the house's 250-line cap.
6
+ *
7
+ * ⛔ `cascade` COMPARES AGAINST `olds`, NOT `output`. Attributes are the live row (name,
8
+ * database, owner, comment, oid) — `cascade` is a prop-only concern no catalog column
9
+ * carries. The engine's noop branch (`Apply.ts`) commits the OLD props unchanged, so a
10
+ * `cascade` flip must answer `update` to reach the persisted state at all: a schema first
11
+ * declared `cascade: true` and later set to `false` would otherwise keep dropping with
12
+ * `CASCADE` on every delete, because `delete`'s `olds` are read from those persisted props.
13
+ */
14
+ import { assertSchemaTarget } from './schema-identity.ts';
15
+ import { isResolved } from 'alchemy/Diff';
16
+ import type { Input } from 'alchemy/Input';
17
+ import * as Effect from 'effect/Effect';
18
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
19
+ import { normalizedComment, schemaNameByteRefusal } from './schema-attrs.ts';
20
+ import { PostgresSchemaNameRefused } from './schema-errors.ts';
21
+
22
+ /** Plan-time only: rename refused, over-long name refused, a database move refused; a `cascade`
23
+ * flip answers `update` so the new prop reaches state, and every other change answers `update`
24
+ * too (which `reconcileWithClient` then applies as create, or refuses as drift on a live
25
+ * schema). */
26
+ export const diffPostgresSchema = (
27
+ news: Input<PostgresSchemaProps>,
28
+ output: PostgresSchemaAttributes | undefined,
29
+ olds?: PostgresSchemaProps,
30
+ ) =>
31
+ Effect.gen(function* () {
32
+ if (output === undefined || !isResolved(news)) return undefined;
33
+ yield* assertSchemaTarget(news, output);
34
+ const nameRefusal = schemaNameByteRefusal(news.name);
35
+ if (nameRefusal !== undefined) {
36
+ return yield* Effect.fail(new PostgresSchemaNameRefused({ name: news.name, ...nameRefusal }));
37
+ }
38
+ const comment = normalizedComment(news.comment);
39
+ const changed =
40
+ (news.owner !== undefined && news.owner !== output.owner) ||
41
+ (comment !== undefined && comment !== (output.comment ?? undefined)) ||
42
+ (news.cascade ?? false) !== (olds?.cascade ?? false);
43
+ return changed ? ({ action: 'update' } as const) : ({ action: 'noop' } as const);
44
+ });
@@ -0,0 +1,146 @@
1
+ /**
2
+ * SQLSTATE `2BP01` (`dependent_objects_still_exist`) must become
3
+ * `PostgresSchemaDropNotEmptyError` on both transports.
4
+ *
5
+ * Measured at `@effect/sql-pg@4.0.0-rc.115` `src/internal/sqlError.ts#classifySqlState`:
6
+ * only class `42` becomes `SqlSyntaxError`. `2BP01` is class `2B`, so the socket client
7
+ * wraps it as `UnknownError` with the raw code on `reason.cause.code`
8
+ * (`PgConnection.ts#classifyFields`). The runner transport copies that rule
9
+ * (`psql-executor.ts#failure`). A test that builds `SqlSyntaxError` by hand pins a shape
10
+ * neither driver produces.
11
+ */
12
+ import { describe, expect, test } from 'bun:test';
13
+ import * as Effect from 'effect/Effect';
14
+ import type { SqlError } from 'effect/unstable/sql/SqlError';
15
+ import type { PgExecutor } from './database-sql.ts';
16
+ import { classifyInstalled } from './installed-classifier.ts';
17
+ import { postgresRunnerConnection } from './connection.ts';
18
+ import { type PsqlRunner, makePsqlExecutor } from './psql-executor.ts';
19
+ import { isDependentObjectsError } from './schema-sql.ts';
20
+ import { PostgresSchemaDropNotEmptyError } from './schema-errors.ts';
21
+ import { dropWithClient, postgresSchemaHandlers } from './schema.ts';
22
+ import type { PostgresSchemaAttributes, PostgresSchemaProps } from './schema-attrs.ts';
23
+
24
+ const baseProps: PostgresSchemaProps = { name: 'ledger', database: 'postgres', owner: 'tim' };
25
+
26
+ const socket2bp01 = (): Promise<SqlError> => classifyInstalled('2BP01');
27
+
28
+ /** Emptiness check says empty; the following DROP is the server's real `2BP01`. */
29
+ const emptyThenRefuse = (drop: Effect.Effect<ReadonlyArray<object>, SqlError>): PgExecutor => ({
30
+ unsafe: <A extends object>(text: string) => {
31
+ if (text.startsWith('SELECT current_database()')) {
32
+ return Effect.succeed([{ database: 'postgres' }] as unknown as ReadonlyArray<A>);
33
+ }
34
+ if (text.includes('AS empty')) {
35
+ return Effect.succeed([{ empty: true }] as unknown as ReadonlyArray<A>);
36
+ }
37
+ return drop as Effect.Effect<ReadonlyArray<A>, SqlError>;
38
+ },
39
+ transaction: () => Effect.void,
40
+ });
41
+
42
+ describe('2BP01 classification', () => {
43
+ test('the installed socket classifier wraps 2BP01 as UnknownError, not SqlSyntaxError', async () => {
44
+ const error = await socket2bp01();
45
+ expect(error.reason._tag).toBe('UnknownError');
46
+ expect(isDependentObjectsError(error)).toBe(true);
47
+ });
48
+
49
+ test('dropWithClient classifies the socket 2BP01 shape as the typed not-empty tag', async () => {
50
+ const error = await Effect.runPromise(
51
+ Effect.flip(dropWithClient(emptyThenRefuse(Effect.fail(await socket2bp01())), baseProps)),
52
+ );
53
+ expect(error).toBeInstanceOf(PostgresSchemaDropNotEmptyError);
54
+ });
55
+
56
+ test('the runner transport classifies a verbose 2BP01 line as the typed not-empty tag', async () => {
57
+ const run: PsqlRunner = ({ stdin }) => {
58
+ if (stdin.includes('current_database()')) {
59
+ return Promise.resolve({ code: 0, stdout: '[{"database":"postgres"}]', stderr: '' });
60
+ }
61
+ if (stdin.includes('AS empty')) {
62
+ return Promise.resolve({ code: 0, stdout: '[{"empty":true}]', stderr: '' });
63
+ }
64
+ return Promise.resolve({
65
+ code: 3,
66
+ stdout: '',
67
+ stderr: 'ERROR: 2BP01: dependent objects still exist\n',
68
+ });
69
+ };
70
+ const produced = await Effect.runPromise(
71
+ Effect.flip(
72
+ makePsqlExecutor(run, { database: 'postgres', username: 'postgres' }).unsafe(
73
+ 'DROP SCHEMA IF EXISTS "ledger"',
74
+ ),
75
+ ),
76
+ );
77
+ expect(produced.reason._tag).toBe('UnknownError');
78
+ expect(isDependentObjectsError(produced)).toBe(true);
79
+
80
+ const error = await Effect.runPromise(
81
+ Effect.flip(
82
+ dropWithClient(
83
+ makePsqlExecutor(run, { database: 'postgres', username: 'postgres' }),
84
+ baseProps,
85
+ ),
86
+ ),
87
+ );
88
+ expect(error).toBeInstanceOf(PostgresSchemaDropNotEmptyError);
89
+ });
90
+
91
+ test('the real delete handler classifies a runner 2BP01 as the typed not-empty tag', async () => {
92
+ // Order is load-bearing (schema-handlers.test.ts#route): the probe must answer PRESENT so
93
+ // the absent-database short-circuit does not swallow the test, and the ownership re-read
94
+ // must answer the row the persisted output vouches for, so the delete reaches the DROP.
95
+ const run: PsqlRunner = ({ stdin }) => {
96
+ if (stdin.includes('AS empty')) {
97
+ return Promise.resolve({ code: 0, stdout: '[{"empty":true}]', stderr: '' });
98
+ }
99
+ if (stdin.includes('FROM pg_namespace')) {
100
+ return Promise.resolve({
101
+ code: 0,
102
+ stdout: '[{"name":"ledger","oid":1,"owner":"tim"}]',
103
+ stderr: '',
104
+ });
105
+ }
106
+ if (stdin.includes('FROM pg_database')) {
107
+ return Promise.resolve({ code: 0, stdout: '[{"present":1}]', stderr: '' });
108
+ }
109
+ if (stdin.includes('current_database()')) {
110
+ return Promise.resolve({ code: 0, stdout: '[{"database":"postgres"}]', stderr: '' });
111
+ }
112
+ return Promise.resolve({
113
+ code: 3,
114
+ stdout: '',
115
+ stderr: 'ERROR: 2BP01: dependent objects still exist\n',
116
+ });
117
+ };
118
+ const output: PostgresSchemaAttributes = {
119
+ name: 'ledger',
120
+ database: 'postgres',
121
+ oid: 1,
122
+ owner: 'tim',
123
+ comment: null,
124
+ };
125
+ const error = await Effect.runPromise(
126
+ Effect.flip(
127
+ postgresSchemaHandlers
128
+ .delete({
129
+ id: 'x',
130
+ fqn: 'x',
131
+ instanceId: 'x',
132
+ olds: baseProps,
133
+ output,
134
+ session: undefined as never,
135
+ bindings: [] as never,
136
+ })
137
+ .pipe(
138
+ Effect.provide(
139
+ postgresRunnerConnection({ run, database: 'postgres', username: 'postgres' }),
140
+ ),
141
+ ),
142
+ ),
143
+ );
144
+ expect(error).toBeInstanceOf(PostgresSchemaDropNotEmptyError);
145
+ });
146
+ });
@@ -0,0 +1,209 @@
1
+ /**
2
+ * `Postgres.Schema`'s failures as typed tags, following the `Postgres.Database` pattern (S21).
3
+ *
4
+ * Refusals use checked catalog facts or raw SQLSTATE (42P06 / 2BP01), never driver message text.
5
+ */
6
+ import * as Data from 'effect/Data';
7
+
8
+ /** A declared name would be silently truncated (same as `PostgresDatabaseNameRefused`). */
9
+ export class PostgresSchemaNameRefused extends Data.TaggedError('PostgresSchemaNameRefused')<{
10
+ readonly name: string;
11
+ readonly byteLength: number;
12
+ readonly limit: number;
13
+ }> {
14
+ override get message(): string {
15
+ return (
16
+ `Postgres.Schema "${this.name}": ${String(this.byteLength)} UTF-8 bytes, over the ` +
17
+ `${String(this.limit)}-byte limit (NAMEDATALEN 64, minus the terminator). PostgreSQL would ` +
18
+ 'accept the CREATE and silently truncate the name with only a NOTICE, so this plan refuses ' +
19
+ 'it instead of creating a schema no later read will ever find again.'
20
+ );
21
+ }
22
+ }
23
+
24
+ /** A logical id's `name` changed. A schema's name is its identity; this family has no
25
+ * `ALTER SCHEMA … RENAME`. */
26
+ export class PostgresSchemaRenameRefused extends Data.TaggedError('PostgresSchemaRenameRefused')<{
27
+ readonly from: string;
28
+ readonly to: string;
29
+ }> {
30
+ override get message(): string {
31
+ return (
32
+ `Postgres.Schema: the declared name changed from "${this.from}" to "${this.to}". A ` +
33
+ 'rename is refused during plan or apply — this provider never runs ALTER SCHEMA … RENAME. Declare a new ' +
34
+ 'logical id for the new name and remove the old one once its contents have moved.'
35
+ );
36
+ }
37
+ }
38
+
39
+ /** `owner` names a role `pg_roles` does not have, checked before the `CREATE SCHEMA`. */
40
+ export class PostgresSchemaOwnerMissing extends Data.TaggedError('PostgresSchemaOwnerMissing')<{
41
+ readonly schema: string;
42
+ readonly owner: string;
43
+ }> {
44
+ override get message(): string {
45
+ return `Postgres.Schema "${this.schema}": AUTHORIZATION "${this.owner}" is not a role in pg_roles.`;
46
+ }
47
+ }
48
+
49
+ /** A live asserted prop no longer matches the declaration (`owner` or `comment`). */
50
+ export class PostgresSchemaDrift extends Data.TaggedError('PostgresSchemaDrift')<{
51
+ readonly schema: string;
52
+ readonly prop: string;
53
+ readonly declared: unknown;
54
+ readonly live: unknown;
55
+ }> {
56
+ override get message(): string {
57
+ return (
58
+ `Postgres.Schema "${this.schema}": ${this.prop} is declared as ` +
59
+ `${JSON.stringify(this.declared)} but the live schema has ${JSON.stringify(this.live)}. ` +
60
+ 'This provider never issues ALTER SCHEMA — update the declaration to match the live value, ' +
61
+ 'or change it by hand and re-plan.'
62
+ );
63
+ }
64
+ }
65
+
66
+ /** `CREATE SCHEMA` raised no error, but the immediate re-read (S10) still finds nothing. */
67
+ export class PostgresSchemaCreateVanished extends Data.TaggedError('PostgresSchemaCreateVanished')<{
68
+ readonly schema: string;
69
+ }> {
70
+ override get message(): string {
71
+ return (
72
+ `Postgres.Schema "${this.schema}": CREATE SCHEMA raised no error, but the schema is still ` +
73
+ 'absent on the immediate re-read. Re-plan — this is not a state this provider expects to reach.'
74
+ );
75
+ }
76
+ }
77
+
78
+ /**
79
+ * `delete` with `cascade: false` refuses a schema that still has relations. The same refusal
80
+ * answers a plain `DROP SCHEMA` the server rejected with SQLSTATE `2BP01`
81
+ * (`dependent_objects_still_exist`) — an object kind the emptiness check's four catalogs do not
82
+ * cover (an extension, a collation) — so no "empty" path escapes the typed tag.
83
+ */
84
+ export class PostgresSchemaDropNotEmptyError extends Data.TaggedError(
85
+ 'PostgresSchemaDropNotEmptyError',
86
+ )<{
87
+ readonly schema: string;
88
+ }> {
89
+ override get message(): string {
90
+ return (
91
+ `Postgres.Schema "${this.schema}": DROP SCHEMA refused because the schema is not empty and ` +
92
+ 'cascade is false. Declare cascade: true to drop its contents, or empty it by hand first.'
93
+ );
94
+ }
95
+ }
96
+
97
+ /** Every statement this resource issues must run against the DECLARED database. The family
98
+ * connection points at a maintenance database, so the schema handlers open `props.database`
99
+ * themselves (`withPg`'s database override); this failure means the server answered
100
+ * `current_database()` with something else — the override was ignored, and no read or write
101
+ * ran against the schema's real home. */
102
+ export class PostgresSchemaWrongDatabase extends Data.TaggedError('PostgresSchemaWrongDatabase')<{
103
+ readonly schema: string;
104
+ readonly declared: string;
105
+ readonly connected: string;
106
+ }> {
107
+ override get message(): string {
108
+ return (
109
+ `Postgres.Schema "${this.schema}": declared in database "${this.declared}" but the ` +
110
+ `connection answers current_database() "${this.connected}". The handlers open the declared ` +
111
+ 'database themselves, so this points at broken provider wiring — fix it before touching any ' +
112
+ 'schema, or the next create would land in the wrong database.'
113
+ );
114
+ }
115
+ }
116
+
117
+ /**
118
+ * `delete` refuses to drop a live schema that is not the one this resource created. The
119
+ * engine hands `delete` the persisted state (`output`, with the `oid` and `owner` the last
120
+ * assert proved), and the provider re-reads `pg_namespace` before any `DROP` — a live row that
121
+ * no longer matches that proof is someone else's schema wearing the same name (the old row was
122
+ * dropped out of band and the name recreated), and `DROP SCHEMA` would remove their objects.
123
+ * Nothing is dropped: clear the out-of-band schema by hand, or adopt it.
124
+ */
125
+ export class PostgresSchemaDeleteForeignRefused extends Data.TaggedError(
126
+ 'PostgresSchemaDeleteForeignRefused',
127
+ )<{
128
+ readonly schema: string;
129
+ readonly database: string;
130
+ readonly liveOid: number;
131
+ readonly liveOwner: string;
132
+ /** The proof the persisted state carries; both `undefined` when no state was handed over. */
133
+ readonly lastOid: number | undefined;
134
+ readonly lastOwner: string | undefined;
135
+ }> {
136
+ override get message(): string {
137
+ const proof =
138
+ this.lastOid === undefined || this.lastOwner === undefined
139
+ ? 'delete carried no persisted oid/owner to prove ownership'
140
+ : `the persisted proof is oid ${String(this.lastOid)}, owner "${this.lastOwner}"`;
141
+ return (
142
+ `Postgres.Schema "${this.schema}": the live schema in database "${this.database}" (oid ` +
143
+ `${String(this.liveOid)}, owner "${this.liveOwner}") is not the one this resource created — ` +
144
+ `${proof}. No DROP was issued: a schema with this name was created out of band. Drop it by ` +
145
+ 'hand, or adopt it on a resource whose declared props match it.'
146
+ );
147
+ }
148
+ }
149
+
150
+ /** A logical id's `database` changed. A schema lives in one database and this family never
151
+ * moves one: `DROP SCHEMA` in the old database plus a new declaration is the only path. */
152
+ export class PostgresSchemaDatabaseRefused extends Data.TaggedError(
153
+ 'PostgresSchemaDatabaseRefused',
154
+ )<{
155
+ readonly from: string;
156
+ readonly to: string;
157
+ }> {
158
+ override get message(): string {
159
+ return (
160
+ `Postgres.Schema: the declared database changed from "${this.from}" to "${this.to}". A ` +
161
+ 'schema is never moved across databases — declare a new logical id in the new database and ' +
162
+ 'remove the old one once its contents have moved.'
163
+ );
164
+ }
165
+ }
166
+
167
+ /** No persisted proof: even a same-owner schema needs explicit adoption, including recovery. */
168
+ export class PostgresSchemaExistsRefused extends Data.TaggedError('PostgresSchemaExistsRefused')<{
169
+ readonly schema: string;
170
+ readonly database: string;
171
+ }> {
172
+ override get message(): string {
173
+ return (
174
+ `Postgres.Schema "${this.schema}" in "${this.database}" already exists. Re-plan with ` +
175
+ '--adopt (adopt(true)) to adopt it explicitly; crash recovery also requires adoption. ' +
176
+ 'No existing schema was changed.'
177
+ );
178
+ }
179
+ }
180
+
181
+ /** Reconcile must not replace the oid delete relies on with an out-of-band replacement's oid. */
182
+ export class PostgresSchemaIdentityRefused extends Data.TaggedError(
183
+ 'PostgresSchemaIdentityRefused',
184
+ )<{
185
+ readonly schema: string;
186
+ readonly storedOid: number;
187
+ readonly liveOid: number;
188
+ }> {
189
+ override get message(): string {
190
+ return (
191
+ `Postgres.Schema "${this.schema}": live oid ${String(this.liveOid)} differs from stored oid ` +
192
+ `${String(this.storedOid)}. The schema was dropped and recreated outside this stack. ` +
193
+ 'Remove stale state and explicitly adopt the replacement before managing it.'
194
+ );
195
+ }
196
+ }
197
+
198
+ export type PostgresSchemaError =
199
+ | PostgresSchemaExistsRefused
200
+ | PostgresSchemaIdentityRefused
201
+ | PostgresSchemaNameRefused
202
+ | PostgresSchemaRenameRefused
203
+ | PostgresSchemaOwnerMissing
204
+ | PostgresSchemaDrift
205
+ | PostgresSchemaCreateVanished
206
+ | PostgresSchemaDropNotEmptyError
207
+ | PostgresSchemaDeleteForeignRefused
208
+ | PostgresSchemaWrongDatabase
209
+ | PostgresSchemaDatabaseRefused;