@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.
- package/README.md +10 -1
- package/dist/caddy/index.js +35 -1
- package/dist/caddy/index.js.map +3 -3
- package/dist/launchd/index.js +35 -1
- package/dist/launchd/index.js.map +3 -3
- package/dist/linux/index.js +35 -1
- package/dist/linux/index.js.map +3 -3
- package/dist/litellm/access-group-form.d.ts +26 -0
- package/dist/litellm/access-group-form.d.ts.map +1 -0
- package/dist/litellm/access-group-operations.d.ts +37 -0
- package/dist/litellm/access-group-operations.d.ts.map +1 -0
- package/dist/litellm/access-group-types.d.ts +49 -0
- package/dist/litellm/access-group-types.d.ts.map +1 -0
- package/dist/litellm/access-group.d.ts +55 -0
- package/dist/litellm/access-group.d.ts.map +1 -0
- package/dist/litellm/credential-errors.d.ts +131 -0
- package/dist/litellm/credential-errors.d.ts.map +1 -0
- package/dist/litellm/credential-form.d.ts +79 -0
- package/dist/litellm/credential-form.d.ts.map +1 -0
- package/dist/litellm/credential-operations.d.ts +84 -0
- package/dist/litellm/credential-operations.d.ts.map +1 -0
- package/dist/litellm/credential-rewrite.d.ts +6 -0
- package/dist/litellm/credential-rewrite.d.ts.map +1 -0
- package/dist/litellm/credential-types.d.ts +87 -0
- package/dist/litellm/credential-types.d.ts.map +1 -0
- package/dist/litellm/credential-values.d.ts +53 -0
- package/dist/litellm/credential-values.d.ts.map +1 -0
- package/dist/litellm/credential.d.ts +83 -0
- package/dist/litellm/credential.d.ts.map +1 -0
- package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
- package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-credential-litellm.d.ts +54 -0
- package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-keys.d.ts +53 -0
- package/dist/litellm/fake-keys.d.ts.map +1 -0
- package/dist/litellm/fake-litellm.d.ts +4 -1
- package/dist/litellm/fake-litellm.d.ts.map +1 -1
- package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
- package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
- package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
- package/dist/litellm/fake-model-litellm.d.ts +48 -0
- package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
- package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-policy-litellm.d.ts +32 -0
- package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-registry-base.d.ts +42 -0
- package/dist/litellm/fake-registry-base.d.ts.map +1 -0
- package/dist/litellm/fake-stack.d.ts +8 -1
- package/dist/litellm/fake-stack.d.ts.map +1 -1
- package/dist/litellm/fake-team-litellm.d.ts +47 -0
- package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-tool-litellm.d.ts +28 -0
- package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
- package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
- package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
- package/dist/litellm/index.d.ts +18 -0
- package/dist/litellm/index.d.ts.map +1 -1
- package/dist/litellm/index.js +3078 -2
- package/dist/litellm/index.js.map +65 -4
- package/dist/litellm/key-errors.d.ts +169 -0
- package/dist/litellm/key-errors.d.ts.map +1 -0
- package/dist/litellm/key-form.d.ts +119 -0
- package/dist/litellm/key-form.d.ts.map +1 -0
- package/dist/litellm/key-harness.d.ts +41 -0
- package/dist/litellm/key-harness.d.ts.map +1 -0
- package/dist/litellm/key-metadata-errors.d.ts +30 -0
- package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
- package/dist/litellm/key-metadata.d.ts +22 -0
- package/dist/litellm/key-metadata.d.ts.map +1 -0
- package/dist/litellm/key-operations.d.ts +63 -0
- package/dist/litellm/key-operations.d.ts.map +1 -0
- package/dist/litellm/key-secret.d.ts +33 -0
- package/dist/litellm/key-secret.d.ts.map +1 -0
- package/dist/litellm/key.d.ts +78 -0
- package/dist/litellm/key.d.ts.map +1 -0
- package/dist/litellm/mcp-server-credential.d.ts +50 -0
- package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
- package/dist/litellm/mcp-server-errors.d.ts +101 -0
- package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
- package/dist/litellm/mcp-server-form.d.ts +56 -0
- package/dist/litellm/mcp-server-form.d.ts.map +1 -0
- package/dist/litellm/mcp-server-locate.d.ts +26 -0
- package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
- package/dist/litellm/mcp-server-operations.d.ts +63 -0
- package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
- package/dist/litellm/mcp-server-shadow.d.ts +24 -0
- package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
- package/dist/litellm/mcp-server-types.d.ts +118 -0
- package/dist/litellm/mcp-server-types.d.ts.map +1 -0
- package/dist/litellm/mcp-server-url.d.ts +11 -0
- package/dist/litellm/mcp-server-url.d.ts.map +1 -0
- package/dist/litellm/mcp-server.d.ts +95 -0
- package/dist/litellm/mcp-server.d.ts.map +1 -0
- package/dist/litellm/model-claim.d.ts +24 -0
- package/dist/litellm/model-claim.d.ts.map +1 -0
- package/dist/litellm/model-credential.d.ts +12 -0
- package/dist/litellm/model-credential.d.ts.map +1 -0
- package/dist/litellm/model-errors.d.ts +119 -0
- package/dist/litellm/model-errors.d.ts.map +1 -0
- package/dist/litellm/model-form.d.ts +78 -0
- package/dist/litellm/model-form.d.ts.map +1 -0
- package/dist/litellm/model-locate.d.ts +13 -0
- package/dist/litellm/model-locate.d.ts.map +1 -0
- package/dist/litellm/model-operations.d.ts +59 -0
- package/dist/litellm/model-operations.d.ts.map +1 -0
- package/dist/litellm/model-types.d.ts +91 -0
- package/dist/litellm/model-types.d.ts.map +1 -0
- package/dist/litellm/model.d.ts +88 -0
- package/dist/litellm/model.d.ts.map +1 -0
- package/dist/litellm/policy-attachment-form.d.ts +19 -0
- package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
- package/dist/litellm/policy-attachment-operations.d.ts +31 -0
- package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
- package/dist/litellm/policy-attachment-types.d.ts +48 -0
- package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
- package/dist/litellm/policy-attachment.d.ts +61 -0
- package/dist/litellm/policy-attachment.d.ts.map +1 -0
- package/dist/litellm/policy-form.d.ts +22 -0
- package/dist/litellm/policy-form.d.ts.map +1 -0
- package/dist/litellm/policy-operations.d.ts +42 -0
- package/dist/litellm/policy-operations.d.ts.map +1 -0
- package/dist/litellm/policy-types.d.ts +57 -0
- package/dist/litellm/policy-types.d.ts.map +1 -0
- package/dist/litellm/policy.d.ts +65 -0
- package/dist/litellm/policy.d.ts.map +1 -0
- package/dist/litellm/providers.d.ts +1 -1
- package/dist/litellm/providers.d.ts.map +1 -1
- package/dist/litellm/registry-errors.d.ts +62 -0
- package/dist/litellm/registry-errors.d.ts.map +1 -0
- package/dist/litellm/registry-support.d.ts +42 -0
- package/dist/litellm/registry-support.d.ts.map +1 -0
- package/dist/litellm/team-form.d.ts +26 -0
- package/dist/litellm/team-form.d.ts.map +1 -0
- package/dist/litellm/team-members.d.ts +10 -0
- package/dist/litellm/team-members.d.ts.map +1 -0
- package/dist/litellm/team-operations.d.ts +38 -0
- package/dist/litellm/team-operations.d.ts.map +1 -0
- package/dist/litellm/team-permission.d.ts +35 -0
- package/dist/litellm/team-permission.d.ts.map +1 -0
- package/dist/litellm/team-types.d.ts +101 -0
- package/dist/litellm/team-types.d.ts.map +1 -0
- package/dist/litellm/team.d.ts +67 -0
- package/dist/litellm/team.d.ts.map +1 -0
- package/dist/litellm/tool-policy-form.d.ts +21 -0
- package/dist/litellm/tool-policy-form.d.ts.map +1 -0
- package/dist/litellm/tool-policy-operations.d.ts +30 -0
- package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
- package/dist/litellm/tool-policy-types.d.ts +46 -0
- package/dist/litellm/tool-policy-types.d.ts.map +1 -0
- package/dist/litellm/tool-policy.d.ts +62 -0
- package/dist/litellm/tool-policy.d.ts.map +1 -0
- package/dist/litellm/toolset-form.d.ts +20 -0
- package/dist/litellm/toolset-form.d.ts.map +1 -0
- package/dist/litellm/toolset-operations.d.ts +39 -0
- package/dist/litellm/toolset-operations.d.ts.map +1 -0
- package/dist/litellm/toolset-types.d.ts +46 -0
- package/dist/litellm/toolset-types.d.ts.map +1 -0
- package/dist/litellm/toolset.d.ts +55 -0
- package/dist/litellm/toolset.d.ts.map +1 -0
- package/dist/openbao/index.js +35 -1
- package/dist/openbao/index.js.map +3 -3
- package/dist/ownership/rows.d.ts +11 -0
- package/dist/ownership/rows.d.ts.map +1 -1
- package/dist/postgres/connection.d.ts +14 -2
- package/dist/postgres/connection.d.ts.map +1 -1
- package/dist/postgres/database-sql.d.ts +27 -8
- package/dist/postgres/database-sql.d.ts.map +1 -1
- package/dist/postgres/fake-grants-parse.d.ts +37 -0
- package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
- package/dist/postgres/fake-grants-read.d.ts +61 -0
- package/dist/postgres/fake-grants-read.d.ts.map +1 -0
- package/dist/postgres/fake-grants-sql.d.ts +46 -0
- package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
- package/dist/postgres/fake-grants-write.d.ts +29 -0
- package/dist/postgres/fake-grants-write.d.ts.map +1 -0
- package/dist/postgres/fake-role-sql.d.ts +41 -0
- package/dist/postgres/fake-role-sql.d.ts.map +1 -0
- package/dist/postgres/fake-schema-sql.d.ts +42 -0
- package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
- package/dist/postgres/fake-sql-parse.d.ts +23 -0
- package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
- package/dist/postgres/fake-sql-quote.d.ts +12 -0
- package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
- package/dist/postgres/fake-sql.d.ts +42 -0
- package/dist/postgres/fake-sql.d.ts.map +1 -1
- package/dist/postgres/grants-attrs.d.ts +115 -0
- package/dist/postgres/grants-attrs.d.ts.map +1 -0
- package/dist/postgres/grants-declare.d.ts +88 -0
- package/dist/postgres/grants-declare.d.ts.map +1 -0
- package/dist/postgres/grants-diff.d.ts +25 -0
- package/dist/postgres/grants-diff.d.ts.map +1 -0
- package/dist/postgres/grants-errors.d.ts +137 -0
- package/dist/postgres/grants-errors.d.ts.map +1 -0
- package/dist/postgres/grants-existence.d.ts +14 -0
- package/dist/postgres/grants-existence.d.ts.map +1 -0
- package/dist/postgres/grants-ops.d.ts +65 -0
- package/dist/postgres/grants-ops.d.ts.map +1 -0
- package/dist/postgres/grants-ownership.d.ts +18 -0
- package/dist/postgres/grants-ownership.d.ts.map +1 -0
- package/dist/postgres/grants-plan-restore.d.ts +22 -0
- package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
- package/dist/postgres/grants-plan.d.ts +65 -0
- package/dist/postgres/grants-plan.d.ts.map +1 -0
- package/dist/postgres/grants-read-defaults.d.ts +17 -0
- package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
- package/dist/postgres/grants-read.d.ts +77 -0
- package/dist/postgres/grants-read.d.ts.map +1 -0
- package/dist/postgres/grants-refuse.d.ts +25 -0
- package/dist/postgres/grants-refuse.d.ts.map +1 -0
- package/dist/postgres/grants-sql.d.ts +42 -0
- package/dist/postgres/grants-sql.d.ts.map +1 -0
- package/dist/postgres/grants-words.d.ts +29 -0
- package/dist/postgres/grants-words.d.ts.map +1 -0
- package/dist/postgres/grants.d.ts +37 -0
- package/dist/postgres/grants.d.ts.map +1 -0
- package/dist/postgres/index.d.ts +31 -6
- package/dist/postgres/index.d.ts.map +1 -1
- package/dist/postgres/index.js +1998 -37
- package/dist/postgres/index.js.map +46 -7
- package/dist/postgres/installed-classifier.d.ts +13 -0
- package/dist/postgres/installed-classifier.d.ts.map +1 -0
- package/dist/postgres/providers.d.ts +16 -8
- package/dist/postgres/providers.d.ts.map +1 -1
- package/dist/postgres/psql-executor.d.ts +4 -0
- package/dist/postgres/psql-executor.d.ts.map +1 -1
- package/dist/postgres/role-attrs.d.ts +112 -0
- package/dist/postgres/role-attrs.d.ts.map +1 -0
- package/dist/postgres/role-diff.d.ts +22 -0
- package/dist/postgres/role-diff.d.ts.map +1 -0
- package/dist/postgres/role-errors.d.ts +132 -0
- package/dist/postgres/role-errors.d.ts.map +1 -0
- package/dist/postgres/role-membership-sql.d.ts +78 -0
- package/dist/postgres/role-membership-sql.d.ts.map +1 -0
- package/dist/postgres/role-provider.d.ts +11 -0
- package/dist/postgres/role-provider.d.ts.map +1 -0
- package/dist/postgres/role-scram.d.ts +8 -0
- package/dist/postgres/role-scram.d.ts.map +1 -0
- package/dist/postgres/role-secrets.d.ts +38 -0
- package/dist/postgres/role-secrets.d.ts.map +1 -0
- package/dist/postgres/role-sql.d.ts +68 -0
- package/dist/postgres/role-sql.d.ts.map +1 -0
- package/dist/postgres/role.d.ts +57 -0
- package/dist/postgres/role.d.ts.map +1 -0
- package/dist/postgres/schema-assert.d.ts +50 -0
- package/dist/postgres/schema-assert.d.ts.map +1 -0
- package/dist/postgres/schema-attrs.d.ts +51 -0
- package/dist/postgres/schema-attrs.d.ts.map +1 -0
- package/dist/postgres/schema-delete.d.ts +28 -0
- package/dist/postgres/schema-delete.d.ts.map +1 -0
- package/dist/postgres/schema-diff.d.ts +14 -0
- package/dist/postgres/schema-diff.d.ts.map +1 -0
- package/dist/postgres/schema-errors.d.ts +139 -0
- package/dist/postgres/schema-errors.d.ts.map +1 -0
- package/dist/postgres/schema-identity.d.ts +8 -0
- package/dist/postgres/schema-identity.d.ts.map +1 -0
- package/dist/postgres/schema-reconcile.d.ts +12 -0
- package/dist/postgres/schema-reconcile.d.ts.map +1 -0
- package/dist/postgres/schema-sql.d.ts +45 -0
- package/dist/postgres/schema-sql.d.ts.map +1 -0
- package/dist/postgres/schema-test-kit.d.ts +67 -0
- package/dist/postgres/schema-test-kit.d.ts.map +1 -0
- package/dist/postgres/schema.d.ts +54 -0
- package/dist/postgres/schema.d.ts.map +1 -0
- package/dist/proxmox/index.js +35 -1
- package/dist/proxmox/index.js.map +3 -3
- package/dist/release/fake-engine.d.ts +10 -0
- package/dist/release/fake-engine.d.ts.map +1 -1
- package/dist/release/index.js +35 -1
- package/dist/release/index.js.map +3 -3
- package/dist/valkey/acl-attrs.d.ts +94 -0
- package/dist/valkey/acl-attrs.d.ts.map +1 -0
- package/dist/valkey/acl-compare.d.ts +28 -0
- package/dist/valkey/acl-compare.d.ts.map +1 -0
- package/dist/valkey/acl-connection.d.ts +6 -0
- package/dist/valkey/acl-connection.d.ts.map +1 -0
- package/dist/valkey/acl-form.d.ts +62 -0
- package/dist/valkey/acl-form.d.ts.map +1 -0
- package/dist/valkey/acl-managed.d.ts +4 -0
- package/dist/valkey/acl-managed.d.ts.map +1 -0
- package/dist/valkey/acl-ops.d.ts +37 -0
- package/dist/valkey/acl-ops.d.ts.map +1 -0
- package/dist/valkey/acl-profiles.d.ts +53 -0
- package/dist/valkey/acl-profiles.d.ts.map +1 -0
- package/dist/valkey/acl-reconcile.d.ts +26 -0
- package/dist/valkey/acl-reconcile.d.ts.map +1 -0
- package/dist/valkey/acl.d.ts +24 -0
- package/dist/valkey/acl.d.ts.map +1 -0
- package/dist/valkey/connection-service.d.ts +22 -0
- package/dist/valkey/connection-service.d.ts.map +1 -0
- package/dist/valkey/connection.d.ts +59 -0
- package/dist/valkey/connection.d.ts.map +1 -0
- package/dist/valkey/errors.d.ts +165 -0
- package/dist/valkey/errors.d.ts.map +1 -0
- package/dist/valkey/fake-acl.d.ts +29 -0
- package/dist/valkey/fake-acl.d.ts.map +1 -0
- package/dist/valkey/fake-valkey.d.ts +35 -0
- package/dist/valkey/fake-valkey.d.ts.map +1 -0
- package/dist/valkey/handler-test-fixture.d.ts +20 -0
- package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
- package/dist/valkey/index.d.ts +18 -0
- package/dist/valkey/index.d.ts.map +1 -0
- package/dist/valkey/index.js +964 -0
- package/dist/valkey/index.js.map +27 -0
- package/dist/valkey/instance-attrs.d.ts +46 -0
- package/dist/valkey/instance-attrs.d.ts.map +1 -0
- package/dist/valkey/instance-form.d.ts +22 -0
- package/dist/valkey/instance-form.d.ts.map +1 -0
- package/dist/valkey/instance.d.ts +48 -0
- package/dist/valkey/instance.d.ts.map +1 -0
- package/dist/valkey/provider-socket-fixture.d.ts +8 -0
- package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
- package/dist/valkey/providers.d.ts +16 -0
- package/dist/valkey/providers.d.ts.map +1 -0
- package/dist/valkey/resp.d.ts +38 -0
- package/dist/valkey/resp.d.ts.map +1 -0
- package/dist/valkey/transport-error.d.ts +36 -0
- package/dist/valkey/transport-error.d.ts.map +1 -0
- package/dist/valkey/transport.d.ts +50 -0
- package/dist/valkey/transport.d.ts.map +1 -0
- package/docs/litellm-access-group.md +105 -0
- package/docs/litellm-credential.md +60 -0
- package/docs/litellm-key-metadata.md +56 -0
- package/docs/litellm-key.md +194 -0
- package/docs/litellm-mcp.md +187 -0
- package/docs/litellm-model.md +111 -0
- package/docs/litellm-policy-attachment.md +86 -0
- package/docs/litellm-policy.md +103 -0
- package/docs/litellm-team.md +117 -0
- package/docs/litellm-tool-policy.md +90 -0
- package/docs/litellm-toolset.md +92 -0
- package/docs/litellm.md +16 -9
- package/docs/peers.md +15 -6
- package/docs/postgres-grants-example.md +55 -0
- package/docs/postgres-grants.md +157 -0
- package/docs/postgres-role.md +126 -0
- package/docs/postgres-schema.md +139 -0
- package/docs/postgres.md +20 -3
- package/docs/valkey-transport.md +29 -0
- package/docs/valkey.md +187 -0
- package/package.json +6 -2
- package/src/ceph/ceph-argv.test.ts +1 -1
- package/src/launchd/sudo-allowlist.test.ts +2 -2
- package/src/linux/sudo-allowlist.test.ts +3 -3
- package/src/linux/sudo-runner.test.ts +2 -2
- package/src/litellm/access-group-form.ts +105 -0
- package/src/litellm/access-group-operations.ts +92 -0
- package/src/litellm/access-group-types.ts +49 -0
- package/src/litellm/access-group.test.ts +197 -0
- package/src/litellm/access-group.ts +151 -0
- package/src/litellm/credential-errors.ts +183 -0
- package/src/litellm/credential-form.test.ts +151 -0
- package/src/litellm/credential-form.ts +211 -0
- package/src/litellm/credential-guards.test.ts +241 -0
- package/src/litellm/credential-operations.ts +208 -0
- package/src/litellm/credential-recovery.test.ts +93 -0
- package/src/litellm/credential-rewrite.test.ts +164 -0
- package/src/litellm/credential-rewrite.ts +50 -0
- package/src/litellm/credential-types.ts +117 -0
- package/src/litellm/credential-values.ts +94 -0
- package/src/litellm/credential.test.ts +218 -0
- package/src/litellm/credential.ts +227 -0
- package/src/litellm/fake-access-group-litellm.ts +127 -0
- package/src/litellm/fake-credential-litellm.ts +216 -0
- package/src/litellm/fake-keys.ts +190 -0
- package/src/litellm/fake-litellm.ts +19 -9
- package/src/litellm/fake-mcp-litellm.ts +214 -0
- package/src/litellm/fake-model-litellm-post-update.ts +103 -0
- package/src/litellm/fake-model-litellm.ts +233 -0
- package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
- package/src/litellm/fake-policy-litellm.ts +186 -0
- package/src/litellm/fake-registry-base.ts +69 -0
- package/src/litellm/fake-stack.ts +17 -1
- package/src/litellm/fake-team-litellm.ts +229 -0
- package/src/litellm/fake-tool-litellm.ts +88 -0
- package/src/litellm/fake-toolset-litellm.ts +110 -0
- package/src/litellm/index.ts +140 -0
- package/src/litellm/key-delete.test.ts +212 -0
- package/src/litellm/key-errors.ts +241 -0
- package/src/litellm/key-form.ts +200 -0
- package/src/litellm/key-harness.ts +121 -0
- package/src/litellm/key-metadata-errors.ts +49 -0
- package/src/litellm/key-metadata.test.ts +156 -0
- package/src/litellm/key-metadata.ts +74 -0
- package/src/litellm/key-operations.ts +184 -0
- package/src/litellm/key-rotation.test.ts +110 -0
- package/src/litellm/key-scope.test.ts +135 -0
- package/src/litellm/key-secret.test.ts +248 -0
- package/src/litellm/key-secret.ts +137 -0
- package/src/litellm/key-transport.test.ts +166 -0
- package/src/litellm/key.test.ts +231 -0
- package/src/litellm/key.ts +213 -0
- package/src/litellm/mcp-server-adopt.test.ts +86 -0
- package/src/litellm/mcp-server-alias.test.ts +184 -0
- package/src/litellm/mcp-server-credential.ts +85 -0
- package/src/litellm/mcp-server-errors.ts +141 -0
- package/src/litellm/mcp-server-exports.test.ts +15 -0
- package/src/litellm/mcp-server-form.test.ts +241 -0
- package/src/litellm/mcp-server-form.ts +233 -0
- package/src/litellm/mcp-server-handlers.test.ts +150 -0
- package/src/litellm/mcp-server-locate.ts +66 -0
- package/src/litellm/mcp-server-operations.ts +111 -0
- package/src/litellm/mcp-server-registry.test.ts +146 -0
- package/src/litellm/mcp-server-retype.test.ts +114 -0
- package/src/litellm/mcp-server-shadow.test.ts +91 -0
- package/src/litellm/mcp-server-shadow.ts +45 -0
- package/src/litellm/mcp-server-tools.test.ts +85 -0
- package/src/litellm/mcp-server-types.ts +143 -0
- package/src/litellm/mcp-server-url.ts +66 -0
- package/src/litellm/mcp-server.test.ts +213 -0
- package/src/litellm/mcp-server.ts +225 -0
- package/src/litellm/model-claim.ts +69 -0
- package/src/litellm/model-credential.ts +45 -0
- package/src/litellm/model-errors.ts +168 -0
- package/src/litellm/model-foreign-row.test.ts +173 -0
- package/src/litellm/model-form.test.ts +228 -0
- package/src/litellm/model-form.ts +223 -0
- package/src/litellm/model-locate.test.ts +128 -0
- package/src/litellm/model-locate.ts +67 -0
- package/src/litellm/model-operations.test.ts +93 -0
- package/src/litellm/model-operations.ts +146 -0
- package/src/litellm/model-params-preserve.test.ts +119 -0
- package/src/litellm/model-recovery.test.ts +57 -0
- package/src/litellm/model-types.ts +112 -0
- package/src/litellm/model.test.ts +222 -0
- package/src/litellm/model.ts +237 -0
- package/src/litellm/policy-attachment-form.ts +103 -0
- package/src/litellm/policy-attachment-operations.ts +74 -0
- package/src/litellm/policy-attachment-types.ts +48 -0
- package/src/litellm/policy-attachment.test.ts +198 -0
- package/src/litellm/policy-attachment.ts +178 -0
- package/src/litellm/policy-form.ts +122 -0
- package/src/litellm/policy-operations.ts +112 -0
- package/src/litellm/policy-types.ts +58 -0
- package/src/litellm/policy.test.ts +214 -0
- package/src/litellm/policy.ts +146 -0
- package/src/litellm/providers.ts +24 -3
- package/src/litellm/registry-errors.ts +88 -0
- package/src/litellm/registry-exports.test.ts +66 -0
- package/src/litellm/registry-support.ts +109 -0
- package/src/litellm/team-form.ts +140 -0
- package/src/litellm/team-members.test.ts +150 -0
- package/src/litellm/team-members.ts +58 -0
- package/src/litellm/team-operations.ts +90 -0
- package/src/litellm/team-permission.ts +159 -0
- package/src/litellm/team-read.test.ts +89 -0
- package/src/litellm/team-types.ts +106 -0
- package/src/litellm/team.test.ts +206 -0
- package/src/litellm/team.ts +159 -0
- package/src/litellm/tool-policy-form.ts +94 -0
- package/src/litellm/tool-policy-operations.ts +58 -0
- package/src/litellm/tool-policy-types.ts +48 -0
- package/src/litellm/tool-policy.test.ts +172 -0
- package/src/litellm/tool-policy.ts +125 -0
- package/src/litellm/toolset-form.ts +104 -0
- package/src/litellm/toolset-operations.ts +90 -0
- package/src/litellm/toolset-types.ts +47 -0
- package/src/litellm/toolset.test.ts +198 -0
- package/src/litellm/toolset.ts +151 -0
- package/src/ownership/ownership.test.ts +33 -1
- package/src/ownership/rows.ts +53 -0
- package/src/postgres/connection.ts +42 -7
- package/src/postgres/database-bigint-serialization.test.ts +1 -0
- package/src/postgres/database-refusals.test.ts +2 -2
- package/src/postgres/database-sql.ts +36 -9
- package/src/postgres/fake-grants-parse.ts +189 -0
- package/src/postgres/fake-grants-read.ts +250 -0
- package/src/postgres/fake-grants-sql.ts +207 -0
- package/src/postgres/fake-grants-write.ts +90 -0
- package/src/postgres/fake-role-sql.ts +240 -0
- package/src/postgres/fake-schema-semantics.test.ts +36 -0
- package/src/postgres/fake-schema-sql.ts +146 -0
- package/src/postgres/fake-sql-parse.ts +86 -0
- package/src/postgres/fake-sql-quote.ts +36 -0
- package/src/postgres/fake-sql.ts +166 -46
- package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
- package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
- package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
- package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
- package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
- package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
- package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
- package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
- package/src/postgres/grants-acl.test.ts +61 -0
- package/src/postgres/grants-attrs.ts +185 -0
- package/src/postgres/grants-database.test.ts +158 -0
- package/src/postgres/grants-declare.ts +172 -0
- package/src/postgres/grants-delete-proof.test.ts +154 -0
- package/src/postgres/grants-diff.ts +101 -0
- package/src/postgres/grants-errors.ts +215 -0
- package/src/postgres/grants-existence-guards.test.ts +113 -0
- package/src/postgres/grants-existence.ts +101 -0
- package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
- package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
- package/src/postgres/grants-lifecycle.test.ts +181 -0
- package/src/postgres/grants-ops.ts +229 -0
- package/src/postgres/grants-owner-revoke.test.ts +121 -0
- package/src/postgres/grants-ownership.ts +49 -0
- package/src/postgres/grants-plan-collateral.test.ts +202 -0
- package/src/postgres/grants-plan-diff.test.ts +204 -0
- package/src/postgres/grants-plan-restore.ts +43 -0
- package/src/postgres/grants-plan-revocations.test.ts +69 -0
- package/src/postgres/grants-plan.test.ts +148 -0
- package/src/postgres/grants-plan.ts +245 -0
- package/src/postgres/grants-provenance.test.ts +134 -0
- package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
- package/src/postgres/grants-read-absent.test.ts +91 -0
- package/src/postgres/grants-read-defaults.ts +51 -0
- package/src/postgres/grants-read.ts +250 -0
- package/src/postgres/grants-refusals.test.ts +136 -0
- package/src/postgres/grants-refuse.ts +119 -0
- package/src/postgres/grants-relkind-wire.test.ts +111 -0
- package/src/postgres/grants-repair-plan.test.ts +201 -0
- package/src/postgres/grants-sql.test.ts +128 -0
- package/src/postgres/grants-sql.ts +144 -0
- package/src/postgres/grants-words.ts +34 -0
- package/src/postgres/grants.ts +110 -0
- package/src/postgres/index.ts +129 -5
- package/src/postgres/installed-classifier.ts +36 -0
- package/src/postgres/providers.ts +33 -9
- package/src/postgres/psql-executor-escaping.test.ts +67 -0
- package/src/postgres/psql-executor.test.ts +63 -2
- package/src/postgres/psql-executor.ts +74 -34
- package/src/postgres/role-adopt.test.ts +98 -0
- package/src/postgres/role-attrs.ts +137 -0
- package/src/postgres/role-diff.ts +93 -0
- package/src/postgres/role-errors.ts +206 -0
- package/src/postgres/role-guard.test.ts +60 -0
- package/src/postgres/role-identity.test.ts +197 -0
- package/src/postgres/role-lifecycle.test.ts +228 -0
- package/src/postgres/role-membership-options.test.ts +73 -0
- package/src/postgres/role-membership-repair.test.ts +153 -0
- package/src/postgres/role-membership-sql.ts +223 -0
- package/src/postgres/role-password-ascii.test.ts +53 -0
- package/src/postgres/role-password-transports.test.ts +123 -0
- package/src/postgres/role-password.test.ts +158 -0
- package/src/postgres/role-privilege.test.ts +107 -0
- package/src/postgres/role-provenance.test.ts +200 -0
- package/src/postgres/role-provider.ts +105 -0
- package/src/postgres/role-refusals.test.ts +225 -0
- package/src/postgres/role-scram.test.ts +38 -0
- package/src/postgres/role-scram.ts +40 -0
- package/src/postgres/role-secrets.ts +61 -0
- package/src/postgres/role-sql.ts +213 -0
- package/src/postgres/role-valid-until.test.ts +68 -0
- package/src/postgres/role.ts +226 -0
- package/src/postgres/schema-assert.ts +139 -0
- package/src/postgres/schema-attrs.ts +71 -0
- package/src/postgres/schema-delete-proofs.test.ts +192 -0
- package/src/postgres/schema-delete.ts +96 -0
- package/src/postgres/schema-diff.ts +44 -0
- package/src/postgres/schema-drop-2bp01.test.ts +146 -0
- package/src/postgres/schema-errors.ts +209 -0
- package/src/postgres/schema-handlers.test.ts +193 -0
- package/src/postgres/schema-identity.ts +39 -0
- package/src/postgres/schema-lifecycle.test.ts +246 -0
- package/src/postgres/schema-race.test.ts +70 -0
- package/src/postgres/schema-reconcile.ts +100 -0
- package/src/postgres/schema-refusals.test.ts +144 -0
- package/src/postgres/schema-socket.test.ts +162 -0
- package/src/postgres/schema-sql.ts +130 -0
- package/src/postgres/schema-takeover.test.ts +149 -0
- package/src/postgres/schema-test-kit.ts +85 -0
- package/src/postgres/schema.ts +130 -0
- package/src/release/binary-alias.test.ts +3 -3
- package/src/release/binary-claims.test.ts +3 -3
- package/src/release/binary-directory-umask.test.ts +65 -0
- package/src/release/fake-engine.ts +15 -0
- package/src/valkey/acl-attrs.ts +98 -0
- package/src/valkey/acl-compare.ts +57 -0
- package/src/valkey/acl-connection.ts +13 -0
- package/src/valkey/acl-delete.test.ts +127 -0
- package/src/valkey/acl-form.ts +239 -0
- package/src/valkey/acl-managed.ts +13 -0
- package/src/valkey/acl-ops.ts +122 -0
- package/src/valkey/acl-ownership.test.ts +118 -0
- package/src/valkey/acl-prefix.test.ts +38 -0
- package/src/valkey/acl-profiles.ts +81 -0
- package/src/valkey/acl-reconcile.ts +180 -0
- package/src/valkey/acl-reserved.test.ts +69 -0
- package/src/valkey/acl-revocation.test.ts +94 -0
- package/src/valkey/acl-seat-prefix.test.ts +111 -0
- package/src/valkey/acl-validation.test.ts +54 -0
- package/src/valkey/acl.test.ts +215 -0
- package/src/valkey/acl.ts +169 -0
- package/src/valkey/connection-service.ts +46 -0
- package/src/valkey/connection.ts +180 -0
- package/src/valkey/errors.ts +239 -0
- package/src/valkey/fake-acl.ts +128 -0
- package/src/valkey/fake-valkey.ts +224 -0
- package/src/valkey/handler-test-fixture.ts +43 -0
- package/src/valkey/handlers.test.ts +205 -0
- package/src/valkey/index.ts +54 -0
- package/src/valkey/instance-attrs.ts +48 -0
- package/src/valkey/instance-form.ts +104 -0
- package/src/valkey/instance.test.ts +108 -0
- package/src/valkey/instance.ts +160 -0
- package/src/valkey/provider-socket-fixture.ts +71 -0
- package/src/valkey/providers.test.ts +129 -0
- package/src/valkey/providers.ts +21 -0
- package/src/valkey/resp.ts +212 -0
- package/src/valkey/transport-bounds.test.ts +150 -0
- package/src/valkey/transport-error.ts +37 -0
- package/src/valkey/transport.test.ts +158 -0
- package/src/valkey/transport.ts +109 -0
- 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
|
+
};
|
package/src/litellm/index.ts
CHANGED
|
@@ -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
|
+
});
|