@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,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The typed refusals `LiteLLM.Key` raises on top of `@distilled.cloud/litellm`'s own SDK errors.
|
|
3
|
+
*
|
|
4
|
+
* ⛔ NOT ONE OF THESE CARRIES A KEY VALUE. They name the alias, the environment VARIABLE and the
|
|
5
|
+
* rule broken, never what the variable held: an error is logged, retried and pasted into a PR.
|
|
6
|
+
* The SDK's own errors are the other half: `generateKey` (key-operations.ts) turns the one that
|
|
7
|
+
* holds the request, and so the value, into `LitellmKeyTransportError` below.
|
|
8
|
+
*/
|
|
9
|
+
import type * as keys from '@distilled.cloud/litellm/key_management';
|
|
10
|
+
import type { HttpClientErrorReason } from 'effect/unstable/http/HttpClientError';
|
|
11
|
+
import type { LitellmKeyCallbackMetadataDeclaredError, LitellmKeyCallbackMetadataLiveError } from './key-metadata-errors.ts';
|
|
12
|
+
declare const LitellmKeyValueRequiredError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
13
|
+
readonly _tag: "LitellmKeyValueRequiredError";
|
|
14
|
+
} & Readonly<A>;
|
|
15
|
+
/** A create is needed and the declaration names no `key` — LiteLLM would mint a value nobody holds. */
|
|
16
|
+
export declare class LitellmKeyValueRequiredError extends LitellmKeyValueRequiredError_base<{
|
|
17
|
+
readonly keyAlias: string;
|
|
18
|
+
}> {
|
|
19
|
+
get message(): string;
|
|
20
|
+
}
|
|
21
|
+
declare const LitellmKeyDebugLoggingError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
22
|
+
readonly _tag: "LitellmKeyDebugLoggingError";
|
|
23
|
+
} & Readonly<A>;
|
|
24
|
+
/**
|
|
25
|
+
* distilled prints request and response BODIES to stderr while `DISTILLED_DEBUG_HTTP` is set, and
|
|
26
|
+
* `/key/generate` carries the key in both. Refused before any request, as `fetchMeshNodeToken` does.
|
|
27
|
+
*/
|
|
28
|
+
export declare class LitellmKeyDebugLoggingError extends LitellmKeyDebugLoggingError_base<{
|
|
29
|
+
readonly keyAlias: string;
|
|
30
|
+
}> {
|
|
31
|
+
get message(): string;
|
|
32
|
+
}
|
|
33
|
+
declare const LitellmKeyTransportError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
34
|
+
readonly _tag: "LitellmKeyTransportError";
|
|
35
|
+
} & Readonly<A>;
|
|
36
|
+
/**
|
|
37
|
+
* `/key/generate` failed on the wire (or its answer could not be read), so nobody knows whether the
|
|
38
|
+
* key exists.
|
|
39
|
+
*
|
|
40
|
+
* ⛔ THIS IS WHAT STANDS IN FOR AN `HttpClientError`, WHICH CARRIES ITS REQUEST, AND THE REQUEST BODY
|
|
41
|
+
* OF `/key/generate` IS `{"key":"sk-…"}`. Measured 2026-09-29 with a synthetic value: on a dropped
|
|
42
|
+
* connection `JSON.stringify(error)`, `Bun.inspect(error, { depth: 10 })` and Effect's JSON logger
|
|
43
|
+
* all printed the key, and so did the failure of a deploy over it. A defect from reading a broken
|
|
44
|
+
* answer (`protocol-rest.ts` reads it with `Effect.orDie`) carries the same request. So `reason` is
|
|
45
|
+
* the `HttpClientError` reason's TAG (a string) and nothing else is kept: no request, no cause, no
|
|
46
|
+
* description (a cause is free text from `fetch`).
|
|
47
|
+
*/
|
|
48
|
+
export declare class LitellmKeyTransportError extends LitellmKeyTransportError_base<{
|
|
49
|
+
readonly keyAlias: string;
|
|
50
|
+
readonly reason: HttpClientErrorReason['_tag'] | 'Defect';
|
|
51
|
+
}> {
|
|
52
|
+
get message(): string;
|
|
53
|
+
}
|
|
54
|
+
declare const LitellmKeyAliasEmptyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
55
|
+
readonly _tag: "LitellmKeyAliasEmptyError";
|
|
56
|
+
} & Readonly<A>;
|
|
57
|
+
/** An empty alias: `/key/list` would read `key_alias=` as no filter, and nothing could find the key again. */
|
|
58
|
+
export declare class LitellmKeyAliasEmptyError extends LitellmKeyAliasEmptyError_base<{}> {
|
|
59
|
+
get message(): string;
|
|
60
|
+
}
|
|
61
|
+
declare const LitellmKeyValueMissingError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
62
|
+
readonly _tag: "LitellmKeyValueMissingError";
|
|
63
|
+
} & Readonly<A>;
|
|
64
|
+
/** `key: { fromEnv }` names a variable the deploying process does not have (or has empty). */
|
|
65
|
+
export declare class LitellmKeyValueMissingError extends LitellmKeyValueMissingError_base<{
|
|
66
|
+
readonly keyAlias: string;
|
|
67
|
+
readonly variable: string;
|
|
68
|
+
}> {
|
|
69
|
+
get message(): string;
|
|
70
|
+
}
|
|
71
|
+
declare const LitellmKeyValueMalformedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
72
|
+
readonly _tag: "LitellmKeyValueMalformedError";
|
|
73
|
+
} & Readonly<A>;
|
|
74
|
+
/** The variable's value breaks the rule `/key/generate` states for a user-defined key. */
|
|
75
|
+
export declare class LitellmKeyValueMalformedError extends LitellmKeyValueMalformedError_base<{
|
|
76
|
+
readonly keyAlias: string;
|
|
77
|
+
readonly variable: string;
|
|
78
|
+
readonly rule: string;
|
|
79
|
+
}> {
|
|
80
|
+
get message(): string;
|
|
81
|
+
}
|
|
82
|
+
declare const LitellmKeyValueNotHonouredError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
83
|
+
readonly _tag: "LitellmKeyValueNotHonouredError";
|
|
84
|
+
} & Readonly<A>;
|
|
85
|
+
/**
|
|
86
|
+
* `/key/generate` answered with a different value than the one sent, so the row exists under a
|
|
87
|
+
* key nobody holds. `removed` says whether the row was deleted again on the way out.
|
|
88
|
+
*/
|
|
89
|
+
export declare class LitellmKeyValueNotHonouredError extends LitellmKeyValueNotHonouredError_base<{
|
|
90
|
+
readonly keyAlias: string;
|
|
91
|
+
readonly removed: boolean;
|
|
92
|
+
}> {
|
|
93
|
+
get message(): string;
|
|
94
|
+
}
|
|
95
|
+
declare const LitellmKeyValueMismatchError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
96
|
+
readonly _tag: "LitellmKeyValueMismatchError";
|
|
97
|
+
} & Readonly<A>;
|
|
98
|
+
/**
|
|
99
|
+
* An ADOPTED key was declared with a `key` whose value is not the key the live row holds. The
|
|
100
|
+
* value is compared only as a sha256 in memory against the row's `token` (`hash_token`, the
|
|
101
|
+
* vendor's own store) — never in state, never in an error — and a mismatch is refused, because a
|
|
102
|
+
* seat that reads the same variable would hold a key that authenticates nothing while the plan
|
|
103
|
+
* reported success. `/key/update` cannot change a key's value (`prepare_key_update_data` pops
|
|
104
|
+
* `key`), so there is nothing to write: the operator must fix the variable or drop the `key`.
|
|
105
|
+
*/
|
|
106
|
+
export declare class LitellmKeyValueMismatchError extends LitellmKeyValueMismatchError_base<{
|
|
107
|
+
readonly keyAlias: string;
|
|
108
|
+
readonly variable: string;
|
|
109
|
+
}> {
|
|
110
|
+
get message(): string;
|
|
111
|
+
}
|
|
112
|
+
declare const LitellmKeyAliasChangedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
113
|
+
readonly _tag: "LitellmKeyAliasChangedError";
|
|
114
|
+
} & Readonly<A>;
|
|
115
|
+
/**
|
|
116
|
+
* The alias is the identity: `/key/update` and `/key/delete` find a key by it, and this resource
|
|
117
|
+
* never holds the value that could find it any other way. A different alias is a different key.
|
|
118
|
+
*/
|
|
119
|
+
export declare class LitellmKeyAliasChangedError extends LitellmKeyAliasChangedError_base<{
|
|
120
|
+
readonly from: string;
|
|
121
|
+
readonly to: string;
|
|
122
|
+
}> {
|
|
123
|
+
get message(): string;
|
|
124
|
+
}
|
|
125
|
+
declare const LitellmKeyAmbiguousAliasError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
126
|
+
readonly _tag: "LitellmKeyAmbiguousAliasError";
|
|
127
|
+
} & Readonly<A>;
|
|
128
|
+
/** More than one live key carries the alias, so nothing can say which one is declared. */
|
|
129
|
+
export declare class LitellmKeyAmbiguousAliasError extends LitellmKeyAmbiguousAliasError_base<{
|
|
130
|
+
readonly keyAlias: string;
|
|
131
|
+
readonly count: number;
|
|
132
|
+
}> {
|
|
133
|
+
get message(): string;
|
|
134
|
+
}
|
|
135
|
+
declare const LitellmKeyUnreadableError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
136
|
+
readonly _tag: "LitellmKeyUnreadableError";
|
|
137
|
+
} & Readonly<A>;
|
|
138
|
+
/** `/key/list` answered something that is not a list of key rows. */
|
|
139
|
+
export declare class LitellmKeyUnreadableError extends LitellmKeyUnreadableError_base<{
|
|
140
|
+
readonly keyAlias: string;
|
|
141
|
+
}> {
|
|
142
|
+
get message(): string;
|
|
143
|
+
}
|
|
144
|
+
declare const LitellmKeyAbsentAfterWriteError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
145
|
+
readonly _tag: "LitellmKeyAbsentAfterWriteError";
|
|
146
|
+
} & Readonly<A>;
|
|
147
|
+
/** A write returned no error but the alias is not listed afterwards. */
|
|
148
|
+
export declare class LitellmKeyAbsentAfterWriteError extends LitellmKeyAbsentAfterWriteError_base<{
|
|
149
|
+
readonly keyAlias: string;
|
|
150
|
+
}> {
|
|
151
|
+
get message(): string;
|
|
152
|
+
}
|
|
153
|
+
declare const LitellmKeyFieldNotAppliedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
154
|
+
readonly _tag: "LitellmKeyFieldNotAppliedError";
|
|
155
|
+
} & Readonly<A>;
|
|
156
|
+
/**
|
|
157
|
+
* The write returned no error but the row still differs from the declaration. `/key/update` is a
|
|
158
|
+
* merge patch (its docstring), so this is a proxy that did not apply a field — refused, never
|
|
159
|
+
* reported as done.
|
|
160
|
+
*/
|
|
161
|
+
export declare class LitellmKeyFieldNotAppliedError extends LitellmKeyFieldNotAppliedError_base<{
|
|
162
|
+
readonly keyAlias: string;
|
|
163
|
+
readonly fields: readonly string[];
|
|
164
|
+
}> {
|
|
165
|
+
get message(): string;
|
|
166
|
+
}
|
|
167
|
+
export type KeyError = keys.ListKeysKeyListGetError | keys.GenerateKeyFnKeyGeneratePostError | keys.UpdateKeyFnKeyUpdatePostError | keys.DeleteKeyFnKeyDeletePostError | LitellmKeyDebugLoggingError | LitellmKeyTransportError | LitellmKeyAliasEmptyError | LitellmKeyValueRequiredError | LitellmKeyValueMissingError | LitellmKeyValueMalformedError | LitellmKeyValueNotHonouredError | LitellmKeyValueMismatchError | LitellmKeyAliasChangedError | LitellmKeyAmbiguousAliasError | LitellmKeyCallbackMetadataDeclaredError | LitellmKeyCallbackMetadataLiveError | LitellmKeyUnreadableError | LitellmKeyAbsentAfterWriteError | LitellmKeyFieldNotAppliedError;
|
|
168
|
+
export {};
|
|
169
|
+
//# sourceMappingURL=key-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-errors.d.ts","sourceRoot":"","sources":["../../src/litellm/key-errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,IAAI,MAAM,yCAAyC,CAAC;AAErE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EACV,uCAAuC,EACvC,mCAAmC,EACpC,MAAM,0BAA0B,CAAC;;;;AAElC,uGAAuG;AACvG,qBAAa,4BAA6B,SAAQ,kCAAiD;IACjG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,wBAAyB,SAAQ,8BAA6C;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;CAC3D,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAO7B;CACF;;;;AAED,8GAA8G;AAC9G,qBAAa,yBAA0B,SAAQ,+BAA8C,EAAE,CAAC;IAC9F,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED,8FAA8F;AAC9F,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED,0FAA0F;AAC1F,qBAAa,6BAA8B,SAAQ,mCAEjD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,qCAEnD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAQ7B;CACF;;;;AAED;;;;;;;GAOG;AACH,qBAAa,4BAA6B,SAAQ,kCAAiD;IACjG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,iCAAgD;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED,0FAA0F;AAC1F,qBAAa,6BAA8B,SAAQ,mCAEjD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED,qEAAqE;AACrE,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED,wEAAwE;AACxE,qBAAa,+BAAgC,SAAQ,qCAEnD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,8BAA+B,SAAQ,oCAElD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;AAED,MAAM,MAAM,QAAQ,GAChB,IAAI,CAAC,uBAAuB,GAC5B,IAAI,CAAC,iCAAiC,GACtC,IAAI,CAAC,6BAA6B,GAClC,IAAI,CAAC,6BAA6B,GAClC,2BAA2B,GAC3B,wBAAwB,GACxB,yBAAyB,GACzB,4BAA4B,GAC5B,2BAA2B,GAC3B,6BAA6B,GAC7B,+BAA+B,GAC/B,4BAA4B,GAC5B,2BAA2B,GAC3B,6BAA6B,GAC7B,uCAAuC,GACvC,mCAAmC,GACnC,yBAAyB,GACzB,+BAA+B,GAC/B,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Props, attributes, wire bodies and comparison for `LiteLLM.Key`, testable without a server.
|
|
3
|
+
*
|
|
4
|
+
* ⛔ THERE IS NO SECRET IN THIS FILE'S OUTPUT. `KeyAttributes` has no `key`, no `token` and no hash:
|
|
5
|
+
* `/key/list` rows carry `token` (LiteLLM's hash of the key) and `toAttributes` drops it, because
|
|
6
|
+
* attributes are persisted unencrypted (key-secret.ts). The value is unwrapped in `createBody`, at
|
|
7
|
+
* the last moment before the wire, and compared with a live row only as a sha256 in memory
|
|
8
|
+
* (`verifyKeyValue`, key-secret.ts) against the raw row's `token` — the hash itself never reaches
|
|
9
|
+
* state. The callback slots of `metadata` are dropped too (key-metadata.ts).
|
|
10
|
+
* ★ THE ROW IS READ THROUGH `/key/list?key_alias=…&return_full_object=true`. Measured 2026-09-28
|
|
11
|
+
* (litellm-key-access): a bare list and `get_key` come back with `models: []` for keys whose real
|
|
12
|
+
* allowlist lives in the full object. The generated `UserAPIKeyAuth` row declares every column
|
|
13
|
+
* compared here (`budget_id`, `models`, `allowed_routes`, `team_id`, `metadata`, `expires`).
|
|
14
|
+
* ⛔ A DECLARATION MANAGES ONLY WHAT IT NAMES. An omitted `budgetId`, `models`, `allowedRoutes`,
|
|
15
|
+
* `teamId` or `duration` is neither compared nor sent, so a live value stays. Reading omission as
|
|
16
|
+
* "clear it" FAILS OPEN on a credential: `[]` is "all models" and "no route restriction" to
|
|
17
|
+
* LiteLLM, and no budget drops the tier's limits. On an adopted key (whose plan says `adopted`, never
|
|
18
|
+
* what the apply will write, and which `--adopt` given for another resource takes over too) that
|
|
19
|
+
* would widen a live key without the plan ever showing an `update`. Clearing is an explicit
|
|
20
|
+
* declaration: `models: []`, `allowedRoutes: []`, `budgetId: null`, `teamId: null`, `duration: null`.
|
|
21
|
+
* `/key/update` is a merge patch for the COLUMNS (its docstring), so an unsent one is left as it is.
|
|
22
|
+
* ⛔ `metadata` IS A MERGE, NOT A COLUMN OF THE DECLARER'S: LiteLLM keeps guardrails, per-model limits
|
|
23
|
+
* and more inside it, and `/key/update` replaces it wholesale. See key-metadata.ts.
|
|
24
|
+
* ⚠️ NOT MODELLED, so a declaration of them could never be diffed: `max_budget`, `soft_budget`,
|
|
25
|
+
* `object_permission`, `blocked`, `spend`, and the top-level rate limits. Bind a `LiteLLM.Budget`
|
|
26
|
+
* for limits. The ones that live in `metadata` (guardrails, tags, `model_rpm_limit`, …) are left
|
|
27
|
+
* alone by the merge, and can be declared as `metadata` keys.
|
|
28
|
+
*/
|
|
29
|
+
import type * as keys from '@distilled.cloud/litellm/key_management';
|
|
30
|
+
import * as Redacted from 'effect/Redacted';
|
|
31
|
+
import type { FromEnv } from '../secrets/write-only.ts';
|
|
32
|
+
import { type Metadata } from './key-metadata.ts';
|
|
33
|
+
export interface KeyProps {
|
|
34
|
+
/** The alias LiteLLM knows the key by: its identity, unique per proxy. Declare an existing key's alias to adopt it. */
|
|
35
|
+
readonly keyAlias: string;
|
|
36
|
+
/**
|
|
37
|
+
* The key's VALUE, by the NAME of the environment variable holding it (`{ fromEnv: 'SEAT_KEY' }`).
|
|
38
|
+
* Write-only and create-only: required to create the key, never stored. On an EXISTING key a
|
|
39
|
+
* declared value is compared with the row in memory only (sha256 against the row's `token`), and a
|
|
40
|
+
* mismatch is refused — `/key/update` cannot change a key's value. Omit it to manage an existing
|
|
41
|
+
* key's settings without ever holding its value.
|
|
42
|
+
*/
|
|
43
|
+
readonly key?: FromEnv;
|
|
44
|
+
/**
|
|
45
|
+
* The `LiteLLM.Budget` tier the key binds to (`budget.budgetId`, so the tier is created first).
|
|
46
|
+
* Omitted = not managed, a live binding stays. `null` = unbind, which drops the tier's limits.
|
|
47
|
+
*/
|
|
48
|
+
readonly budgetId?: string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Model names the key may call. Omitted = not managed, a live scope stays (a NEW key then starts
|
|
51
|
+
* with LiteLLM's default). `[]` = ALL models, LiteLLM's reading: declared on a scoped key it WIDENS it.
|
|
52
|
+
*/
|
|
53
|
+
readonly models?: readonly string[];
|
|
54
|
+
/**
|
|
55
|
+
* Routes the key may call, exact or wildcard (`/chat/completions`, `/v1/*`). Omitted = not
|
|
56
|
+
* managed. `[]` = no route restriction: declared on a restricted key it WIDENS it.
|
|
57
|
+
*/
|
|
58
|
+
readonly allowedRoutes?: readonly string[];
|
|
59
|
+
/** The team the key belongs to. Omitted = not managed. `null` = detach. */
|
|
60
|
+
readonly teamId?: string | null;
|
|
61
|
+
/**
|
|
62
|
+
* The `metadata` keys this declaration manages, a MERGE (key-metadata.ts): other live keys are
|
|
63
|
+
* carried, never removed, and a key is cleared by declaring it `null`. Stored in state, so no
|
|
64
|
+
* secrets. `logging`, `callback_settings` and `secret_manager_settings` are refused.
|
|
65
|
+
*/
|
|
66
|
+
readonly metadata?: Metadata;
|
|
67
|
+
/**
|
|
68
|
+
* Validity from creation: `'30s'`, `'30m'`, `'30h'`, `'30d'`. Omitted = not managed (a live expiry
|
|
69
|
+
* stays; a new key never expires). `null` = never expires, which clears a live expiry.
|
|
70
|
+
*/
|
|
71
|
+
readonly duration?: string | null;
|
|
72
|
+
}
|
|
73
|
+
export interface KeyAttributes {
|
|
74
|
+
readonly keyAlias: string;
|
|
75
|
+
readonly budgetId: string | null;
|
|
76
|
+
readonly models: readonly string[];
|
|
77
|
+
readonly allowedRoutes: readonly string[];
|
|
78
|
+
readonly teamId: string | null;
|
|
79
|
+
/** The row's `metadata` WITHOUT the callback slots (`withheld`): those carry secret keys and state is unencrypted. */
|
|
80
|
+
readonly metadata: Metadata;
|
|
81
|
+
/**
|
|
82
|
+
* The `duration` this provider last WROTE. The row carries only `expires`, an absolute time, so
|
|
83
|
+
* the declared duration cannot be read back; state remembers it. `null` for an adopted row.
|
|
84
|
+
*/
|
|
85
|
+
readonly duration: string | null;
|
|
86
|
+
/** When the key stops authenticating, as the row says. Observed, never declared. */
|
|
87
|
+
readonly expires: string | null;
|
|
88
|
+
/**
|
|
89
|
+
* The NAMES of the `metadata` callback slots the row has and this resource never reads. A metadata
|
|
90
|
+
* write is refused while any is present: `/key/update` replaces the column and could not carry them.
|
|
91
|
+
*/
|
|
92
|
+
readonly withheld: readonly string[];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Wire names of the fields the declaration NAMES where the live row disagrees. An omitted prop is
|
|
96
|
+
* never here (the header's "manages only what it names"), so nothing omitted is ever written.
|
|
97
|
+
*/
|
|
98
|
+
export declare const differing: (live: KeyAttributes, props: KeyProps) => readonly string[];
|
|
99
|
+
/**
|
|
100
|
+
* Create body: only what is declared, plus the value.
|
|
101
|
+
* ⛔ `Redacted.value` IS CALLED HERE, TO SEND, AND IN key-secret.ts's `echoes`, TO COMPARE — nowhere else.
|
|
102
|
+
*/
|
|
103
|
+
export declare const createBody: (props: KeyProps, secret: Redacted.Redacted<string>) => keys.GenerateKeyFnKeyGeneratePostRequest;
|
|
104
|
+
/**
|
|
105
|
+
* Update body: the alias (which finds the key, `key` omitted) and ONLY the declared fields that
|
|
106
|
+
* differ, each as the declaration wants it — a declared `null` on `budget_id`/`team_id`/`duration`
|
|
107
|
+
* as an explicit `null` (a key column, which "an explicit null clears"), a declared `[]` as `[]`.
|
|
108
|
+
* ★ `metadata` CARRIES EVERY LIVE KEY with the declared ones on top, because `/key/update` replaces
|
|
109
|
+
* the column (key-metadata.ts). The caller has refused a key with `withheld` slots by now.
|
|
110
|
+
* ⛔ NEVER CARRIES `key`: an update must not be able to change which value authenticates.
|
|
111
|
+
*/
|
|
112
|
+
export declare const updateBody: (props: KeyProps, live: KeyAttributes) => keys.UpdateKeyFnKeyUpdatePostRequest;
|
|
113
|
+
/**
|
|
114
|
+
* One row of `/key/list?return_full_object=true`. The row's `token` (LiteLLM's hash of the key), the
|
|
115
|
+
* `metadata` callback slots (only their names stay, as `withheld`), and every other column not named
|
|
116
|
+
* in `KeyAttributes`, are dropped here on purpose.
|
|
117
|
+
*/
|
|
118
|
+
export declare const toAttributes: (row: Record<string, unknown>) => KeyAttributes;
|
|
119
|
+
//# sourceMappingURL=key-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-form.d.ts","sourceRoot":"","sources":["../../src/litellm/key-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,KAAK,IAAI,MAAM,yCAAyC,CAAC;AACrE,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAkD,MAAM,mBAAmB,CAAC;AAElG,MAAM,WAAW,QAAQ;IACvB,uHAAuH;IACvH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,sHAAsH;IACtH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAmBD;;;GAGG;AACH,eAAO,MAAM,SAAS,SAAU,aAAa,SAAS,QAAQ,KAAG,SAAS,MAAM,EAW/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,UACd,QAAQ,UACP,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAChC,IAAI,CAAC,mCAaP,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UACd,QAAQ,QACT,aAAa,KAClB,IAAI,CAAC,+BAWP,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,aAa3D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as Effect from 'effect/Effect';
|
|
2
|
+
import { startFakeLitellm } from './fake-litellm.ts';
|
|
3
|
+
import { type FakeStack } from './fake-stack.ts';
|
|
4
|
+
import { LiteLLMKey } from './key.ts';
|
|
5
|
+
import type { KeyProps } from './key-form.ts';
|
|
6
|
+
import type { LitellmOpContext } from './operations.ts';
|
|
7
|
+
export declare const MASTER_KEY = "sk-test-master";
|
|
8
|
+
/** A valid user-defined key (`sk-` and 16+ characters) that is obviously not a real one. */
|
|
9
|
+
export declare const FAKE_KEY = "sk-FAKE-seat-key-000000000001";
|
|
10
|
+
export declare const OTHER_FAKE_KEY = "sk-FAKE-seat-key-000000000002";
|
|
11
|
+
export declare const VAR = "FAKE_LITELLM_SEAT_KEY";
|
|
12
|
+
/** The row's `token` for a value, the same sha256 the fake and the vendor store (`hash_token`). */
|
|
13
|
+
export declare const tokenFor: (value: string) => string;
|
|
14
|
+
export type Fake = ReturnType<typeof startFakeLitellm>;
|
|
15
|
+
export declare const newFake: (options?: Parameters<typeof startFakeLitellm>[0]) => Fake;
|
|
16
|
+
export declare const keyStack: (fake: Fake, settings?: {
|
|
17
|
+
readonly noRetry?: boolean;
|
|
18
|
+
}) => FakeStack;
|
|
19
|
+
/** One declaration as a stack body. `name` is the resource's logical id. */
|
|
20
|
+
export declare const declare: (props: KeyProps, name?: string) => Effect.Effect<void, never, import("alchemy").Provider<LiteLLMKey>>;
|
|
21
|
+
/**
|
|
22
|
+
* Runs `body` with `values` in `process.env`, then puts the environment back exactly as it was.
|
|
23
|
+
* ⚠️ THE PROVIDER READS `process.env` AT CALL TIME (write-only.ts `resolveAll`), so the variable
|
|
24
|
+
* has to be there for the whole deploy and gone after it.
|
|
25
|
+
*/
|
|
26
|
+
export declare const withEnv: <A>(values: Readonly<Record<string, string | undefined>>, body: () => Promise<A>) => Promise<A>;
|
|
27
|
+
/** The message a rejected deploy carries, or `''` when it did not reject. */
|
|
28
|
+
export declare const failureOf: (attempt: Promise<unknown>) => Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Runs one handler effect against the fake outside any stack (a handler-level test), with the SDK's
|
|
31
|
+
* retry OFF: a test of a failing call wants the failure, not the backoff before it.
|
|
32
|
+
*/
|
|
33
|
+
export declare const runAgainst: <A, E>(fake: Fake, effect: Effect.Effect<A, E, LitellmOpContext>) => Promise<A>;
|
|
34
|
+
/** A seeded live row shaped like `UserAPIKeyAuth`, with a hash `token` a resource must never surface. */
|
|
35
|
+
export declare const liveRow: (fields?: Record<string, unknown>) => Record<string, unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* Someone changing a live key outside the stack — the dashboard's `/key/update` — through the fake's
|
|
38
|
+
* own route, so it replaces `metadata` the way LiteLLM does. It shows in `fake.keys.writes()`.
|
|
39
|
+
*/
|
|
40
|
+
export declare const dashboardEdit: (fake: Fake, keyAlias: string, patch: Record<string, unknown>) => Promise<void>;
|
|
41
|
+
//# sourceMappingURL=key-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-harness.d.ts","sourceRoot":"","sources":["../../src/litellm/key-harness.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAa,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,eAAO,MAAM,UAAU,mBAAmB,CAAC;AAC3C,4FAA4F;AAC5F,eAAO,MAAM,QAAQ,kCAAkC,CAAC;AACxD,eAAO,MAAM,cAAc,kCAAkC,CAAC;AAC9D,eAAO,MAAM,GAAG,0BAA0B,CAAC;AAE3C,mGAAmG;AACnG,eAAO,MAAM,QAAQ,UAAW,MAAM,KAAG,MACmB,CAAC;AAE7D,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,aAAc,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAG,IAClB,CAAC;AAE1D,eAAO,MAAM,QAAQ,SAAU,IAAI,aAAa;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,SACQ,CAAC;AAE1F,4EAA4E;AAC5E,eAAO,MAAM,OAAO,UAAW,QAAQ,sFAGnC,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAU,CAAC,UACrB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,QAC9C,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAcX,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,SAAS,YAAmB,OAAO,CAAC,OAAO,CAAC,KAAG,OAAO,CAAC,MAAM,CAIvE,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,QACvB,IAAI,UACF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAC5C,OAAO,CAAC,CAAC,CAQT,CAAC;AAEJ,yGAAyG;AACzG,eAAO,MAAM,OAAO,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAYnF,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,SAClB,IAAI,YACA,MAAM,SACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAOd,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
declare const LitellmKeyCallbackMetadataDeclaredError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
2
|
+
readonly _tag: "LitellmKeyCallbackMetadataDeclaredError";
|
|
3
|
+
} & Readonly<A>;
|
|
4
|
+
/**
|
|
5
|
+
* The declaration names a callback slot. LiteLLM stores its `callback_vars` ENCRYPTED, so the row
|
|
6
|
+
* would never read back equal (every deploy would fail with `LitellmKeyFieldNotAppliedError`), and
|
|
7
|
+
* Alchemy state is unencrypted.
|
|
8
|
+
*/
|
|
9
|
+
export declare class LitellmKeyCallbackMetadataDeclaredError extends LitellmKeyCallbackMetadataDeclaredError_base<{
|
|
10
|
+
readonly keyAlias: string;
|
|
11
|
+
readonly slots: readonly string[];
|
|
12
|
+
}> {
|
|
13
|
+
get message(): string;
|
|
14
|
+
}
|
|
15
|
+
declare const LitellmKeyCallbackMetadataLiveError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
16
|
+
readonly _tag: "LitellmKeyCallbackMetadataLiveError";
|
|
17
|
+
} & Readonly<A>;
|
|
18
|
+
/**
|
|
19
|
+
* The live key holds callback credentials in its `metadata` and the declaration wants a metadata
|
|
20
|
+
* key changed. `/key/update` REPLACES the column, and this resource never read those slots, so it
|
|
21
|
+
* could not send them back: writing would strip the key's logging. Refused before the write.
|
|
22
|
+
*/
|
|
23
|
+
export declare class LitellmKeyCallbackMetadataLiveError extends LitellmKeyCallbackMetadataLiveError_base<{
|
|
24
|
+
readonly keyAlias: string;
|
|
25
|
+
readonly slots: readonly string[];
|
|
26
|
+
}> {
|
|
27
|
+
get message(): string;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=key-metadata-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-metadata-errors.d.ts","sourceRoot":"","sources":["../../src/litellm/key-metadata-errors.ts"],"names":[],"mappings":";;;AASA;;;;GAIG;AACH,qBAAa,uCAAwC,SAAQ,6CAE3D;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,mCAAoC,SAAQ,yCAEvD;IACA,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAO7B;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type Metadata = Readonly<Record<string, unknown>>;
|
|
2
|
+
/** The slots that carry callback credentials: never in attributes, never declared, never written. */
|
|
3
|
+
export declare const CALLBACK_SLOTS: readonly ['callback_settings', 'logging', 'secret_manager_settings'];
|
|
4
|
+
/** The callback slots `metadata` names, sorted (`CALLBACK_SLOTS` is). */
|
|
5
|
+
export declare const callbackSlotsIn: (metadata: Metadata | undefined) => readonly string[];
|
|
6
|
+
/**
|
|
7
|
+
* A row's `metadata` as attributes hold it: everything but the callback slots, whose NAMES are
|
|
8
|
+
* returned beside it (`withheld`) so a write knows it could not carry them.
|
|
9
|
+
*/
|
|
10
|
+
export declare const splitMetadata: (raw: unknown) => {
|
|
11
|
+
readonly metadata: Record<string, unknown>;
|
|
12
|
+
readonly withheld: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Whether a key the declaration names differs from the live row. An absent live key differs from any
|
|
16
|
+
* declared value, `null` included (`deepEqual` tells `undefined` from `null`), so `{ seat: null }`
|
|
17
|
+
* writes a `null` once and is quiet after.
|
|
18
|
+
*/
|
|
19
|
+
export declare const metadataDiffers: (live: Metadata, declared: Metadata | undefined) => boolean;
|
|
20
|
+
/** The body's `metadata`: every live key carried, the declared ones on top. */
|
|
21
|
+
export declare const mergedMetadata: (live: Metadata, declared: Metadata | undefined) => Metadata;
|
|
22
|
+
//# sourceMappingURL=key-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-metadata.d.ts","sourceRoot":"","sources":["../../src/litellm/key-metadata.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzD,qGAAqG;AACrG,eAAO,MAAM,cAAc,YAAI,mBAAmB,EAAE,SAAS,EAAE,yBAAyB,CAAU,CAAC;AAKnG,yEAAyE;AACzE,eAAO,MAAM,eAAe,aAAc,QAAQ,GAAG,SAAS,KAAG,SAAS,MAAM,EACc,CAAC;AAE/F;;;GAGG;AACH,eAAO,MAAM,aAAa,QACnB,OAAO,KACX;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAOpF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,SAAU,QAAQ,YAAY,QAAQ,GAAG,SAAS,KAAG,OAEA,CAAC;AAElF,+EAA+E;AAC/E,eAAO,MAAM,cAAc,SAAU,QAAQ,YAAY,QAAQ,GAAG,SAAS,KAAG,QAG9E,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four LiteLLM `/key/*` calls `LiteLLM.Key` uses, through the SDK's typed operations.
|
|
3
|
+
*
|
|
4
|
+
* ★ EVERY OPERATION HERE EXISTS IN `@distilled.cloud/litellm/key_management` (generated at LiteLLM
|
|
5
|
+
* 1.103.0) AND IS CALLED WITH ITS OWN REQUEST TYPE — none is guessed, none is hand-rolled:
|
|
6
|
+
* `listKeysKeyListGet` GET /key/list read, by `key_alias`, `return_full_object`
|
|
7
|
+
* `generateKeyFnKeyGeneratePost` POST /key/generate create, with the user-defined `key`
|
|
8
|
+
* `updateKeyFnKeyUpdatePost` POST /key/update merge patch, found by `key_alias`
|
|
9
|
+
* `deleteKeyFnKeyDeletePost` POST /key/delete by `key_aliases`
|
|
10
|
+
* `/key/info` and `/v2/key/info` are NOT used: they take the key or its hash, and this resource
|
|
11
|
+
* holds neither for an adopted key. Listing by alias needs no value.
|
|
12
|
+
* ⚠️ NO SEMAPHORE, unlike pass-through endpoints: every key is its own DB row (budget-operations.ts).
|
|
13
|
+
* ⚠️ THE SDK'S DEFAULT RETRY APPLIES TO `/key/generate` TOO. A create whose response was lost and is
|
|
14
|
+
* then retried surfaces the proxy's duplicate-alias 400 rather than a second key; the next deploy
|
|
15
|
+
* reads the row. UNVERIFIED against a live proxy — the retry policy is core's, not this file's.
|
|
16
|
+
* ⚠️ DELETE IS IDEMPOTENT BY THIS FUNCTION, not by the vendor. MEASURED in the litellm 1.103.0 wheel
|
|
17
|
+
* (`key_management_endpoints.py`): `/key/delete` for an alias it does not hold answers 404 "No keys
|
|
18
|
+
* found" (`delete_verification_tokens`, :4915-4918), and 403 for a caller that may not delete the
|
|
19
|
+
* key (:4933-4936). The SDK types both as resource-specific tags, `KeyNotFound` and
|
|
20
|
+
* `KeyDeleteForbidden` (a distilled patch, `patches/key_management/delete_key_fn_key_delete_post.json`,
|
|
21
|
+
* each matched on the status AND a phrase of the vendor's message), so `catchTag` sees them: the
|
|
22
|
+
* MESSAGE MATCH LIVES IN THE SDK, never here (S21). An absent alias is settled by the LIST, which
|
|
23
|
+
* answers absence unambiguously, and a `KeyNotFound` (another caller won the race, or a retry of a
|
|
24
|
+
* delete whose answer was lost) re-lists and is swallowed only if the key has gone since. Every
|
|
25
|
+
* other failure, `KeyDeleteForbidden` included, propagates typed: a 404 that is not the vendor's
|
|
26
|
+
* is core's `NotFound`, not absence. operations.ts's `deletePassThroughEndpoint` and
|
|
27
|
+
* budget-operations.ts decide the same way, on their own tag.
|
|
28
|
+
*/
|
|
29
|
+
import * as keys from '@distilled.cloud/litellm/key_management';
|
|
30
|
+
import * as Effect from 'effect/Effect';
|
|
31
|
+
import { LitellmKeyAliasEmptyError, LitellmKeyAmbiguousAliasError, LitellmKeyTransportError, LitellmKeyUnreadableError } from './key-errors.ts';
|
|
32
|
+
import { type KeyAttributes } from './key-form.ts';
|
|
33
|
+
import { type LitellmOpContext } from './operations.ts';
|
|
34
|
+
/**
|
|
35
|
+
* The one live key with this alias, or `undefined`. Two rows are an error, never a pick: the
|
|
36
|
+
* server filters by an EXACT alias by default, and this filters again so a proxy that matched a
|
|
37
|
+
* substring cannot hand back someone else's key.
|
|
38
|
+
*/
|
|
39
|
+
export declare const findKey: (keyAlias: string) => Effect.Effect<KeyAttributes | undefined, keys.ListKeysKeyListGetError | LitellmKeyUnreadableError | LitellmKeyAmbiguousAliasError | LitellmKeyAliasEmptyError, LitellmOpContext>;
|
|
40
|
+
/**
|
|
41
|
+
* The row's `token` (the vendor's sha256 of the key), `null` when the row carries none, or
|
|
42
|
+
* `undefined` when the alias is absent. Absence must plan recreation, not a value mismatch.
|
|
43
|
+
* Read only for the in-memory mismatch check (`verifyKeyValue`); the hash is never persisted.
|
|
44
|
+
*/
|
|
45
|
+
export declare const readKeyToken: (keyAlias: string) => Effect.Effect<string | null | undefined, keys.ListKeysKeyListGetError | LitellmKeyUnreadableError | LitellmKeyAmbiguousAliasError | LitellmKeyAliasEmptyError, LitellmOpContext>;
|
|
46
|
+
/**
|
|
47
|
+
* `/key/generate`. The response's `key` is `Redacted` (the SDK's `SensitiveValue`); never log the response.
|
|
48
|
+
* ⛔ THE REQUEST BODY IS `{"key":"sk-…"}`, AND A FAILED CALL CAN CARRY ITS REQUEST. Two ways, both
|
|
49
|
+
* measured 2026-09-29 with a synthetic key (key-transport.test.ts): a transport failure is an
|
|
50
|
+
* `HttpClientError` in the error channel, and a body that fails mid-read is the SAME error as a
|
|
51
|
+
* DEFECT (`Effect.orDie` in `@distilled.cloud/core`'s `protocol-rest.ts`). Either would put the
|
|
52
|
+
* plaintext in front of anything that serialises, inspects or logs the failure — while the SDK's
|
|
53
|
+
* own `HttpClientError` is not something this resource can leave typed as it is. Both become
|
|
54
|
+
* `LitellmKeyTransportError`, which keeps the alias and the reason's tag and nothing else.
|
|
55
|
+
* The SDK's status errors (`BadRequest`, `Forbidden`, …) carry only the proxy's message text and
|
|
56
|
+
* stay as they are, so a caller can still `catchTag` them.
|
|
57
|
+
*/
|
|
58
|
+
export declare const generateKey: (body: keys.GenerateKeyFnKeyGeneratePostRequest) => Effect.Effect<keys.GenerateKeyResponse, keys.BadRequest | import("@distilled.cloud/caddy").ConfigError | keys.Forbidden | LitellmKeyTransportError | keys.UnprocessableEntity | import("@distilled.cloud/litellm/Errors").DefaultErrors, import("@distilled.cloud/litellm/Credentials").Credentials>;
|
|
59
|
+
/** `/key/update`, found by the body's `key_alias`. */
|
|
60
|
+
export declare const updateKey: (body: keys.UpdateKeyFnKeyUpdatePostRequest) => Effect.Effect<void, keys.UpdateKeyFnKeyUpdatePostError, import("@distilled.cloud/litellm/Credentials").Credentials>;
|
|
61
|
+
/** `/key/delete` by alias, when the list shows the key; a no-op when it does not. */
|
|
62
|
+
export declare const deleteKey: (keyAlias: string) => Effect.Effect<void, keys.DeleteKeyFnKeyDeletePostError | keys.ListKeysKeyListGetError | LitellmKeyUnreadableError | LitellmKeyAmbiguousAliasError | LitellmKeyAliasEmptyError, LitellmOpContext>;
|
|
63
|
+
//# sourceMappingURL=key-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-operations.d.ts","sourceRoot":"","sources":["../../src/litellm/key-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,IAAI,MAAM,yCAAyC,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,iBAAiB,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,OAAO,aACR,MAAM,KACf,MAAM,CAAC,MAAM,CACd,aAAa,GAAG,SAAS,EACvB,IAAI,CAAC,uBAAuB,GAC5B,yBAAyB,GACzB,6BAA6B,GAC7B,yBAAyB,EAC3B,gBAAgB,CAEgF,CAAC;AAmCnG;;;;GAIG;AACH,eAAO,MAAM,YAAY,aACb,MAAM,KACf,MAAM,CAAC,MAAM,CACd,MAAM,GAAG,IAAI,GAAG,SAAS,EACvB,IAAI,CAAC,uBAAuB,GAC5B,yBAAyB,GACzB,6BAA6B,GAC7B,yBAAyB,EAC3B,gBAAgB,CAQX,CAAC;AASR;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,SAAU,IAAI,CAAC,mCAAmC,ySAiBzE,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,SAAS,SAAU,IAAI,CAAC,+BAA+B,wHACG,CAAC;AAExE,qFAAqF;AACrF,eAAO,MAAM,SAAS,aACV,MAAM,KACf,MAAM,CAAC,MAAM,CACd,IAAI,EACF,IAAI,CAAC,6BAA6B,GAClC,IAAI,CAAC,uBAAuB,GAC5B,yBAAyB,GACzB,6BAA6B,GAC7B,yBAAyB,EAC3B,gBAAgB,CAiBf,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as Effect from 'effect/Effect';
|
|
2
|
+
import * as Redacted from 'effect/Redacted';
|
|
3
|
+
import { type FromEnv } from '../secrets/write-only.ts';
|
|
4
|
+
import { LitellmKeyDebugLoggingError, LitellmKeyValueMalformedError, LitellmKeyValueMismatchError, LitellmKeyValueMissingError, LitellmKeyValueRequiredError } from './key-errors.ts';
|
|
5
|
+
/**
|
|
6
|
+
* The declared value, `Redacted`, or a typed refusal naming the alias, the variable and the rule.
|
|
7
|
+
* Called only when a create is actually about to happen, never by `diff` or `read`, so a plan
|
|
8
|
+
* (which needs no secret) runs without the variable.
|
|
9
|
+
* ⚠️ AN EMPTY VARIABLE IS A MISSING ONE (`resolveAll`): a secret renderer that failed writes
|
|
10
|
+
* `NAME=` and sending `''` would create a key that authenticates with nothing.
|
|
11
|
+
*/
|
|
12
|
+
export declare const resolveKeyValue: (keyAlias: string, ref: FromEnv | undefined) => Effect.Effect<Redacted.Redacted<string>, LitellmKeyValueRequiredError | LitellmKeyValueMissingError | LitellmKeyValueMalformedError>;
|
|
13
|
+
/** Whether `/key/generate` echoed the value it was sent (the SDK hands it back `Redacted`). */
|
|
14
|
+
export declare const echoes: (returned: string | Redacted.Redacted<string>, sent: Redacted.Redacted<string>) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Whether an ADOPTED key's declared `key: { fromEnv }` value is the key the live row holds.
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ COMPARED AS A SHA256 AGAINST THE ROW'S `token`, never value-against-value, and the hash is
|
|
19
|
+
* never written anywhere: a `Redacted` value unwrapped only long enough to digest it, then gone.
|
|
20
|
+
* The row's `token` (`hash_token`) is the vendor's own sha256 hex of the key.
|
|
21
|
+
*/
|
|
22
|
+
export declare const verifyKeyValue: (keyAlias: string, ref: FromEnv | undefined, token: string | null) => Effect.Effect<void, LitellmKeyValueMismatchError>;
|
|
23
|
+
/**
|
|
24
|
+
* ⛔ THE SDK PRINTS BODIES WHILE `DISTILLED_DEBUG_HTTP` IS SET (`@distilled.cloud/core`
|
|
25
|
+
* `protocol-http.ts`: the first 400 characters of every request body; `protocol-rest.ts`: of every
|
|
26
|
+
* response), and `/key/generate` carries the key in both. Measured by reading the pinned source
|
|
27
|
+
* 2026-09-29; `mesh-node-token.ts` refuses for the same reason. Only a create needs it: no other
|
|
28
|
+
* call in this resource carries the value. Reads `process.env` because that is what distilled reads.
|
|
29
|
+
*/
|
|
30
|
+
export declare const refuseDebugLogging: (keyAlias: string) => Effect.Effect<void, LitellmKeyDebugLoggingError>;
|
|
31
|
+
/** Whether verification can run; unset/empty variables skip the check, never a create. */
|
|
32
|
+
export declare const hasKeyValue: (ref: FromEnv | undefined) => boolean;
|
|
33
|
+
//# sourceMappingURL=key-secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-secret.d.ts","sourceRoot":"","sources":["../../src/litellm/key-secret.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,0BAA0B,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,iBAAiB,CAAC;AAYzB;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM,OACX,OAAO,GAAG,SAAS,KACvB,MAAM,CAAC,MAAM,CACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EACzB,4BAA4B,GAAG,2BAA2B,GAAG,6BAA6B,CAWxF,CAAC;AAEL,+FAA+F;AAC/F,eAAO,MAAM,MAAM,aACP,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAC9B,OAC6F,CAAC;AAUjG;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,aACf,MAAM,OACX,OAAO,GAAG,SAAS,SACjB,MAAM,GAAG,IAAI,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAS/C,CAAC;AAEL;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,aACnB,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAGjC,CAAC;AAElB,0FAA0F;AAC1F,eAAO,MAAM,WAAW,QAAS,OAAO,GAAG,SAAS,KAAG,OACoB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `LiteLLM.Key` — one virtual key of LiteLLM's `LiteLLM_VerificationToken` (`/key/*`), bound to a
|
|
3
|
+
* `LiteLLM.Budget` tier, with its value kept out of Alchemy state.
|
|
4
|
+
*
|
|
5
|
+
* ★ ADOPT BY ALIAS. `keyAlias` is the identity: `/key/update` and `/key/delete` find a key by it
|
|
6
|
+
* (their docstrings), and `/key/list` filters by it, so an existing key is taken over by declaring
|
|
7
|
+
* its alias, with no value in hand. A live key with no state is `Unowned` and needs `--adopt`; the
|
|
8
|
+
* apply re-checks it (`refuseTakeover`) for a create the planner could not probe — which is EVERY
|
|
9
|
+
* key declared with `budgetId: tier.budgetId`, an Output until the tier exists.
|
|
10
|
+
* ⛔ THE VALUE IS WRITE-ONLY (key-secret.ts): `key: { fromEnv }` names the variable, the value goes
|
|
11
|
+
* over the wire once in `/key/generate`, and no attribute, log line or error carries it. `diff`
|
|
12
|
+
* checks a set variable against the live token in memory; an unset variable skips the check.
|
|
13
|
+
* `read` never touches the environment, and no value or hash is added to state.
|
|
14
|
+
* ★ `defaultRemovalPolicy: 'retain'` — deleting a key breaks whatever holds it (a seat's every call
|
|
15
|
+
* 401s). Dropping the declaration leaves the key live; `.pipe(RemovalPolicy.destroy())` opts in.
|
|
16
|
+
* ⛔ A RENAME IS REFUSED, not replaced. The new key would need the same value, and `/key/generate`
|
|
17
|
+
* rejects a second key with a value it already holds; under `retain` the old row would still be
|
|
18
|
+
* there. Declare the new alias as a new resource and destroy the old one.
|
|
19
|
+
* ★ A DECLARATION MANAGES ONLY WHAT IT NAMES (key-form.ts): an omitted prop is never compared or sent,
|
|
20
|
+
* and `metadata` is a merge (key-metadata.ts), so an adopted key's scope, budget and guardrails are
|
|
21
|
+
* never cleared by leaving them out.
|
|
22
|
+
* ⛔ NO CREDENTIAL IS A PROP; `litellmProviders`' layer supplies `Credentials`.
|
|
23
|
+
*/
|
|
24
|
+
import { Resource } from 'alchemy';
|
|
25
|
+
import type { Input } from 'alchemy/Input';
|
|
26
|
+
import * as Provider from 'alchemy/Provider';
|
|
27
|
+
import * as Effect from 'effect/Effect';
|
|
28
|
+
import { LitellmKeyAbsentAfterWriteError, LitellmKeyAliasChangedError, LitellmKeyFieldNotAppliedError, LitellmKeyValueNotHonouredError } from './key-errors.ts';
|
|
29
|
+
import { type KeyAttributes, type KeyProps } from './key-form.ts';
|
|
30
|
+
import { LitellmKeyCallbackMetadataDeclaredError, LitellmKeyCallbackMetadataLiveError } from './key-metadata-errors.ts';
|
|
31
|
+
export type { KeyAttributes, KeyProps };
|
|
32
|
+
export type { KeyError } from './key-errors.ts';
|
|
33
|
+
export interface LiteLLMKey extends Resource<'LiteLLM.Key', KeyProps, KeyAttributes> {
|
|
34
|
+
}
|
|
35
|
+
export declare const LiteLLMKey: import("alchemy").ResourceClass<LiteLLMKey>;
|
|
36
|
+
export declare const isLiteLLMKey: (value: unknown) => value is LiteLLMKey;
|
|
37
|
+
/** ⛔ TEST-ONLY EXPORT. Not on index.ts's barrel. */
|
|
38
|
+
export declare const keyHandlers: {
|
|
39
|
+
read: ({ olds, output }: {
|
|
40
|
+
olds: KeyProps;
|
|
41
|
+
output: KeyAttributes | undefined;
|
|
42
|
+
}) => Effect.Effect<KeyAttributes | undefined, import("./key-errors.ts").LitellmKeyAliasEmptyError | import("./key-errors.ts").LitellmKeyAmbiguousAliasError | import("./key-errors.ts").LitellmKeyUnreadableError | import("@distilled.cloud/litellm/key_management").ListKeysKeyListGetError, import("@distilled.cloud/litellm/Protocol").LitellmOpContext>;
|
|
43
|
+
diff: ({ news, output }: {
|
|
44
|
+
news: Input<KeyProps>;
|
|
45
|
+
output: KeyAttributes | undefined;
|
|
46
|
+
}) => Effect.Effect<{
|
|
47
|
+
readonly action: 'update';
|
|
48
|
+
} | {
|
|
49
|
+
readonly action: 'noop';
|
|
50
|
+
} | undefined, LitellmKeyAliasChangedError | import("./key-errors.ts").LitellmKeyAliasEmptyError | import("./key-errors.ts").LitellmKeyAmbiguousAliasError | LitellmKeyCallbackMetadataDeclaredError | LitellmKeyCallbackMetadataLiveError | import("./key-errors.ts").LitellmKeyUnreadableError | import("./key-errors.ts").LitellmKeyValueMismatchError | import("@distilled.cloud/litellm/key_management").ListKeysKeyListGetError, import("@distilled.cloud/litellm/Protocol").LitellmOpContext>;
|
|
51
|
+
reconcile: ({ fqn, instanceId, news, output, }: {
|
|
52
|
+
fqn: string;
|
|
53
|
+
instanceId: string;
|
|
54
|
+
news: KeyProps;
|
|
55
|
+
output: KeyAttributes | undefined;
|
|
56
|
+
}) => Effect.Effect<{
|
|
57
|
+
keyAlias: string;
|
|
58
|
+
budgetId: string | null;
|
|
59
|
+
models: readonly string[];
|
|
60
|
+
allowedRoutes: readonly string[];
|
|
61
|
+
teamId: string | null;
|
|
62
|
+
metadata: import("./key-metadata.ts").Metadata;
|
|
63
|
+
expires: string | null;
|
|
64
|
+
withheld: readonly string[];
|
|
65
|
+
duration: string | null;
|
|
66
|
+
}, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/litellm/key_management").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/litellm/key_management").Forbidden | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | LitellmKeyAbsentAfterWriteError | import("./key-errors.ts").LitellmKeyAliasEmptyError | import("./key-errors.ts").LitellmKeyAmbiguousAliasError | LitellmKeyCallbackMetadataDeclaredError | LitellmKeyCallbackMetadataLiveError | import("./key-errors.ts").LitellmKeyDebugLoggingError | LitellmKeyFieldNotAppliedError | import("./key-errors.ts").LitellmKeyTransportError | import("./key-errors.ts").LitellmKeyUnreadableError | import("./key-errors.ts").LitellmKeyValueMalformedError | import("./key-errors.ts").LitellmKeyValueMismatchError | import("./key-errors.ts").LitellmKeyValueMissingError | LitellmKeyValueNotHonouredError | import("./key-errors.ts").LitellmKeyValueRequiredError | import("@distilled.cloud/litellm/Errors").LitellmParseError | import("@distilled.cloud/litellm/key_management").NotFound | import("@distilled.cloud/caddy").ServiceUnavailable | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/litellm/Errors").UnknownLitellmError | import("@distilled.cloud/litellm/key_management").UnprocessableEntity, import("@distilled.cloud/litellm/Protocol").LitellmOpContext>;
|
|
67
|
+
delete: ({ output }: {
|
|
68
|
+
output: KeyAttributes;
|
|
69
|
+
}) => Effect.Effect<void, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/litellm/key_management").BadRequest | import("@distilled.cloud/caddy").ConfigError | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/litellm/key_management").KeyDeleteForbidden | import("@distilled.cloud/litellm/key_management").KeyNotFound | import("./key-errors.ts").LitellmKeyAliasEmptyError | import("./key-errors.ts").LitellmKeyAmbiguousAliasError | import("./key-errors.ts").LitellmKeyUnreadableError | import("@distilled.cloud/litellm/Errors").LitellmParseError | import("@distilled.cloud/caddy").ServiceUnavailable | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/litellm/Errors").UnknownLitellmError | import("@distilled.cloud/litellm/key_management").UnprocessableEntity, import("@distilled.cloud/litellm/Protocol").LitellmOpContext>;
|
|
70
|
+
/**
|
|
71
|
+
* ⚠️ ENUMERATES NOTHING, ON PURPOSE. `nuke` walks `list` and deletes what it finds; a proxy's key
|
|
72
|
+
* table holds every live credential the estate's services authenticate with, plus dashboard
|
|
73
|
+
* session keys nobody declared — none of which this stack made.
|
|
74
|
+
*/
|
|
75
|
+
list: () => Effect.Effect<never[], never, never>;
|
|
76
|
+
};
|
|
77
|
+
export declare const LiteLLMKeyProvider: () => import("effect/Layer").Layer<Provider.Provider<LiteLLMKey>, never, import("@distilled.cloud/litellm/Protocol").LitellmOpContext>;
|
|
78
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/litellm/key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,+BAA+B,EAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,QAAQ,EAId,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,uCAAuC,EACvC,mCAAmC,EACpC,MAAM,0BAA0B,CAAC;AAUlC,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,UAAW,SAAQ,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC;CAAG;AAEvF,eAAO,MAAM,UAAU,6CAA0E,CAAC;AAElG,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,KAAK,IAAI,UACe,CAAC;AA4DvE,oDAAoD;AACpD,eAAO,MAAM,WAAW;IACtB,IAAI,qBAAqB;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;KAAE;IAO9E,IAAI,qBAAqB;QAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;KAAE;yBAarC,QAAQ;;yBAIrC,MAAM;;IAIzB,SAAS,uCAKN;QACD,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;KACnC;;;;;;;;;;;IAmCD,MAAM,eAAe;QAAE,MAAM,EAAE,aAAa,CAAA;KAAE;IAE9C;;;;OAIG;IACH,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,kBAAkB,wIACmD,CAAC"}
|