@homeflare/alchemy 0.43.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +10 -1
  2. package/dist/caddy/index.js +35 -1
  3. package/dist/caddy/index.js.map +3 -3
  4. package/dist/launchd/index.js +35 -1
  5. package/dist/launchd/index.js.map +3 -3
  6. package/dist/linux/index.js +35 -1
  7. package/dist/linux/index.js.map +3 -3
  8. package/dist/litellm/access-group-form.d.ts +26 -0
  9. package/dist/litellm/access-group-form.d.ts.map +1 -0
  10. package/dist/litellm/access-group-operations.d.ts +37 -0
  11. package/dist/litellm/access-group-operations.d.ts.map +1 -0
  12. package/dist/litellm/access-group-types.d.ts +49 -0
  13. package/dist/litellm/access-group-types.d.ts.map +1 -0
  14. package/dist/litellm/access-group.d.ts +55 -0
  15. package/dist/litellm/access-group.d.ts.map +1 -0
  16. package/dist/litellm/credential-errors.d.ts +131 -0
  17. package/dist/litellm/credential-errors.d.ts.map +1 -0
  18. package/dist/litellm/credential-form.d.ts +79 -0
  19. package/dist/litellm/credential-form.d.ts.map +1 -0
  20. package/dist/litellm/credential-operations.d.ts +84 -0
  21. package/dist/litellm/credential-operations.d.ts.map +1 -0
  22. package/dist/litellm/credential-rewrite.d.ts +6 -0
  23. package/dist/litellm/credential-rewrite.d.ts.map +1 -0
  24. package/dist/litellm/credential-types.d.ts +87 -0
  25. package/dist/litellm/credential-types.d.ts.map +1 -0
  26. package/dist/litellm/credential-values.d.ts +53 -0
  27. package/dist/litellm/credential-values.d.ts.map +1 -0
  28. package/dist/litellm/credential.d.ts +83 -0
  29. package/dist/litellm/credential.d.ts.map +1 -0
  30. package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
  31. package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
  32. package/dist/litellm/fake-credential-litellm.d.ts +54 -0
  33. package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
  34. package/dist/litellm/fake-keys.d.ts +53 -0
  35. package/dist/litellm/fake-keys.d.ts.map +1 -0
  36. package/dist/litellm/fake-litellm.d.ts +4 -1
  37. package/dist/litellm/fake-litellm.d.ts.map +1 -1
  38. package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
  39. package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
  40. package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
  41. package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
  42. package/dist/litellm/fake-model-litellm.d.ts +48 -0
  43. package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
  44. package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
  45. package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
  46. package/dist/litellm/fake-policy-litellm.d.ts +32 -0
  47. package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
  48. package/dist/litellm/fake-registry-base.d.ts +42 -0
  49. package/dist/litellm/fake-registry-base.d.ts.map +1 -0
  50. package/dist/litellm/fake-stack.d.ts +8 -1
  51. package/dist/litellm/fake-stack.d.ts.map +1 -1
  52. package/dist/litellm/fake-team-litellm.d.ts +47 -0
  53. package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
  54. package/dist/litellm/fake-tool-litellm.d.ts +28 -0
  55. package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
  56. package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
  57. package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
  58. package/dist/litellm/index.d.ts +18 -0
  59. package/dist/litellm/index.d.ts.map +1 -1
  60. package/dist/litellm/index.js +3078 -2
  61. package/dist/litellm/index.js.map +65 -4
  62. package/dist/litellm/key-errors.d.ts +169 -0
  63. package/dist/litellm/key-errors.d.ts.map +1 -0
  64. package/dist/litellm/key-form.d.ts +119 -0
  65. package/dist/litellm/key-form.d.ts.map +1 -0
  66. package/dist/litellm/key-harness.d.ts +41 -0
  67. package/dist/litellm/key-harness.d.ts.map +1 -0
  68. package/dist/litellm/key-metadata-errors.d.ts +30 -0
  69. package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
  70. package/dist/litellm/key-metadata.d.ts +22 -0
  71. package/dist/litellm/key-metadata.d.ts.map +1 -0
  72. package/dist/litellm/key-operations.d.ts +63 -0
  73. package/dist/litellm/key-operations.d.ts.map +1 -0
  74. package/dist/litellm/key-secret.d.ts +33 -0
  75. package/dist/litellm/key-secret.d.ts.map +1 -0
  76. package/dist/litellm/key.d.ts +78 -0
  77. package/dist/litellm/key.d.ts.map +1 -0
  78. package/dist/litellm/mcp-server-credential.d.ts +50 -0
  79. package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
  80. package/dist/litellm/mcp-server-errors.d.ts +101 -0
  81. package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
  82. package/dist/litellm/mcp-server-form.d.ts +56 -0
  83. package/dist/litellm/mcp-server-form.d.ts.map +1 -0
  84. package/dist/litellm/mcp-server-locate.d.ts +26 -0
  85. package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
  86. package/dist/litellm/mcp-server-operations.d.ts +63 -0
  87. package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
  88. package/dist/litellm/mcp-server-shadow.d.ts +24 -0
  89. package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
  90. package/dist/litellm/mcp-server-types.d.ts +118 -0
  91. package/dist/litellm/mcp-server-types.d.ts.map +1 -0
  92. package/dist/litellm/mcp-server-url.d.ts +11 -0
  93. package/dist/litellm/mcp-server-url.d.ts.map +1 -0
  94. package/dist/litellm/mcp-server.d.ts +95 -0
  95. package/dist/litellm/mcp-server.d.ts.map +1 -0
  96. package/dist/litellm/model-claim.d.ts +24 -0
  97. package/dist/litellm/model-claim.d.ts.map +1 -0
  98. package/dist/litellm/model-credential.d.ts +12 -0
  99. package/dist/litellm/model-credential.d.ts.map +1 -0
  100. package/dist/litellm/model-errors.d.ts +119 -0
  101. package/dist/litellm/model-errors.d.ts.map +1 -0
  102. package/dist/litellm/model-form.d.ts +78 -0
  103. package/dist/litellm/model-form.d.ts.map +1 -0
  104. package/dist/litellm/model-locate.d.ts +13 -0
  105. package/dist/litellm/model-locate.d.ts.map +1 -0
  106. package/dist/litellm/model-operations.d.ts +59 -0
  107. package/dist/litellm/model-operations.d.ts.map +1 -0
  108. package/dist/litellm/model-types.d.ts +91 -0
  109. package/dist/litellm/model-types.d.ts.map +1 -0
  110. package/dist/litellm/model.d.ts +88 -0
  111. package/dist/litellm/model.d.ts.map +1 -0
  112. package/dist/litellm/policy-attachment-form.d.ts +19 -0
  113. package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
  114. package/dist/litellm/policy-attachment-operations.d.ts +31 -0
  115. package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
  116. package/dist/litellm/policy-attachment-types.d.ts +48 -0
  117. package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
  118. package/dist/litellm/policy-attachment.d.ts +61 -0
  119. package/dist/litellm/policy-attachment.d.ts.map +1 -0
  120. package/dist/litellm/policy-form.d.ts +22 -0
  121. package/dist/litellm/policy-form.d.ts.map +1 -0
  122. package/dist/litellm/policy-operations.d.ts +42 -0
  123. package/dist/litellm/policy-operations.d.ts.map +1 -0
  124. package/dist/litellm/policy-types.d.ts +57 -0
  125. package/dist/litellm/policy-types.d.ts.map +1 -0
  126. package/dist/litellm/policy.d.ts +65 -0
  127. package/dist/litellm/policy.d.ts.map +1 -0
  128. package/dist/litellm/providers.d.ts +1 -1
  129. package/dist/litellm/providers.d.ts.map +1 -1
  130. package/dist/litellm/registry-errors.d.ts +62 -0
  131. package/dist/litellm/registry-errors.d.ts.map +1 -0
  132. package/dist/litellm/registry-support.d.ts +42 -0
  133. package/dist/litellm/registry-support.d.ts.map +1 -0
  134. package/dist/litellm/team-form.d.ts +26 -0
  135. package/dist/litellm/team-form.d.ts.map +1 -0
  136. package/dist/litellm/team-members.d.ts +10 -0
  137. package/dist/litellm/team-members.d.ts.map +1 -0
  138. package/dist/litellm/team-operations.d.ts +38 -0
  139. package/dist/litellm/team-operations.d.ts.map +1 -0
  140. package/dist/litellm/team-permission.d.ts +35 -0
  141. package/dist/litellm/team-permission.d.ts.map +1 -0
  142. package/dist/litellm/team-types.d.ts +101 -0
  143. package/dist/litellm/team-types.d.ts.map +1 -0
  144. package/dist/litellm/team.d.ts +67 -0
  145. package/dist/litellm/team.d.ts.map +1 -0
  146. package/dist/litellm/tool-policy-form.d.ts +21 -0
  147. package/dist/litellm/tool-policy-form.d.ts.map +1 -0
  148. package/dist/litellm/tool-policy-operations.d.ts +30 -0
  149. package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
  150. package/dist/litellm/tool-policy-types.d.ts +46 -0
  151. package/dist/litellm/tool-policy-types.d.ts.map +1 -0
  152. package/dist/litellm/tool-policy.d.ts +62 -0
  153. package/dist/litellm/tool-policy.d.ts.map +1 -0
  154. package/dist/litellm/toolset-form.d.ts +20 -0
  155. package/dist/litellm/toolset-form.d.ts.map +1 -0
  156. package/dist/litellm/toolset-operations.d.ts +39 -0
  157. package/dist/litellm/toolset-operations.d.ts.map +1 -0
  158. package/dist/litellm/toolset-types.d.ts +46 -0
  159. package/dist/litellm/toolset-types.d.ts.map +1 -0
  160. package/dist/litellm/toolset.d.ts +55 -0
  161. package/dist/litellm/toolset.d.ts.map +1 -0
  162. package/dist/openbao/index.js +35 -1
  163. package/dist/openbao/index.js.map +3 -3
  164. package/dist/ownership/rows.d.ts +11 -0
  165. package/dist/ownership/rows.d.ts.map +1 -1
  166. package/dist/postgres/connection.d.ts +14 -2
  167. package/dist/postgres/connection.d.ts.map +1 -1
  168. package/dist/postgres/database-sql.d.ts +27 -8
  169. package/dist/postgres/database-sql.d.ts.map +1 -1
  170. package/dist/postgres/fake-grants-parse.d.ts +37 -0
  171. package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
  172. package/dist/postgres/fake-grants-read.d.ts +61 -0
  173. package/dist/postgres/fake-grants-read.d.ts.map +1 -0
  174. package/dist/postgres/fake-grants-sql.d.ts +46 -0
  175. package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
  176. package/dist/postgres/fake-grants-write.d.ts +29 -0
  177. package/dist/postgres/fake-grants-write.d.ts.map +1 -0
  178. package/dist/postgres/fake-role-sql.d.ts +41 -0
  179. package/dist/postgres/fake-role-sql.d.ts.map +1 -0
  180. package/dist/postgres/fake-schema-sql.d.ts +42 -0
  181. package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
  182. package/dist/postgres/fake-sql-parse.d.ts +23 -0
  183. package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
  184. package/dist/postgres/fake-sql-quote.d.ts +12 -0
  185. package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
  186. package/dist/postgres/fake-sql.d.ts +42 -0
  187. package/dist/postgres/fake-sql.d.ts.map +1 -1
  188. package/dist/postgres/grants-attrs.d.ts +115 -0
  189. package/dist/postgres/grants-attrs.d.ts.map +1 -0
  190. package/dist/postgres/grants-declare.d.ts +88 -0
  191. package/dist/postgres/grants-declare.d.ts.map +1 -0
  192. package/dist/postgres/grants-diff.d.ts +25 -0
  193. package/dist/postgres/grants-diff.d.ts.map +1 -0
  194. package/dist/postgres/grants-errors.d.ts +137 -0
  195. package/dist/postgres/grants-errors.d.ts.map +1 -0
  196. package/dist/postgres/grants-existence.d.ts +14 -0
  197. package/dist/postgres/grants-existence.d.ts.map +1 -0
  198. package/dist/postgres/grants-ops.d.ts +65 -0
  199. package/dist/postgres/grants-ops.d.ts.map +1 -0
  200. package/dist/postgres/grants-ownership.d.ts +18 -0
  201. package/dist/postgres/grants-ownership.d.ts.map +1 -0
  202. package/dist/postgres/grants-plan-restore.d.ts +22 -0
  203. package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
  204. package/dist/postgres/grants-plan.d.ts +65 -0
  205. package/dist/postgres/grants-plan.d.ts.map +1 -0
  206. package/dist/postgres/grants-read-defaults.d.ts +17 -0
  207. package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
  208. package/dist/postgres/grants-read.d.ts +77 -0
  209. package/dist/postgres/grants-read.d.ts.map +1 -0
  210. package/dist/postgres/grants-refuse.d.ts +25 -0
  211. package/dist/postgres/grants-refuse.d.ts.map +1 -0
  212. package/dist/postgres/grants-sql.d.ts +42 -0
  213. package/dist/postgres/grants-sql.d.ts.map +1 -0
  214. package/dist/postgres/grants-words.d.ts +29 -0
  215. package/dist/postgres/grants-words.d.ts.map +1 -0
  216. package/dist/postgres/grants.d.ts +37 -0
  217. package/dist/postgres/grants.d.ts.map +1 -0
  218. package/dist/postgres/index.d.ts +31 -6
  219. package/dist/postgres/index.d.ts.map +1 -1
  220. package/dist/postgres/index.js +1998 -37
  221. package/dist/postgres/index.js.map +46 -7
  222. package/dist/postgres/installed-classifier.d.ts +13 -0
  223. package/dist/postgres/installed-classifier.d.ts.map +1 -0
  224. package/dist/postgres/providers.d.ts +16 -8
  225. package/dist/postgres/providers.d.ts.map +1 -1
  226. package/dist/postgres/psql-executor.d.ts +4 -0
  227. package/dist/postgres/psql-executor.d.ts.map +1 -1
  228. package/dist/postgres/role-attrs.d.ts +112 -0
  229. package/dist/postgres/role-attrs.d.ts.map +1 -0
  230. package/dist/postgres/role-diff.d.ts +22 -0
  231. package/dist/postgres/role-diff.d.ts.map +1 -0
  232. package/dist/postgres/role-errors.d.ts +132 -0
  233. package/dist/postgres/role-errors.d.ts.map +1 -0
  234. package/dist/postgres/role-membership-sql.d.ts +78 -0
  235. package/dist/postgres/role-membership-sql.d.ts.map +1 -0
  236. package/dist/postgres/role-provider.d.ts +11 -0
  237. package/dist/postgres/role-provider.d.ts.map +1 -0
  238. package/dist/postgres/role-scram.d.ts +8 -0
  239. package/dist/postgres/role-scram.d.ts.map +1 -0
  240. package/dist/postgres/role-secrets.d.ts +38 -0
  241. package/dist/postgres/role-secrets.d.ts.map +1 -0
  242. package/dist/postgres/role-sql.d.ts +68 -0
  243. package/dist/postgres/role-sql.d.ts.map +1 -0
  244. package/dist/postgres/role.d.ts +57 -0
  245. package/dist/postgres/role.d.ts.map +1 -0
  246. package/dist/postgres/schema-assert.d.ts +50 -0
  247. package/dist/postgres/schema-assert.d.ts.map +1 -0
  248. package/dist/postgres/schema-attrs.d.ts +51 -0
  249. package/dist/postgres/schema-attrs.d.ts.map +1 -0
  250. package/dist/postgres/schema-delete.d.ts +28 -0
  251. package/dist/postgres/schema-delete.d.ts.map +1 -0
  252. package/dist/postgres/schema-diff.d.ts +14 -0
  253. package/dist/postgres/schema-diff.d.ts.map +1 -0
  254. package/dist/postgres/schema-errors.d.ts +139 -0
  255. package/dist/postgres/schema-errors.d.ts.map +1 -0
  256. package/dist/postgres/schema-identity.d.ts +8 -0
  257. package/dist/postgres/schema-identity.d.ts.map +1 -0
  258. package/dist/postgres/schema-reconcile.d.ts +12 -0
  259. package/dist/postgres/schema-reconcile.d.ts.map +1 -0
  260. package/dist/postgres/schema-sql.d.ts +45 -0
  261. package/dist/postgres/schema-sql.d.ts.map +1 -0
  262. package/dist/postgres/schema-test-kit.d.ts +67 -0
  263. package/dist/postgres/schema-test-kit.d.ts.map +1 -0
  264. package/dist/postgres/schema.d.ts +54 -0
  265. package/dist/postgres/schema.d.ts.map +1 -0
  266. package/dist/proxmox/index.js +35 -1
  267. package/dist/proxmox/index.js.map +3 -3
  268. package/dist/release/fake-engine.d.ts +10 -0
  269. package/dist/release/fake-engine.d.ts.map +1 -1
  270. package/dist/release/index.js +35 -1
  271. package/dist/release/index.js.map +3 -3
  272. package/dist/valkey/acl-attrs.d.ts +94 -0
  273. package/dist/valkey/acl-attrs.d.ts.map +1 -0
  274. package/dist/valkey/acl-compare.d.ts +28 -0
  275. package/dist/valkey/acl-compare.d.ts.map +1 -0
  276. package/dist/valkey/acl-connection.d.ts +6 -0
  277. package/dist/valkey/acl-connection.d.ts.map +1 -0
  278. package/dist/valkey/acl-form.d.ts +62 -0
  279. package/dist/valkey/acl-form.d.ts.map +1 -0
  280. package/dist/valkey/acl-managed.d.ts +4 -0
  281. package/dist/valkey/acl-managed.d.ts.map +1 -0
  282. package/dist/valkey/acl-ops.d.ts +37 -0
  283. package/dist/valkey/acl-ops.d.ts.map +1 -0
  284. package/dist/valkey/acl-profiles.d.ts +53 -0
  285. package/dist/valkey/acl-profiles.d.ts.map +1 -0
  286. package/dist/valkey/acl-reconcile.d.ts +26 -0
  287. package/dist/valkey/acl-reconcile.d.ts.map +1 -0
  288. package/dist/valkey/acl.d.ts +24 -0
  289. package/dist/valkey/acl.d.ts.map +1 -0
  290. package/dist/valkey/connection-service.d.ts +22 -0
  291. package/dist/valkey/connection-service.d.ts.map +1 -0
  292. package/dist/valkey/connection.d.ts +59 -0
  293. package/dist/valkey/connection.d.ts.map +1 -0
  294. package/dist/valkey/errors.d.ts +165 -0
  295. package/dist/valkey/errors.d.ts.map +1 -0
  296. package/dist/valkey/fake-acl.d.ts +29 -0
  297. package/dist/valkey/fake-acl.d.ts.map +1 -0
  298. package/dist/valkey/fake-valkey.d.ts +35 -0
  299. package/dist/valkey/fake-valkey.d.ts.map +1 -0
  300. package/dist/valkey/handler-test-fixture.d.ts +20 -0
  301. package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
  302. package/dist/valkey/index.d.ts +18 -0
  303. package/dist/valkey/index.d.ts.map +1 -0
  304. package/dist/valkey/index.js +964 -0
  305. package/dist/valkey/index.js.map +27 -0
  306. package/dist/valkey/instance-attrs.d.ts +46 -0
  307. package/dist/valkey/instance-attrs.d.ts.map +1 -0
  308. package/dist/valkey/instance-form.d.ts +22 -0
  309. package/dist/valkey/instance-form.d.ts.map +1 -0
  310. package/dist/valkey/instance.d.ts +48 -0
  311. package/dist/valkey/instance.d.ts.map +1 -0
  312. package/dist/valkey/provider-socket-fixture.d.ts +8 -0
  313. package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
  314. package/dist/valkey/providers.d.ts +16 -0
  315. package/dist/valkey/providers.d.ts.map +1 -0
  316. package/dist/valkey/resp.d.ts +38 -0
  317. package/dist/valkey/resp.d.ts.map +1 -0
  318. package/dist/valkey/transport-error.d.ts +36 -0
  319. package/dist/valkey/transport-error.d.ts.map +1 -0
  320. package/dist/valkey/transport.d.ts +50 -0
  321. package/dist/valkey/transport.d.ts.map +1 -0
  322. package/docs/litellm-access-group.md +105 -0
  323. package/docs/litellm-credential.md +60 -0
  324. package/docs/litellm-key-metadata.md +56 -0
  325. package/docs/litellm-key.md +194 -0
  326. package/docs/litellm-mcp.md +187 -0
  327. package/docs/litellm-model.md +111 -0
  328. package/docs/litellm-policy-attachment.md +86 -0
  329. package/docs/litellm-policy.md +103 -0
  330. package/docs/litellm-team.md +117 -0
  331. package/docs/litellm-tool-policy.md +90 -0
  332. package/docs/litellm-toolset.md +92 -0
  333. package/docs/litellm.md +16 -9
  334. package/docs/peers.md +15 -6
  335. package/docs/postgres-grants-example.md +55 -0
  336. package/docs/postgres-grants.md +157 -0
  337. package/docs/postgres-role.md +126 -0
  338. package/docs/postgres-schema.md +139 -0
  339. package/docs/postgres.md +20 -3
  340. package/docs/valkey-transport.md +29 -0
  341. package/docs/valkey.md +187 -0
  342. package/package.json +6 -2
  343. package/src/ceph/ceph-argv.test.ts +1 -1
  344. package/src/launchd/sudo-allowlist.test.ts +2 -2
  345. package/src/linux/sudo-allowlist.test.ts +3 -3
  346. package/src/linux/sudo-runner.test.ts +2 -2
  347. package/src/litellm/access-group-form.ts +105 -0
  348. package/src/litellm/access-group-operations.ts +92 -0
  349. package/src/litellm/access-group-types.ts +49 -0
  350. package/src/litellm/access-group.test.ts +197 -0
  351. package/src/litellm/access-group.ts +151 -0
  352. package/src/litellm/credential-errors.ts +183 -0
  353. package/src/litellm/credential-form.test.ts +151 -0
  354. package/src/litellm/credential-form.ts +211 -0
  355. package/src/litellm/credential-guards.test.ts +241 -0
  356. package/src/litellm/credential-operations.ts +208 -0
  357. package/src/litellm/credential-recovery.test.ts +93 -0
  358. package/src/litellm/credential-rewrite.test.ts +164 -0
  359. package/src/litellm/credential-rewrite.ts +50 -0
  360. package/src/litellm/credential-types.ts +117 -0
  361. package/src/litellm/credential-values.ts +94 -0
  362. package/src/litellm/credential.test.ts +218 -0
  363. package/src/litellm/credential.ts +227 -0
  364. package/src/litellm/fake-access-group-litellm.ts +127 -0
  365. package/src/litellm/fake-credential-litellm.ts +216 -0
  366. package/src/litellm/fake-keys.ts +190 -0
  367. package/src/litellm/fake-litellm.ts +19 -9
  368. package/src/litellm/fake-mcp-litellm.ts +214 -0
  369. package/src/litellm/fake-model-litellm-post-update.ts +103 -0
  370. package/src/litellm/fake-model-litellm.ts +233 -0
  371. package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
  372. package/src/litellm/fake-policy-litellm.ts +186 -0
  373. package/src/litellm/fake-registry-base.ts +69 -0
  374. package/src/litellm/fake-stack.ts +17 -1
  375. package/src/litellm/fake-team-litellm.ts +229 -0
  376. package/src/litellm/fake-tool-litellm.ts +88 -0
  377. package/src/litellm/fake-toolset-litellm.ts +110 -0
  378. package/src/litellm/index.ts +140 -0
  379. package/src/litellm/key-delete.test.ts +212 -0
  380. package/src/litellm/key-errors.ts +241 -0
  381. package/src/litellm/key-form.ts +200 -0
  382. package/src/litellm/key-harness.ts +121 -0
  383. package/src/litellm/key-metadata-errors.ts +49 -0
  384. package/src/litellm/key-metadata.test.ts +156 -0
  385. package/src/litellm/key-metadata.ts +74 -0
  386. package/src/litellm/key-operations.ts +184 -0
  387. package/src/litellm/key-rotation.test.ts +110 -0
  388. package/src/litellm/key-scope.test.ts +135 -0
  389. package/src/litellm/key-secret.test.ts +248 -0
  390. package/src/litellm/key-secret.ts +137 -0
  391. package/src/litellm/key-transport.test.ts +166 -0
  392. package/src/litellm/key.test.ts +231 -0
  393. package/src/litellm/key.ts +213 -0
  394. package/src/litellm/mcp-server-adopt.test.ts +86 -0
  395. package/src/litellm/mcp-server-alias.test.ts +184 -0
  396. package/src/litellm/mcp-server-credential.ts +85 -0
  397. package/src/litellm/mcp-server-errors.ts +141 -0
  398. package/src/litellm/mcp-server-exports.test.ts +15 -0
  399. package/src/litellm/mcp-server-form.test.ts +241 -0
  400. package/src/litellm/mcp-server-form.ts +233 -0
  401. package/src/litellm/mcp-server-handlers.test.ts +150 -0
  402. package/src/litellm/mcp-server-locate.ts +66 -0
  403. package/src/litellm/mcp-server-operations.ts +111 -0
  404. package/src/litellm/mcp-server-registry.test.ts +146 -0
  405. package/src/litellm/mcp-server-retype.test.ts +114 -0
  406. package/src/litellm/mcp-server-shadow.test.ts +91 -0
  407. package/src/litellm/mcp-server-shadow.ts +45 -0
  408. package/src/litellm/mcp-server-tools.test.ts +85 -0
  409. package/src/litellm/mcp-server-types.ts +143 -0
  410. package/src/litellm/mcp-server-url.ts +66 -0
  411. package/src/litellm/mcp-server.test.ts +213 -0
  412. package/src/litellm/mcp-server.ts +225 -0
  413. package/src/litellm/model-claim.ts +69 -0
  414. package/src/litellm/model-credential.ts +45 -0
  415. package/src/litellm/model-errors.ts +168 -0
  416. package/src/litellm/model-foreign-row.test.ts +173 -0
  417. package/src/litellm/model-form.test.ts +228 -0
  418. package/src/litellm/model-form.ts +223 -0
  419. package/src/litellm/model-locate.test.ts +128 -0
  420. package/src/litellm/model-locate.ts +67 -0
  421. package/src/litellm/model-operations.test.ts +93 -0
  422. package/src/litellm/model-operations.ts +146 -0
  423. package/src/litellm/model-params-preserve.test.ts +119 -0
  424. package/src/litellm/model-recovery.test.ts +57 -0
  425. package/src/litellm/model-types.ts +112 -0
  426. package/src/litellm/model.test.ts +222 -0
  427. package/src/litellm/model.ts +237 -0
  428. package/src/litellm/policy-attachment-form.ts +103 -0
  429. package/src/litellm/policy-attachment-operations.ts +74 -0
  430. package/src/litellm/policy-attachment-types.ts +48 -0
  431. package/src/litellm/policy-attachment.test.ts +198 -0
  432. package/src/litellm/policy-attachment.ts +178 -0
  433. package/src/litellm/policy-form.ts +122 -0
  434. package/src/litellm/policy-operations.ts +112 -0
  435. package/src/litellm/policy-types.ts +58 -0
  436. package/src/litellm/policy.test.ts +214 -0
  437. package/src/litellm/policy.ts +146 -0
  438. package/src/litellm/providers.ts +24 -3
  439. package/src/litellm/registry-errors.ts +88 -0
  440. package/src/litellm/registry-exports.test.ts +66 -0
  441. package/src/litellm/registry-support.ts +109 -0
  442. package/src/litellm/team-form.ts +140 -0
  443. package/src/litellm/team-members.test.ts +150 -0
  444. package/src/litellm/team-members.ts +58 -0
  445. package/src/litellm/team-operations.ts +90 -0
  446. package/src/litellm/team-permission.ts +159 -0
  447. package/src/litellm/team-read.test.ts +89 -0
  448. package/src/litellm/team-types.ts +106 -0
  449. package/src/litellm/team.test.ts +206 -0
  450. package/src/litellm/team.ts +159 -0
  451. package/src/litellm/tool-policy-form.ts +94 -0
  452. package/src/litellm/tool-policy-operations.ts +58 -0
  453. package/src/litellm/tool-policy-types.ts +48 -0
  454. package/src/litellm/tool-policy.test.ts +172 -0
  455. package/src/litellm/tool-policy.ts +125 -0
  456. package/src/litellm/toolset-form.ts +104 -0
  457. package/src/litellm/toolset-operations.ts +90 -0
  458. package/src/litellm/toolset-types.ts +47 -0
  459. package/src/litellm/toolset.test.ts +198 -0
  460. package/src/litellm/toolset.ts +151 -0
  461. package/src/ownership/ownership.test.ts +33 -1
  462. package/src/ownership/rows.ts +53 -0
  463. package/src/postgres/connection.ts +42 -7
  464. package/src/postgres/database-bigint-serialization.test.ts +1 -0
  465. package/src/postgres/database-refusals.test.ts +2 -2
  466. package/src/postgres/database-sql.ts +36 -9
  467. package/src/postgres/fake-grants-parse.ts +189 -0
  468. package/src/postgres/fake-grants-read.ts +250 -0
  469. package/src/postgres/fake-grants-sql.ts +207 -0
  470. package/src/postgres/fake-grants-write.ts +90 -0
  471. package/src/postgres/fake-role-sql.ts +240 -0
  472. package/src/postgres/fake-schema-semantics.test.ts +36 -0
  473. package/src/postgres/fake-schema-sql.ts +146 -0
  474. package/src/postgres/fake-sql-parse.ts +86 -0
  475. package/src/postgres/fake-sql-quote.ts +36 -0
  476. package/src/postgres/fake-sql.ts +166 -46
  477. package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
  478. package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
  479. package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
  480. package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
  481. package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
  482. package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
  483. package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
  484. package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
  485. package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
  486. package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
  487. package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
  488. package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
  489. package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
  490. package/src/postgres/grants-acl.test.ts +61 -0
  491. package/src/postgres/grants-attrs.ts +185 -0
  492. package/src/postgres/grants-database.test.ts +158 -0
  493. package/src/postgres/grants-declare.ts +172 -0
  494. package/src/postgres/grants-delete-proof.test.ts +154 -0
  495. package/src/postgres/grants-diff.ts +101 -0
  496. package/src/postgres/grants-errors.ts +215 -0
  497. package/src/postgres/grants-existence-guards.test.ts +113 -0
  498. package/src/postgres/grants-existence.ts +101 -0
  499. package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
  500. package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
  501. package/src/postgres/grants-lifecycle.test.ts +181 -0
  502. package/src/postgres/grants-ops.ts +229 -0
  503. package/src/postgres/grants-owner-revoke.test.ts +121 -0
  504. package/src/postgres/grants-ownership.ts +49 -0
  505. package/src/postgres/grants-plan-collateral.test.ts +202 -0
  506. package/src/postgres/grants-plan-diff.test.ts +204 -0
  507. package/src/postgres/grants-plan-restore.ts +43 -0
  508. package/src/postgres/grants-plan-revocations.test.ts +69 -0
  509. package/src/postgres/grants-plan.test.ts +148 -0
  510. package/src/postgres/grants-plan.ts +245 -0
  511. package/src/postgres/grants-provenance.test.ts +134 -0
  512. package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
  513. package/src/postgres/grants-read-absent.test.ts +91 -0
  514. package/src/postgres/grants-read-defaults.ts +51 -0
  515. package/src/postgres/grants-read.ts +250 -0
  516. package/src/postgres/grants-refusals.test.ts +136 -0
  517. package/src/postgres/grants-refuse.ts +119 -0
  518. package/src/postgres/grants-relkind-wire.test.ts +111 -0
  519. package/src/postgres/grants-repair-plan.test.ts +201 -0
  520. package/src/postgres/grants-sql.test.ts +128 -0
  521. package/src/postgres/grants-sql.ts +144 -0
  522. package/src/postgres/grants-words.ts +34 -0
  523. package/src/postgres/grants.ts +110 -0
  524. package/src/postgres/index.ts +129 -5
  525. package/src/postgres/installed-classifier.ts +36 -0
  526. package/src/postgres/providers.ts +33 -9
  527. package/src/postgres/psql-executor-escaping.test.ts +67 -0
  528. package/src/postgres/psql-executor.test.ts +63 -2
  529. package/src/postgres/psql-executor.ts +74 -34
  530. package/src/postgres/role-adopt.test.ts +98 -0
  531. package/src/postgres/role-attrs.ts +137 -0
  532. package/src/postgres/role-diff.ts +93 -0
  533. package/src/postgres/role-errors.ts +206 -0
  534. package/src/postgres/role-guard.test.ts +60 -0
  535. package/src/postgres/role-identity.test.ts +197 -0
  536. package/src/postgres/role-lifecycle.test.ts +228 -0
  537. package/src/postgres/role-membership-options.test.ts +73 -0
  538. package/src/postgres/role-membership-repair.test.ts +153 -0
  539. package/src/postgres/role-membership-sql.ts +223 -0
  540. package/src/postgres/role-password-ascii.test.ts +53 -0
  541. package/src/postgres/role-password-transports.test.ts +123 -0
  542. package/src/postgres/role-password.test.ts +158 -0
  543. package/src/postgres/role-privilege.test.ts +107 -0
  544. package/src/postgres/role-provenance.test.ts +200 -0
  545. package/src/postgres/role-provider.ts +105 -0
  546. package/src/postgres/role-refusals.test.ts +225 -0
  547. package/src/postgres/role-scram.test.ts +38 -0
  548. package/src/postgres/role-scram.ts +40 -0
  549. package/src/postgres/role-secrets.ts +61 -0
  550. package/src/postgres/role-sql.ts +213 -0
  551. package/src/postgres/role-valid-until.test.ts +68 -0
  552. package/src/postgres/role.ts +226 -0
  553. package/src/postgres/schema-assert.ts +139 -0
  554. package/src/postgres/schema-attrs.ts +71 -0
  555. package/src/postgres/schema-delete-proofs.test.ts +192 -0
  556. package/src/postgres/schema-delete.ts +96 -0
  557. package/src/postgres/schema-diff.ts +44 -0
  558. package/src/postgres/schema-drop-2bp01.test.ts +146 -0
  559. package/src/postgres/schema-errors.ts +209 -0
  560. package/src/postgres/schema-handlers.test.ts +193 -0
  561. package/src/postgres/schema-identity.ts +39 -0
  562. package/src/postgres/schema-lifecycle.test.ts +246 -0
  563. package/src/postgres/schema-race.test.ts +70 -0
  564. package/src/postgres/schema-reconcile.ts +100 -0
  565. package/src/postgres/schema-refusals.test.ts +144 -0
  566. package/src/postgres/schema-socket.test.ts +162 -0
  567. package/src/postgres/schema-sql.ts +130 -0
  568. package/src/postgres/schema-takeover.test.ts +149 -0
  569. package/src/postgres/schema-test-kit.ts +85 -0
  570. package/src/postgres/schema.ts +130 -0
  571. package/src/release/binary-alias.test.ts +3 -3
  572. package/src/release/binary-claims.test.ts +3 -3
  573. package/src/release/binary-directory-umask.test.ts +65 -0
  574. package/src/release/fake-engine.ts +15 -0
  575. package/src/valkey/acl-attrs.ts +98 -0
  576. package/src/valkey/acl-compare.ts +57 -0
  577. package/src/valkey/acl-connection.ts +13 -0
  578. package/src/valkey/acl-delete.test.ts +127 -0
  579. package/src/valkey/acl-form.ts +239 -0
  580. package/src/valkey/acl-managed.ts +13 -0
  581. package/src/valkey/acl-ops.ts +122 -0
  582. package/src/valkey/acl-ownership.test.ts +118 -0
  583. package/src/valkey/acl-prefix.test.ts +38 -0
  584. package/src/valkey/acl-profiles.ts +81 -0
  585. package/src/valkey/acl-reconcile.ts +180 -0
  586. package/src/valkey/acl-reserved.test.ts +69 -0
  587. package/src/valkey/acl-revocation.test.ts +94 -0
  588. package/src/valkey/acl-seat-prefix.test.ts +111 -0
  589. package/src/valkey/acl-validation.test.ts +54 -0
  590. package/src/valkey/acl.test.ts +215 -0
  591. package/src/valkey/acl.ts +169 -0
  592. package/src/valkey/connection-service.ts +46 -0
  593. package/src/valkey/connection.ts +180 -0
  594. package/src/valkey/errors.ts +239 -0
  595. package/src/valkey/fake-acl.ts +128 -0
  596. package/src/valkey/fake-valkey.ts +224 -0
  597. package/src/valkey/handler-test-fixture.ts +43 -0
  598. package/src/valkey/handlers.test.ts +205 -0
  599. package/src/valkey/index.ts +54 -0
  600. package/src/valkey/instance-attrs.ts +48 -0
  601. package/src/valkey/instance-form.ts +104 -0
  602. package/src/valkey/instance.test.ts +108 -0
  603. package/src/valkey/instance.ts +160 -0
  604. package/src/valkey/provider-socket-fixture.ts +71 -0
  605. package/src/valkey/providers.test.ts +129 -0
  606. package/src/valkey/providers.ts +21 -0
  607. package/src/valkey/resp.ts +212 -0
  608. package/src/valkey/transport-bounds.test.ts +150 -0
  609. package/src/valkey/transport-error.ts +37 -0
  610. package/src/valkey/transport.test.ts +158 -0
  611. package/src/valkey/transport.ts +109 -0
  612. package/src/valkey/upstream-bounds.test.ts +14 -0
@@ -0,0 +1,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
+ });