@homeflare/alchemy 0.43.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 (604) hide show
  1. package/README.md +10 -1
  2. package/dist/caddy/index.js +35 -1
  3. package/dist/caddy/index.js.map +3 -3
  4. package/dist/launchd/index.js +35 -1
  5. package/dist/launchd/index.js.map +3 -3
  6. package/dist/linux/index.js +35 -1
  7. package/dist/linux/index.js.map +3 -3
  8. package/dist/litellm/access-group-form.d.ts +26 -0
  9. package/dist/litellm/access-group-form.d.ts.map +1 -0
  10. package/dist/litellm/access-group-operations.d.ts +37 -0
  11. package/dist/litellm/access-group-operations.d.ts.map +1 -0
  12. package/dist/litellm/access-group-types.d.ts +49 -0
  13. package/dist/litellm/access-group-types.d.ts.map +1 -0
  14. package/dist/litellm/access-group.d.ts +55 -0
  15. package/dist/litellm/access-group.d.ts.map +1 -0
  16. package/dist/litellm/credential-errors.d.ts +131 -0
  17. package/dist/litellm/credential-errors.d.ts.map +1 -0
  18. package/dist/litellm/credential-form.d.ts +79 -0
  19. package/dist/litellm/credential-form.d.ts.map +1 -0
  20. package/dist/litellm/credential-operations.d.ts +84 -0
  21. package/dist/litellm/credential-operations.d.ts.map +1 -0
  22. package/dist/litellm/credential-rewrite.d.ts +6 -0
  23. package/dist/litellm/credential-rewrite.d.ts.map +1 -0
  24. package/dist/litellm/credential-types.d.ts +87 -0
  25. package/dist/litellm/credential-types.d.ts.map +1 -0
  26. package/dist/litellm/credential-values.d.ts +53 -0
  27. package/dist/litellm/credential-values.d.ts.map +1 -0
  28. package/dist/litellm/credential.d.ts +83 -0
  29. package/dist/litellm/credential.d.ts.map +1 -0
  30. package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
  31. package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
  32. package/dist/litellm/fake-credential-litellm.d.ts +54 -0
  33. package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
  34. package/dist/litellm/fake-keys.d.ts +53 -0
  35. package/dist/litellm/fake-keys.d.ts.map +1 -0
  36. package/dist/litellm/fake-litellm.d.ts +4 -1
  37. package/dist/litellm/fake-litellm.d.ts.map +1 -1
  38. package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
  39. package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
  40. package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
  41. package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
  42. package/dist/litellm/fake-model-litellm.d.ts +48 -0
  43. package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
  44. package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
  45. package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
  46. package/dist/litellm/fake-policy-litellm.d.ts +32 -0
  47. package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
  48. package/dist/litellm/fake-registry-base.d.ts +42 -0
  49. package/dist/litellm/fake-registry-base.d.ts.map +1 -0
  50. package/dist/litellm/fake-stack.d.ts +8 -1
  51. package/dist/litellm/fake-stack.d.ts.map +1 -1
  52. package/dist/litellm/fake-team-litellm.d.ts +47 -0
  53. package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
  54. package/dist/litellm/fake-tool-litellm.d.ts +28 -0
  55. package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
  56. package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
  57. package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
  58. package/dist/litellm/index.d.ts +18 -0
  59. package/dist/litellm/index.d.ts.map +1 -1
  60. package/dist/litellm/index.js +3078 -2
  61. package/dist/litellm/index.js.map +65 -4
  62. package/dist/litellm/key-errors.d.ts +169 -0
  63. package/dist/litellm/key-errors.d.ts.map +1 -0
  64. package/dist/litellm/key-form.d.ts +119 -0
  65. package/dist/litellm/key-form.d.ts.map +1 -0
  66. package/dist/litellm/key-harness.d.ts +41 -0
  67. package/dist/litellm/key-harness.d.ts.map +1 -0
  68. package/dist/litellm/key-metadata-errors.d.ts +30 -0
  69. package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
  70. package/dist/litellm/key-metadata.d.ts +22 -0
  71. package/dist/litellm/key-metadata.d.ts.map +1 -0
  72. package/dist/litellm/key-operations.d.ts +63 -0
  73. package/dist/litellm/key-operations.d.ts.map +1 -0
  74. package/dist/litellm/key-secret.d.ts +33 -0
  75. package/dist/litellm/key-secret.d.ts.map +1 -0
  76. package/dist/litellm/key.d.ts +78 -0
  77. package/dist/litellm/key.d.ts.map +1 -0
  78. package/dist/litellm/mcp-server-credential.d.ts +50 -0
  79. package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
  80. package/dist/litellm/mcp-server-errors.d.ts +101 -0
  81. package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
  82. package/dist/litellm/mcp-server-form.d.ts +56 -0
  83. package/dist/litellm/mcp-server-form.d.ts.map +1 -0
  84. package/dist/litellm/mcp-server-locate.d.ts +26 -0
  85. package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
  86. package/dist/litellm/mcp-server-operations.d.ts +63 -0
  87. package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
  88. package/dist/litellm/mcp-server-shadow.d.ts +24 -0
  89. package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
  90. package/dist/litellm/mcp-server-types.d.ts +118 -0
  91. package/dist/litellm/mcp-server-types.d.ts.map +1 -0
  92. package/dist/litellm/mcp-server-url.d.ts +11 -0
  93. package/dist/litellm/mcp-server-url.d.ts.map +1 -0
  94. package/dist/litellm/mcp-server.d.ts +95 -0
  95. package/dist/litellm/mcp-server.d.ts.map +1 -0
  96. package/dist/litellm/model-claim.d.ts +24 -0
  97. package/dist/litellm/model-claim.d.ts.map +1 -0
  98. package/dist/litellm/model-credential.d.ts +12 -0
  99. package/dist/litellm/model-credential.d.ts.map +1 -0
  100. package/dist/litellm/model-errors.d.ts +119 -0
  101. package/dist/litellm/model-errors.d.ts.map +1 -0
  102. package/dist/litellm/model-form.d.ts +78 -0
  103. package/dist/litellm/model-form.d.ts.map +1 -0
  104. package/dist/litellm/model-locate.d.ts +13 -0
  105. package/dist/litellm/model-locate.d.ts.map +1 -0
  106. package/dist/litellm/model-operations.d.ts +59 -0
  107. package/dist/litellm/model-operations.d.ts.map +1 -0
  108. package/dist/litellm/model-types.d.ts +91 -0
  109. package/dist/litellm/model-types.d.ts.map +1 -0
  110. package/dist/litellm/model.d.ts +88 -0
  111. package/dist/litellm/model.d.ts.map +1 -0
  112. package/dist/litellm/policy-attachment-form.d.ts +19 -0
  113. package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
  114. package/dist/litellm/policy-attachment-operations.d.ts +31 -0
  115. package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
  116. package/dist/litellm/policy-attachment-types.d.ts +48 -0
  117. package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
  118. package/dist/litellm/policy-attachment.d.ts +61 -0
  119. package/dist/litellm/policy-attachment.d.ts.map +1 -0
  120. package/dist/litellm/policy-form.d.ts +22 -0
  121. package/dist/litellm/policy-form.d.ts.map +1 -0
  122. package/dist/litellm/policy-operations.d.ts +42 -0
  123. package/dist/litellm/policy-operations.d.ts.map +1 -0
  124. package/dist/litellm/policy-types.d.ts +57 -0
  125. package/dist/litellm/policy-types.d.ts.map +1 -0
  126. package/dist/litellm/policy.d.ts +65 -0
  127. package/dist/litellm/policy.d.ts.map +1 -0
  128. package/dist/litellm/providers.d.ts +1 -1
  129. package/dist/litellm/providers.d.ts.map +1 -1
  130. package/dist/litellm/registry-errors.d.ts +62 -0
  131. package/dist/litellm/registry-errors.d.ts.map +1 -0
  132. package/dist/litellm/registry-support.d.ts +42 -0
  133. package/dist/litellm/registry-support.d.ts.map +1 -0
  134. package/dist/litellm/team-form.d.ts +26 -0
  135. package/dist/litellm/team-form.d.ts.map +1 -0
  136. package/dist/litellm/team-members.d.ts +10 -0
  137. package/dist/litellm/team-members.d.ts.map +1 -0
  138. package/dist/litellm/team-operations.d.ts +38 -0
  139. package/dist/litellm/team-operations.d.ts.map +1 -0
  140. package/dist/litellm/team-permission.d.ts +35 -0
  141. package/dist/litellm/team-permission.d.ts.map +1 -0
  142. package/dist/litellm/team-types.d.ts +101 -0
  143. package/dist/litellm/team-types.d.ts.map +1 -0
  144. package/dist/litellm/team.d.ts +67 -0
  145. package/dist/litellm/team.d.ts.map +1 -0
  146. package/dist/litellm/tool-policy-form.d.ts +21 -0
  147. package/dist/litellm/tool-policy-form.d.ts.map +1 -0
  148. package/dist/litellm/tool-policy-operations.d.ts +30 -0
  149. package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
  150. package/dist/litellm/tool-policy-types.d.ts +46 -0
  151. package/dist/litellm/tool-policy-types.d.ts.map +1 -0
  152. package/dist/litellm/tool-policy.d.ts +62 -0
  153. package/dist/litellm/tool-policy.d.ts.map +1 -0
  154. package/dist/litellm/toolset-form.d.ts +20 -0
  155. package/dist/litellm/toolset-form.d.ts.map +1 -0
  156. package/dist/litellm/toolset-operations.d.ts +39 -0
  157. package/dist/litellm/toolset-operations.d.ts.map +1 -0
  158. package/dist/litellm/toolset-types.d.ts +46 -0
  159. package/dist/litellm/toolset-types.d.ts.map +1 -0
  160. package/dist/litellm/toolset.d.ts +55 -0
  161. package/dist/litellm/toolset.d.ts.map +1 -0
  162. package/dist/openbao/index.js +35 -1
  163. package/dist/openbao/index.js.map +3 -3
  164. package/dist/ownership/rows.d.ts +11 -0
  165. package/dist/ownership/rows.d.ts.map +1 -1
  166. package/dist/postgres/connection.d.ts +14 -2
  167. package/dist/postgres/connection.d.ts.map +1 -1
  168. package/dist/postgres/database-sql.d.ts +27 -8
  169. package/dist/postgres/database-sql.d.ts.map +1 -1
  170. package/dist/postgres/fake-grants-parse.d.ts +37 -0
  171. package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
  172. package/dist/postgres/fake-grants-read.d.ts +61 -0
  173. package/dist/postgres/fake-grants-read.d.ts.map +1 -0
  174. package/dist/postgres/fake-grants-sql.d.ts +46 -0
  175. package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
  176. package/dist/postgres/fake-grants-write.d.ts +29 -0
  177. package/dist/postgres/fake-grants-write.d.ts.map +1 -0
  178. package/dist/postgres/fake-role-sql.d.ts +40 -0
  179. package/dist/postgres/fake-role-sql.d.ts.map +1 -0
  180. package/dist/postgres/fake-schema-sql.d.ts +42 -0
  181. package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
  182. package/dist/postgres/fake-sql-parse.d.ts +23 -0
  183. package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
  184. package/dist/postgres/fake-sql-quote.d.ts +12 -0
  185. package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
  186. package/dist/postgres/fake-sql.d.ts +42 -0
  187. package/dist/postgres/fake-sql.d.ts.map +1 -1
  188. package/dist/postgres/grants-attrs.d.ts +115 -0
  189. package/dist/postgres/grants-attrs.d.ts.map +1 -0
  190. package/dist/postgres/grants-declare.d.ts +88 -0
  191. package/dist/postgres/grants-declare.d.ts.map +1 -0
  192. package/dist/postgres/grants-diff.d.ts +25 -0
  193. package/dist/postgres/grants-diff.d.ts.map +1 -0
  194. package/dist/postgres/grants-errors.d.ts +137 -0
  195. package/dist/postgres/grants-errors.d.ts.map +1 -0
  196. package/dist/postgres/grants-existence.d.ts +14 -0
  197. package/dist/postgres/grants-existence.d.ts.map +1 -0
  198. package/dist/postgres/grants-ops.d.ts +65 -0
  199. package/dist/postgres/grants-ops.d.ts.map +1 -0
  200. package/dist/postgres/grants-ownership.d.ts +18 -0
  201. package/dist/postgres/grants-ownership.d.ts.map +1 -0
  202. package/dist/postgres/grants-plan-restore.d.ts +22 -0
  203. package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
  204. package/dist/postgres/grants-plan.d.ts +65 -0
  205. package/dist/postgres/grants-plan.d.ts.map +1 -0
  206. package/dist/postgres/grants-read-defaults.d.ts +17 -0
  207. package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
  208. package/dist/postgres/grants-read.d.ts +77 -0
  209. package/dist/postgres/grants-read.d.ts.map +1 -0
  210. package/dist/postgres/grants-refuse.d.ts +25 -0
  211. package/dist/postgres/grants-refuse.d.ts.map +1 -0
  212. package/dist/postgres/grants-sql.d.ts +42 -0
  213. package/dist/postgres/grants-sql.d.ts.map +1 -0
  214. package/dist/postgres/grants-words.d.ts +29 -0
  215. package/dist/postgres/grants-words.d.ts.map +1 -0
  216. package/dist/postgres/grants.d.ts +37 -0
  217. package/dist/postgres/grants.d.ts.map +1 -0
  218. package/dist/postgres/index.d.ts +31 -6
  219. package/dist/postgres/index.d.ts.map +1 -1
  220. package/dist/postgres/index.js +1975 -37
  221. package/dist/postgres/index.js.map +46 -7
  222. package/dist/postgres/installed-classifier.d.ts +13 -0
  223. package/dist/postgres/installed-classifier.d.ts.map +1 -0
  224. package/dist/postgres/providers.d.ts +16 -8
  225. package/dist/postgres/providers.d.ts.map +1 -1
  226. package/dist/postgres/psql-executor.d.ts +4 -0
  227. package/dist/postgres/psql-executor.d.ts.map +1 -1
  228. package/dist/postgres/role-attrs.d.ts +109 -0
  229. package/dist/postgres/role-attrs.d.ts.map +1 -0
  230. package/dist/postgres/role-diff.d.ts +22 -0
  231. package/dist/postgres/role-diff.d.ts.map +1 -0
  232. package/dist/postgres/role-errors.d.ts +126 -0
  233. package/dist/postgres/role-errors.d.ts.map +1 -0
  234. package/dist/postgres/role-membership-sql.d.ts +75 -0
  235. package/dist/postgres/role-membership-sql.d.ts.map +1 -0
  236. package/dist/postgres/role-provider.d.ts +11 -0
  237. package/dist/postgres/role-provider.d.ts.map +1 -0
  238. package/dist/postgres/role-scram.d.ts +6 -0
  239. package/dist/postgres/role-scram.d.ts.map +1 -0
  240. package/dist/postgres/role-secrets.d.ts +30 -0
  241. package/dist/postgres/role-secrets.d.ts.map +1 -0
  242. package/dist/postgres/role-sql.d.ts +68 -0
  243. package/dist/postgres/role-sql.d.ts.map +1 -0
  244. package/dist/postgres/role.d.ts +57 -0
  245. package/dist/postgres/role.d.ts.map +1 -0
  246. package/dist/postgres/schema-assert.d.ts +50 -0
  247. package/dist/postgres/schema-assert.d.ts.map +1 -0
  248. package/dist/postgres/schema-attrs.d.ts +51 -0
  249. package/dist/postgres/schema-attrs.d.ts.map +1 -0
  250. package/dist/postgres/schema-delete.d.ts +28 -0
  251. package/dist/postgres/schema-delete.d.ts.map +1 -0
  252. package/dist/postgres/schema-diff.d.ts +14 -0
  253. package/dist/postgres/schema-diff.d.ts.map +1 -0
  254. package/dist/postgres/schema-errors.d.ts +139 -0
  255. package/dist/postgres/schema-errors.d.ts.map +1 -0
  256. package/dist/postgres/schema-identity.d.ts +8 -0
  257. package/dist/postgres/schema-identity.d.ts.map +1 -0
  258. package/dist/postgres/schema-reconcile.d.ts +12 -0
  259. package/dist/postgres/schema-reconcile.d.ts.map +1 -0
  260. package/dist/postgres/schema-sql.d.ts +45 -0
  261. package/dist/postgres/schema-sql.d.ts.map +1 -0
  262. package/dist/postgres/schema-test-kit.d.ts +67 -0
  263. package/dist/postgres/schema-test-kit.d.ts.map +1 -0
  264. package/dist/postgres/schema.d.ts +54 -0
  265. package/dist/postgres/schema.d.ts.map +1 -0
  266. package/dist/proxmox/index.js +35 -1
  267. package/dist/proxmox/index.js.map +3 -3
  268. package/dist/release/fake-engine.d.ts +10 -0
  269. package/dist/release/fake-engine.d.ts.map +1 -1
  270. package/dist/release/index.js +35 -1
  271. package/dist/release/index.js.map +3 -3
  272. package/dist/valkey/acl-attrs.d.ts +94 -0
  273. package/dist/valkey/acl-attrs.d.ts.map +1 -0
  274. package/dist/valkey/acl-compare.d.ts +28 -0
  275. package/dist/valkey/acl-compare.d.ts.map +1 -0
  276. package/dist/valkey/acl-connection.d.ts +6 -0
  277. package/dist/valkey/acl-connection.d.ts.map +1 -0
  278. package/dist/valkey/acl-form.d.ts +62 -0
  279. package/dist/valkey/acl-form.d.ts.map +1 -0
  280. package/dist/valkey/acl-managed.d.ts +4 -0
  281. package/dist/valkey/acl-managed.d.ts.map +1 -0
  282. package/dist/valkey/acl-ops.d.ts +37 -0
  283. package/dist/valkey/acl-ops.d.ts.map +1 -0
  284. package/dist/valkey/acl-profiles.d.ts +53 -0
  285. package/dist/valkey/acl-profiles.d.ts.map +1 -0
  286. package/dist/valkey/acl-reconcile.d.ts +26 -0
  287. package/dist/valkey/acl-reconcile.d.ts.map +1 -0
  288. package/dist/valkey/acl.d.ts +24 -0
  289. package/dist/valkey/acl.d.ts.map +1 -0
  290. package/dist/valkey/connection-service.d.ts +22 -0
  291. package/dist/valkey/connection-service.d.ts.map +1 -0
  292. package/dist/valkey/connection.d.ts +59 -0
  293. package/dist/valkey/connection.d.ts.map +1 -0
  294. package/dist/valkey/errors.d.ts +165 -0
  295. package/dist/valkey/errors.d.ts.map +1 -0
  296. package/dist/valkey/fake-acl.d.ts +29 -0
  297. package/dist/valkey/fake-acl.d.ts.map +1 -0
  298. package/dist/valkey/fake-valkey.d.ts +35 -0
  299. package/dist/valkey/fake-valkey.d.ts.map +1 -0
  300. package/dist/valkey/handler-test-fixture.d.ts +20 -0
  301. package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
  302. package/dist/valkey/index.d.ts +18 -0
  303. package/dist/valkey/index.d.ts.map +1 -0
  304. package/dist/valkey/index.js +964 -0
  305. package/dist/valkey/index.js.map +27 -0
  306. package/dist/valkey/instance-attrs.d.ts +46 -0
  307. package/dist/valkey/instance-attrs.d.ts.map +1 -0
  308. package/dist/valkey/instance-form.d.ts +22 -0
  309. package/dist/valkey/instance-form.d.ts.map +1 -0
  310. package/dist/valkey/instance.d.ts +48 -0
  311. package/dist/valkey/instance.d.ts.map +1 -0
  312. package/dist/valkey/provider-socket-fixture.d.ts +8 -0
  313. package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
  314. package/dist/valkey/providers.d.ts +16 -0
  315. package/dist/valkey/providers.d.ts.map +1 -0
  316. package/dist/valkey/resp.d.ts +38 -0
  317. package/dist/valkey/resp.d.ts.map +1 -0
  318. package/dist/valkey/transport-error.d.ts +36 -0
  319. package/dist/valkey/transport-error.d.ts.map +1 -0
  320. package/dist/valkey/transport.d.ts +50 -0
  321. package/dist/valkey/transport.d.ts.map +1 -0
  322. package/docs/litellm-access-group.md +105 -0
  323. package/docs/litellm-credential.md +60 -0
  324. package/docs/litellm-key-metadata.md +56 -0
  325. package/docs/litellm-key.md +194 -0
  326. package/docs/litellm-mcp.md +187 -0
  327. package/docs/litellm-model.md +111 -0
  328. package/docs/litellm-policy-attachment.md +86 -0
  329. package/docs/litellm-policy.md +103 -0
  330. package/docs/litellm-team.md +117 -0
  331. package/docs/litellm-tool-policy.md +90 -0
  332. package/docs/litellm-toolset.md +92 -0
  333. package/docs/litellm.md +16 -9
  334. package/docs/peers.md +15 -6
  335. package/docs/postgres-grants-example.md +55 -0
  336. package/docs/postgres-grants.md +157 -0
  337. package/docs/postgres-role.md +114 -0
  338. package/docs/postgres-schema.md +139 -0
  339. package/docs/postgres.md +20 -3
  340. package/docs/valkey-transport.md +29 -0
  341. package/docs/valkey.md +187 -0
  342. package/package.json +6 -2
  343. package/src/litellm/access-group-form.ts +105 -0
  344. package/src/litellm/access-group-operations.ts +92 -0
  345. package/src/litellm/access-group-types.ts +49 -0
  346. package/src/litellm/access-group.test.ts +197 -0
  347. package/src/litellm/access-group.ts +151 -0
  348. package/src/litellm/credential-errors.ts +183 -0
  349. package/src/litellm/credential-form.test.ts +151 -0
  350. package/src/litellm/credential-form.ts +211 -0
  351. package/src/litellm/credential-guards.test.ts +241 -0
  352. package/src/litellm/credential-operations.ts +208 -0
  353. package/src/litellm/credential-recovery.test.ts +93 -0
  354. package/src/litellm/credential-rewrite.test.ts +164 -0
  355. package/src/litellm/credential-rewrite.ts +50 -0
  356. package/src/litellm/credential-types.ts +117 -0
  357. package/src/litellm/credential-values.ts +94 -0
  358. package/src/litellm/credential.test.ts +218 -0
  359. package/src/litellm/credential.ts +227 -0
  360. package/src/litellm/fake-access-group-litellm.ts +127 -0
  361. package/src/litellm/fake-credential-litellm.ts +216 -0
  362. package/src/litellm/fake-keys.ts +190 -0
  363. package/src/litellm/fake-litellm.ts +19 -9
  364. package/src/litellm/fake-mcp-litellm.ts +214 -0
  365. package/src/litellm/fake-model-litellm-post-update.ts +103 -0
  366. package/src/litellm/fake-model-litellm.ts +233 -0
  367. package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
  368. package/src/litellm/fake-policy-litellm.ts +186 -0
  369. package/src/litellm/fake-registry-base.ts +69 -0
  370. package/src/litellm/fake-stack.ts +17 -1
  371. package/src/litellm/fake-team-litellm.ts +229 -0
  372. package/src/litellm/fake-tool-litellm.ts +88 -0
  373. package/src/litellm/fake-toolset-litellm.ts +110 -0
  374. package/src/litellm/index.ts +140 -0
  375. package/src/litellm/key-delete.test.ts +212 -0
  376. package/src/litellm/key-errors.ts +241 -0
  377. package/src/litellm/key-form.ts +200 -0
  378. package/src/litellm/key-harness.ts +121 -0
  379. package/src/litellm/key-metadata-errors.ts +49 -0
  380. package/src/litellm/key-metadata.test.ts +156 -0
  381. package/src/litellm/key-metadata.ts +74 -0
  382. package/src/litellm/key-operations.ts +184 -0
  383. package/src/litellm/key-rotation.test.ts +110 -0
  384. package/src/litellm/key-scope.test.ts +135 -0
  385. package/src/litellm/key-secret.test.ts +248 -0
  386. package/src/litellm/key-secret.ts +137 -0
  387. package/src/litellm/key-transport.test.ts +166 -0
  388. package/src/litellm/key.test.ts +231 -0
  389. package/src/litellm/key.ts +213 -0
  390. package/src/litellm/mcp-server-adopt.test.ts +86 -0
  391. package/src/litellm/mcp-server-alias.test.ts +184 -0
  392. package/src/litellm/mcp-server-credential.ts +85 -0
  393. package/src/litellm/mcp-server-errors.ts +141 -0
  394. package/src/litellm/mcp-server-exports.test.ts +15 -0
  395. package/src/litellm/mcp-server-form.test.ts +241 -0
  396. package/src/litellm/mcp-server-form.ts +233 -0
  397. package/src/litellm/mcp-server-handlers.test.ts +150 -0
  398. package/src/litellm/mcp-server-locate.ts +66 -0
  399. package/src/litellm/mcp-server-operations.ts +111 -0
  400. package/src/litellm/mcp-server-registry.test.ts +146 -0
  401. package/src/litellm/mcp-server-retype.test.ts +114 -0
  402. package/src/litellm/mcp-server-shadow.test.ts +91 -0
  403. package/src/litellm/mcp-server-shadow.ts +45 -0
  404. package/src/litellm/mcp-server-tools.test.ts +85 -0
  405. package/src/litellm/mcp-server-types.ts +143 -0
  406. package/src/litellm/mcp-server-url.ts +66 -0
  407. package/src/litellm/mcp-server.test.ts +213 -0
  408. package/src/litellm/mcp-server.ts +225 -0
  409. package/src/litellm/model-claim.ts +69 -0
  410. package/src/litellm/model-credential.ts +45 -0
  411. package/src/litellm/model-errors.ts +168 -0
  412. package/src/litellm/model-foreign-row.test.ts +173 -0
  413. package/src/litellm/model-form.test.ts +228 -0
  414. package/src/litellm/model-form.ts +223 -0
  415. package/src/litellm/model-locate.test.ts +128 -0
  416. package/src/litellm/model-locate.ts +67 -0
  417. package/src/litellm/model-operations.test.ts +93 -0
  418. package/src/litellm/model-operations.ts +146 -0
  419. package/src/litellm/model-params-preserve.test.ts +119 -0
  420. package/src/litellm/model-recovery.test.ts +57 -0
  421. package/src/litellm/model-types.ts +112 -0
  422. package/src/litellm/model.test.ts +222 -0
  423. package/src/litellm/model.ts +237 -0
  424. package/src/litellm/policy-attachment-form.ts +103 -0
  425. package/src/litellm/policy-attachment-operations.ts +74 -0
  426. package/src/litellm/policy-attachment-types.ts +48 -0
  427. package/src/litellm/policy-attachment.test.ts +198 -0
  428. package/src/litellm/policy-attachment.ts +178 -0
  429. package/src/litellm/policy-form.ts +122 -0
  430. package/src/litellm/policy-operations.ts +112 -0
  431. package/src/litellm/policy-types.ts +58 -0
  432. package/src/litellm/policy.test.ts +214 -0
  433. package/src/litellm/policy.ts +146 -0
  434. package/src/litellm/providers.ts +24 -3
  435. package/src/litellm/registry-errors.ts +88 -0
  436. package/src/litellm/registry-exports.test.ts +66 -0
  437. package/src/litellm/registry-support.ts +109 -0
  438. package/src/litellm/team-form.ts +140 -0
  439. package/src/litellm/team-members.test.ts +150 -0
  440. package/src/litellm/team-members.ts +58 -0
  441. package/src/litellm/team-operations.ts +90 -0
  442. package/src/litellm/team-permission.ts +159 -0
  443. package/src/litellm/team-read.test.ts +89 -0
  444. package/src/litellm/team-types.ts +106 -0
  445. package/src/litellm/team.test.ts +206 -0
  446. package/src/litellm/team.ts +159 -0
  447. package/src/litellm/tool-policy-form.ts +94 -0
  448. package/src/litellm/tool-policy-operations.ts +58 -0
  449. package/src/litellm/tool-policy-types.ts +48 -0
  450. package/src/litellm/tool-policy.test.ts +172 -0
  451. package/src/litellm/tool-policy.ts +125 -0
  452. package/src/litellm/toolset-form.ts +104 -0
  453. package/src/litellm/toolset-operations.ts +90 -0
  454. package/src/litellm/toolset-types.ts +47 -0
  455. package/src/litellm/toolset.test.ts +198 -0
  456. package/src/litellm/toolset.ts +151 -0
  457. package/src/ownership/ownership.test.ts +33 -1
  458. package/src/ownership/rows.ts +53 -0
  459. package/src/postgres/connection.ts +42 -7
  460. package/src/postgres/database-bigint-serialization.test.ts +1 -0
  461. package/src/postgres/database-refusals.test.ts +2 -2
  462. package/src/postgres/database-sql.ts +36 -9
  463. package/src/postgres/fake-grants-parse.ts +189 -0
  464. package/src/postgres/fake-grants-read.ts +250 -0
  465. package/src/postgres/fake-grants-sql.ts +207 -0
  466. package/src/postgres/fake-grants-write.ts +90 -0
  467. package/src/postgres/fake-role-sql.ts +220 -0
  468. package/src/postgres/fake-schema-semantics.test.ts +36 -0
  469. package/src/postgres/fake-schema-sql.ts +146 -0
  470. package/src/postgres/fake-sql-parse.ts +86 -0
  471. package/src/postgres/fake-sql-quote.ts +36 -0
  472. package/src/postgres/fake-sql.ts +161 -46
  473. package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
  474. package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
  475. package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
  476. package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
  477. package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
  478. package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
  479. package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
  480. package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
  481. package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
  482. package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
  483. package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
  484. package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
  485. package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
  486. package/src/postgres/grants-acl.test.ts +61 -0
  487. package/src/postgres/grants-attrs.ts +185 -0
  488. package/src/postgres/grants-database.test.ts +158 -0
  489. package/src/postgres/grants-declare.ts +172 -0
  490. package/src/postgres/grants-delete-proof.test.ts +154 -0
  491. package/src/postgres/grants-diff.ts +101 -0
  492. package/src/postgres/grants-errors.ts +215 -0
  493. package/src/postgres/grants-existence-guards.test.ts +113 -0
  494. package/src/postgres/grants-existence.ts +101 -0
  495. package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
  496. package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
  497. package/src/postgres/grants-lifecycle.test.ts +181 -0
  498. package/src/postgres/grants-ops.ts +229 -0
  499. package/src/postgres/grants-owner-revoke.test.ts +121 -0
  500. package/src/postgres/grants-ownership.ts +49 -0
  501. package/src/postgres/grants-plan-collateral.test.ts +202 -0
  502. package/src/postgres/grants-plan-diff.test.ts +204 -0
  503. package/src/postgres/grants-plan-restore.ts +43 -0
  504. package/src/postgres/grants-plan-revocations.test.ts +69 -0
  505. package/src/postgres/grants-plan.test.ts +148 -0
  506. package/src/postgres/grants-plan.ts +245 -0
  507. package/src/postgres/grants-provenance.test.ts +134 -0
  508. package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
  509. package/src/postgres/grants-read-absent.test.ts +91 -0
  510. package/src/postgres/grants-read-defaults.ts +51 -0
  511. package/src/postgres/grants-read.ts +250 -0
  512. package/src/postgres/grants-refusals.test.ts +136 -0
  513. package/src/postgres/grants-refuse.ts +119 -0
  514. package/src/postgres/grants-relkind-wire.test.ts +111 -0
  515. package/src/postgres/grants-repair-plan.test.ts +201 -0
  516. package/src/postgres/grants-sql.test.ts +128 -0
  517. package/src/postgres/grants-sql.ts +144 -0
  518. package/src/postgres/grants-words.ts +34 -0
  519. package/src/postgres/grants.ts +110 -0
  520. package/src/postgres/index.ts +128 -5
  521. package/src/postgres/installed-classifier.ts +36 -0
  522. package/src/postgres/providers.ts +33 -9
  523. package/src/postgres/psql-executor-escaping.test.ts +67 -0
  524. package/src/postgres/psql-executor.test.ts +63 -2
  525. package/src/postgres/psql-executor.ts +74 -34
  526. package/src/postgres/role-adopt.test.ts +98 -0
  527. package/src/postgres/role-attrs.ts +134 -0
  528. package/src/postgres/role-diff.ts +89 -0
  529. package/src/postgres/role-errors.ts +198 -0
  530. package/src/postgres/role-guard.test.ts +60 -0
  531. package/src/postgres/role-identity.test.ts +185 -0
  532. package/src/postgres/role-lifecycle.test.ts +228 -0
  533. package/src/postgres/role-membership-sql.ts +198 -0
  534. package/src/postgres/role-password.test.ts +158 -0
  535. package/src/postgres/role-privilege.test.ts +80 -0
  536. package/src/postgres/role-provenance.test.ts +200 -0
  537. package/src/postgres/role-provider.ts +104 -0
  538. package/src/postgres/role-refusals.test.ts +250 -0
  539. package/src/postgres/role-scram.test.ts +38 -0
  540. package/src/postgres/role-scram.ts +38 -0
  541. package/src/postgres/role-secrets.ts +46 -0
  542. package/src/postgres/role-sql.ts +211 -0
  543. package/src/postgres/role-valid-until.test.ts +68 -0
  544. package/src/postgres/role.ts +218 -0
  545. package/src/postgres/schema-assert.ts +139 -0
  546. package/src/postgres/schema-attrs.ts +71 -0
  547. package/src/postgres/schema-delete-proofs.test.ts +192 -0
  548. package/src/postgres/schema-delete.ts +96 -0
  549. package/src/postgres/schema-diff.ts +44 -0
  550. package/src/postgres/schema-drop-2bp01.test.ts +146 -0
  551. package/src/postgres/schema-errors.ts +209 -0
  552. package/src/postgres/schema-handlers.test.ts +193 -0
  553. package/src/postgres/schema-identity.ts +39 -0
  554. package/src/postgres/schema-lifecycle.test.ts +246 -0
  555. package/src/postgres/schema-race.test.ts +70 -0
  556. package/src/postgres/schema-reconcile.ts +100 -0
  557. package/src/postgres/schema-refusals.test.ts +144 -0
  558. package/src/postgres/schema-socket.test.ts +161 -0
  559. package/src/postgres/schema-sql.ts +130 -0
  560. package/src/postgres/schema-takeover.test.ts +149 -0
  561. package/src/postgres/schema-test-kit.ts +85 -0
  562. package/src/postgres/schema.ts +130 -0
  563. package/src/release/binary-alias.test.ts +3 -3
  564. package/src/release/binary-claims.test.ts +3 -3
  565. package/src/release/binary-directory-umask.test.ts +65 -0
  566. package/src/release/fake-engine.ts +15 -0
  567. package/src/valkey/acl-attrs.ts +98 -0
  568. package/src/valkey/acl-compare.ts +57 -0
  569. package/src/valkey/acl-connection.ts +13 -0
  570. package/src/valkey/acl-delete.test.ts +127 -0
  571. package/src/valkey/acl-form.ts +239 -0
  572. package/src/valkey/acl-managed.ts +13 -0
  573. package/src/valkey/acl-ops.ts +122 -0
  574. package/src/valkey/acl-ownership.test.ts +118 -0
  575. package/src/valkey/acl-prefix.test.ts +38 -0
  576. package/src/valkey/acl-profiles.ts +81 -0
  577. package/src/valkey/acl-reconcile.ts +180 -0
  578. package/src/valkey/acl-reserved.test.ts +69 -0
  579. package/src/valkey/acl-revocation.test.ts +94 -0
  580. package/src/valkey/acl-seat-prefix.test.ts +111 -0
  581. package/src/valkey/acl-validation.test.ts +54 -0
  582. package/src/valkey/acl.test.ts +215 -0
  583. package/src/valkey/acl.ts +169 -0
  584. package/src/valkey/connection-service.ts +46 -0
  585. package/src/valkey/connection.ts +180 -0
  586. package/src/valkey/errors.ts +239 -0
  587. package/src/valkey/fake-acl.ts +128 -0
  588. package/src/valkey/fake-valkey.ts +224 -0
  589. package/src/valkey/handler-test-fixture.ts +43 -0
  590. package/src/valkey/handlers.test.ts +205 -0
  591. package/src/valkey/index.ts +54 -0
  592. package/src/valkey/instance-attrs.ts +48 -0
  593. package/src/valkey/instance-form.ts +104 -0
  594. package/src/valkey/instance.test.ts +108 -0
  595. package/src/valkey/instance.ts +160 -0
  596. package/src/valkey/provider-socket-fixture.ts +71 -0
  597. package/src/valkey/providers.test.ts +129 -0
  598. package/src/valkey/providers.ts +21 -0
  599. package/src/valkey/resp.ts +212 -0
  600. package/src/valkey/transport-bounds.test.ts +150 -0
  601. package/src/valkey/transport-error.ts +37 -0
  602. package/src/valkey/transport.test.ts +158 -0
  603. package/src/valkey/transport.ts +109 -0
  604. package/src/valkey/upstream-bounds.test.ts +14 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * A fake of LiteLLM's `/v1/mcp/toolset` routes for tests — TEST ONLY. Skeleton and the rules every
