diff --git a/packages/ai/src/env-api-keys.ts b/packages/ai/src/env-api-keys.ts index 8683974e..2302b076 100644 --- a/packages/ai/src/env-api-keys.ts +++ b/packages/ai/src/env-api-keys.ts @@ -107,30 +107,6 @@ export function findEnvKeys(provider: string): string[] | undefined { return found.length > 0 ? found : undefined; } -/** - * Check if a provider has environment-backed authentication available. - * - * This includes non-API-key credential sources such as AWS credentials for Bedrock. - */ -export function hasEnvAuth(provider: KnownProvider): boolean; -export function hasEnvAuth(provider: string): boolean; -export function hasEnvAuth(provider: string): boolean { - if (findEnvKeys(provider)) return true; - - if (provider === "amazon-bedrock") { - return !!( - process.env.AWS_PROFILE || - (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) || - process.env.AWS_BEARER_TOKEN_BEDROCK || - process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI || - process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI || - process.env.AWS_WEB_IDENTITY_TOKEN_FILE - ); - } - - return false; -} - /** * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY. * @@ -154,5 +130,25 @@ export function getEnvApiKey(provider: string): string | undefined { } } + if (provider === "amazon-bedrock") { + // Amazon Bedrock supports multiple credential sources: + // 1. AWS_PROFILE - named profile from ~/.aws/credentials + // 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys + // 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token + // 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles + // 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI) + // 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts) + if ( + process.env.AWS_PROFILE || + (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) || + process.env.AWS_BEARER_TOKEN_BEDROCK || + process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI || + process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI || + process.env.AWS_WEB_IDENTITY_TOKEN_FILE + ) { + return ""; + } + } + return undefined; } diff --git a/packages/coding-agent/src/core/auth-storage.ts b/packages/coding-agent/src/core/auth-storage.ts index 1efacb09..fc2adb8b 100644 --- a/packages/coding-agent/src/core/auth-storage.ts +++ b/packages/coding-agent/src/core/auth-storage.ts @@ -9,7 +9,6 @@ import { findEnvKeys, getEnvApiKey, - hasEnvAuth, type OAuthCredentials, type OAuthLoginCallbacks, type OAuthProviderId, @@ -332,7 +331,7 @@ export class AuthStorage { hasAuth(provider: string): boolean { if (this.runtimeOverrides.has(provider)) return true; if (this.data[provider]) return true; - if (hasEnvAuth(provider)) return true; + if (getEnvApiKey(provider)) return true; if (this.fallbackResolver?.(provider)) return true; return false; }