@everworker/oneringai 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/connectors/oauth/utils/encryption.ts","../../../src/connectors/oauth/infrastructure/storage/MemoryStorage.ts","../../../src/connectors/oauth/domain/TokenStore.ts","../../../src/connectors/oauth/utils/pkce.ts","../../../src/connectors/oauth/flows/AuthCodePKCE.ts","../../../src/connectors/oauth/flows/ClientCredentials.ts","../../../src/connectors/oauth/flows/JWTBearer.ts","../../../src/connectors/oauth/flows/StaticToken.ts","../../../src/connectors/oauth/OAuthManager.ts","../../../src/infrastructure/resilience/CircuitBreaker.ts","../../../src/infrastructure/resilience/BackoffStrategy.ts","../../../src/infrastructure/observability/Logger.ts","../../../src/infrastructure/observability/Metrics.ts","../../../src/core/Connector.ts","../../../src/core/Vendor.ts","../../../src/domain/errors/AIErrors.ts","../../../src/infrastructure/providers/base/BaseProvider.ts","../../../src/infrastructure/providers/base/BaseMediaProvider.ts","../../../src/infrastructure/providers/openai/OpenAIImageProvider.ts","../../../src/infrastructure/providers/google/GoogleImageProvider.ts","../../../src/infrastructure/providers/grok/GrokImageProvider.ts","../../../src/core/createImageProvider.ts","../../../src/domain/entities/RegistryUtils.ts","../../../src/domain/entities/ImageModel.ts","../../../src/capabilities/images/ImageGeneration.ts"],"names":["crypto","crypto2","fs","importPKCS8","SignJWT","EventEmitter","path","fs2","OpenAI","fs3","GoogleGenAI","fs4"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Encryption utilities for OAuth tokens\n * Uses AES-256-GCM for secure token storage\n */\n\nimport * as crypto from 'crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 64;\nconst TAG_LENGTH = 16;\nconst KEY_LENGTH = 32;\n\n/**\n * Encrypt data using AES-256-GCM with PBKDF2 key derivation\n *\n * @param text - Plaintext to encrypt\n * @param password - Encryption key/password\n * @returns Base64-encoded encrypted data\n */\nexport function encrypt(text: string, password: string): string {\n // Generate random salt\n const salt = crypto.randomBytes(SALT_LENGTH);\n\n // Derive key from password using PBKDF2\n const key = crypto.pbkdf2Sync(password, salt, 100000, KEY_LENGTH, 'sha512');\n\n // Generate random IV\n const iv = crypto.randomBytes(IV_LENGTH);\n\n // Create cipher\n const cipher = crypto.createCipheriv(ALGORITHM, key, iv);\n\n // Encrypt\n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Get authentication tag\n const tag = cipher.getAuthTag();\n\n // Combine: salt + iv + tag + encrypted\n const result = Buffer.concat([salt, iv, tag, Buffer.from(encrypted, 'hex')]);\n\n // Return as base64\n return result.toString('base64');\n}\n\n/**\n * Decrypt data using AES-256-GCM\n *\n * @param encryptedData - Base64-encoded encrypted data\n * @param password - Encryption key/password\n * @returns Decrypted plaintext\n */\nexport function decrypt(encryptedData: string, password: string): string {\n const buffer = Buffer.from(encryptedData, 'base64');\n\n // Extract components\n const salt = buffer.subarray(0, SALT_LENGTH);\n const iv = buffer.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);\n const tag = buffer.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + TAG_LENGTH);\n const encrypted = buffer.subarray(SALT_LENGTH + IV_LENGTH + TAG_LENGTH);\n\n // Derive key from password\n const key = crypto.pbkdf2Sync(password, salt, 100000, KEY_LENGTH, 'sha512');\n\n // Create decipher\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(tag);\n\n // Decrypt\n let decrypted = decipher.update(encrypted);\n decrypted = Buffer.concat([decrypted, decipher.final()]);\n\n return decrypted.toString('utf8');\n}\n\n/**\n * Get encryption key from environment or generate temporary one\n *\n * For production, always set OAUTH_ENCRYPTION_KEY environment variable!\n */\nexport function getEncryptionKey(): string {\n // Use environment variable if available (RECOMMENDED)\n if (process.env.OAUTH_ENCRYPTION_KEY) {\n return process.env.OAUTH_ENCRYPTION_KEY;\n }\n\n // For in-memory storage: use process-specific key (not persistent across restarts)\n // This is acceptable for MemoryStorage but NOT for FileStorage or DatabaseStorage!\n if (!(global as any).__oauthEncryptionKey) {\n (global as any).__oauthEncryptionKey = crypto.randomBytes(32).toString('hex');\n\n console.warn(\n 'WARNING: Using auto-generated encryption key. Tokens will not persist across restarts. ' +\n 'Set OAUTH_ENCRYPTION_KEY environment variable for production!'\n );\n }\n\n return (global as any).__oauthEncryptionKey;\n}\n\n/**\n * Generate a secure random encryption key\n * Use this to generate OAUTH_ENCRYPTION_KEY for your .env file\n */\nexport function generateEncryptionKey(): string {\n return crypto.randomBytes(32).toString('hex');\n}\n","/**\n * In-memory token storage (default)\n * Tokens are encrypted in memory using AES-256-GCM\n */\n\nimport { ITokenStorage, StoredToken } from '../../domain/ITokenStorage.js';\nimport { encrypt, decrypt, getEncryptionKey } from '../../utils/encryption.js';\n\nexport class MemoryStorage implements ITokenStorage {\n private tokens: Map<string, string> = new Map(); // Stores encrypted tokens\n\n async storeToken(key: string, token: StoredToken): Promise<void> {\n const encryptionKey = getEncryptionKey();\n const plaintext = JSON.stringify(token);\n const encrypted = encrypt(plaintext, encryptionKey);\n\n this.tokens.set(key, encrypted);\n }\n\n async getToken(key: string): Promise<StoredToken | null> {\n const encrypted = this.tokens.get(key);\n if (!encrypted) {\n return null;\n }\n\n try {\n const encryptionKey = getEncryptionKey();\n const decrypted = decrypt(encrypted, encryptionKey);\n return JSON.parse(decrypted) as StoredToken;\n } catch (error) {\n console.error('Failed to decrypt token from memory:', error);\n // Remove corrupted token\n this.tokens.delete(key);\n return null;\n }\n }\n\n async deleteToken(key: string): Promise<void> {\n this.tokens.delete(key);\n }\n\n async hasToken(key: string): Promise<boolean> {\n return this.tokens.has(key);\n }\n\n /**\n * Clear all tokens (useful for testing)\n */\n clearAll(): void {\n this.tokens.clear();\n }\n\n /**\n * Get number of stored tokens\n */\n size(): number {\n return this.tokens.size;\n }\n}\n","/**\n * Token Store (Domain Layer)\n * Manages token lifecycle using pluggable storage backend\n */\n\nimport { ITokenStorage, StoredToken } from './ITokenStorage.js';\nimport { MemoryStorage } from '../infrastructure/storage/MemoryStorage.js';\n\nexport class TokenStore {\n private storage: ITokenStorage;\n private baseStorageKey: string;\n\n constructor(storageKey: string = 'default', storage?: ITokenStorage) {\n this.baseStorageKey = storageKey;\n // Default to in-memory storage (encrypted)\n this.storage = storage || new MemoryStorage();\n }\n\n /**\n * Get user-scoped storage key\n * For multi-user support, keys are scoped per user: \"provider:userId\"\n * For single-user (backward compatible), userId is omitted or \"default\"\n *\n * @param userId - User identifier (optional, defaults to single-user mode)\n * @returns Storage key scoped to user\n */\n private getScopedKey(userId?: string): string {\n if (!userId || userId === 'default') {\n // Single-user mode (backward compatible)\n return this.baseStorageKey;\n }\n // Multi-user mode: scope by userId\n return `${this.baseStorageKey}:${userId}`;\n }\n\n /**\n * Store token (encrypted by storage layer)\n * @param tokenResponse - Token response from OAuth provider\n * @param userId - Optional user identifier for multi-user support\n */\n async storeToken(tokenResponse: any, userId?: string): Promise<void> {\n // Validate required fields\n if (!tokenResponse.access_token) {\n throw new Error('OAuth response missing required access_token field');\n }\n\n if (typeof tokenResponse.access_token !== 'string') {\n throw new Error('access_token must be a string');\n }\n\n if (tokenResponse.expires_in !== undefined && tokenResponse.expires_in < 0) {\n throw new Error('expires_in must be positive');\n }\n\n const token: StoredToken = {\n access_token: tokenResponse.access_token,\n refresh_token: tokenResponse.refresh_token,\n expires_in: tokenResponse.expires_in || 3600,\n token_type: tokenResponse.token_type || 'Bearer',\n scope: tokenResponse.scope,\n obtained_at: Date.now(),\n };\n\n const key = this.getScopedKey(userId);\n await this.storage.storeToken(key, token);\n }\n\n /**\n * Get access token\n * @param userId - Optional user identifier for multi-user support\n */\n async getAccessToken(userId?: string): Promise<string> {\n const key = this.getScopedKey(userId);\n const token = await this.storage.getToken(key);\n if (!token) {\n throw new Error(`No token stored for ${userId ? `user: ${userId}` : 'default user'}`);\n }\n return token.access_token;\n }\n\n /**\n * Get refresh token\n * @param userId - Optional user identifier for multi-user support\n */\n async getRefreshToken(userId?: string): Promise<string> {\n const key = this.getScopedKey(userId);\n const token = await this.storage.getToken(key);\n if (!token?.refresh_token) {\n throw new Error(`No refresh token available for ${userId ? `user: ${userId}` : 'default user'}`);\n }\n return token.refresh_token;\n }\n\n /**\n * Check if has refresh token\n * @param userId - Optional user identifier for multi-user support\n */\n async hasRefreshToken(userId?: string): Promise<boolean> {\n const key = this.getScopedKey(userId);\n const token = await this.storage.getToken(key);\n return !!token?.refresh_token;\n }\n\n /**\n * Check if token is valid (not expired)\n *\n * @param bufferSeconds - Refresh this many seconds before expiry (default: 300 = 5 min)\n * @param userId - Optional user identifier for multi-user support\n */\n async isValid(bufferSeconds: number = 300, userId?: string): Promise<boolean> {\n const key = this.getScopedKey(userId);\n const token = await this.storage.getToken(key);\n if (!token) {\n return false;\n }\n\n const expiresAt = token.obtained_at + token.expires_in * 1000;\n const bufferMs = bufferSeconds * 1000;\n\n return Date.now() < expiresAt - bufferMs;\n }\n\n /**\n * Clear stored token\n * @param userId - Optional user identifier for multi-user support\n */\n async clear(userId?: string): Promise<void> {\n const key = this.getScopedKey(userId);\n await this.storage.deleteToken(key);\n }\n\n /**\n * Get full token info\n * @param userId - Optional user identifier for multi-user support\n */\n async getTokenInfo(userId?: string): Promise<StoredToken | null> {\n const key = this.getScopedKey(userId);\n return this.storage.getToken(key);\n }\n}\n","/**\n * PKCE (Proof Key for Code Exchange) utilities\n * RFC 7636 - https://tools.ietf.org/html/rfc7636\n */\n\nimport * as crypto from 'crypto';\n\nexport interface PKCEPair {\n codeVerifier: string;\n codeChallenge: string;\n}\n\n/**\n * Generate PKCE code verifier and challenge pair\n *\n * code_challenge = BASE64URL(SHA256(code_verifier))\n */\nexport function generatePKCE(): PKCEPair {\n // Generate random code verifier (43-128 characters as per RFC)\n const codeVerifier = base64URLEncode(crypto.randomBytes(32));\n\n // Create code challenge = BASE64URL(SHA256(code_verifier))\n const hash = crypto.createHash('sha256').update(codeVerifier).digest();\n const codeChallenge = base64URLEncode(hash);\n\n return {\n codeVerifier,\n codeChallenge,\n };\n}\n\n/**\n * Base64 URL encode (RFC 4648 Section 5)\n * Used for PKCE code_verifier and code_challenge\n */\nfunction base64URLEncode(buffer: Buffer): string {\n return buffer\n .toString('base64')\n .replace(/\\+/g, '-') // Replace + with -\n .replace(/\\//g, '_') // Replace / with _\n .replace(/=/g, ''); // Remove padding\n}\n\n/**\n * Generate random state for CSRF protection\n */\nexport function generateState(): string {\n return crypto.randomBytes(16).toString('hex');\n}\n","/**\n * OAuth 2.0 Authorization Code Flow with PKCE (RFC 7636)\n * User authentication for web and mobile apps\n */\n\nimport { TokenStore } from '../domain/TokenStore.js';\nimport { generatePKCE, generateState } from '../utils/pkce.js';\nimport type { OAuthConfig } from '../types.js';\n\nexport class AuthCodePKCEFlow {\n private tokenStore: TokenStore;\n // Store PKCE data per user with timestamps for cleanup\n private codeVerifiers: Map<string, { verifier: string; timestamp: number }> = new Map();\n private states: Map<string, { state: string; timestamp: number }> = new Map();\n // Store refresh locks per user to prevent concurrent refresh\n private refreshLocks: Map<string, Promise<string>> = new Map();\n // PKCE data TTL: 15 minutes (auth flows should complete within this time)\n private readonly PKCE_TTL = 15 * 60 * 1000;\n\n constructor(private config: OAuthConfig) {\n const storageKey = config.storageKey || `auth_code:${config.clientId}`;\n this.tokenStore = new TokenStore(storageKey, config.storage);\n }\n\n /**\n * Generate authorization URL for user to visit\n * Opens browser or redirects user to this URL\n *\n * @param userId - User identifier for multi-user support (optional)\n */\n async getAuthorizationUrl(userId?: string): Promise<string> {\n if (!this.config.authorizationUrl) {\n throw new Error('authorizationUrl is required for authorization_code flow');\n }\n\n if (!this.config.redirectUri) {\n throw new Error('redirectUri is required for authorization_code flow');\n }\n\n // Clean up expired PKCE data before creating new flow\n this.cleanupExpiredPKCE();\n\n const userKey = userId || 'default';\n\n // Generate PKCE pair\n const { codeVerifier, codeChallenge } = generatePKCE();\n this.codeVerifiers.set(userKey, { verifier: codeVerifier, timestamp: Date.now() });\n\n // Generate state for CSRF protection\n const state = generateState();\n this.states.set(userKey, { state, timestamp: Date.now() });\n\n // Build authorization URL\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n state,\n });\n\n // Add scope if provided\n if (this.config.scope) {\n params.append('scope', this.config.scope);\n }\n\n // Add PKCE parameters (if enabled, default true)\n if (this.config.usePKCE !== false) {\n params.append('code_challenge', codeChallenge);\n params.append('code_challenge_method', 'S256');\n }\n\n // Add user_id as state metadata (encode in state for retrieval in callback)\n // The state will be: `{random_state}::{userId}`\n const stateWithUser = userId ? `${state}::${userId}` : state;\n params.set('state', stateWithUser);\n\n return `${this.config.authorizationUrl}?${params.toString()}`;\n }\n\n /**\n * Exchange authorization code for access token\n *\n * @param code - Authorization code from callback\n * @param state - State parameter from callback (for CSRF verification, may include userId)\n * @param userId - User identifier (optional, can be extracted from state)\n */\n async exchangeCode(code: string, state: string, userId?: string): Promise<void> {\n // Extract userId from state if embedded\n let actualState = state;\n let actualUserId = userId;\n\n if (state.includes('::')) {\n const parts = state.split('::');\n actualState = parts[0]!;\n actualUserId = parts[1];\n }\n\n const userKey = actualUserId || 'default';\n\n // Verify state to prevent CSRF attacks\n const stateData = this.states.get(userKey);\n if (!stateData) {\n throw new Error(`No PKCE state found for user ${actualUserId}. Authorization flow may have expired (15 min TTL).`);\n }\n\n const expectedState = stateData.state;\n if (actualState !== expectedState) {\n throw new Error(`State mismatch for user ${actualUserId} - possible CSRF attack. Expected: ${expectedState}, Got: ${actualState}`);\n }\n\n if (!this.config.redirectUri) {\n throw new Error('redirectUri is required');\n }\n\n // Build token request\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: this.config.redirectUri,\n client_id: this.config.clientId,\n });\n\n // Add client secret if provided (confidential clients)\n if (this.config.clientSecret) {\n params.append('client_secret', this.config.clientSecret);\n }\n\n // Add code_verifier if PKCE was used\n const verifierData = this.codeVerifiers.get(userKey);\n if (this.config.usePKCE !== false && verifierData) {\n params.append('code_verifier', verifierData.verifier);\n }\n\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${response.status} ${response.statusText} - ${error}`);\n }\n\n const data: any = await response.json();\n\n // Store token (encrypted) with user scoping\n await this.tokenStore.storeToken(data, actualUserId);\n\n // Clear PKCE data (one-time use)\n this.codeVerifiers.delete(userKey);\n this.states.delete(userKey);\n }\n\n /**\n * Get valid token (auto-refreshes if needed)\n * @param userId - User identifier for multi-user support\n */\n async getToken(userId?: string): Promise<string> {\n const key = userId || 'default';\n\n // If already refreshing for this user, wait for the existing refresh\n if (this.refreshLocks.has(key)) {\n return this.refreshLocks.get(key)!;\n }\n\n // Return cached token if valid\n if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry, userId)) {\n return this.tokenStore.getAccessToken(userId);\n }\n\n // Try to refresh if we have a refresh token\n if (await this.tokenStore.hasRefreshToken(userId)) {\n // Start refresh and lock it\n const refreshPromise = this.refreshToken(userId);\n this.refreshLocks.set(key, refreshPromise);\n\n try {\n return await refreshPromise;\n } finally {\n // Always clean up lock, even on error\n this.refreshLocks.delete(key);\n }\n }\n\n // No valid token and can't refresh\n throw new Error(`No valid token available for ${userId ? `user: ${userId}` : 'default user'}. User needs to authorize (call startAuthFlow).`);\n }\n\n /**\n * Refresh access token using refresh token\n * @param userId - User identifier for multi-user support\n */\n async refreshToken(userId?: string): Promise<string> {\n const refreshToken = await this.tokenStore.getRefreshToken(userId);\n\n const params = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.config.clientId,\n });\n\n // Add client secret if provided\n if (this.config.clientSecret) {\n params.append('client_secret', this.config.clientSecret);\n }\n\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText} - ${error}`);\n }\n\n const data: any = await response.json();\n\n // Store new token with user scoping\n await this.tokenStore.storeToken(data, userId);\n\n return data.access_token;\n }\n\n /**\n * Check if token is valid\n * @param userId - User identifier for multi-user support\n */\n async isTokenValid(userId?: string): Promise<boolean> {\n return this.tokenStore.isValid(this.config.refreshBeforeExpiry, userId);\n }\n\n /**\n * Revoke token (if supported by provider)\n * @param revocationUrl - Optional revocation endpoint\n * @param userId - User identifier for multi-user support\n */\n async revokeToken(revocationUrl?: string, userId?: string): Promise<void> {\n if (!revocationUrl) {\n // Just clear from storage\n await this.tokenStore.clear(userId);\n return;\n }\n\n try {\n const token = await this.tokenStore.getAccessToken(userId);\n\n await fetch(revocationUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n token,\n client_id: this.config.clientId,\n }),\n });\n } finally {\n // Always clear from storage\n await this.tokenStore.clear(userId);\n }\n }\n\n /**\n * Clean up expired PKCE data to prevent memory leaks\n * Removes verifiers and states older than PKCE_TTL (15 minutes)\n */\n private cleanupExpiredPKCE(): void {\n const now = Date.now();\n\n // Clean up expired code verifiers\n for (const [key, data] of this.codeVerifiers) {\n if (now - data.timestamp > this.PKCE_TTL) {\n this.codeVerifiers.delete(key);\n this.states.delete(key);\n }\n }\n }\n}\n","/**\n * OAuth 2.0 Client Credentials Flow\n * Machine-to-machine authentication\n */\n\nimport { TokenStore } from '../domain/TokenStore.js';\nimport type { OAuthConfig } from '../types.js';\n\nexport class ClientCredentialsFlow {\n private tokenStore: TokenStore;\n\n constructor(private config: OAuthConfig) {\n const storageKey = config.storageKey || `client_credentials:${config.clientId}`;\n this.tokenStore = new TokenStore(storageKey, config.storage);\n }\n\n /**\n * Get token using client credentials\n */\n async getToken(): Promise<string> {\n // Return cached token if valid\n if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry)) {\n return this.tokenStore.getAccessToken();\n }\n\n // Request new token\n return this.requestToken();\n }\n\n /**\n * Request a new token from the authorization server\n */\n private async requestToken(): Promise<string> {\n // Create Basic Auth header\n const auth = Buffer.from(`${this.config.clientId}:${this.config.clientSecret}`).toString(\n 'base64'\n );\n\n const params = new URLSearchParams({\n grant_type: 'client_credentials',\n });\n\n // Add scope if provided\n if (this.config.scope) {\n params.append('scope', this.config.scope);\n }\n\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n Authorization: `Basic ${auth}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token request failed: ${response.status} ${response.statusText} - ${error}`);\n }\n\n const data: any = await response.json();\n\n // Store token (encrypted)\n await this.tokenStore.storeToken(data);\n\n return data.access_token;\n }\n\n /**\n * Refresh token (client credentials don't use refresh tokens)\n * Just requests a new token\n */\n async refreshToken(): Promise<string> {\n await this.tokenStore.clear();\n return this.requestToken();\n }\n\n /**\n * Check if token is valid\n */\n async isTokenValid(): Promise<boolean> {\n return this.tokenStore.isValid(this.config.refreshBeforeExpiry);\n }\n}\n","/**\n * OAuth 2.0 JWT Bearer Flow (RFC 7523)\n * Service account authentication using private key signing\n */\n\nimport { SignJWT, importPKCS8 } from 'jose';\nimport * as fs from 'fs';\nimport { TokenStore } from '../domain/TokenStore.js';\nimport type { OAuthConfig } from '../types.js';\n\nexport class JWTBearerFlow {\n private tokenStore: TokenStore;\n private privateKey: string;\n\n constructor(private config: OAuthConfig) {\n const storageKey = config.storageKey || `jwt_bearer:${config.clientId}`;\n this.tokenStore = new TokenStore(storageKey, config.storage);\n\n // Load private key\n if (config.privateKey) {\n this.privateKey = config.privateKey;\n } else if (config.privateKeyPath) {\n try {\n this.privateKey = fs.readFileSync(config.privateKeyPath, 'utf8');\n } catch (error) {\n throw new Error(`Failed to read private key from ${config.privateKeyPath}: ${(error as Error).message}`);\n }\n } else {\n throw new Error('JWT Bearer flow requires privateKey or privateKeyPath');\n }\n }\n\n /**\n * Generate signed JWT assertion\n */\n private async generateJWT(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const alg = this.config.tokenSigningAlg || 'RS256';\n\n // Parse private key\n const key = await importPKCS8(this.privateKey, alg);\n\n // Create JWT\n const jwt = await new SignJWT({\n scope: this.config.scope || '',\n })\n .setProtectedHeader({ alg })\n .setIssuer(this.config.clientId)\n .setSubject(this.config.clientId)\n .setAudience(this.config.audience || this.config.tokenUrl)\n .setIssuedAt(now)\n .setExpirationTime(now + 3600) // 1 hour\n .sign(key);\n\n return jwt;\n }\n\n /**\n * Get token using JWT Bearer assertion\n */\n async getToken(): Promise<string> {\n // Return cached token if valid\n if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry)) {\n return this.tokenStore.getAccessToken();\n }\n\n // Request new token\n return this.requestToken();\n }\n\n /**\n * Request token using JWT assertion\n */\n private async requestToken(): Promise<string> {\n // Generate JWT assertion\n const assertion = await this.generateJWT();\n\n // Exchange JWT for access token\n const params = new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion,\n });\n\n const response = await fetch(this.config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`JWT Bearer token request failed: ${response.status} ${response.statusText} - ${error}`);\n }\n\n const data: any = await response.json();\n\n // Store token (encrypted)\n await this.tokenStore.storeToken(data);\n\n return data.access_token;\n }\n\n /**\n * Refresh token (generate new JWT and request new token)\n */\n async refreshToken(): Promise<string> {\n await this.tokenStore.clear();\n return this.requestToken();\n }\n\n /**\n * Check if token is valid\n */\n async isTokenValid(): Promise<boolean> {\n return this.tokenStore.isValid(this.config.refreshBeforeExpiry);\n }\n}\n","/**\n * Static Token Flow - For APIs that use static API keys\n * Examples: OpenAI, Anthropic, many SaaS APIs\n */\n\nimport type { OAuthConfig } from '../types.js';\n\nexport class StaticTokenFlow {\n private token: string;\n\n constructor(config: OAuthConfig) {\n if (!config.staticToken) {\n throw new Error('Static token flow requires staticToken in config');\n }\n\n this.token = config.staticToken;\n }\n\n /**\n * Get token (always returns the static token)\n */\n async getToken(): Promise<string> {\n return this.token;\n }\n\n /**\n * Refresh token (no-op for static tokens)\n */\n async refreshToken(): Promise<string> {\n return this.token;\n }\n\n /**\n * Token is always valid for static tokens\n */\n async isTokenValid(): Promise<boolean> {\n return true;\n }\n\n /**\n * Update the static token\n */\n updateToken(newToken: string): void {\n this.token = newToken;\n }\n}\n","/**\n * OAuth Manager - Main entry point for OAuth 2.0 authentication\n * Supports multiple flows: Authorization Code (with PKCE), Client Credentials, JWT Bearer, Static Token\n */\n\nimport { AuthCodePKCEFlow } from './flows/AuthCodePKCE.js';\nimport { ClientCredentialsFlow } from './flows/ClientCredentials.js';\nimport { JWTBearerFlow } from './flows/JWTBearer.js';\nimport { StaticTokenFlow } from './flows/StaticToken.js';\nimport type { OAuthConfig } from './types.js';\n\nexport class OAuthManager {\n private flow: AuthCodePKCEFlow | ClientCredentialsFlow | JWTBearerFlow | StaticTokenFlow;\n\n constructor(config: OAuthConfig) {\n // Validate configuration\n this.validateConfig(config);\n\n // Create appropriate flow implementation\n switch (config.flow) {\n case 'authorization_code':\n this.flow = new AuthCodePKCEFlow(config);\n break;\n\n case 'client_credentials':\n this.flow = new ClientCredentialsFlow(config);\n break;\n\n case 'jwt_bearer':\n this.flow = new JWTBearerFlow(config);\n break;\n\n case 'static_token':\n this.flow = new StaticTokenFlow(config);\n break;\n\n default:\n throw new Error(`Unknown OAuth flow: ${(config as any).flow}`);\n }\n }\n\n /**\n * Get valid access token\n * Automatically refreshes if expired\n *\n * @param userId - User identifier for multi-user support (optional)\n */\n async getToken(userId?: string): Promise<string> {\n return this.flow.getToken(userId);\n }\n\n /**\n * Force refresh the token\n *\n * @param userId - User identifier for multi-user support (optional)\n */\n async refreshToken(userId?: string): Promise<string> {\n return this.flow.refreshToken(userId);\n }\n\n /**\n * Check if current token is valid\n *\n * @param userId - User identifier for multi-user support (optional)\n */\n async isTokenValid(userId?: string): Promise<boolean> {\n return this.flow.isTokenValid(userId);\n }\n\n // ==================== Authorization Code Flow Methods ====================\n\n /**\n * Start authorization flow (Authorization Code only)\n * Returns URL for user to visit\n *\n * @param userId - User identifier for multi-user support (optional)\n * @returns Authorization URL for the user to visit\n */\n async startAuthFlow(userId?: string): Promise<string> {\n if (!(this.flow instanceof AuthCodePKCEFlow)) {\n throw new Error('startAuthFlow() is only available for authorization_code flow');\n }\n\n return this.flow.getAuthorizationUrl(userId);\n }\n\n /**\n * Handle OAuth callback (Authorization Code only)\n * Call this with the callback URL after user authorizes\n *\n * @param callbackUrl - Full callback URL with code and state parameters\n * @param userId - Optional user identifier (can be extracted from state if embedded)\n */\n async handleCallback(callbackUrl: string, userId?: string): Promise<void> {\n if (!(this.flow instanceof AuthCodePKCEFlow)) {\n throw new Error('handleCallback() is only available for authorization_code flow');\n }\n\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n\n if (!code) {\n throw new Error('Missing authorization code in callback URL');\n }\n\n if (!state) {\n throw new Error('Missing state parameter in callback URL');\n }\n\n await this.flow.exchangeCode(code, state, userId);\n }\n\n /**\n * Revoke token (if supported by provider)\n *\n * @param revocationUrl - Optional revocation endpoint URL\n * @param userId - User identifier for multi-user support (optional)\n */\n async revokeToken(revocationUrl?: string, userId?: string): Promise<void> {\n if (this.flow instanceof AuthCodePKCEFlow) {\n await this.flow.revokeToken(revocationUrl, userId);\n } else {\n throw new Error('Token revocation not implemented for this flow');\n }\n }\n\n // ==================== Validation ====================\n\n private validateConfig(config: OAuthConfig): void {\n // Required fields\n if (!config.flow) {\n throw new Error('OAuth flow is required (authorization_code, client_credentials, jwt_bearer, or static_token)');\n }\n\n // tokenUrl and clientId not required for static_token\n if (config.flow !== 'static_token') {\n if (!config.tokenUrl) {\n throw new Error('tokenUrl is required');\n }\n\n if (!config.clientId) {\n throw new Error('clientId is required');\n }\n }\n\n // Flow-specific validation\n switch (config.flow) {\n case 'authorization_code':\n if (!config.authorizationUrl) {\n throw new Error('authorizationUrl is required for authorization_code flow');\n }\n if (!config.redirectUri) {\n throw new Error('redirectUri is required for authorization_code flow');\n }\n break;\n\n case 'client_credentials':\n if (!config.clientSecret) {\n throw new Error('clientSecret is required for client_credentials flow');\n }\n break;\n\n case 'jwt_bearer':\n if (!config.privateKey && !config.privateKeyPath) {\n throw new Error(\n 'privateKey or privateKeyPath is required for jwt_bearer flow'\n );\n }\n break;\n\n case 'static_token':\n if (!config.staticToken) {\n throw new Error('staticToken is required for static_token flow');\n }\n break;\n }\n\n // Warn if using FileStorage without encryption key\n if (config.storage && !process.env.OAUTH_ENCRYPTION_KEY) {\n console.warn(\n 'WARNING: Using persistent storage without OAUTH_ENCRYPTION_KEY environment variable. ' +\n 'Tokens will be encrypted with auto-generated key that changes on restart!'\n );\n }\n }\n}\n","/**\n * Generic Circuit Breaker implementation\n *\n * Prevents cascading failures by failing fast when a system is down.\n * Works for any async operation (LLM calls, tool execution, etc.)\n */\n\nimport { EventEmitter } from 'eventemitter3';\n\n/**\n * Circuit breaker states\n */\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\n/**\n * Failure record for window tracking\n */\ninterface FailureRecord {\n timestamp: number;\n error: string;\n}\n\n/**\n * Circuit breaker configuration\n */\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n\n /** Number of successes to close from half-open */\n successThreshold: number;\n\n /** Time to wait in open state before trying half-open (ms) */\n resetTimeoutMs: number;\n\n /** Time window for counting failures (ms) */\n windowMs: number;\n\n /** Classify errors - return true if error should count as failure */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Circuit breaker metrics\n */\nexport interface CircuitBreakerMetrics {\n name: string;\n state: CircuitState;\n\n // Counters\n totalRequests: number;\n successCount: number;\n failureCount: number;\n rejectedCount: number; // Rejected by open circuit\n\n // Current window\n recentFailures: number;\n consecutiveSuccesses: number;\n\n // Timestamps\n lastFailureTime?: number;\n lastSuccessTime?: number;\n lastStateChange: number;\n nextRetryTime?: number;\n\n // Rates\n failureRate: number;\n successRate: number;\n}\n\n/**\n * Circuit breaker events\n */\nexport interface CircuitBreakerEvents {\n opened: { name: string; failureCount: number; lastError: string; nextRetryTime: number };\n 'half-open': { name: string; timestamp: number };\n closed: { name: string; successCount: number; timestamp: number };\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n successThreshold: 2,\n resetTimeoutMs: 30000, // 30 seconds\n windowMs: 60000, // 1 minute\n isRetryable: () => true, // All errors count by default\n};\n\n/**\n * Circuit breaker error - thrown when circuit is open\n */\nexport class CircuitOpenError extends Error {\n constructor(\n public readonly breakerName: string,\n public readonly nextRetryTime: number,\n public readonly failureCount: number,\n public readonly lastError: string\n ) {\n const retryInSeconds = Math.ceil((nextRetryTime - Date.now()) / 1000);\n super(\n `Circuit breaker '${breakerName}' is OPEN. ` +\n `Retry in ${retryInSeconds}s. ` +\n `(${failureCount} recent failures, last: ${lastError})`\n );\n this.name = 'CircuitOpenError';\n }\n}\n\n/**\n * Generic circuit breaker for any async operation\n */\nexport class CircuitBreaker<T = any> extends EventEmitter<CircuitBreakerEvents> {\n private state: CircuitState = 'closed';\n private config: CircuitBreakerConfig;\n\n // Failure tracking\n private failures: FailureRecord[] = [];\n private lastError: string = '';\n\n // Success tracking\n private consecutiveSuccesses = 0;\n\n // Timing\n private openedAt?: number;\n private lastStateChange: number;\n\n // Metrics\n private totalRequests = 0;\n private successCount = 0;\n private failureCount = 0;\n private rejectedCount = 0;\n private lastFailureTime?: number;\n private lastSuccessTime?: number;\n\n constructor(\n public readonly name: string,\n config: Partial<CircuitBreakerConfig> = {}\n ) {\n super();\n this.config = { ...DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };\n this.lastStateChange = Date.now();\n }\n\n /**\n * Execute function with circuit breaker protection\n */\n async execute(fn: () => Promise<T>): Promise<T> {\n this.totalRequests++;\n\n // Check circuit state\n const now = Date.now();\n\n switch (this.state) {\n case 'open':\n // Check if timeout has expired\n if (this.openedAt && now - this.openedAt >= this.config.resetTimeoutMs) {\n // Transition to half-open\n this.transitionTo('half-open');\n } else {\n // Still open, reject immediately\n this.rejectedCount++;\n const nextRetry = (this.openedAt || now) + this.config.resetTimeoutMs;\n throw new CircuitOpenError(this.name, nextRetry, this.failures.length, this.lastError);\n }\n break;\n\n case 'half-open':\n // Allow one request through\n break;\n\n case 'closed':\n // Normal operation\n break;\n }\n\n // Execute the function\n try {\n const result = await fn();\n\n // Success - record it\n this.recordSuccess();\n\n return result;\n } catch (error) {\n // Failure - record it\n this.recordFailure(error as Error);\n\n throw error;\n }\n }\n\n /**\n * Record successful execution\n */\n private recordSuccess(): void {\n this.successCount++;\n this.lastSuccessTime = Date.now();\n this.consecutiveSuccesses++;\n\n if (this.state === 'half-open') {\n // Check if enough successes to close\n if (this.consecutiveSuccesses >= this.config.successThreshold) {\n this.transitionTo('closed');\n }\n } else if (this.state === 'closed') {\n // Clean up old failures on success\n this.pruneOldFailures();\n }\n }\n\n /**\n * Record failed execution\n */\n private recordFailure(error: Error): void {\n // Check if error should count as failure\n if (this.config.isRetryable && !this.config.isRetryable(error)) {\n // Non-retryable error, don't count toward circuit breaker\n return;\n }\n\n this.failureCount++;\n this.lastFailureTime = Date.now();\n this.lastError = error.message;\n\n // Reset consecutive successes\n this.consecutiveSuccesses = 0;\n\n // Record failure\n this.failures.push({\n timestamp: Date.now(),\n error: error.message,\n });\n\n // Prune old failures outside window\n this.pruneOldFailures();\n\n // Check if we should open the circuit\n if (this.state === 'half-open') {\n // Failure during half-open → back to open\n this.transitionTo('open');\n } else if (this.state === 'closed') {\n // Check failure threshold\n if (this.failures.length >= this.config.failureThreshold) {\n this.transitionTo('open');\n }\n }\n }\n\n /**\n * Transition to new state\n */\n private transitionTo(newState: CircuitState): void {\n this.state = newState;\n this.lastStateChange = Date.now();\n\n switch (newState) {\n case 'open':\n this.openedAt = Date.now();\n this.emit('opened', {\n name: this.name,\n failureCount: this.failures.length,\n lastError: this.lastError,\n nextRetryTime: this.openedAt + this.config.resetTimeoutMs,\n });\n break;\n\n case 'half-open':\n this.emit('half-open', {\n name: this.name,\n timestamp: Date.now(),\n });\n break;\n\n case 'closed':\n // Reset state\n this.failures = [];\n this.consecutiveSuccesses = 0;\n this.openedAt = undefined;\n\n this.emit('closed', {\n name: this.name,\n successCount: this.consecutiveSuccesses,\n timestamp: Date.now(),\n });\n break;\n }\n }\n\n /**\n * Remove failures outside the time window\n */\n private pruneOldFailures(): void {\n const now = Date.now();\n const cutoff = now - this.config.windowMs;\n this.failures = this.failures.filter((f) => f.timestamp > cutoff);\n }\n\n /**\n * Get current state\n */\n getState(): CircuitState {\n return this.state;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CircuitBreakerMetrics {\n this.pruneOldFailures();\n\n const total = this.successCount + this.failureCount;\n const failureRate = total > 0 ? this.failureCount / total : 0;\n const successRate = total > 0 ? this.successCount / total : 0;\n\n return {\n name: this.name,\n state: this.state,\n totalRequests: this.totalRequests,\n successCount: this.successCount,\n failureCount: this.failureCount,\n rejectedCount: this.rejectedCount,\n recentFailures: this.failures.length,\n consecutiveSuccesses: this.consecutiveSuccesses,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n lastStateChange: this.lastStateChange,\n nextRetryTime: this.openedAt ? this.openedAt + this.config.resetTimeoutMs : undefined,\n failureRate,\n successRate,\n };\n }\n\n /**\n * Manually reset circuit breaker (force close)\n */\n reset(): void {\n this.transitionTo('closed');\n this.totalRequests = 0;\n this.successCount = 0;\n this.failureCount = 0;\n this.rejectedCount = 0;\n this.lastFailureTime = undefined;\n this.lastSuccessTime = undefined;\n }\n\n /**\n * Check if circuit is allowing requests\n */\n isOpen(): boolean {\n if (this.state === 'open' && this.openedAt) {\n const now = Date.now();\n if (now - this.openedAt >= this.config.resetTimeoutMs) {\n // Should transition to half-open\n this.transitionTo('half-open');\n return false;\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get configuration\n */\n getConfig(): CircuitBreakerConfig {\n return { ...this.config };\n }\n}\n","/**\n * Backoff strategies for retry logic\n */\n\n/**\n * Backoff strategy type\n */\nexport type BackoffStrategyType = 'exponential' | 'linear' | 'constant';\n\n/**\n * Backoff configuration\n */\nexport interface BackoffConfig {\n /** Strategy type */\n strategy: BackoffStrategyType;\n\n /** Initial delay in ms */\n initialDelayMs: number;\n\n /** Maximum delay in ms */\n maxDelayMs: number;\n\n /** Multiplier for exponential (default: 2) */\n multiplier?: number;\n\n /** Increment for linear (default: 1000ms) */\n incrementMs?: number;\n\n /** Add random jitter to prevent thundering herd */\n jitter?: boolean;\n\n /** Jitter factor (0-1, default: 0.1 = ±10%) */\n jitterFactor?: number;\n\n /** Classify errors - return true if error should be retried */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Default backoff configuration\n */\nexport const DEFAULT_BACKOFF_CONFIG: BackoffConfig = {\n strategy: 'exponential',\n initialDelayMs: 1000, // 1 second\n maxDelayMs: 30000, // 30 seconds\n multiplier: 2,\n jitter: true,\n jitterFactor: 0.1,\n};\n\n/**\n * Calculate backoff delay for given attempt\n */\nexport function calculateBackoff(attempt: number, config: BackoffConfig = DEFAULT_BACKOFF_CONFIG): number {\n let delay: number;\n\n switch (config.strategy) {\n case 'exponential':\n delay = config.initialDelayMs * Math.pow(config.multiplier || 2, attempt - 1);\n break;\n\n case 'linear':\n delay = config.initialDelayMs + (config.incrementMs || 1000) * (attempt - 1);\n break;\n\n case 'constant':\n delay = config.initialDelayMs;\n break;\n\n default:\n delay = config.initialDelayMs;\n }\n\n // Cap at max delay\n delay = Math.min(delay, config.maxDelayMs);\n\n // Add jitter if enabled\n if (config.jitter) {\n delay = addJitter(delay, config.jitterFactor || 0.1);\n }\n\n return Math.floor(delay);\n}\n\n/**\n * Add random jitter to a delay\n *\n * @param delay - Base delay in ms\n * @param factor - Jitter factor (0-1), default 0.1 = ±10%\n * @returns delay with jitter applied\n */\nexport function addJitter(delay: number, factor: number = 0.1): number {\n // Calculate jitter range\n const jitterRange = delay * factor;\n\n // Add random value in range [-jitterRange, +jitterRange]\n const jitter = (Math.random() * 2 - 1) * jitterRange;\n\n return delay + jitter;\n}\n\n/**\n * Wait for backoff delay\n */\nexport async function backoffWait(attempt: number, config: BackoffConfig = DEFAULT_BACKOFF_CONFIG): Promise<number> {\n const delay = calculateBackoff(attempt, config);\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n return delay;\n}\n\n/**\n * Backoff iterator - generates delays for each attempt\n */\nexport function* backoffSequence(\n config: BackoffConfig = DEFAULT_BACKOFF_CONFIG,\n maxAttempts?: number\n): Generator<number, void, unknown> {\n let attempt = 1;\n\n while (true) {\n if (maxAttempts && attempt > maxAttempts) {\n return;\n }\n\n yield calculateBackoff(attempt, config);\n attempt++;\n }\n}\n\n/**\n * Retry with backoff\n *\n * @param fn - Function to execute\n * @param config - Backoff configuration\n * @param maxAttempts - Max retry attempts (default: unlimited)\n * @returns Result of fn()\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: BackoffConfig = DEFAULT_BACKOFF_CONFIG,\n maxAttempts?: number\n): Promise<T> {\n let attempt = 0;\n let lastError: Error;\n\n while (true) {\n attempt++;\n\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n if (config.isRetryable && !config.isRetryable(lastError)) {\n // Non-retryable error, throw immediately\n throw lastError;\n }\n\n // Check max attempts\n if (maxAttempts && attempt >= maxAttempts) {\n throw lastError;\n }\n\n // Wait before retrying\n await backoffWait(attempt, config);\n }\n }\n}\n","/**\n * Structured logging infrastructure\n *\n * Provides framework-wide structured logging with context propagation.\n * Supports console output (default) with optional file output.\n *\n * Environment variables:\n * - LOG_LEVEL: trace|debug|info|warn|error|silent (default: info)\n * - LOG_FILE: Path to log file (optional, default: console output)\n * - LOG_PRETTY: true|false (default: true in development)\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Log level\n */\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/**\n * Log levels as numbers (for comparison)\n */\nconst LOG_LEVEL_VALUES: Record<LogLevel, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n silent: 100,\n};\n\n/**\n * Safe JSON stringify that handles circular references and problematic objects\n */\nfunction safeStringify(obj: unknown, indent?: number): string {\n const seen = new WeakSet();\n\n const replacer = (_key: string, value: unknown): unknown => {\n // Handle null/undefined\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle primitive types\n if (typeof value !== 'object') {\n // Handle functions\n if (typeof value === 'function') {\n return '[Function]';\n }\n // Handle BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }\n\n // Handle special objects that shouldn't be serialized\n const objValue = value as object;\n const constructor = objValue.constructor?.name || '';\n\n // Skip Node.js internal objects that cause circular reference issues\n if (\n constructor === 'Timeout' ||\n constructor === 'TimersList' ||\n constructor === 'Socket' ||\n constructor === 'Server' ||\n constructor === 'IncomingMessage' ||\n constructor === 'ServerResponse' ||\n constructor === 'WriteStream' ||\n constructor === 'ReadStream' ||\n constructor === 'EventEmitter'\n ) {\n return `[${constructor}]`;\n }\n\n // Handle circular references\n if (seen.has(objValue)) {\n return '[Circular]';\n }\n\n // Handle Error objects specially\n if (objValue instanceof Error) {\n return {\n name: objValue.name,\n message: objValue.message,\n stack: objValue.stack,\n };\n }\n\n // Handle Date\n if (objValue instanceof Date) {\n return objValue.toISOString();\n }\n\n // Handle Map\n if (objValue instanceof Map) {\n return Object.fromEntries(objValue);\n }\n\n // Handle Set\n if (objValue instanceof Set) {\n return Array.from(objValue);\n }\n\n // Handle Buffer\n if (Buffer.isBuffer(objValue)) {\n return `[Buffer(${objValue.length})]`;\n }\n\n // Add to seen set for circular reference detection\n seen.add(objValue);\n\n return value;\n };\n\n try {\n return JSON.stringify(obj, replacer, indent);\n } catch {\n // Fallback if stringify still fails\n return '[Unserializable]';\n }\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Log level */\n level?: LogLevel;\n\n /** Pretty print for development */\n pretty?: boolean;\n\n /** Base context added to all logs */\n context?: Record<string, any>;\n\n /** Custom destination (default: console) */\n destination?: 'console' | 'stdout' | 'stderr';\n\n /** File path for file logging */\n filePath?: string;\n}\n\n/**\n * Log entry\n */\nexport interface LogEntry {\n level: LogLevel;\n time: number;\n msg: string;\n [key: string]: any;\n}\n\n/**\n * Framework logger\n */\nexport class FrameworkLogger {\n private config: LoggerConfig;\n private context: Record<string, any>;\n private levelValue: number;\n private fileStream?: fs.WriteStream;\n\n constructor(config: LoggerConfig = {}) {\n this.config = {\n level: (config.level || process.env.LOG_LEVEL || 'info') as LogLevel,\n pretty: config.pretty ?? (process.env.LOG_PRETTY === 'true' || process.env.NODE_ENV === 'development'),\n destination: config.destination || 'console',\n context: config.context || {},\n filePath: config.filePath || process.env.LOG_FILE,\n };\n\n this.context = this.config.context || {};\n this.levelValue = LOG_LEVEL_VALUES[this.config.level || 'info'];\n\n // Initialize file stream if file path is provided\n if (this.config.filePath) {\n this.initFileStream(this.config.filePath);\n }\n }\n\n /**\n * Initialize file stream for logging\n */\n private initFileStream(filePath: string): void {\n try {\n // Ensure directory exists\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Create write stream with append mode\n this.fileStream = fs.createWriteStream(filePath, {\n flags: 'a', // append mode\n encoding: 'utf8',\n });\n\n // Handle stream errors\n this.fileStream.on('error', (err) => {\n console.error(`[Logger] File stream error: ${err.message}`);\n this.fileStream = undefined;\n });\n } catch (err) {\n console.error(`[Logger] Failed to initialize log file: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n /**\n * Create child logger with additional context\n */\n child(context: Record<string, any>): FrameworkLogger {\n return new FrameworkLogger({\n ...this.config,\n context: { ...this.context, ...context },\n });\n }\n\n /**\n * Trace log\n */\n trace(obj: Record<string, any> | string, msg?: string): void {\n this.log('trace', obj, msg);\n }\n\n /**\n * Debug log\n */\n debug(obj: Record<string, any> | string, msg?: string): void {\n this.log('debug', obj, msg);\n }\n\n /**\n * Info log\n */\n info(obj: Record<string, any> | string, msg?: string): void {\n this.log('info', obj, msg);\n }\n\n /**\n * Warn log\n */\n warn(obj: Record<string, any> | string, msg?: string): void {\n this.log('warn', obj, msg);\n }\n\n /**\n * Error log\n */\n error(obj: Record<string, any> | string, msg?: string): void {\n this.log('error', obj, msg);\n }\n\n /**\n * Internal log method\n */\n private log(level: LogLevel, obj: Record<string, any> | string, msg?: string): void {\n // Check if this level should be logged\n if (LOG_LEVEL_VALUES[level] < this.levelValue) {\n return;\n }\n\n // Parse arguments\n let data: Record<string, any>;\n let message: string;\n\n if (typeof obj === 'string') {\n message = obj;\n data = {};\n } else {\n message = msg || '';\n data = obj;\n }\n\n // Create log entry\n const entry: LogEntry = {\n level,\n time: Date.now(),\n ...this.context,\n ...data,\n msg: message,\n };\n\n // Output\n this.output(entry);\n }\n\n /**\n * Output log entry\n */\n private output(entry: LogEntry): void {\n if (this.config.pretty) {\n this.prettyPrint(entry);\n } else {\n this.jsonPrint(entry);\n }\n }\n\n /**\n * Pretty print for development\n */\n private prettyPrint(entry: LogEntry): void {\n const levelColors: Record<LogLevel, string> = {\n trace: '\\x1b[90m', // Gray\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n silent: '',\n };\n\n const reset = '\\x1b[0m';\n const color = this.fileStream ? '' : levelColors[entry.level] || ''; // No colors in file\n\n // Format time\n const time = new Date(entry.time).toISOString().substring(11, 23);\n\n // Format level\n const levelStr = entry.level.toUpperCase().padEnd(5);\n\n // Format context\n const contextParts: string[] = [];\n for (const [key, value] of Object.entries(entry)) {\n if (key !== 'level' && key !== 'time' && key !== 'msg') {\n contextParts.push(`${key}=${safeStringify(value)}`);\n }\n }\n const context = contextParts.length > 0 ? ` ${contextParts.join(' ')}` : '';\n\n // Output\n const output = `${color}[${time}] ${levelStr}${reset} ${entry.msg}${context}`;\n\n // Write to file if available\n if (this.fileStream) {\n // Strip ANSI color codes for file output\n const cleanOutput = output.replace(/\\x1b\\[[0-9;]*m/g, '');\n this.fileStream.write(cleanOutput + '\\n');\n return;\n }\n\n // Console output\n switch (entry.level) {\n case 'error':\n case 'warn':\n console.error(output);\n break;\n default:\n console.log(output);\n }\n }\n\n /**\n * JSON print for production\n */\n private jsonPrint(entry: LogEntry): void {\n const json = safeStringify(entry);\n\n // Write to file if available\n if (this.fileStream) {\n this.fileStream.write(json + '\\n');\n return;\n }\n\n // Console output\n switch (this.config.destination) {\n case 'stderr':\n console.error(json);\n break;\n default:\n console.log(json);\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n\n if (config.level) {\n this.levelValue = LOG_LEVEL_VALUES[config.level];\n }\n\n if (config.context) {\n this.context = { ...this.context, ...config.context };\n }\n\n // Reinitialize file stream if file path changed\n if (config.filePath !== undefined) {\n this.closeFileStream();\n if (config.filePath) {\n this.initFileStream(config.filePath);\n }\n }\n }\n\n /**\n * Close file stream\n */\n private closeFileStream(): void {\n if (this.fileStream) {\n this.fileStream.end();\n this.fileStream = undefined;\n }\n }\n\n /**\n * Cleanup resources (call before process exit)\n */\n close(): void {\n this.closeFileStream();\n }\n\n /**\n * Get current log level\n */\n getLevel(): LogLevel {\n return this.config.level || 'info';\n }\n\n /**\n * Check if level is enabled\n */\n isLevelEnabled(level: LogLevel): boolean {\n return LOG_LEVEL_VALUES[level] >= this.levelValue;\n }\n}\n\n/**\n * Global logger singleton\n */\nexport const logger = new FrameworkLogger({\n level: (process.env.LOG_LEVEL as LogLevel) || 'info',\n pretty: process.env.LOG_PRETTY === 'true' || process.env.NODE_ENV === 'development',\n filePath: process.env.LOG_FILE,\n});\n\n/**\n * Cleanup logger on process exit\n */\nprocess.on('exit', () => {\n logger.close();\n});\n\nprocess.on('SIGINT', () => {\n logger.close();\n process.exit(0);\n});\n\nprocess.on('SIGTERM', () => {\n logger.close();\n process.exit(0);\n});\n","/**\n * Metrics collection infrastructure\n *\n * Pluggable metrics system with support for various backends.\n */\n\n/**\n * Metric tags\n */\nexport type MetricTags = Record<string, string | number | boolean>;\n\n/**\n * Metrics collector interface\n */\nexport interface MetricsCollector {\n /**\n * Increment a counter\n */\n increment(metric: string, value?: number, tags?: MetricTags): void;\n\n /**\n * Set a gauge value\n */\n gauge(metric: string, value: number, tags?: MetricTags): void;\n\n /**\n * Record a timing/duration\n */\n timing(metric: string, duration: number, tags?: MetricTags): void;\n\n /**\n * Record a histogram value\n */\n histogram(metric: string, value: number, tags?: MetricTags): void;\n}\n\n/**\n * No-op metrics collector (default - zero overhead)\n */\nexport class NoOpMetrics implements MetricsCollector {\n increment(): void {}\n gauge(): void {}\n timing(): void {}\n histogram(): void {}\n}\n\n/**\n * Console metrics collector (development/debugging)\n */\nexport class ConsoleMetrics implements MetricsCollector {\n private prefix: string;\n\n constructor(prefix: string = 'oneringai') {\n this.prefix = prefix;\n }\n\n increment(metric: string, value: number = 1, tags?: MetricTags): void {\n this.log('COUNTER', metric, value, tags);\n }\n\n gauge(metric: string, value: number, tags?: MetricTags): void {\n this.log('GAUGE', metric, value, tags);\n }\n\n timing(metric: string, duration: number, tags?: MetricTags): void {\n this.log('TIMING', metric, `${duration}ms`, tags);\n }\n\n histogram(metric: string, value: number, tags?: MetricTags): void {\n this.log('HISTOGRAM', metric, value, tags);\n }\n\n private log(type: string, metric: string, value: any, tags?: MetricTags): void {\n const fullMetric = `${this.prefix}.${metric}`;\n const tagsStr = tags ? ` ${JSON.stringify(tags)}` : '';\n console.log(`[METRIC:${type}] ${fullMetric}=${value}${tagsStr}`);\n }\n}\n\n/**\n * In-memory metrics aggregator (testing/development)\n */\nexport class InMemoryMetrics implements MetricsCollector {\n private counters = new Map<string, number>();\n private gauges = new Map<string, number>();\n private timings = new Map<string, number[]>();\n private histograms = new Map<string, number[]>();\n\n increment(metric: string, value: number = 1, tags?: MetricTags): void {\n const key = this.makeKey(metric, tags);\n this.counters.set(key, (this.counters.get(key) || 0) + value);\n }\n\n gauge(metric: string, value: number, tags?: MetricTags): void {\n const key = this.makeKey(metric, tags);\n this.gauges.set(key, value);\n }\n\n timing(metric: string, duration: number, tags?: MetricTags): void {\n const key = this.makeKey(metric, tags);\n const timings = this.timings.get(key) || [];\n timings.push(duration);\n this.timings.set(key, timings);\n }\n\n histogram(metric: string, value: number, tags?: MetricTags): void {\n const key = this.makeKey(metric, tags);\n const values = this.histograms.get(key) || [];\n values.push(value);\n this.histograms.set(key, values);\n }\n\n private makeKey(metric: string, tags?: MetricTags): string {\n if (!tags) return metric;\n const tagStr = Object.entries(tags)\n .map(([k, v]) => `${k}:${v}`)\n .sort()\n .join(',');\n return `${metric}{${tagStr}}`;\n }\n\n /**\n * Get all metrics (for testing)\n */\n getMetrics(): {\n counters: Map<string, number>;\n gauges: Map<string, number>;\n timings: Map<string, number[]>;\n histograms: Map<string, number[]>;\n } {\n return {\n counters: new Map(this.counters),\n gauges: new Map(this.gauges),\n timings: new Map(this.timings),\n histograms: new Map(this.histograms),\n };\n }\n\n /**\n * Clear all metrics\n */\n clear(): void {\n this.counters.clear();\n this.gauges.clear();\n this.timings.clear();\n this.histograms.clear();\n }\n\n /**\n * Get summary statistics for timings\n */\n getTimingStats(metric: string, tags?: MetricTags): {\n count: number;\n min: number;\n max: number;\n mean: number;\n p50: number;\n p95: number;\n p99: number;\n } | null {\n const key = this.makeKey(metric, tags);\n const timings = this.timings.get(key);\n\n if (!timings || timings.length === 0) {\n return null;\n }\n\n const sorted = [...timings].sort((a, b) => a - b);\n const count = sorted.length;\n const sum = sorted.reduce((a, b) => a + b, 0);\n\n return {\n count,\n min: sorted[0] ?? 0,\n max: sorted[count - 1] ?? 0,\n mean: sum / count,\n p50: sorted[Math.floor(count * 0.5)] ?? 0,\n p95: sorted[Math.floor(count * 0.95)] ?? 0,\n p99: sorted[Math.floor(count * 0.99)] ?? 0,\n };\n }\n}\n\n/**\n * Metrics collector type\n */\nexport type MetricsCollectorType = 'noop' | 'console' | 'inmemory';\n\n/**\n * Create metrics collector from type\n */\nexport function createMetricsCollector(type?: MetricsCollectorType, prefix?: string): MetricsCollector {\n const collectorType = type || (process.env.METRICS_COLLECTOR as MetricsCollectorType) || 'noop';\n\n switch (collectorType) {\n case 'console':\n return new ConsoleMetrics(prefix);\n case 'inmemory':\n return new InMemoryMetrics();\n default:\n return new NoOpMetrics();\n }\n}\n\n/**\n * Global metrics singleton\n */\nexport const metrics: MetricsCollector = createMetricsCollector(\n undefined,\n process.env.METRICS_PREFIX || 'oneringai'\n);\n\n/**\n * Update global metrics collector\n */\nexport function setMetricsCollector(collector: MetricsCollector): void {\n Object.assign(metrics, collector);\n}\n","/**\n * Connector - The single source of truth for authentication\n *\n * Manages authenticated connections to:\n * - AI providers (OpenAI, Anthropic, Google, etc.)\n * - External APIs (GitHub, Salesforce, etc.)\n *\n * Enterprise features:\n * - Request timeout with AbortController\n * - Circuit breaker for failing services\n * - Retry with exponential backoff\n * - Request/response logging\n */\n\nimport { ConnectorConfig, ConnectorAuth } from '../domain/entities/Connector.js';\nimport { Vendor } from './Vendor.js';\nimport { OAuthManager } from '../connectors/oauth/OAuthManager.js';\nimport { MemoryStorage } from '../connectors/oauth/infrastructure/storage/MemoryStorage.js';\nimport type { ITokenStorage } from '../connectors/oauth/domain/ITokenStorage.js';\nimport { CircuitBreaker } from '../infrastructure/resilience/CircuitBreaker.js';\nimport { calculateBackoff, BackoffConfig } from '../infrastructure/resilience/BackoffStrategy.js';\nimport { logger } from '../infrastructure/observability/Logger.js';\nimport { metrics } from '../infrastructure/observability/Metrics.js';\n\n/**\n * Default configuration values for resilience features\n */\nexport const DEFAULT_CONNECTOR_TIMEOUT = 30000; // 30 seconds\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_RETRYABLE_STATUSES = [429, 500, 502, 503, 504];\nexport const DEFAULT_BASE_DELAY_MS = 1000;\nexport const DEFAULT_MAX_DELAY_MS = 30000;\n\n/**\n * Fetch options with additional connector-specific settings\n */\nexport interface ConnectorFetchOptions extends RequestInit {\n /** Override timeout for this request */\n timeout?: number;\n /** Skip retry for this request */\n skipRetry?: boolean;\n /** Skip circuit breaker for this request */\n skipCircuitBreaker?: boolean;\n}\n\n/**\n * Connector class - represents a single authenticated connection\n */\nexport class Connector {\n // ============ Static Registry ============\n\n private static registry: Map<string, Connector> = new Map();\n private static defaultStorage: ITokenStorage = new MemoryStorage();\n\n /**\n * Create and register a new connector\n * @param config - Must include `name` field\n */\n static create(config: ConnectorConfig & { name: string }): Connector {\n if (!config.name || config.name.trim().length === 0) {\n throw new Error('Connector name is required');\n }\n if (Connector.registry.has(config.name)) {\n throw new Error(`Connector '${config.name}' already exists. Use Connector.get() or choose a different name.`);\n }\n const connector = new Connector(config);\n Connector.registry.set(config.name, connector);\n return connector;\n }\n\n /**\n * Get a connector by name\n */\n static get(name: string): Connector {\n const connector = Connector.registry.get(name);\n if (!connector) {\n const available = Connector.list().join(', ') || 'none';\n throw new Error(`Connector '${name}' not found. Available: ${available}`);\n }\n return connector;\n }\n\n /**\n * Check if a connector exists\n */\n static has(name: string): boolean {\n return Connector.registry.has(name);\n }\n\n /**\n * List all registered connector names\n */\n static list(): string[] {\n return Array.from(Connector.registry.keys());\n }\n\n /**\n * Remove a connector\n */\n static remove(name: string): boolean {\n const connector = Connector.registry.get(name);\n if (connector) {\n connector.dispose();\n }\n return Connector.registry.delete(name);\n }\n\n /**\n * Clear all connectors (useful for testing)\n */\n static clear(): void {\n for (const connector of Connector.registry.values()) {\n connector.dispose();\n }\n Connector.registry.clear();\n }\n\n /**\n * Set default token storage for OAuth connectors\n */\n static setDefaultStorage(storage: ITokenStorage): void {\n Connector.defaultStorage = storage;\n }\n\n /**\n * Get all registered connectors\n */\n static listAll(): Connector[] {\n return Array.from(Connector.registry.values());\n }\n\n /**\n * Get number of registered connectors\n */\n static size(): number {\n return Connector.registry.size;\n }\n\n /**\n * Get connector descriptions formatted for tool parameters\n * Useful for generating dynamic tool descriptions\n */\n static getDescriptionsForTools(): string {\n const connectors = Connector.listAll();\n\n if (connectors.length === 0) {\n return 'No connectors registered yet.';\n }\n\n return connectors\n .map((c) => ` - \"${c.name}\": ${c.displayName} - ${c.config.description || 'No description'}`)\n .join('\\n');\n }\n\n /**\n * Get connector info (for tools and documentation)\n */\n static getInfo(): Record<string, { displayName: string; description: string; baseURL: string }> {\n const info: Record<string, { displayName: string; description: string; baseURL: string }> = {};\n\n for (const connector of Connector.registry.values()) {\n info[connector.name] = {\n displayName: connector.displayName,\n description: connector.config.description || '',\n baseURL: connector.baseURL,\n };\n }\n\n return info;\n }\n\n // ============ Instance ============\n\n readonly name: string;\n readonly vendor?: Vendor;\n readonly config: ConnectorConfig;\n\n private oauthManager?: OAuthManager;\n private circuitBreaker?: CircuitBreaker;\n private disposed = false;\n\n // Metrics\n private requestCount = 0;\n private successCount = 0;\n private failureCount = 0;\n private totalLatencyMs = 0;\n\n private constructor(config: ConnectorConfig & { name: string }) {\n this.name = config.name;\n this.vendor = config.vendor;\n this.config = config;\n\n // Initialize OAuth manager for OAuth and JWT auth types\n if (config.auth.type === 'oauth') {\n this.initOAuthManager(config.auth);\n } else if (config.auth.type === 'jwt') {\n this.initJWTManager(config.auth);\n }\n\n // Initialize circuit breaker if enabled (default: true)\n this.initCircuitBreaker();\n }\n\n /**\n * Initialize circuit breaker with config or defaults\n */\n private initCircuitBreaker(): void {\n const cbConfig = this.config.circuitBreaker;\n const enabled = cbConfig?.enabled ?? true;\n\n if (enabled) {\n this.circuitBreaker = new CircuitBreaker(`connector:${this.name}`, {\n failureThreshold: cbConfig?.failureThreshold ?? 5,\n successThreshold: cbConfig?.successThreshold ?? 2,\n resetTimeoutMs: cbConfig?.resetTimeoutMs ?? 30000,\n windowMs: 60000, // 1 minute window\n isRetryable: (error) => {\n // Don't count client errors (4xx except 429) as circuit breaker failures\n if (error.message.includes('HTTP 4') && !error.message.includes('HTTP 429')) {\n return false;\n }\n return true;\n },\n });\n\n // Log circuit breaker state changes\n this.circuitBreaker.on('opened', ({ name, failureCount, lastError }) => {\n logger.warn(`Circuit breaker opened for ${name}: ${failureCount} failures, last error: ${lastError}`);\n metrics.increment('connector.circuit_breaker.opened', 1, { connector: this.name });\n });\n\n this.circuitBreaker.on('closed', ({ name }) => {\n logger.info(`Circuit breaker closed for ${name}`);\n metrics.increment('connector.circuit_breaker.closed', 1, { connector: this.name });\n });\n }\n }\n\n /**\n * Human-readable display name\n */\n get displayName(): string {\n return this.config.displayName || this.name;\n }\n\n /**\n * API base URL for this connector\n */\n get baseURL(): string {\n return this.config.baseURL || '';\n }\n\n /**\n * Get the API key (for api_key auth type)\n */\n getApiKey(): string {\n if (this.config.auth.type !== 'api_key') {\n throw new Error(`Connector '${this.name}' does not use API key auth. Type: ${this.config.auth.type}`);\n }\n return this.config.auth.apiKey;\n }\n\n /**\n * Get the current access token (for OAuth, JWT, or API key)\n * Handles automatic refresh if needed\n */\n async getToken(userId?: string): Promise<string> {\n if (this.config.auth.type === 'api_key') {\n return this.config.auth.apiKey;\n }\n\n // OAuth and JWT both use OAuthManager\n if (!this.oauthManager) {\n throw new Error(`OAuth manager not initialized for connector '${this.name}'`);\n }\n\n return this.oauthManager.getToken(userId);\n }\n\n /**\n * Start OAuth authorization flow\n * Returns the URL to redirect the user to\n */\n async startAuth(userId?: string): Promise<string> {\n if (!this.oauthManager) {\n throw new Error(`Connector '${this.name}' is not an OAuth connector`);\n }\n return this.oauthManager.startAuthFlow(userId);\n }\n\n /**\n * Handle OAuth callback\n * Call this after user is redirected back from OAuth provider\n */\n async handleCallback(callbackUrl: string, userId?: string): Promise<void> {\n if (!this.oauthManager) {\n throw new Error(`Connector '${this.name}' is not an OAuth connector`);\n }\n await this.oauthManager.handleCallback(callbackUrl, userId);\n }\n\n /**\n * Check if the connector has a valid token\n */\n async hasValidToken(userId?: string): Promise<boolean> {\n try {\n if (this.config.auth.type === 'api_key') {\n return true; // API keys are always \"valid\" (we don't validate them)\n }\n if (this.oauthManager) {\n const token = await this.oauthManager.getToken(userId);\n return !!token;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Get vendor-specific options from config\n */\n getOptions(): Record<string, unknown> {\n return this.config.options ?? {};\n }\n\n /**\n * Get the service type (explicit or undefined)\n */\n get serviceType(): string | undefined {\n return this.config.serviceType;\n }\n\n /**\n * Get connector metrics\n */\n getMetrics(): {\n requestCount: number;\n successCount: number;\n failureCount: number;\n avgLatencyMs: number;\n circuitBreakerState?: string;\n } {\n return {\n requestCount: this.requestCount,\n successCount: this.successCount,\n failureCount: this.failureCount,\n avgLatencyMs: this.requestCount > 0 ? this.totalLatencyMs / this.requestCount : 0,\n circuitBreakerState: this.circuitBreaker?.getState(),\n };\n }\n\n /**\n * Reset circuit breaker (force close)\n */\n resetCircuitBreaker(): void {\n this.circuitBreaker?.reset();\n }\n\n /**\n * Make an authenticated fetch request using this connector\n * This is the foundation for all vendor-dependent tools\n *\n * Features:\n * - Timeout with AbortController\n * - Circuit breaker protection\n * - Retry with exponential backoff\n * - Request/response logging\n *\n * @param endpoint - API endpoint (relative to baseURL) or full URL\n * @param options - Fetch options with connector-specific settings\n * @param userId - Optional user ID for multi-user OAuth\n * @returns Fetch Response\n */\n async fetch(\n endpoint: string,\n options?: ConnectorFetchOptions,\n userId?: string\n ): Promise<Response> {\n // Check if disposed\n if (this.disposed) {\n throw new Error(`Connector '${this.name}' has been disposed`);\n }\n\n const startTime = Date.now();\n this.requestCount++;\n\n // Resolve URL\n const url = endpoint.startsWith('http') ? endpoint : `${this.baseURL}${endpoint}`;\n\n // Get timeout\n const timeout = options?.timeout ?? this.config.timeout ?? DEFAULT_CONNECTOR_TIMEOUT;\n\n // Log request if enabled\n if (this.config.logging?.enabled) {\n this.logRequest(url, options);\n }\n\n // Build the actual fetch function\n const doFetch = async (): Promise<Response> => {\n // Get token (may involve refresh)\n const token = await this.getToken(userId);\n const auth = this.config.auth;\n\n // Build auth header\n let headerName = 'Authorization';\n let headerValue = `Bearer ${token}`;\n\n if (auth.type === 'api_key') {\n headerName = auth.headerName || 'Authorization';\n const prefix = auth.headerPrefix ?? 'Bearer';\n headerValue = prefix ? `${prefix} ${token}` : token;\n }\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n ...options?.headers,\n [headerName]: headerValue,\n },\n });\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n // Build retry wrapper\n const doFetchWithRetry = async (): Promise<Response> => {\n const retryConfig = this.config.retry;\n const maxRetries = retryConfig?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const retryableStatuses = retryConfig?.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES;\n const baseDelayMs = retryConfig?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n const maxDelayMs = retryConfig?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n\n const backoffConfig: BackoffConfig = {\n strategy: 'exponential',\n initialDelayMs: baseDelayMs,\n maxDelayMs: maxDelayMs,\n multiplier: 2,\n jitter: true,\n jitterFactor: 0.1,\n };\n\n let lastError: Error | undefined;\n let lastResponse: Response | undefined;\n\n for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {\n try {\n const response = await doFetch();\n\n // Check if we should retry based on status code\n if (!response.ok && retryableStatuses.includes(response.status) && attempt <= maxRetries) {\n lastResponse = response;\n const delay = calculateBackoff(attempt, backoffConfig);\n\n if (this.config.logging?.enabled) {\n logger.debug(`Connector ${this.name}: Retry ${attempt}/${maxRetries} after ${delay}ms (status ${response.status})`);\n }\n\n await this.sleep(delay);\n continue;\n }\n\n return response;\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on abort (timeout)\n if (lastError.name === 'AbortError') {\n throw new Error(`Request timeout after ${timeout}ms: ${url}`);\n }\n\n // Retry on network errors\n if (attempt <= maxRetries && !options?.skipRetry) {\n const delay = calculateBackoff(attempt, backoffConfig);\n\n if (this.config.logging?.enabled) {\n logger.debug(`Connector ${this.name}: Retry ${attempt}/${maxRetries} after ${delay}ms (error: ${lastError.message})`);\n }\n\n await this.sleep(delay);\n continue;\n }\n\n throw lastError;\n }\n }\n\n // If we exhausted retries with a response, return it\n if (lastResponse) {\n return lastResponse;\n }\n\n // Otherwise throw the last error\n throw lastError ?? new Error('Unknown error during fetch');\n };\n\n try {\n let response: Response;\n\n // Wrap with circuit breaker if enabled and not skipped\n if (this.circuitBreaker && !options?.skipCircuitBreaker) {\n response = await this.circuitBreaker.execute(doFetchWithRetry);\n } else {\n response = await doFetchWithRetry();\n }\n\n // Record success\n const latency = Date.now() - startTime;\n this.successCount++;\n this.totalLatencyMs += latency;\n metrics.timing('connector.latency', latency, { connector: this.name });\n metrics.increment('connector.success', 1, { connector: this.name });\n\n // Log response if enabled\n if (this.config.logging?.enabled) {\n this.logResponse(url, response, latency);\n }\n\n return response;\n } catch (error) {\n // Record failure\n const latency = Date.now() - startTime;\n this.failureCount++;\n this.totalLatencyMs += latency;\n metrics.increment('connector.failure', 1, { connector: this.name, error: (error as Error).name });\n\n // Log error\n if (this.config.logging?.enabled) {\n logger.error(\n { connector: this.name, url, latency, error: (error as Error).message },\n `Connector ${this.name} fetch failed: ${(error as Error).message}`\n );\n }\n\n throw error;\n }\n }\n\n /**\n * Make an authenticated fetch request and parse JSON response\n * Throws on non-OK responses\n *\n * @param endpoint - API endpoint (relative to baseURL) or full URL\n * @param options - Fetch options with connector-specific settings\n * @param userId - Optional user ID for multi-user OAuth\n * @returns Parsed JSON response\n */\n async fetchJSON<T = unknown>(\n endpoint: string,\n options?: ConnectorFetchOptions,\n userId?: string\n ): Promise<T> {\n const response = await this.fetch(endpoint, options, userId);\n\n // Try to parse response body\n const text = await response.text();\n let data: T;\n\n try {\n data = JSON.parse(text) as T;\n } catch {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n throw new Error(`Invalid JSON response: ${text.slice(0, 100)}`);\n }\n\n if (!response.ok) {\n // Include parsed error in message if available\n const errorMsg = typeof data === 'object' && data !== null ? JSON.stringify(data) : text;\n throw new Error(`HTTP ${response.status}: ${errorMsg}`);\n }\n\n return data;\n }\n\n // ============ Private Helpers ============\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private logRequest(url: string, options?: RequestInit): void {\n const logData: Record<string, unknown> = {\n connector: this.name,\n method: options?.method ?? 'GET',\n url,\n };\n\n if (this.config.logging?.logHeaders && options?.headers) {\n // Redact sensitive headers\n const headers = { ...options.headers } as Record<string, string>;\n if (headers['Authorization']) {\n headers['Authorization'] = '[REDACTED]';\n }\n if (headers['authorization']) {\n headers['authorization'] = '[REDACTED]';\n }\n logData.headers = headers;\n }\n\n if (this.config.logging?.logBody && options?.body) {\n logData.body = typeof options.body === 'string' ? options.body.slice(0, 1000) : '[non-string body]';\n }\n\n logger.debug(logData, `Connector ${this.name} request`);\n }\n\n private logResponse(url: string, response: Response, latency: number): void {\n logger.debug(\n { connector: this.name, url, status: response.status, latency },\n `Connector ${this.name} response`\n );\n }\n\n /**\n * Dispose of resources\n */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n // Clean up resources\n this.oauthManager = undefined;\n this.circuitBreaker = undefined;\n }\n\n /**\n * Check if connector is disposed\n */\n isDisposed(): boolean {\n return this.disposed;\n }\n\n // ============ Private ============\n\n private initOAuthManager(auth: ConnectorAuth & { type: 'oauth' }): void {\n // Convert ConnectorAuth to OAuthConfig\n const oauthConfig = {\n flow: auth.flow as 'authorization_code' | 'client_credentials' | 'jwt_bearer',\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n tokenUrl: auth.tokenUrl,\n authorizationUrl: auth.authorizationUrl,\n redirectUri: auth.redirectUri,\n scope: auth.scope,\n usePKCE: auth.usePKCE,\n privateKey: auth.privateKey,\n privateKeyPath: auth.privateKeyPath,\n audience: auth.audience,\n refreshBeforeExpiry: auth.refreshBeforeExpiry,\n storage: Connector.defaultStorage,\n storageKey: auth.storageKey ?? this.name,\n };\n\n this.oauthManager = new OAuthManager(oauthConfig);\n }\n\n private initJWTManager(auth: ConnectorAuth & { type: 'jwt' }): void {\n // JWT uses jwt_bearer flow via OAuthManager\n this.oauthManager = new OAuthManager({\n flow: 'jwt_bearer',\n clientId: auth.clientId,\n tokenUrl: auth.tokenUrl,\n privateKey: auth.privateKey,\n privateKeyPath: auth.privateKeyPath,\n scope: auth.scope,\n audience: auth.audience,\n storage: Connector.defaultStorage,\n storageKey: this.name,\n });\n }\n}\n","/**\n * Supported AI Vendors\n *\n * Use this enum instead of string literals for type safety.\n * These map to specific provider implementations.\n */\nexport const Vendor = {\n OpenAI: 'openai',\n Anthropic: 'anthropic',\n Google: 'google',\n GoogleVertex: 'google-vertex',\n Groq: 'groq',\n Together: 'together',\n Perplexity: 'perplexity',\n Grok: 'grok',\n DeepSeek: 'deepseek',\n Mistral: 'mistral',\n Ollama: 'ollama',\n Custom: 'custom', // OpenAI-compatible endpoint\n} as const;\n\nexport type Vendor = (typeof Vendor)[keyof typeof Vendor];\n\n/**\n * All vendor values as array (useful for validation)\n */\nexport const VENDORS = Object.values(Vendor);\n\n/**\n * Check if a string is a valid vendor\n */\nexport function isVendor(value: string): value is Vendor {\n return VENDORS.includes(value as Vendor);\n}\n","/**\n * Custom error classes for the AI library\n */\n\nexport class AIError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = 'AIError';\n Object.setPrototypeOf(this, AIError.prototype);\n }\n}\n\nexport class ProviderNotFoundError extends AIError {\n constructor(providerName: string) {\n super(\n `Provider '${providerName}' not found. Did you configure it in OneRingAI constructor?`,\n 'PROVIDER_NOT_FOUND',\n 404\n );\n this.name = 'ProviderNotFoundError';\n Object.setPrototypeOf(this, ProviderNotFoundError.prototype);\n }\n}\n\nexport class ProviderAuthError extends AIError {\n constructor(providerName: string, message: string = 'Authentication failed') {\n super(\n `${providerName}: ${message}`,\n 'PROVIDER_AUTH_ERROR',\n 401\n );\n this.name = 'ProviderAuthError';\n Object.setPrototypeOf(this, ProviderAuthError.prototype);\n }\n}\n\nexport class ProviderRateLimitError extends AIError {\n constructor(\n providerName: string,\n public readonly retryAfter?: number\n ) {\n super(\n `${providerName}: Rate limit exceeded${retryAfter ? `. Retry after ${retryAfter}ms` : ''}`,\n 'PROVIDER_RATE_LIMIT',\n 429\n );\n this.name = 'ProviderRateLimitError';\n Object.setPrototypeOf(this, ProviderRateLimitError.prototype);\n }\n}\n\nexport class ProviderContextLengthError extends AIError {\n constructor(\n providerName: string,\n public readonly maxTokens: number,\n public readonly requestedTokens?: number\n ) {\n super(\n `${providerName}: Context length exceeded. Max: ${maxTokens}${requestedTokens ? `, Requested: ${requestedTokens}` : ''}`,\n 'PROVIDER_CONTEXT_LENGTH_EXCEEDED',\n 413\n );\n this.name = 'ProviderContextLengthError';\n Object.setPrototypeOf(this, ProviderContextLengthError.prototype);\n }\n}\n\nexport class ToolExecutionError extends AIError {\n constructor(\n toolName: string,\n message: string,\n public readonly originalError?: Error\n ) {\n super(\n `Tool '${toolName}' execution failed: ${message}`,\n 'TOOL_EXECUTION_ERROR',\n 500,\n originalError\n );\n this.name = 'ToolExecutionError';\n Object.setPrototypeOf(this, ToolExecutionError.prototype);\n }\n}\n\nexport class ToolTimeoutError extends AIError {\n constructor(\n toolName: string,\n public readonly timeoutMs: number\n ) {\n super(\n `Tool '${toolName}' execution timed out after ${timeoutMs}ms`,\n 'TOOL_TIMEOUT',\n 408\n );\n this.name = 'ToolTimeoutError';\n Object.setPrototypeOf(this, ToolTimeoutError.prototype);\n }\n}\n\nexport class ToolNotFoundError extends AIError {\n constructor(toolName: string) {\n super(\n `Tool '${toolName}' not found. Did you register it with the agent?`,\n 'TOOL_NOT_FOUND',\n 404\n );\n this.name = 'ToolNotFoundError';\n Object.setPrototypeOf(this, ToolNotFoundError.prototype);\n }\n}\n\nexport class ModelNotSupportedError extends AIError {\n constructor(providerName: string, model: string, capability: string) {\n super(\n `Model '${model}' from ${providerName} does not support ${capability}`,\n 'MODEL_NOT_SUPPORTED',\n 400\n );\n this.name = 'ModelNotSupportedError';\n Object.setPrototypeOf(this, ModelNotSupportedError.prototype);\n }\n}\n\nexport class InvalidConfigError extends AIError {\n constructor(message: string) {\n super(message, 'INVALID_CONFIG', 400);\n this.name = 'InvalidConfigError';\n Object.setPrototypeOf(this, InvalidConfigError.prototype);\n }\n}\n\nexport class InvalidToolArgumentsError extends AIError {\n constructor(\n toolName: string,\n public readonly rawArguments: string,\n public readonly parseError?: Error\n ) {\n super(\n `Invalid arguments for tool '${toolName}': ${parseError?.message || 'Failed to parse JSON'}`,\n 'INVALID_TOOL_ARGUMENTS',\n 400,\n parseError\n );\n this.name = 'InvalidToolArgumentsError';\n Object.setPrototypeOf(this, InvalidToolArgumentsError.prototype);\n }\n}\n\nexport class ProviderError extends AIError {\n constructor(\n public readonly providerName: string,\n message: string,\n statusCode?: number,\n originalError?: Error\n ) {\n super(\n `${providerName}: ${message}`,\n 'PROVIDER_ERROR',\n statusCode,\n originalError\n );\n this.name = 'ProviderError';\n Object.setPrototypeOf(this, ProviderError.prototype);\n }\n}\n\n// ============ TaskAgent Errors ============\n\n/**\n * Error thrown when a dependency cycle is detected in a plan\n */\nexport class DependencyCycleError extends AIError {\n constructor(\n /** Task IDs forming the cycle (e.g., ['A', 'B', 'C', 'A']) */\n public readonly cycle: string[],\n /** Plan ID where the cycle was detected */\n public readonly planId?: string\n ) {\n super(\n `Dependency cycle detected: ${cycle.join(' -> ')}`,\n 'DEPENDENCY_CYCLE',\n 400\n );\n this.name = 'DependencyCycleError';\n Object.setPrototypeOf(this, DependencyCycleError.prototype);\n }\n}\n\n/**\n * Error thrown when a task execution times out\n */\nexport class TaskTimeoutError extends AIError {\n constructor(\n public readonly taskId: string,\n public readonly taskName: string,\n public readonly timeoutMs: number\n ) {\n super(\n `Task '${taskName}' (${taskId}) timed out after ${timeoutMs}ms`,\n 'TASK_TIMEOUT',\n 408\n );\n this.name = 'TaskTimeoutError';\n Object.setPrototypeOf(this, TaskTimeoutError.prototype);\n }\n}\n\n/**\n * Error thrown when task completion validation fails\n */\nexport class TaskValidationError extends AIError {\n constructor(\n public readonly taskId: string,\n public readonly taskName: string,\n public readonly reason: string\n ) {\n super(\n `Task '${taskName}' (${taskId}) validation failed: ${reason}`,\n 'TASK_VALIDATION_ERROR',\n 422\n );\n this.name = 'TaskValidationError';\n Object.setPrototypeOf(this, TaskValidationError.prototype);\n }\n}\n\n/**\n * Task failure info for parallel execution\n */\nexport interface TaskFailure {\n taskId: string;\n taskName: string;\n error: Error;\n}\n\n/**\n * Error thrown when multiple tasks fail in parallel execution (fail-all mode)\n */\nexport class ParallelTasksError extends AIError {\n constructor(\n /** Array of task failures */\n public readonly failures: TaskFailure[]\n ) {\n const names = failures.map((f) => f.taskName).join(', ');\n super(\n `Multiple tasks failed in parallel execution: ${names}`,\n 'PARALLEL_TASKS_ERROR',\n 500\n );\n this.name = 'ParallelTasksError';\n Object.setPrototypeOf(this, ParallelTasksError.prototype);\n }\n\n /**\n * Get all failure errors\n */\n getErrors(): Error[] {\n return this.failures.map((f) => f.error);\n }\n\n /**\n * Get failed task IDs\n */\n getFailedTaskIds(): string[] {\n return this.failures.map((f) => f.taskId);\n }\n}\n\n// ============ Context Management Errors ============\n\n/**\n * Detailed budget information for context overflow diagnosis\n */\nexport interface ContextOverflowBudget {\n actualTokens: number;\n maxTokens: number;\n overageTokens: number;\n breakdown: Record<string, number>;\n degradationLog: string[];\n}\n\n/**\n * Error thrown when context cannot be reduced to fit within limits\n * after all graceful degradation levels have been exhausted.\n */\nexport class ContextOverflowError extends AIError {\n constructor(\n message: string,\n /** Detailed budget information for debugging */\n public readonly budget: ContextOverflowBudget\n ) {\n super(\n `Context overflow: ${message}. Actual: ${budget.actualTokens}, Max: ${budget.maxTokens}, Overage: ${budget.overageTokens}`,\n 'CONTEXT_OVERFLOW',\n 413\n );\n this.name = 'ContextOverflowError';\n Object.setPrototypeOf(this, ContextOverflowError.prototype);\n }\n\n /**\n * Get a formatted summary of what was tried\n */\n getDegradationSummary(): string {\n return this.budget.degradationLog.join('\\n');\n }\n\n /**\n * Get the top token consumers\n */\n getTopConsumers(count = 5): Array<{ component: string; tokens: number }> {\n return Object.entries(this.budget.breakdown)\n .map(([component, tokens]) => ({ component, tokens }))\n .sort((a, b) => b.tokens - a.tokens)\n .slice(0, count);\n }\n}\n","/**\n * Base provider class with common functionality\n */\n\nimport { IProvider, ProviderCapabilities } from '../../../domain/interfaces/IProvider.js';\nimport { ProviderConfig } from '../../../domain/types/ProviderConfig.js';\nimport { InvalidConfigError } from '../../../domain/errors/AIErrors.js';\n\nexport abstract class BaseProvider implements IProvider {\n abstract readonly name: string;\n abstract readonly capabilities: ProviderCapabilities;\n\n constructor(protected config: ProviderConfig) {}\n\n /**\n * Validate provider configuration\n * Returns validation result with details\n */\n async validateConfig(): Promise<boolean> {\n const validation = this.validateApiKey();\n return validation.isValid;\n }\n\n /**\n * Validate API key format and presence\n * Can be overridden by providers with specific key formats\n */\n protected validateApiKey(): { isValid: boolean; warning?: string } {\n const apiKey = this.config.apiKey;\n\n // Check for presence\n if (!apiKey || apiKey.trim().length === 0) {\n return { isValid: false };\n }\n\n // Check for common placeholder values\n const placeholders = [\n 'your-api-key',\n 'YOUR_API_KEY',\n 'sk-xxx',\n 'api-key-here',\n 'REPLACE_ME',\n '<your-key>',\n ];\n\n if (placeholders.some((p) => apiKey.includes(p))) {\n return {\n isValid: false,\n warning: `API key appears to be a placeholder value`,\n };\n }\n\n // Provider-specific format validation (can be overridden)\n return this.validateProviderSpecificKeyFormat(apiKey);\n }\n\n /**\n * Override this method in provider implementations for specific key format validation\n */\n protected validateProviderSpecificKeyFormat(_apiKey: string): { isValid: boolean; warning?: string } {\n // Default: accept any non-empty key\n // Override in subclasses for provider-specific validation\n return { isValid: true };\n }\n\n /**\n * Validate config and throw if invalid\n */\n protected assertValidConfig(): void {\n const validation = this.validateApiKey();\n if (!validation.isValid) {\n throw new InvalidConfigError(\n `Invalid API key for provider '${this.name}'${validation.warning ? `: ${validation.warning}` : ''}`\n );\n }\n }\n\n /**\n * Get API key from config\n */\n protected getApiKey(): string {\n return this.config.apiKey;\n }\n\n /**\n * Get base URL if configured\n */\n protected getBaseURL(): string | undefined {\n return this.config.baseURL;\n }\n\n /**\n * Get timeout configuration\n */\n protected getTimeout(): number {\n return this.config.timeout || 60000; // 60s default\n }\n\n /**\n * Get max retries configuration\n */\n protected getMaxRetries(): number {\n return this.config.maxRetries || 3;\n }\n}\n","/**\n * Base media provider with common functionality for Image, Audio, and Video providers\n * Provides circuit breaker, logging, and metrics similar to BaseTextProvider\n */\n\nimport { BaseProvider } from './BaseProvider.js';\nimport type { IProvider } from '../../../domain/interfaces/IProvider.js';\nimport { CircuitBreaker, DEFAULT_CIRCUIT_BREAKER_CONFIG } from '../../resilience/CircuitBreaker.js';\nimport { logger, FrameworkLogger } from '../../observability/Logger.js';\nimport { metrics } from '../../observability/Metrics.js';\n\n/**\n * Base class for all media providers (Image, Audio, Video)\n * Follows the same patterns as BaseTextProvider for consistency\n */\nexport abstract class BaseMediaProvider extends BaseProvider implements IProvider {\n protected circuitBreaker?: CircuitBreaker;\n protected logger: FrameworkLogger;\n private _isObservabilityInitialized = false;\n\n constructor(config: any) {\n super(config);\n\n // Initialize with default logger (will be updated with provider name on first use)\n this.logger = logger.child({\n component: 'MediaProvider',\n provider: 'unknown',\n });\n\n // Circuit breaker created lazily on first use\n }\n\n /**\n * Auto-initialize observability on first use (lazy initialization)\n * This is called automatically by executeWithCircuitBreaker()\n * @internal\n */\n private ensureObservabilityInitialized(): void {\n if (this._isObservabilityInitialized) {\n return;\n }\n\n const providerName = this.name || 'unknown';\n\n // Create circuit breaker with provider name\n const cbConfig = (this.config as any).circuitBreaker || DEFAULT_CIRCUIT_BREAKER_CONFIG;\n this.circuitBreaker = new CircuitBreaker(\n `media-provider:${providerName}`,\n cbConfig\n );\n\n // Update logger with provider name\n this.logger = logger.child({\n component: 'MediaProvider',\n provider: providerName,\n });\n\n // Forward circuit breaker events to metrics\n this.circuitBreaker.on('opened', (data) => {\n this.logger.warn(data, 'Circuit breaker opened');\n metrics.increment('circuit_breaker.opened', 1, {\n breaker: data.name,\n provider: providerName,\n });\n });\n\n this.circuitBreaker.on('closed', (data) => {\n this.logger.info(data, 'Circuit breaker closed');\n metrics.increment('circuit_breaker.closed', 1, {\n breaker: data.name,\n provider: providerName,\n });\n });\n\n this._isObservabilityInitialized = true;\n }\n\n /**\n * Execute operation with circuit breaker protection\n * Automatically records metrics and handles errors\n *\n * @param operation - The async operation to execute\n * @param operationName - Name of the operation for metrics (e.g., 'image.generate', 'audio.synthesize')\n * @param metadata - Additional metadata to log/record\n */\n protected async executeWithCircuitBreaker<TResult>(\n operation: () => Promise<TResult>,\n operationName: string,\n metadata?: Record<string, unknown>\n ): Promise<TResult> {\n // Auto-initialize observability on first use\n this.ensureObservabilityInitialized();\n\n const startTime = Date.now();\n const metricLabels = {\n provider: this.name,\n operation: operationName,\n ...metadata,\n };\n\n try {\n // Execute through circuit breaker\n const result = await this.circuitBreaker!.execute(operation);\n\n // Record success metrics\n const duration = Date.now() - startTime;\n metrics.histogram(`${operationName}.duration`, duration, metricLabels);\n metrics.increment(`${operationName}.success`, 1, metricLabels);\n\n this.logger.debug(\n { operation: operationName, duration, ...metadata },\n 'Operation completed successfully'\n );\n\n return result;\n } catch (error) {\n // Record error metrics\n const duration = Date.now() - startTime;\n metrics.increment(`${operationName}.error`, 1, {\n ...metricLabels,\n error: error instanceof Error ? error.name : 'unknown',\n });\n\n this.logger.error(\n {\n operation: operationName,\n duration,\n error: error instanceof Error ? error.message : String(error),\n ...metadata,\n },\n 'Operation failed'\n );\n\n throw error;\n }\n }\n\n /**\n * Log operation start with context\n * Useful for logging before async operations\n */\n protected logOperationStart(operation: string, context: Record<string, unknown>): void {\n this.ensureObservabilityInitialized();\n this.logger.info({ operation, ...context }, `${operation} started`);\n }\n\n /**\n * Log operation completion with context\n */\n protected logOperationComplete(operation: string, context: Record<string, unknown>): void {\n this.ensureObservabilityInitialized();\n this.logger.info({ operation, ...context }, `${operation} completed`);\n }\n}\n","/**\n * OpenAI Image Generation provider\n * Supports: gpt-image-1, dall-e-3, dall-e-2\n */\n\nimport OpenAI from 'openai';\nimport * as fs from 'fs';\nimport { BaseMediaProvider } from '../base/BaseMediaProvider.js';\nimport type {\n IImageProvider,\n ImageGenerateOptions,\n ImageEditOptions,\n ImageVariationOptions,\n ImageResponse,\n} from '../../../domain/interfaces/IImageProvider.js';\nimport type { ProviderCapabilities } from '../../../domain/interfaces/IProvider.js';\nimport type { OpenAIMediaConfig } from '../../../domain/types/ProviderConfig.js';\nimport {\n ProviderAuthError,\n ProviderRateLimitError,\n ProviderError,\n} from '../../../domain/errors/AIErrors.js';\n\nexport class OpenAIImageProvider extends BaseMediaProvider implements IImageProvider {\n readonly name: string = 'openai-image';\n readonly vendor = 'openai' as const;\n readonly capabilities: ProviderCapabilities = {\n text: false,\n images: true,\n videos: false,\n audio: false,\n features: {\n imageGeneration: true,\n imageEditing: true,\n },\n };\n\n private client: OpenAI;\n\n constructor(config: OpenAIMediaConfig) {\n super({ apiKey: config.auth.apiKey, ...config });\n\n this.client = new OpenAI({\n apiKey: config.auth.apiKey,\n baseURL: config.baseURL,\n organization: config.organization,\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n });\n }\n\n /**\n * Generate images from a text prompt\n */\n async generateImage(options: ImageGenerateOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.generate', {\n model: options.model,\n size: options.size,\n quality: options.quality,\n n: options.n,\n });\n\n // gpt-image-1 doesn't support response_format parameter\n const isGptImage = options.model === 'gpt-image-1';\n\n const params: any = {\n model: options.model,\n prompt: options.prompt,\n size: options.size as any,\n quality: options.quality,\n style: options.style,\n n: options.n || 1,\n };\n\n // Only add response_format for models that support it\n if (!isGptImage) {\n params.response_format = options.response_format || 'b64_json';\n }\n\n const response = await this.client.images.generate(params);\n\n const data = response.data || [];\n\n this.logOperationComplete('image.generate', {\n model: options.model,\n imagesGenerated: data.length,\n });\n\n return {\n created: response.created,\n data: data.map((img) => ({\n url: img.url,\n b64_json: img.b64_json,\n revised_prompt: img.revised_prompt,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error; // TypeScript needs this\n }\n },\n 'image.generate',\n { model: options.model }\n );\n }\n\n /**\n * Edit an existing image with a prompt\n * Supported by: gpt-image-1, dall-e-2\n */\n async editImage(options: ImageEditOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.edit', {\n model: options.model,\n size: options.size,\n n: options.n,\n });\n\n // Prepare the image - handle both Buffer and file path\n const image = this.prepareImageInput(options.image);\n const mask = options.mask ? this.prepareImageInput(options.mask) : undefined;\n\n // gpt-image-1 doesn't support response_format parameter\n const isGptImage = options.model === 'gpt-image-1';\n\n const params: any = {\n model: options.model,\n image,\n prompt: options.prompt,\n mask,\n size: options.size as any,\n n: options.n || 1,\n };\n\n // Only add response_format for models that support it\n if (!isGptImage) {\n params.response_format = options.response_format || 'b64_json';\n }\n\n const response = await this.client.images.edit(params);\n\n const data = response.data || [];\n\n this.logOperationComplete('image.edit', {\n model: options.model,\n imagesGenerated: data.length,\n });\n\n return {\n created: response.created,\n data: data.map((img) => ({\n url: img.url,\n b64_json: img.b64_json,\n revised_prompt: img.revised_prompt,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.edit',\n { model: options.model }\n );\n }\n\n /**\n * Create variations of an existing image\n * Supported by: dall-e-2 only\n */\n async createVariation(options: ImageVariationOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.variation', {\n model: options.model,\n size: options.size,\n n: options.n,\n });\n\n // Prepare the image\n const image = this.prepareImageInput(options.image);\n\n const response = await this.client.images.createVariation({\n model: options.model,\n image,\n size: options.size as any,\n n: options.n || 1,\n response_format: options.response_format || 'b64_json',\n });\n\n const data = response.data || [];\n\n this.logOperationComplete('image.variation', {\n model: options.model,\n imagesGenerated: data.length,\n });\n\n return {\n created: response.created,\n data: data.map((img) => ({\n url: img.url,\n b64_json: img.b64_json,\n revised_prompt: img.revised_prompt,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.variation',\n { model: options.model }\n );\n }\n\n /**\n * List available image models\n */\n async listModels(): Promise<string[]> {\n return ['gpt-image-1', 'dall-e-3', 'dall-e-2'];\n }\n\n /**\n * Prepare image input (Buffer or file path) for OpenAI API\n */\n private prepareImageInput(image: Buffer | string): any {\n if (Buffer.isBuffer(image)) {\n // OpenAI accepts File objects, we create a blob-like structure\n return new File([new Uint8Array(image)], 'image.png', { type: 'image/png' });\n }\n\n // It's a file path - create a readable stream\n return fs.createReadStream(image);\n }\n\n /**\n * Handle OpenAI API errors\n */\n private handleError(error: any): never {\n const message = error.message || 'Unknown OpenAI API error';\n const status = error.status;\n\n if (status === 401) {\n throw new ProviderAuthError('openai', 'Invalid API key');\n }\n\n if (status === 429) {\n throw new ProviderRateLimitError('openai', message);\n }\n\n if (status === 400) {\n // Check for specific image-related errors\n if (message.includes('safety system')) {\n throw new ProviderError('openai', `Content policy violation: ${message}`);\n }\n throw new ProviderError('openai', `Bad request: ${message}`);\n }\n\n throw new ProviderError('openai', message);\n }\n}\n","/**\n * Google Imagen Image Generation provider\n * Supports: imagen-3.0-generate-002, imagen-3.0-fast-generate-001, imagen-3.0-capability-001\n */\n\nimport { GoogleGenAI } from '@google/genai';\nimport { BaseMediaProvider } from '../base/BaseMediaProvider.js';\nimport type {\n IImageProvider,\n ImageGenerateOptions,\n ImageEditOptions,\n ImageResponse,\n} from '../../../domain/interfaces/IImageProvider.js';\nimport type { ProviderCapabilities } from '../../../domain/interfaces/IProvider.js';\nimport type { GoogleConfig } from '../../../domain/types/ProviderConfig.js';\nimport {\n ProviderAuthError,\n ProviderRateLimitError,\n ProviderError,\n} from '../../../domain/errors/AIErrors.js';\n\n/**\n * Extended options for Google image generation\n */\nexport interface GoogleImageGenerateOptions extends ImageGenerateOptions {\n /** Negative prompt - what to avoid */\n negativePrompt?: string;\n /** Aspect ratio (1:1, 3:4, 4:3, 9:16, 16:9) */\n aspectRatio?: '1:1' | '3:4' | '4:3' | '9:16' | '16:9';\n /** Random seed for reproducible generation */\n seed?: number;\n /** Output MIME type */\n outputMimeType?: 'image/png' | 'image/jpeg';\n /** Include safety filter reason in response */\n includeRaiReason?: boolean;\n}\n\nexport class GoogleImageProvider extends BaseMediaProvider implements IImageProvider {\n readonly name: string = 'google-image';\n readonly vendor = 'google' as const;\n readonly capabilities: ProviderCapabilities = {\n text: false,\n images: true,\n videos: false,\n audio: false,\n features: {\n imageGeneration: true,\n imageEditing: true,\n },\n };\n\n private client: GoogleGenAI;\n\n constructor(config: GoogleConfig) {\n super(config);\n\n this.client = new GoogleGenAI({\n apiKey: config.apiKey,\n });\n }\n\n /**\n * Generate images from a text prompt using Google Imagen\n */\n async generateImage(options: ImageGenerateOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.generate', {\n model: options.model,\n n: options.n,\n });\n\n const googleOptions = options as GoogleImageGenerateOptions;\n\n const response = await this.client.models.generateImages({\n model: options.model,\n prompt: options.prompt,\n config: {\n numberOfImages: options.n || 1,\n negativePrompt: googleOptions.negativePrompt,\n aspectRatio: googleOptions.aspectRatio,\n seed: googleOptions.seed,\n outputMimeType: googleOptions.outputMimeType,\n includeRaiReason: googleOptions.includeRaiReason,\n },\n });\n\n const images = response.generatedImages || [];\n\n this.logOperationComplete('image.generate', {\n model: options.model,\n imagesGenerated: images.length,\n });\n\n return {\n created: Math.floor(Date.now() / 1000),\n data: images.map((img: any) => ({\n b64_json: img.image?.imageBytes,\n // Google doesn't provide URLs, only base64\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.generate',\n { model: options.model }\n );\n }\n\n /**\n * Edit an existing image using Imagen capability model\n * Uses imagen-3.0-capability-001\n */\n async editImage(options: ImageEditOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.edit', {\n model: options.model,\n n: options.n,\n });\n\n // Prepare the reference image\n const referenceImage = await this.prepareReferenceImage(options.image);\n\n const response = await this.client.models.editImage({\n model: options.model || 'imagen-3.0-capability-001',\n prompt: options.prompt,\n referenceImages: [referenceImage],\n config: {\n numberOfImages: options.n || 1,\n },\n });\n\n const images = response.generatedImages || [];\n\n this.logOperationComplete('image.edit', {\n model: options.model,\n imagesGenerated: images.length,\n });\n\n return {\n created: Math.floor(Date.now() / 1000),\n data: images.map((img: any) => ({\n b64_json: img.image?.imageBytes,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.edit',\n { model: options.model }\n );\n }\n\n /**\n * List available image models\n */\n async listModels(): Promise<string[]> {\n return [\n 'imagen-4.0-generate-001',\n 'imagen-4.0-ultra-generate-001',\n 'imagen-4.0-fast-generate-001',\n ];\n }\n\n /**\n * Prepare a reference image for Google's editImage API\n */\n private async prepareReferenceImage(image: Buffer | string): Promise<any> {\n let imageBytes: string;\n\n if (Buffer.isBuffer(image)) {\n imageBytes = image.toString('base64');\n } else {\n // It's a file path - read and convert\n const fs = await import('fs');\n const buffer = fs.readFileSync(image);\n imageBytes = buffer.toString('base64');\n }\n\n // Return a subject reference image structure\n return {\n referenceImage: {\n image: {\n imageBytes,\n },\n },\n referenceType: 'REFERENCE_TYPE_SUBJECT',\n };\n }\n\n /**\n * Handle Google API errors\n */\n private handleError(error: any): never {\n const message = error.message || 'Unknown Google API error';\n const status = error.status || error.code;\n\n if (status === 401 || message.includes('API key not valid')) {\n throw new ProviderAuthError('google', 'Invalid API key');\n }\n\n if (status === 429 || message.includes('Resource exhausted')) {\n throw new ProviderRateLimitError('google', message);\n }\n\n if (status === 400) {\n // Check for safety-related errors\n if (\n message.includes('SAFETY') ||\n message.includes('blocked') ||\n message.includes('Responsible AI')\n ) {\n throw new ProviderError('google', `Content policy violation: ${message}`);\n }\n throw new ProviderError('google', `Bad request: ${message}`);\n }\n\n throw new ProviderError('google', message);\n }\n}\n","/**\n * Grok (xAI) Image Generation Provider\n * Uses OpenAI-compatible API at api.x.ai\n * Supports: grok-imagine-image\n */\n\nimport OpenAI from 'openai';\nimport * as fs from 'fs';\nimport { BaseMediaProvider } from '../base/BaseMediaProvider.js';\nimport type {\n IImageProvider,\n ImageGenerateOptions,\n ImageEditOptions,\n ImageResponse,\n} from '../../../domain/interfaces/IImageProvider.js';\nimport type { ProviderCapabilities } from '../../../domain/interfaces/IProvider.js';\nimport type { GrokMediaConfig } from '../../../domain/types/ProviderConfig.js';\nimport {\n ProviderAuthError,\n ProviderRateLimitError,\n ProviderError,\n} from '../../../domain/errors/AIErrors.js';\n\nconst GROK_API_BASE_URL = 'https://api.x.ai/v1';\n\nexport class GrokImageProvider extends BaseMediaProvider implements IImageProvider {\n readonly name: string = 'grok-image';\n readonly vendor = 'grok' as const;\n readonly capabilities: ProviderCapabilities = {\n text: false,\n images: true,\n videos: false,\n audio: false,\n features: {\n imageGeneration: true,\n imageEditing: true,\n },\n };\n\n private client: OpenAI;\n\n constructor(config: GrokMediaConfig) {\n super({ apiKey: config.auth.apiKey, ...config });\n\n this.client = new OpenAI({\n apiKey: config.auth.apiKey,\n baseURL: config.baseURL || GROK_API_BASE_URL,\n timeout: config.timeout,\n maxRetries: config.maxRetries,\n });\n }\n\n /**\n * Generate images from a text prompt\n */\n async generateImage(options: ImageGenerateOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.generate', {\n model: options.model,\n size: options.size,\n quality: options.quality,\n n: options.n,\n });\n\n // xAI API uses aspect_ratio instead of size, and doesn't support quality\n const params: any = {\n model: options.model || 'grok-imagine-image',\n prompt: options.prompt,\n n: options.n || 1,\n response_format: options.response_format || 'b64_json',\n };\n\n // Add aspect_ratio if provided (xAI uses aspect_ratio, not size)\n if (options.aspectRatio) {\n params.aspect_ratio = options.aspectRatio;\n }\n\n const response = await this.client.images.generate(params);\n\n const data = response.data || [];\n\n this.logOperationComplete('image.generate', {\n model: options.model,\n imagesGenerated: data.length,\n });\n\n return {\n created: response.created,\n data: data.map((img) => ({\n url: img.url,\n b64_json: img.b64_json,\n revised_prompt: img.revised_prompt,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.generate',\n { model: options.model }\n );\n }\n\n /**\n * Edit an existing image with a prompt\n */\n async editImage(options: ImageEditOptions): Promise<ImageResponse> {\n return this.executeWithCircuitBreaker(\n async () => {\n try {\n this.logOperationStart('image.edit', {\n model: options.model,\n size: options.size,\n n: options.n,\n });\n\n // Prepare the image - handle both Buffer and file path\n const image = this.prepareImageInput(options.image);\n const mask = options.mask ? this.prepareImageInput(options.mask) : undefined;\n\n const params: any = {\n model: options.model || 'grok-imagine-image',\n image,\n prompt: options.prompt,\n mask,\n size: options.size as any,\n n: options.n || 1,\n response_format: options.response_format || 'b64_json',\n };\n\n const response = await this.client.images.edit(params);\n\n const data = response.data || [];\n\n this.logOperationComplete('image.edit', {\n model: options.model,\n imagesGenerated: data.length,\n });\n\n return {\n created: response.created,\n data: data.map((img) => ({\n url: img.url,\n b64_json: img.b64_json,\n revised_prompt: img.revised_prompt,\n })),\n };\n } catch (error: any) {\n this.handleError(error);\n throw error;\n }\n },\n 'image.edit',\n { model: options.model }\n );\n }\n\n /**\n * List available image models\n */\n async listModels(): Promise<string[]> {\n return ['grok-imagine-image'];\n }\n\n /**\n * Prepare image input (Buffer or file path) for API\n */\n private prepareImageInput(image: Buffer | string): any {\n if (Buffer.isBuffer(image)) {\n return new File([new Uint8Array(image)], 'image.png', { type: 'image/png' });\n }\n\n // It's a file path - create a readable stream\n return fs.createReadStream(image);\n }\n\n /**\n * Handle API errors\n */\n private handleError(error: any): never {\n const message = error.message || 'Unknown Grok API error';\n const status = error.status;\n\n if (status === 401) {\n throw new ProviderAuthError('grok', 'Invalid API key');\n }\n\n if (status === 429) {\n throw new ProviderRateLimitError('grok', message);\n }\n\n if (status === 400) {\n if (message.includes('safety') || message.includes('policy')) {\n throw new ProviderError('grok', `Content policy violation: ${message}`);\n }\n throw new ProviderError('grok', `Bad request: ${message}`);\n }\n\n throw new ProviderError('grok', message);\n }\n}\n","/**\n * Factory functions for creating image providers\n */\n\nimport { Connector } from './Connector.js';\nimport type { IImageProvider } from '../domain/interfaces/IImageProvider.js';\nimport { Vendor } from './Vendor.js';\nimport { OpenAIImageProvider } from '../infrastructure/providers/openai/OpenAIImageProvider.js';\nimport { GoogleImageProvider } from '../infrastructure/providers/google/GoogleImageProvider.js';\nimport { GrokImageProvider } from '../infrastructure/providers/grok/GrokImageProvider.js';\nimport type { OpenAIMediaConfig, GoogleConfig, GrokMediaConfig } from '../domain/types/ProviderConfig.js';\n\n/**\n * Create an Image Generation provider from a connector\n */\nexport function createImageProvider(connector: Connector): IImageProvider {\n const vendor = connector.vendor;\n\n switch (vendor) {\n case Vendor.OpenAI:\n return new OpenAIImageProvider(extractOpenAIConfig(connector));\n\n case Vendor.Google:\n return new GoogleImageProvider(extractGoogleConfig(connector));\n\n case Vendor.Grok:\n return new GrokImageProvider(extractGrokConfig(connector));\n\n default:\n throw new Error(\n `No Image provider available for vendor: ${vendor}. ` +\n `Supported vendors: ${Vendor.OpenAI}, ${Vendor.Google}, ${Vendor.Grok}`\n );\n }\n}\n\n/**\n * Extract OpenAI configuration from connector\n */\nfunction extractOpenAIConfig(connector: Connector): OpenAIMediaConfig {\n const auth = connector.config.auth;\n\n if (auth.type !== 'api_key') {\n throw new Error('OpenAI requires API key authentication');\n }\n\n const options = connector.getOptions();\n\n return {\n auth: {\n type: 'api_key',\n apiKey: auth.apiKey,\n },\n baseURL: connector.baseURL,\n organization: options.organization as string | undefined,\n timeout: options.timeout as number | undefined,\n maxRetries: options.maxRetries as number | undefined,\n };\n}\n\n/**\n * Extract Google configuration from connector\n */\nfunction extractGoogleConfig(connector: Connector): GoogleConfig {\n const auth = connector.config.auth;\n\n if (auth.type !== 'api_key') {\n throw new Error('Google requires API key authentication');\n }\n\n return {\n apiKey: auth.apiKey,\n };\n}\n\n/**\n * Extract Grok configuration from connector\n */\nfunction extractGrokConfig(connector: Connector): GrokMediaConfig {\n const auth = connector.config.auth;\n\n if (auth.type !== 'api_key') {\n throw new Error('Grok requires API key authentication');\n }\n\n const options = connector.getOptions();\n\n return {\n auth: {\n type: 'api_key',\n apiKey: auth.apiKey,\n },\n baseURL: connector.baseURL,\n timeout: options.timeout as number | undefined,\n maxRetries: options.maxRetries as number | undefined,\n };\n}\n","/**\n * Generic utilities for model registries\n * Eliminates code duplication across Image, TTS, STT, and Video registries\n */\n\nimport type { Vendor as VendorType } from '../../core/Vendor.js';\nimport type { IBaseModelDescription } from '../types/SharedTypes.js';\n\n/**\n * Creates standard helper functions for any model registry\n * This eliminates the need to write the same helper functions for each registry\n *\n * @example\n * ```typescript\n * const helpers = createRegistryHelpers(IMAGE_MODEL_REGISTRY);\n * export const getImageModelInfo = helpers.getInfo;\n * export const getImageModelsByVendor = helpers.getByVendor;\n * export const getActiveImageModels = helpers.getActive;\n * ```\n */\nexport function createRegistryHelpers<T extends IBaseModelDescription>(\n registry: Record<string, T>\n) {\n return {\n /**\n * Get model information by name\n */\n getInfo: (modelName: string): T | undefined => {\n return registry[modelName];\n },\n\n /**\n * Get all active models for a specific vendor\n */\n getByVendor: (vendor: VendorType): T[] => {\n return Object.values(registry).filter(\n (model) => model.provider === vendor && model.isActive\n );\n },\n\n /**\n * Get all currently active models (across all vendors)\n */\n getActive: (): T[] => {\n return Object.values(registry).filter((model) => model.isActive);\n },\n\n /**\n * Get all models (including inactive/deprecated)\n */\n getAll: (): T[] => {\n return Object.values(registry);\n },\n\n /**\n * Check if model exists in registry\n */\n has: (modelName: string): boolean => {\n return modelName in registry;\n },\n };\n}\n\n/**\n * Creates feature-based filter for registries with capabilities\n * Used to find models that support specific features\n *\n * @example\n * ```typescript\n * const filter = createCapabilityFilter(IMAGE_MODEL_REGISTRY);\n * const modelsWithInpainting = filter.withFeature('inputModes').filter(\n * m => m.capabilities.inputModes.inpainting\n * );\n * ```\n */\nexport function createCapabilityFilter<\n T extends IBaseModelDescription & { capabilities: Record<string, unknown> }\n>(registry: Record<string, T>) {\n return {\n /**\n * Get models that have a specific capability feature\n * @param feature - The capability feature to filter by\n * @param value - Optional specific value to match (if undefined, just checks truthy)\n */\n withFeature: <K extends keyof T['capabilities']>(\n feature: K,\n value?: T['capabilities'][K]\n ): T[] => {\n return Object.values(registry).filter((model) => {\n if (!model.isActive) return false;\n\n const capValue = (model.capabilities as Record<string, unknown>)[feature as string];\n\n // If specific value provided, match exactly\n if (value !== undefined) {\n return capValue === value;\n }\n\n // Otherwise check if feature exists and is truthy\n return Array.isArray(capValue) ? capValue.length > 0 : Boolean(capValue);\n });\n },\n };\n}\n","/**\n * Image generation model registry with comprehensive metadata\n */\n\nimport { Vendor } from '../../core/Vendor.js';\nimport type { IBaseModelDescription, VendorOptionSchema } from '../types/SharedTypes.js';\nimport { createRegistryHelpers } from './RegistryUtils.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Supported image sizes by model\n */\nexport type ImageSize =\n | '256x256'\n | '512x512'\n | '1024x1024'\n | '1024x1536'\n | '1536x1024'\n | '1792x1024'\n | '1024x1792'\n | 'auto';\n\n/**\n * Supported aspect ratios\n */\nexport type AspectRatio = '1:1' | '3:4' | '4:3' | '9:16' | '16:9' | '3:2' | '2:3';\n\n/**\n * Image model capabilities\n */\nexport interface ImageModelCapabilities {\n /** Supported image sizes */\n sizes: readonly ImageSize[];\n\n /** Supported aspect ratios (Google) */\n aspectRatios?: readonly AspectRatio[];\n\n /** Maximum number of images per request */\n maxImagesPerRequest: number;\n\n /** Supported output formats */\n outputFormats: readonly string[];\n\n /** Feature support flags */\n features: {\n /** Text-to-image generation */\n generation: boolean;\n /** Image editing/inpainting */\n editing: boolean;\n /** Image variations */\n variations: boolean;\n /** Style control */\n styleControl: boolean;\n /** Quality control (standard/hd) */\n qualityControl: boolean;\n /** Transparent backgrounds */\n transparency: boolean;\n /** Prompt revision/enhancement */\n promptRevision: boolean;\n };\n\n /** Model limits */\n limits: {\n /** Maximum prompt length in characters */\n maxPromptLength: number;\n /** Rate limit (requests per minute) */\n maxRequestsPerMinute?: number;\n };\n\n /** Vendor-specific options schema */\n vendorOptions?: Record<string, VendorOptionSchema>;\n}\n\n/**\n * Image model pricing\n */\nexport interface ImageModelPricing {\n /** Cost per image at standard quality */\n perImageStandard?: number;\n /** Cost per image at HD quality */\n perImageHD?: number;\n /** Cost per image (flat rate) */\n perImage?: number;\n currency: 'USD';\n}\n\n/**\n * Complete image model description\n */\nexport interface IImageModelDescription extends IBaseModelDescription {\n capabilities: ImageModelCapabilities;\n pricing?: ImageModelPricing;\n}\n\n// =============================================================================\n// Model Constants\n// =============================================================================\n\nexport const IMAGE_MODELS = {\n [Vendor.OpenAI]: {\n /** GPT-Image-1: Latest OpenAI image model with best quality */\n GPT_IMAGE_1: 'gpt-image-1',\n /** DALL-E 3: High quality image generation */\n DALL_E_3: 'dall-e-3',\n /** DALL-E 2: Fast, supports editing and variations */\n DALL_E_2: 'dall-e-2',\n },\n [Vendor.Google]: {\n /** Imagen 4.0: Latest Google image generation model */\n IMAGEN_4_GENERATE: 'imagen-4.0-generate-001',\n /** Imagen 4.0 Ultra: Highest quality */\n IMAGEN_4_ULTRA: 'imagen-4.0-ultra-generate-001',\n /** Imagen 4.0 Fast: Optimized for speed */\n IMAGEN_4_FAST: 'imagen-4.0-fast-generate-001',\n },\n [Vendor.Grok]: {\n /** Grok Imagine Image: xAI image generation with editing support */\n GROK_IMAGINE_IMAGE: 'grok-imagine-image',\n /** Grok 2 Image: xAI image generation (text-only input) */\n GROK_2_IMAGE_1212: 'grok-2-image-1212',\n },\n} as const;\n\n// =============================================================================\n// Registry\n// =============================================================================\n\n/**\n * Complete image model registry\n * Last full audit: January 2026\n */\nexport const IMAGE_MODEL_REGISTRY: Record<string, IImageModelDescription> = {\n // ======================== OpenAI ========================\n\n 'gpt-image-1': {\n name: 'gpt-image-1',\n displayName: 'GPT-Image-1',\n provider: Vendor.OpenAI,\n description: 'OpenAI latest image generation model with best quality and features',\n isActive: true,\n releaseDate: '2025-04-01',\n sources: {\n documentation: 'https://platform.openai.com/docs/guides/images',\n pricing: 'https://openai.com/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['1024x1024', '1024x1536', '1536x1024', 'auto'],\n maxImagesPerRequest: 10,\n outputFormats: ['png', 'webp', 'jpeg'],\n features: {\n generation: true,\n editing: true,\n variations: false,\n styleControl: false,\n qualityControl: true,\n transparency: true,\n promptRevision: false,\n },\n limits: { maxPromptLength: 32000 },\n vendorOptions: {\n quality: {\n type: 'enum',\n label: 'Quality',\n description: 'Image quality level',\n enum: ['auto', 'low', 'medium', 'high'],\n default: 'auto',\n controlType: 'select',\n },\n background: {\n type: 'enum',\n label: 'Background',\n description: 'Background transparency',\n enum: ['auto', 'transparent', 'opaque'],\n default: 'auto',\n controlType: 'select',\n },\n output_format: {\n type: 'enum',\n label: 'Output Format',\n description: 'Image file format',\n enum: ['png', 'jpeg', 'webp'],\n default: 'png',\n controlType: 'select',\n },\n output_compression: {\n type: 'number',\n label: 'Compression',\n description: 'Compression level for JPEG/WebP (0-100)',\n min: 0,\n max: 100,\n default: 75,\n controlType: 'slider',\n },\n moderation: {\n type: 'enum',\n label: 'Moderation',\n description: 'Content moderation strictness',\n enum: ['auto', 'low'],\n default: 'auto',\n controlType: 'radio',\n },\n },\n },\n pricing: {\n perImageStandard: 0.011,\n perImageHD: 0.042,\n currency: 'USD',\n },\n },\n\n 'dall-e-3': {\n name: 'dall-e-3',\n displayName: 'DALL-E 3',\n provider: Vendor.OpenAI,\n description: 'High quality image generation with prompt revision',\n isActive: true,\n releaseDate: '2023-11-06',\n deprecationDate: '2026-05-12',\n sources: {\n documentation: 'https://platform.openai.com/docs/guides/images',\n pricing: 'https://openai.com/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['1024x1024', '1024x1792', '1792x1024'],\n maxImagesPerRequest: 1,\n outputFormats: ['png', 'url'],\n features: {\n generation: true,\n editing: false,\n variations: false,\n styleControl: true,\n qualityControl: true,\n transparency: false,\n promptRevision: true,\n },\n limits: { maxPromptLength: 4000 },\n vendorOptions: {\n quality: {\n type: 'enum',\n label: 'Quality',\n description: 'Image quality: standard or HD',\n enum: ['standard', 'hd'],\n default: 'standard',\n controlType: 'radio',\n },\n style: {\n type: 'enum',\n label: 'Style',\n description: 'Image style: vivid (hyper-real) or natural',\n enum: ['vivid', 'natural'],\n default: 'vivid',\n controlType: 'radio',\n },\n },\n },\n pricing: {\n perImageStandard: 0.040,\n perImageHD: 0.080,\n currency: 'USD',\n },\n },\n\n 'dall-e-2': {\n name: 'dall-e-2',\n displayName: 'DALL-E 2',\n provider: Vendor.OpenAI,\n description: 'Fast image generation with editing and variation support',\n isActive: true,\n releaseDate: '2022-11-03',\n deprecationDate: '2026-05-12',\n sources: {\n documentation: 'https://platform.openai.com/docs/guides/images',\n pricing: 'https://openai.com/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['256x256', '512x512', '1024x1024'],\n maxImagesPerRequest: 10,\n outputFormats: ['png', 'url'],\n features: {\n generation: true,\n editing: true,\n variations: true,\n styleControl: false,\n qualityControl: false,\n transparency: false,\n promptRevision: false,\n },\n limits: { maxPromptLength: 1000 },\n vendorOptions: {},\n },\n pricing: {\n perImage: 0.020,\n currency: 'USD',\n },\n },\n\n // ======================== Google ========================\n\n 'imagen-4.0-generate-001': {\n name: 'imagen-4.0-generate-001',\n displayName: 'Imagen 4.0 Generate',\n provider: Vendor.Google,\n description: 'Google Imagen 4.0 - standard quality image generation',\n isActive: true,\n releaseDate: '2025-06-01',\n sources: {\n documentation: 'https://ai.google.dev/gemini-api/docs/imagen',\n pricing: 'https://ai.google.dev/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['1024x1024'],\n aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],\n maxImagesPerRequest: 4,\n outputFormats: ['png', 'jpeg'],\n features: {\n generation: true,\n editing: false,\n variations: false,\n styleControl: false,\n qualityControl: false,\n transparency: false,\n promptRevision: false,\n },\n limits: { maxPromptLength: 480 },\n vendorOptions: {\n aspectRatio: {\n type: 'enum',\n label: 'Aspect Ratio',\n description: 'Output image proportions',\n enum: ['1:1', '3:4', '4:3', '16:9', '9:16'],\n default: '1:1',\n controlType: 'select',\n },\n sampleImageSize: {\n type: 'enum',\n label: 'Resolution',\n description: 'Output image resolution',\n enum: ['1K', '2K'],\n default: '1K',\n controlType: 'radio',\n },\n outputMimeType: {\n type: 'enum',\n label: 'Output Format',\n description: 'Image file format',\n enum: ['image/png', 'image/jpeg'],\n default: 'image/png',\n controlType: 'select',\n },\n negativePrompt: {\n type: 'string',\n label: 'Negative Prompt',\n description: 'Elements to avoid in the generated image',\n controlType: 'textarea',\n },\n personGeneration: {\n type: 'enum',\n label: 'Person Generation',\n description: 'Controls whether people can appear in images',\n enum: ['dont_allow', 'allow_adult', 'allow_all'],\n default: 'allow_adult',\n controlType: 'select',\n },\n safetyFilterLevel: {\n type: 'enum',\n label: 'Safety Filter',\n description: 'Content safety filtering threshold',\n enum: ['block_none', 'block_only_high', 'block_medium_and_above', 'block_low_and_above'],\n default: 'block_medium_and_above',\n controlType: 'select',\n },\n enhancePrompt: {\n type: 'boolean',\n label: 'Enhance Prompt',\n description: 'Use LLM-based prompt rewriting for better quality',\n default: true,\n controlType: 'checkbox',\n },\n seed: {\n type: 'number',\n label: 'Seed',\n description: 'Random seed for reproducible generation (1-2147483647)',\n min: 1,\n max: 2147483647,\n controlType: 'text',\n },\n addWatermark: {\n type: 'boolean',\n label: 'Add Watermark',\n description: 'Add invisible SynthID watermark',\n default: true,\n controlType: 'checkbox',\n },\n language: {\n type: 'enum',\n label: 'Prompt Language',\n description: 'Language of the input prompt',\n enum: ['auto', 'en', 'zh', 'zh-CN', 'zh-TW', 'hi', 'ja', 'ko', 'pt', 'es'],\n default: 'en',\n controlType: 'select',\n },\n },\n },\n pricing: {\n perImage: 0.04,\n currency: 'USD',\n },\n },\n\n 'imagen-4.0-ultra-generate-001': {\n name: 'imagen-4.0-ultra-generate-001',\n displayName: 'Imagen 4.0 Ultra',\n provider: Vendor.Google,\n description: 'Google Imagen 4.0 Ultra - highest quality image generation',\n isActive: true,\n releaseDate: '2025-06-01',\n sources: {\n documentation: 'https://ai.google.dev/gemini-api/docs/imagen',\n pricing: 'https://ai.google.dev/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['1024x1024'],\n aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],\n maxImagesPerRequest: 4,\n outputFormats: ['png', 'jpeg'],\n features: {\n generation: true,\n editing: false,\n variations: false,\n styleControl: false,\n qualityControl: true,\n transparency: false,\n promptRevision: false,\n },\n limits: { maxPromptLength: 480 },\n vendorOptions: {\n aspectRatio: {\n type: 'enum',\n label: 'Aspect Ratio',\n description: 'Output image proportions',\n enum: ['1:1', '3:4', '4:3', '16:9', '9:16'],\n default: '1:1',\n controlType: 'select',\n },\n sampleImageSize: {\n type: 'enum',\n label: 'Resolution',\n description: 'Output image resolution',\n enum: ['1K', '2K'],\n default: '1K',\n controlType: 'radio',\n },\n outputMimeType: {\n type: 'enum',\n label: 'Output Format',\n description: 'Image file format',\n enum: ['image/png', 'image/jpeg'],\n default: 'image/png',\n controlType: 'select',\n },\n negativePrompt: {\n type: 'string',\n label: 'Negative Prompt',\n description: 'Elements to avoid in the generated image',\n controlType: 'textarea',\n },\n personGeneration: {\n type: 'enum',\n label: 'Person Generation',\n description: 'Controls whether people can appear in images',\n enum: ['dont_allow', 'allow_adult', 'allow_all'],\n default: 'allow_adult',\n controlType: 'select',\n },\n safetyFilterLevel: {\n type: 'enum',\n label: 'Safety Filter',\n description: 'Content safety filtering threshold',\n enum: ['block_none', 'block_only_high', 'block_medium_and_above', 'block_low_and_above'],\n default: 'block_medium_and_above',\n controlType: 'select',\n },\n enhancePrompt: {\n type: 'boolean',\n label: 'Enhance Prompt',\n description: 'Use LLM-based prompt rewriting for better quality',\n default: true,\n controlType: 'checkbox',\n },\n seed: {\n type: 'number',\n label: 'Seed',\n description: 'Random seed for reproducible generation (1-2147483647)',\n min: 1,\n max: 2147483647,\n controlType: 'text',\n },\n addWatermark: {\n type: 'boolean',\n label: 'Add Watermark',\n description: 'Add invisible SynthID watermark',\n default: true,\n controlType: 'checkbox',\n },\n language: {\n type: 'enum',\n label: 'Prompt Language',\n description: 'Language of the input prompt',\n enum: ['auto', 'en', 'zh', 'zh-CN', 'zh-TW', 'hi', 'ja', 'ko', 'pt', 'es'],\n default: 'en',\n controlType: 'select',\n },\n },\n },\n pricing: {\n perImage: 0.08,\n currency: 'USD',\n },\n },\n\n 'imagen-4.0-fast-generate-001': {\n name: 'imagen-4.0-fast-generate-001',\n displayName: 'Imagen 4.0 Fast',\n provider: Vendor.Google,\n description: 'Google Imagen 4.0 Fast - optimized for speed',\n isActive: true,\n releaseDate: '2025-06-01',\n sources: {\n documentation: 'https://ai.google.dev/gemini-api/docs/imagen',\n pricing: 'https://ai.google.dev/pricing',\n lastVerified: '2026-01-25',\n },\n capabilities: {\n sizes: ['1024x1024'],\n aspectRatios: ['1:1', '3:4', '4:3', '9:16', '16:9'],\n maxImagesPerRequest: 4,\n outputFormats: ['png', 'jpeg'],\n features: {\n generation: true,\n editing: false,\n variations: false,\n styleControl: false,\n qualityControl: false,\n transparency: false,\n promptRevision: false,\n },\n limits: { maxPromptLength: 480 },\n vendorOptions: {\n aspectRatio: {\n type: 'enum',\n label: 'Aspect Ratio',\n description: 'Output image proportions',\n enum: ['1:1', '3:4', '4:3', '16:9', '9:16'],\n default: '1:1',\n controlType: 'select',\n },\n sampleImageSize: {\n type: 'enum',\n label: 'Resolution',\n description: 'Output image resolution',\n enum: ['1K', '2K'],\n default: '1K',\n controlType: 'radio',\n },\n outputMimeType: {\n type: 'enum',\n label: 'Output Format',\n description: 'Image file format',\n enum: ['image/png', 'image/jpeg'],\n default: 'image/png',\n controlType: 'select',\n },\n negativePrompt: {\n type: 'string',\n label: 'Negative Prompt',\n description: 'Elements to avoid in the generated image',\n controlType: 'textarea',\n },\n personGeneration: {\n type: 'enum',\n label: 'Person Generation',\n description: 'Controls whether people can appear in images',\n enum: ['dont_allow', 'allow_adult', 'allow_all'],\n default: 'allow_adult',\n controlType: 'select',\n },\n safetyFilterLevel: {\n type: 'enum',\n label: 'Safety Filter',\n description: 'Content safety filtering threshold',\n enum: ['block_none', 'block_only_high', 'block_medium_and_above', 'block_low_and_above'],\n default: 'block_medium_and_above',\n controlType: 'select',\n },\n enhancePrompt: {\n type: 'boolean',\n label: 'Enhance Prompt',\n description: 'Use LLM-based prompt rewriting for better quality',\n default: true,\n controlType: 'checkbox',\n },\n seed: {\n type: 'number',\n label: 'Seed',\n description: 'Random seed for reproducible generation (1-2147483647)',\n min: 1,\n max: 2147483647,\n controlType: 'text',\n },\n addWatermark: {\n type: 'boolean',\n label: 'Add Watermark',\n description: 'Add invisible SynthID watermark',\n default: true,\n controlType: 'checkbox',\n },\n language: {\n type: 'enum',\n label: 'Prompt Language',\n description: 'Language of the input prompt',\n enum: ['auto', 'en', 'zh', 'zh-CN', 'zh-TW', 'hi', 'ja', 'ko', 'pt', 'es'],\n default: 'en',\n controlType: 'select',\n },\n },\n },\n pricing: {\n perImage: 0.02,\n currency: 'USD',\n },\n },\n\n // ======================== xAI Grok ========================\n\n 'grok-imagine-image': {\n name: 'grok-imagine-image',\n displayName: 'Grok Imagine Image',\n provider: Vendor.Grok,\n description: 'xAI Grok Imagine image generation with aspect ratio control and editing support',\n isActive: true,\n releaseDate: '2025-01-01',\n sources: {\n documentation: 'https://docs.x.ai/docs/guides/image-generation',\n pricing: 'https://docs.x.ai/docs/models',\n lastVerified: '2026-02-01',\n },\n capabilities: {\n sizes: ['1024x1024'],\n aspectRatios: ['1:1', '4:3', '3:4', '16:9', '9:16', '3:2', '2:3'],\n maxImagesPerRequest: 10,\n outputFormats: ['png', 'jpeg'],\n features: {\n generation: true,\n editing: true,\n variations: false,\n styleControl: false,\n qualityControl: false, // quality not supported by xAI API\n transparency: false,\n promptRevision: true,\n },\n limits: { maxPromptLength: 4096 },\n vendorOptions: {\n n: {\n type: 'number',\n label: 'Number of Images',\n description: 'Number of images to generate (1-10)',\n min: 1,\n max: 10,\n default: 1,\n controlType: 'slider',\n },\n response_format: {\n type: 'enum',\n label: 'Response Format',\n description: 'Format of the returned image',\n enum: ['url', 'b64_json'],\n default: 'url',\n controlType: 'radio',\n },\n },\n },\n pricing: {\n perImage: 0.02,\n currency: 'USD',\n },\n },\n\n 'grok-2-image-1212': {\n name: 'grok-2-image-1212',\n displayName: 'Grok 2 Image',\n provider: Vendor.Grok,\n description: 'xAI Grok 2 image generation (text-only input, no editing)',\n isActive: true,\n releaseDate: '2024-12-12',\n sources: {\n documentation: 'https://docs.x.ai/docs/guides/image-generation',\n pricing: 'https://docs.x.ai/docs/models',\n lastVerified: '2026-02-01',\n },\n capabilities: {\n sizes: ['1024x1024'],\n aspectRatios: ['1:1', '4:3', '3:4', '16:9', '9:16', '3:2', '2:3'],\n maxImagesPerRequest: 10,\n outputFormats: ['png', 'jpeg'],\n features: {\n generation: true,\n editing: false,\n variations: false,\n styleControl: false,\n qualityControl: false, // quality not supported by xAI API\n transparency: false,\n promptRevision: false,\n },\n limits: { maxPromptLength: 4096 },\n vendorOptions: {\n n: {\n type: 'number',\n label: 'Number of Images',\n description: 'Number of images to generate (1-10)',\n min: 1,\n max: 10,\n default: 1,\n controlType: 'slider',\n },\n response_format: {\n type: 'enum',\n label: 'Response Format',\n description: 'Format of the returned image',\n enum: ['url', 'b64_json'],\n default: 'url',\n controlType: 'radio',\n },\n },\n },\n pricing: {\n perImage: 0.07,\n currency: 'USD',\n },\n },\n};\n\n// =============================================================================\n// Helper Functions (using shared utilities)\n// =============================================================================\n\nconst helpers = createRegistryHelpers(IMAGE_MODEL_REGISTRY);\n\nexport const getImageModelInfo = helpers.getInfo;\nexport const getImageModelsByVendor = helpers.getByVendor;\nexport const getActiveImageModels = helpers.getActive;\n\n/**\n * Get image models that support a specific feature\n */\nexport function getImageModelsWithFeature(\n feature: keyof IImageModelDescription['capabilities']['features']\n): IImageModelDescription[] {\n return Object.values(IMAGE_MODEL_REGISTRY).filter(\n (model) => model.isActive && model.capabilities.features[feature]\n );\n}\n\n/**\n * Calculate estimated cost for image generation\n */\nexport function calculateImageCost(\n modelName: string,\n imageCount: number,\n quality: 'standard' | 'hd' = 'standard'\n): number | null {\n const model = getImageModelInfo(modelName);\n if (!model?.pricing) return null;\n\n if (model.pricing.perImage) {\n return imageCount * model.pricing.perImage;\n }\n\n const pricePerImage =\n quality === 'hd' ? model.pricing.perImageHD : model.pricing.perImageStandard;\n\n if (!pricePerImage) return null;\n return imageCount * pricePerImage;\n}\n","/**\n * ImageGeneration - High-level image generation capability\n *\n * Provides a unified interface for generating images across multiple vendors.\n *\n * @example\n * ```typescript\n * import { ImageGeneration, Connector, Vendor } from '@oneringai/agents';\n *\n * Connector.create({\n * name: 'openai',\n * vendor: Vendor.OpenAI,\n * auth: { type: 'api_key', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * const imageGen = ImageGeneration.create({ connector: 'openai' });\n *\n * const result = await imageGen.generate({\n * prompt: 'A futuristic city at sunset',\n * model: 'dall-e-3',\n * size: '1024x1024',\n * quality: 'hd',\n * });\n *\n * // Get base64 data\n * console.log(result.data[0].b64_json);\n * ```\n */\n\nimport { Connector } from '../../core/Connector.js';\nimport { createImageProvider } from '../../core/createImageProvider.js';\nimport type {\n IImageProvider,\n ImageGenerateOptions,\n ImageEditOptions,\n ImageVariationOptions,\n ImageResponse,\n} from '../../domain/interfaces/IImageProvider.js';\nimport { IMAGE_MODELS, getImageModelInfo } from '../../domain/entities/ImageModel.js';\nimport { Vendor } from '../../core/Vendor.js';\n\n/**\n * Options for creating an ImageGeneration instance\n */\nexport interface ImageGenerationCreateOptions {\n /** Connector name or instance */\n connector: string | Connector;\n}\n\n/**\n * Simplified options for quick generation\n */\nexport interface SimpleGenerateOptions {\n /** Text prompt describing the image */\n prompt: string;\n /** Model to use (defaults to vendor's best model) */\n model?: string;\n /** Image size */\n size?: string;\n /** Quality setting */\n quality?: 'standard' | 'hd';\n /** Style setting (DALL-E 3 only) */\n style?: 'vivid' | 'natural';\n /** Number of images to generate */\n n?: number;\n /** Response format */\n response_format?: 'url' | 'b64_json';\n}\n\n/**\n * ImageGeneration capability class\n */\nexport class ImageGeneration {\n private provider: IImageProvider;\n private connector: Connector;\n private defaultModel: string;\n\n private constructor(connector: Connector) {\n this.connector = connector;\n this.provider = createImageProvider(connector);\n this.defaultModel = this.getDefaultModel();\n }\n\n /**\n * Create an ImageGeneration instance\n */\n static create(options: ImageGenerationCreateOptions): ImageGeneration {\n const connector =\n typeof options.connector === 'string'\n ? Connector.get(options.connector)\n : options.connector;\n\n if (!connector) {\n throw new Error(`Connector not found: ${options.connector}`);\n }\n\n return new ImageGeneration(connector);\n }\n\n /**\n * Generate images from a text prompt\n */\n async generate(options: SimpleGenerateOptions): Promise<ImageResponse> {\n const fullOptions: ImageGenerateOptions = {\n model: options.model || this.defaultModel,\n prompt: options.prompt,\n size: options.size,\n quality: options.quality,\n style: options.style,\n n: options.n,\n response_format: options.response_format || 'b64_json',\n };\n\n return this.provider.generateImage(fullOptions);\n }\n\n /**\n * Edit an existing image\n * Note: Not all models/vendors support this\n */\n async edit(options: ImageEditOptions): Promise<ImageResponse> {\n if (!this.provider.editImage) {\n throw new Error(`Image editing not supported by ${this.provider.name}`);\n }\n\n const fullOptions: ImageEditOptions = {\n ...options,\n model: options.model || this.getEditModel(),\n };\n\n return this.provider.editImage(fullOptions);\n }\n\n /**\n * Create variations of an existing image\n * Note: Only DALL-E 2 supports this\n */\n async createVariation(options: ImageVariationOptions): Promise<ImageResponse> {\n if (!this.provider.createVariation) {\n throw new Error(`Image variations not supported by ${this.provider.name}`);\n }\n\n const fullOptions: ImageVariationOptions = {\n ...options,\n model: options.model || 'dall-e-2', // Only DALL-E 2 supports variations\n };\n\n return this.provider.createVariation(fullOptions);\n }\n\n /**\n * List available models for this provider\n */\n async listModels(): Promise<string[]> {\n if (this.provider.listModels) {\n return this.provider.listModels();\n }\n\n // Fallback to registry\n const vendor = this.connector.vendor;\n if (vendor && IMAGE_MODELS[vendor as keyof typeof IMAGE_MODELS]) {\n return Object.values(IMAGE_MODELS[vendor as keyof typeof IMAGE_MODELS]);\n }\n\n return [];\n }\n\n /**\n * Get information about a specific model\n */\n getModelInfo(modelName: string) {\n return getImageModelInfo(modelName);\n }\n\n /**\n * Get the underlying provider\n */\n getProvider(): IImageProvider {\n return this.provider;\n }\n\n /**\n * Get the current connector\n */\n getConnector(): Connector {\n return this.connector;\n }\n\n /**\n * Get the default model for this vendor\n */\n private getDefaultModel(): string {\n const vendor = this.connector.vendor;\n\n switch (vendor) {\n case Vendor.OpenAI:\n return IMAGE_MODELS[Vendor.OpenAI].DALL_E_3;\n case Vendor.Google:\n return IMAGE_MODELS[Vendor.Google].IMAGEN_4_GENERATE;\n case Vendor.Grok:\n return IMAGE_MODELS[Vendor.Grok].GROK_IMAGINE_IMAGE;\n default:\n throw new Error(`No default image model for vendor: ${vendor}`);\n }\n }\n\n /**\n * Get the default edit model for this vendor\n */\n private getEditModel(): string {\n const vendor = this.connector.vendor;\n\n switch (vendor) {\n case Vendor.OpenAI:\n return IMAGE_MODELS[Vendor.OpenAI].GPT_IMAGE_1;\n case Vendor.Google:\n // Imagen 4 doesn't have a separate editing model yet\n return IMAGE_MODELS[Vendor.Google].IMAGEN_4_GENERATE;\n case Vendor.Grok:\n // grok-imagine-image supports editing\n return IMAGE_MODELS[Vendor.Grok].GROK_IMAGINE_IMAGE;\n default:\n throw new Error(`No edit model for vendor: ${vendor}`);\n }\n }\n}\n"]}