3
+ * fake follows: fake-registry-base.ts.
4
+ *
5
+ * ★ MEASURED FROM THE LIVE 1.103.0 CONTAINER'S SOURCE (2026-09-30, `mcp_management_endpoints.py` and
6
+ * `toolset_db.py`, read, not called): the id is a server-issued uuid (the create has no id field);
7
+ * the name is unique (create or rename onto a taken one is a 409); a create answers 201 with the
8
+ * row; the edit is partial — absent keeps, `null` clears, EXCEPT a `null` name or `tools`, which are
9
+ * no-ops; a delete answers 202 with NO BODY, a missing id is a 404; the by-id read is the table.
10
+ * ★ ALSO MEASURED: the LIST swallows a database error into `[]` (`list_mcp_toolsets`), which
11
+ * `listSwallowsErrors` models — the list then says nothing about what exists.
12
+ * ⚠️ NOT MODELLED: the caller-scoped narrowing of the list for a non-admin key.
13
+ */
14
+ import { FAKE_KEY, type FakeRecord, empty, json, recordingFetch } from './fake-registry-base.ts';
15
+ import type { Row } from './registry-support.ts';
16
+
17
+ export interface FakeToolsetLitellm extends FakeRecord {
18
+ readonly toolsets: () => readonly Row[];
19
+ }
20
+
21
+ export interface FakeToolsetOptions {
22
+ readonly masterKey?: string;
23
+ readonly seed?: readonly Row[];
24
+ /** `GET /v1/mcp/toolset` answers `[]` whatever exists (a swallowed database error). */
25
+ readonly listSwallowsErrors?: boolean;
26
+ /** `POST`/`PUT`/`DELETE` answer 403, as for a key that is not PROXY_ADMIN. */
27
+ readonly forbidWrites?: boolean;
28
+ }
29
+
30
+ export const toolsetRow = (fields: Row): Row => ({
31
+ created_at: '2026-09-30T00:00:00Z',
32
+ description: null,
33
+ tools: [],
34
+ updated_at: '2026-09-30T00:00:00Z',
35
+ ...fields,
36
+ });
37
+
38
+ export const startFakeToolsetLitellm = (options: FakeToolsetOptions = {}): FakeToolsetLitellm => {
39
+ let rows: Row[] = (options.seed ?? []).map((row) => ({ ...row }));
40
+ let issued = 0;
41
+
42
+ const record = recordingFetch(options.masterKey ?? FAKE_KEY, ({ body, request, url }) => {
43
+ const byId = /^\/v1\/mcp\/toolset\/([^/]+)$/.exec(url.pathname);
44
+ if (url.pathname === '/v1/mcp/toolset' && request.method === 'GET') {
45
+ return json(200, options.listSwallowsErrors === true ? [] : rows);
46
+ }
47
+ if (byId !== null && request.method === 'GET') {
48
+ const id = decodeURIComponent(byId[1] ?? '');
49
+ const found = rows.find((row) => row['toolset_id'] === id);
50
+ return found === undefined
51
+ ? json(404, { detail: { error: `Toolset '${id}' not found.` } })
52
+ : json(200, found);
53
+ }
54
+ if (request.method !== 'GET' && options.forbidWrites === true) {
55
+ return json(403, { detail: { error: 'Only proxy admins can change MCP toolsets.' } });
56
+ }
57
+ if (url.pathname === '/v1/mcp/toolset' && request.method === 'POST') {
58
+ if (rows.some((row) => row['toolset_name'] === body['toolset_name'])) {
59
+ return json(409, {
60
+ detail: { error: `A toolset named '${String(body['toolset_name'])}' already exists.` },
61
+ });
62
+ }
63
+ issued += 1;
64
+ const created = toolsetRow({
65
+ description: body['description'] ?? null,
66
+ tools: body['tools'] ?? [],
67
+ toolset_id: `FAKE-toolset-${String(issued).padStart(4, '0')}`,
68
+ toolset_name: body['toolset_name'],
69
+ });
70
+ rows = [...rows, created];
71
+ return json(201, created);
72
+ }
73
+ if (url.pathname === '/v1/mcp/toolset' && request.method === 'PUT') {
74
+ const at = rows.findIndex((row) => row['toolset_id'] === body['toolset_id']);
75
+ if (at === -1) {
76
+ return json(404, {
77
+ detail: { error: `Toolset '${String(body['toolset_id'])}' not found.` },
78
+ });
79
+ }
80
+ const taken = rows.some(
81
+ (row, i) =>
82
+ i !== at &&
83
+ body['toolset_name'] !== undefined &&
84
+ row['toolset_name'] === body['toolset_name'],
85
+ );
86
+ if (taken)
87
+ return json(409, { detail: { error: 'A toolset with that name already exists.' } });
88
+ // ★ measured: absent keeps, null clears — except a null name or tools, which change nothing
89
+ const { toolset_id: _id, ...sent } = body;
90
+ const patch = Object.fromEntries(
91
+ Object.entries(sent).filter(
92
+ ([key, value]) => !(value === null && (key === 'toolset_name' || key === 'tools')),
93
+ ),
94
+ );
95
+ rows = rows.map((row, i) => (i === at ? { ...row, ...patch } : row));
96
+ return json(200, rows[at]);
97
+ }
98
+ if (byId !== null && request.method === 'DELETE') {
99
+ const id = decodeURIComponent(byId[1] ?? '');
100
+ if (!rows.some((row) => row['toolset_id'] === id)) {
101
+ return json(404, { detail: { error: `Toolset '${id}' not found.` } });
102
+ }
103
+ rows = rows.filter((row) => row['toolset_id'] !== id);
104
+ return empty(202);
105
+ }
106
+ return json(404, { detail: 'not found' });
107
+ });
108
+
109
+ return { ...record, toolsets: () => rows.map((row) => ({ ...row })) };
110
+ };
@@ -38,4 +38,144 @@ export {
38
38
  LitellmBudgetHardCapUnjustifiedError,
39
39
  LitellmBudgetUnreadableError,
40
40
  } from './budget-errors.ts';
41
+ export {
42
+ LiteLLMCredential,
43
+ LiteLLMCredentialProvider,
44
+ isLiteLLMCredential,
45
+ type CredentialAttributes,
46
+ type CredentialError,
47
+ type CredentialProps,
48
+ } from './credential.ts';
49
+ export {
50
+ LitellmCredentialAbsentAfterWriteError,
51
+ LitellmCredentialEnvUnsetError,
52
+ LitellmCredentialInvalidError,
53
+ LitellmCredentialNotConvergedError,
54
+ LitellmCredentialUnreadableError,
55
+ } from './credential-errors.ts';
56
+ export {
57
+ LiteLLMMCPServer,
58
+ LiteLLMMCPServerProvider,
59
+ isLiteLLMMCPServer,
60
+ type McpServerAttributes,
61
+ type McpServerError,
62
+ type McpServerProps,
63
+ } from './mcp-server.ts';
64
+ export {
65
+ LitellmMcpServerAbsentAfterWriteError,
66
+ LitellmMcpServerAmbiguousNameError,
67
+ LitellmMcpServerCredentialEnvUnsetError,
68
+ LitellmMcpServerDescriptionShadowedError,
69
+ LitellmMcpServerInvalidError,
70
+ LitellmMcpServerNotConvergedError,
71
+ LitellmMcpServerUnreadableError,
72
+ } from './mcp-server-errors.ts';
73
+ export type { McpAuthType, McpStaticAuthType, McpTransport } from './mcp-server-types.ts';
74
+ export {
75
+ LiteLLMAccessGroup,
76
+ LiteLLMAccessGroupProvider,
77
+ isLiteLLMAccessGroup,
78
+ type AccessGroupAttributes,
79
+ type AccessGroupError,
80
+ type AccessGroupProps,
81
+ } from './access-group.ts';
82
+ export {
83
+ LiteLLMPolicyAttachment,
84
+ LiteLLMPolicyAttachmentProvider,
85
+ isLiteLLMPolicyAttachment,
86
+ type PolicyAttachmentAttributes,
87
+ type PolicyAttachmentError,
88
+ type PolicyAttachmentProps,
89
+ } from './policy-attachment.ts';
90
+ export {
91
+ LiteLLMPolicy,
92
+ LiteLLMPolicyProvider,
93
+ isLiteLLMPolicy,
94
+ type PolicyAttributes,
95
+ type PolicyError,
96
+ type PolicyProps,
97
+ } from './policy.ts';
98
+ export {
99
+ LiteLLMTeam,
100
+ LiteLLMTeamProvider,
101
+ isLiteLLMTeam,
102
+ type TeamAttributes,
103
+ type TeamError,
104
+ type TeamMember,
105
+ type TeamMemberAttributes,
106
+ type TeamObjectPermission,
107
+ type TeamObjectPermissionAttributes,
108
+ type TeamProps,
109
+ } from './team.ts';
110
+ export {
111
+ LiteLLMToolPolicy,
112
+ LiteLLMToolPolicyProvider,
113
+ isLiteLLMToolPolicy,
114
+ type ToolInputPolicy,
115
+ type ToolOutputPolicy,
116
+ type ToolPolicyAttributes,
117
+ type ToolPolicyError,
118
+ type ToolPolicyProps,
119
+ } from './tool-policy.ts';
120
+ export {
121
+ LiteLLMToolset,
122
+ LiteLLMToolsetProvider,
123
+ isLiteLLMToolset,
124
+ type ToolsetAttributes,
125
+ type ToolsetError,
126
+ type ToolsetProps,
127
+ } from './toolset.ts';
128
+ export type { ToolsetTool } from './toolset-types.ts';
129
+ export {
130
+ LiteLLMModel,
131
+ LiteLLMModelProvider,
132
+ isLiteLLMModel,
133
+ type ModelAttributes,
134
+ type ModelError,
135
+ type ModelProps,
136
+ } from './model.ts';
137
+ export {
138
+ LitellmModelAbsentAfterWriteError,
139
+ LitellmModelAmbiguousNameError,
140
+ LitellmModelConfigFileRowError,
141
+ LitellmModelForeignRowError,
142
+ LitellmModelInvalidError,
143
+ LitellmModelNotConvergedError,
144
+ LitellmModelPriorGenerationError,
145
+ LitellmModelUnreadableError,
146
+ } from './model-errors.ts';
147
+ export {
148
+ LitellmRegistryAbsentAfterWriteError,
149
+ LitellmRegistryAmbiguousError,
150
+ LitellmRegistryInvalidError,
151
+ LitellmRegistryNotConvergedError,
152
+ LitellmRegistryUnreadableError,
153
+ type RegistryError,
154
+ } from './registry-errors.ts';
155
+ export {
156
+ LiteLLMKey,
157
+ LiteLLMKeyProvider,
158
+ isLiteLLMKey,
159
+ type KeyAttributes,
160
+ type KeyError,
161
+ type KeyProps,
162
+ } from './key.ts';
163
+ export {
164
+ LitellmKeyAbsentAfterWriteError,
165
+ LitellmKeyAliasChangedError,
166
+ LitellmKeyAliasEmptyError,
167
+ LitellmKeyDebugLoggingError,
168
+ LitellmKeyAmbiguousAliasError,
169
+ LitellmKeyFieldNotAppliedError,
170
+ LitellmKeyTransportError,
171
+ LitellmKeyUnreadableError,
172
+ LitellmKeyValueMalformedError,
173
+ LitellmKeyValueMissingError,
174
+ LitellmKeyValueNotHonouredError,
175
+ LitellmKeyValueRequiredError,
176
+ } from './key-errors.ts';
177
+ export {
178
+ LitellmKeyCallbackMetadataDeclaredError,
179
+ LitellmKeyCallbackMetadataLiveError,
180
+ } from './key-metadata-errors.ts';
41
181
  export { litellmProviders } from './providers.ts';
@@ -0,0 +1,212 @@
1
+ /**
2
+ * `LiteLLM.Key` removal and read failures: what a delete does to a key that is there, one that is
3
+ * not, one it may not remove, and what a proxy that cannot be reached must never be taken to mean.
4
+ */
5
+ import { describe, expect, test } from 'bun:test';
6
+ import * as RemovalPolicy from 'alchemy/RemovalPolicy';
7
+ import * as Effect from 'effect/Effect';
8
+ import { keyHandlers } from './key.ts';
9
+ import type { KeyAttributes } from './key-form.ts';
10
+ import {
11
+ FAKE_KEY,
12
+ VAR,
13
+ declare,
14
+ failureOf,
15
+ keyStack,
16
+ liveRow,
17
+ newFake,
18
+ runAgainst,
19
+ withEnv,
20
+ } from './key-harness.ts';
21
+
22
+ const seat = { key: { fromEnv: VAR }, keyAlias: 'seat-a' } as const;
23
+ const attributes: KeyAttributes = {
24
+ allowedRoutes: [],
25
+ budgetId: null,
26
+ duration: null,
27
+ expires: null,
28
+ keyAlias: 'seat-a',
29
+ metadata: {},
30
+ models: [],
31
+ teamId: null,
32
+ withheld: [],
33
+ };
34
+ const paths = (fake: ReturnType<typeof newFake>) => fake.keys.writes().map((write) => write.path);
35
+ const answer = (status: number, body: unknown) =>
36
+ new Response(JSON.stringify(body), { headers: { 'content-type': 'application/json' }, status });
37
+ /** The fake, with `POST /key/delete` answered by `respond` (the row untouched) and every other route its own. */
38
+ const deleteAnswering = (fake: ReturnType<typeof newFake>, respond: () => Response) => ({
39
+ ...fake,
40
+ fetch: (async (input: string | URL | Request, init?: RequestInit) =>
41
+ new URL(input instanceof Request ? input.url : String(input)).pathname === '/key/delete'
42
+ ? respond()
43
+ : fake.fetch(input, init)) as typeof globalThis.fetch,
44
+ });
45
+ const create = (stack: ReturnType<typeof keyStack>, destroy: boolean) =>
46
+ withEnv({ [VAR]: FAKE_KEY }, () =>
47
+ stack.deploy(destroy ? declare(seat).pipe(RemovalPolicy.destroy()) : declare(seat)),
48
+ );
49
+
50
+ describe('delete', () => {
51
+ test('retain is the default: dropping the declaration leaves the key live and sends no delete', async () => {
52
+ const fake = newFake();
53
+ const stack = keyStack(fake);
54
+ await create(stack, false);
55
+ await stack.deploy(Effect.void);
56
+ expect(fake.keys.rows()).toHaveLength(1);
57
+ expect(paths(fake)).toEqual(['/key/generate']);
58
+ });
59
+
60
+ test('RemovalPolicy.destroy() reaches delete, by alias, with no key in the body', async () => {
61
+ const fake = newFake();
62
+ const stack = keyStack(fake);
63
+ await create(stack, true);
64
+ await stack.deploy(Effect.void);
65
+ expect(fake.keys.rows()).toEqual([]);
66
+ expect(fake.keys.writes().at(-1)).toEqual({
67
+ body: { key_aliases: ['seat-a'] },
68
+ path: '/key/delete',
69
+ });
70
+ });
71
+
72
+ test('deleting a key that is already gone succeeds and writes nothing', async () => {
73
+ const fake = newFake();
74
+ await runAgainst(fake, keyHandlers.delete({ output: attributes }));
75
+ expect(fake.keys.writes()).toEqual([]);
76
+ // ★ SETTLED BY THE LIST, not by what `/key/delete` answers for an absent alias (unmeasured).
77
+ expect(fake.requests().map((r) => `${r.method} ${r.path.split('?')[0]}`)).toEqual([
78
+ 'GET /key/list',
79
+ ]);
80
+ });
81
+
82
+ test('a delete another caller won the race for is swallowed once a re-list shows it gone', async () => {
83
+ // ★ The fake answers the 404 as the real ProxyException (`message` is `str(detail)`, fake-keys.ts),
84
+ // so this is `KeyNotFound` matched on the wire shape `delete_key_fn` really produces.
85
+ const fake = newFake({ keyDeleteRaces: true, keySeed: [liveRow()] });
86
+ await runAgainst(fake, keyHandlers.delete({ output: attributes }));
87
+ expect(fake.keys.rows()).toEqual([]);
88
+ });
89
+
90
+ test('a delete the caller may not make is NOT swallowed: it fails typed and the key stays', async () => {
91
+ const fake = newFake({ keyDeleteForbidden: true, keySeed: [liveRow()] });
92
+ const error = await runAgainst(fake, Effect.flip(keyHandlers.delete({ output: attributes })));
93
+ expect(error).toMatchObject({ _tag: 'KeyDeleteForbidden' });
94
+ expect(fake.keys.rows()).toHaveLength(1);
95
+ });
96
+
97
+ test("the SDK's delete tags are in the operation's type, so a caller can catchTag them", async () => {
98
+ // ★ THE TYPE IS THE ASSERTION: `catchTag('KeyDeleteForbidden')` only compiles while the SDK's
99
+ // `/key/delete` error union carries it (a distilled patch), which `bun run check` proves.
100
+ const fake = newFake({ keyDeleteForbidden: true, keySeed: [liveRow()] });
101
+ const handled = await runAgainst(
102
+ fake,
103
+ keyHandlers
104
+ .delete({ output: attributes })
105
+ .pipe(Effect.catchTag('KeyDeleteForbidden', () => Effect.succeed('caught'))),
106
+ );
107
+ expect(handled).toBe('caught');
108
+ });
109
+
110
+ test('a 404 the vendor did not send is not "the key is gone": it fails as core\'s NotFound', async () => {
111
+ const fake = deleteAnswering(newFake({ keySeed: [liveRow()] }), () =>
112
+ answer(404, { detail: 'route not found' }),
113
+ );
114
+ const error = await runAgainst(fake, Effect.flip(keyHandlers.delete({ output: attributes })));
115
+ expect(error).toMatchObject({ _tag: 'NotFound' });
116
+ expect(fake.keys.rows()).toHaveLength(1);
117
+ });
118
+
119
+ test('a "No keys found" (bare `detail` shape too) that the re-list contradicts is not swallowed: the LIST decides', async () => {
120
+ const fake = deleteAnswering(newFake({ keySeed: [liveRow()] }), () =>
121
+ answer(404, { detail: { error: 'No keys found' } }),
122
+ );
123
+ const error = await runAgainst(fake, Effect.flip(keyHandlers.delete({ output: attributes })));
124
+ expect(error).toMatchObject({ _tag: 'KeyNotFound' });
125
+ expect(fake.keys.rows()).toHaveLength(1);
126
+ });
127
+
128
+ test('any OTHER failure is not swallowed, even when the key is gone by the time it is re-listed', async () => {
129
+ // The delete RUNS (the row is gone) and its answer is a 400: only a `KeyNotFound` is read as
130
+ // "already done", so this surfaces and the next deploy, which lists first, finds nothing to do.
131
+ const fake = newFake({ keySeed: [liveRow()] });
132
+ const answeredBadly = {
133
+ ...fake,
134
+ fetch: (async (input: string | URL | Request, init?: RequestInit) => {
135
+ const reply = await fake.fetch(input, init);
136
+ const path = new URL(input instanceof Request ? input.url : String(input)).pathname;
137
+ return path === '/key/delete' ? answer(400, { detail: { error: 'Not all keys' } }) : reply;
138
+ }) as typeof globalThis.fetch,
139
+ };
140
+ const error = await runAgainst(
141
+ answeredBadly,
142
+ Effect.flip(keyHandlers.delete({ output: attributes })),
143
+ );
144
+ expect(error).toMatchObject({ _tag: 'BadRequest' });
145
+ expect(fake.keys.rows()).toEqual([]);
146
+ await runAgainst(fake, keyHandlers.delete({ output: attributes })); // and the rerun is a no-op
147
+ });
148
+ });
149
+
150
+ describe('a read that fails is not an absence', () => {
151
+ test('a 503 on /key/list propagates typed from read, reconcile and delete', async () => {
152
+ const fake = newFake({ keyListStatus: 503, keySeed: [liveRow()] });
153
+ const olds = { keyAlias: 'seat-a' };
154
+ const readFailure = await runAgainst(
155
+ fake,
156
+ Effect.flip(keyHandlers.read({ olds, output: attributes })),
157
+ );
158
+ expect(readFailure).toMatchObject({ _tag: 'ServiceUnavailable' });
159
+ const deleteFailure = await runAgainst(
160
+ fake,
161
+ Effect.flip(keyHandlers.delete({ output: attributes })),
162
+ );
163
+ expect(deleteFailure).toMatchObject({ _tag: 'ServiceUnavailable' });
164
+ const reconcileFailure = await runAgainst(
165
+ fake,
166
+ Effect.flip(
167
+ keyHandlers.reconcile({ fqn: 'Seat', instanceId: 'i', news: olds, output: attributes }),
168
+ ),
169
+ );
170
+ expect(reconcileFailure).toMatchObject({ _tag: 'ServiceUnavailable' });
171
+ expect(fake.keys.writes()).toEqual([]);
172
+ });
173
+
174
+ test('through the engine a 503 fails the deploy: no create is attempted on "absent"', async () => {
175
+ const fake = newFake({ keyListStatus: 503 });
176
+ const message = await failureOf(
177
+ withEnv({ [VAR]: FAKE_KEY }, () => keyStack(fake, { noRetry: true }).deploy(declare(seat))),
178
+ );
179
+ expect(message).not.toBe('');
180
+ expect(fake.keys.writes()).toEqual([]);
181
+ });
182
+
183
+ test('two keys under one alias are refused rather than one picked', async () => {
184
+ const fake = newFake({ keySeed: [liveRow(), liveRow({ token: 'FAKE-TOKEN-2' })] });
185
+ const error = await runAgainst(
186
+ fake,
187
+ Effect.flip(keyHandlers.read({ olds: { keyAlias: 'seat-a' }, output: attributes })),
188
+ );
189
+ expect(error).toMatchObject({ _tag: 'LitellmKeyAmbiguousAliasError', count: 2 });
190
+ });
191
+
192
+ test('a hash list (return_full_object ignored) is unreadable, not "no key"', async () => {
193
+ const fake = newFake();
194
+ const listOfHashes = {
195
+ ...fake,
196
+ fetch: (async (input: string | URL | Request, init?: RequestInit) => {
197
+ const url = new URL(input instanceof Request ? input.url : String(input));
198
+ if (url.pathname === '/key/list') {
199
+ return new Response(JSON.stringify({ keys: ['FAKE-TOKEN-HASH'] }), {
200
+ headers: { 'content-type': 'application/json' },
201
+ });
202
+ }
203
+ return fake.fetch(input, init);
204
+ }) as typeof globalThis.fetch,
205
+ };
206
+ const error = await runAgainst(
207
+ listOfHashes,
208
+ Effect.flip(keyHandlers.read({ olds: { keyAlias: 'seat-a' }, output: attributes })),
209
+ );
210
+ expect(error).toMatchObject({ _tag: 'LitellmKeyUnreadableError' });
211
+ });
212
+ });