{"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/infrastructure/storage/FileStorage.ts","../../../src/connectors/oauth/OAuthManager.ts","../../../src/core/StorageRegistry.ts","../../../src/infrastructure/resilience/CircuitBreaker.ts","../../../src/infrastructure/resilience/BackoffStrategy.ts","../../../src/infrastructure/observability/Logger.ts","../../../src/infrastructure/observability/Metrics.ts","../../../src/core/ScopedConnectorRegistry.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/extractProviderConfig.ts","../../../src/core/createImageProvider.ts","../../../src/domain/entities/RegistryUtils.ts","../../../src/domain/entities/ImageModel.ts","../../../src/capabilities/images/ImageGeneration.ts"],"names":["crypto","crypto2","createPrivateKey","fs","importPKCS8","SignJWT","fs2","crypto3","path","EventEmitter","path2","fs3","randomUUID","OpenAI","fs4","GoogleGenAI","fs5"],"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   * List all storage keys (for account enumeration)\n   */\n  async listKeys(): Promise<string[]> {\n    return Array.from(this.tokens.keys());\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 (and optionally account-scoped) storage key.\n   *\n   * Output is exactly two shapes:\n   * - **2-part** `baseKey` — system / app-level (no userId, no accountId).\n   * - **4-part** `baseKey:userId:accountId` — user-scoped, with `'default'`\n   *   substituted for whichever component the caller omitted.\n   *\n   * The previous 3-part `baseKey:userId` shape (userId without accountId) is\n   * deliberately gone. Strict host storage adapters (e.g. v25\n   * MongoTokenStorage) reject 3-part keys because the contract is \"system\n   * tokens are 2-part, user tokens always carry an accountId\" — a 3-part key\n   * is ambiguous between the two. Defaulting accountId to `'default'`\n   * collapses the bug class without losing any information: callers that\n   * pass only userId continue to see exactly one token per user, just under\n   * the explicit 4-part key now.\n   *\n   * @param userId - User identifier (optional, defaults to single-user mode)\n   * @param accountId - Account alias for multi-account support (optional)\n   * @returns Storage key — always 2 parts (system) or 4 parts (user)\n   */\n  private getScopedKey(userId?: string, accountId?: string): string {\n    const hasUser = !!(userId && userId !== 'default');\n    const hasAccount = !!accountId;\n    if (!hasUser && !hasAccount) {\n      // Single-user / system mode (backward compatible).\n      return this.baseStorageKey;\n    }\n    const userPart = hasUser ? userId! : 'default';\n    const accountPart = hasAccount ? accountId! : 'default';\n    return `${this.baseStorageKey}:${userPart}:${accountPart}`;\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async storeToken(tokenResponse: any, userId?: string, accountId?: 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, accountId);\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async getAccessToken(userId?: string, accountId?: string): Promise<string> {\n    const key = this.getScopedKey(userId, accountId);\n    const token = await this.storage.getToken(key);\n    if (!token) {\n      const userLabel = userId ? `user: ${userId}` : 'default user';\n      const accountLabel = accountId ? `, account: ${accountId}` : '';\n      throw new Error(`No token stored for ${userLabel}${accountLabel}`);\n    }\n    return token.access_token;\n  }\n\n  /**\n   * Get refresh token\n   * @param userId - Optional user identifier for multi-user support\n   * @param accountId - Optional account alias for multi-account support\n   */\n  async getRefreshToken(userId?: string, accountId?: string): Promise<string> {\n    const key = this.getScopedKey(userId, accountId);\n    const token = await this.storage.getToken(key);\n    if (!token?.refresh_token) {\n      const userLabel = userId ? `user: ${userId}` : 'default user';\n      const accountLabel = accountId ? `, account: ${accountId}` : '';\n      throw new Error(`No refresh token available for ${userLabel}${accountLabel}`);\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async hasRefreshToken(userId?: string, accountId?: string): Promise<boolean> {\n    const key = this.getScopedKey(userId, accountId);\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async isValid(bufferSeconds: number = 300, userId?: string, accountId?: string): Promise<boolean> {\n    const key = this.getScopedKey(userId, accountId);\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async clear(userId?: string, accountId?: string): Promise<void> {\n    const key = this.getScopedKey(userId, accountId);\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   * @param accountId - Optional account alias for multi-account support\n   */\n  async getTokenInfo(userId?: string, accountId?: string): Promise<StoredToken | null> {\n    const key = this.getScopedKey(userId, accountId);\n    return this.storage.getToken(key);\n  }\n\n  /**\n   * Re-key a token from one accountId to another.\n   * Used to stabilize account IDs — e.g., replacing a temporary random ID\n   * with the actual email address discovered after OAuth completes.\n   *\n   * If oldAccountId === newAccountId, this is a no-op.\n   * If a token already exists under newAccountId, it is replaced.\n   *\n   * @param userId - User identifier\n   * @param oldAccountId - Current account alias (e.g., temporary random ID)\n   * @param newAccountId - New account alias (e.g., discovered email address)\n   * @returns true if the token was re-keyed, false if no token found under oldAccountId\n   */\n  async rekeyAccount(userId: string, oldAccountId: string, newAccountId: string): Promise<boolean> {\n    if (oldAccountId === newAccountId) return true;\n\n    // Read token under old key\n    const oldKey = this.getScopedKey(userId, oldAccountId);\n    const token = await this.storage.getToken(oldKey);\n    if (!token) return false;\n\n    // Remove any stale token under the new key (from a prior auth of the same account)\n    const newKey = this.getScopedKey(userId, newAccountId);\n    await this.storage.deleteToken(newKey);\n\n    // Store under the new key\n    await this.storage.storeToken(newKey, token);\n\n    // Remove the old key\n    await this.storage.deleteToken(oldKey);\n\n    return true;\n  }\n\n  /**\n   * Remove a specific account's stored token.\n   * Used when a user unlinks/disconnects one of their accounts.\n   *\n   * @param userId - User identifier\n   * @param accountId - Account alias to remove\n   * @returns true if a token was deleted, false if no token existed\n   */\n  async removeAccount(userId: string, accountId: string): Promise<boolean> {\n    if (!userId || !accountId) {\n      throw new Error('removeAccount requires non-empty userId and accountId');\n    }\n    const key = this.getScopedKey(userId, accountId);\n    const existing = await this.storage.getToken(key);\n    if (!existing) return false;\n    await this.storage.deleteToken(key);\n    return true;\n  }\n\n  /**\n   * List account aliases for a user on this connector.\n   * Returns account IDs that have stored tokens.\n   *\n   * @param userId - Optional user identifier\n   * @returns Array of account aliases (e.g., ['work', 'personal'])\n   */\n  async listAccounts(userId?: string): Promise<string[]> {\n    if (!this.storage.listKeys) {\n      return [];\n    }\n\n    const allKeys = await this.storage.listKeys();\n    const userPart = userId && userId !== 'default' ? userId : 'default';\n    const prefix = `${this.baseStorageKey}:${userPart}:`;\n\n    const accounts: string[] = [];\n    for (const key of allKeys) {\n      if (key.startsWith(prefix)) {\n        const accountId = key.slice(prefix.length);\n        // Only include if it's a direct account (no further colons)\n        if (accountId && !accountId.includes(':')) {\n          accounts.push(accountId);\n        }\n      }\n    }\n\n    return accounts;\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\n/**\n * Force-merge a vendor-required scope token into a space-separated scope\n * string. Idempotent: returns the input unchanged if the token is already\n * present. Empty / undefined scope yields the required token alone so the\n * IdP at least gets refresh-grant guidance.\n *\n * The `requiredScope` is per-vendor — Microsoft / Atlassian / GitLab use\n * `offline_access`, Salesforce uses `refresh_token`, Twitter/X uses\n * `offline.access`. Sourced from `OAuthConfig.requiredScope`, which the\n * vendor template's `RefreshStrategy` stamped at config-build time.\n */\nfunction mergeRequiredScope(scope: string | undefined, required: string | undefined): string | undefined {\n  const requiredTrimmed = required?.trim();\n  // Empty / whitespace required is a misconfiguration — never emit empty tokens.\n  if (!requiredTrimmed) return scope;\n  const trimmed = scope?.trim() ?? '';\n  if (!trimmed) return requiredTrimmed;\n  const tokens = trimmed.split(/\\s+/).filter(Boolean);\n  if (tokens.includes(requiredTrimmed)) return trimmed;\n  tokens.push(requiredTrimmed);\n  return tokens.join(' ');\n}\n\nexport class AuthCodePKCEFlow {\n  private tokenStore: TokenStore;\n  // Store PKCE data per user+account 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+account 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   * Build a map key from userId and accountId for internal PKCE/state/lock maps.\n   */\n  private getMapKey(userId?: string, accountId?: string): string {\n    const userPart = userId || 'default';\n    return accountId ? `${userPart}:${accountId}` : userPart;\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   * @param accountId - Account alias for multi-account support (optional)\n   */\n  async getAuthorizationUrl(userId?: string, accountId?: 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 mapKey = this.getMapKey(userId, accountId);\n\n    // Generate PKCE pair\n    const { codeVerifier, codeChallenge } = generatePKCE();\n    this.codeVerifiers.set(mapKey, { verifier: codeVerifier, timestamp: Date.now() });\n\n    // Generate state for CSRF protection\n    const state = generateState();\n    this.states.set(mapKey, { 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    // Force-merge the vendor's `requiredScope` (e.g. `offline_access` for\n    // Microsoft, `refresh_token` for Salesforce, `offline.access` for\n    // Twitter/X) so refresh-token issuance survives operator scope overrides\n    // — e.g. someone setting Microsoft's `.default` to use pre-consented app\n    // permissions, which silently strips the vendor-template scope list.\n    // Without a refresh token, the access token's expiry is terminal: every\n    // background fetch silently fails forever after the first ~1h.\n    //\n    // The required token comes from the vendor template's `RefreshStrategy`\n    // and is persisted on the OAuth config (`config.requiredScope`), so even\n    // hosts that bypass `buildAuthConfig` (e.g. v25's\n    // `GroupScopedConnectorRegistry`, which instantiates Connector directly\n    // from decrypted DB configs) get the right merge as long as the saved\n    // config carries the field. Vendors with no required scope (Discord,\n    // Asana, GitHub, etc. — `automatic` / `never_expires` / `manual_setup`\n    // strategies) leave `requiredScope` undefined and this is a no-op.\n    const mergedScope = mergeRequiredScope(this.config.scope, this.config.requiredScope);\n    if (mergedScope) {\n      params.append('scope', mergedScope);\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 vendor-specific authorization parameters (e.g. Google's access_type=offline)\n    if (this.config.authorizationParams) {\n      for (const [key, value] of Object.entries(this.config.authorizationParams)) {\n        params.set(key, value);\n      }\n    }\n\n    // Encode userId and accountId in state for retrieval in callback\n    // Format: `{random_state}[::userId[::accountId]]`\n    let stateWithMetadata = state;\n    if (userId || accountId) {\n      stateWithMetadata = `${state}::${userId || ''}`;\n      if (accountId) {\n        stateWithMetadata += `::${accountId}`;\n      }\n    }\n    params.set('state', stateWithMetadata);\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/accountId)\n   * @param userId - User identifier (optional, can be extracted from state)\n   * @param accountId - Account alias (optional, can be extracted from state)\n   */\n  async exchangeCode(code: string, state: string, userId?: string, accountId?: string): Promise<void> {\n    // Extract userId and accountId from state if embedded\n    let actualState = state;\n    let actualUserId = userId;\n    let actualAccountId = accountId;\n\n    if (state.includes('::')) {\n      const parts = state.split('::');\n      actualState = parts[0]!;\n      if (!actualUserId && parts[1]) {\n        actualUserId = parts[1];\n      }\n      if (!actualAccountId && parts[2]) {\n        actualAccountId = parts[2];\n      }\n    }\n\n    const mapKey = this.getMapKey(actualUserId, actualAccountId);\n\n    // Verify state to prevent CSRF attacks\n    const stateData = this.states.get(mapKey);\n    if (!stateData) {\n      const label = actualAccountId\n        ? `user ${actualUserId}, account ${actualAccountId}`\n        : `user ${actualUserId}`;\n      throw new Error(`No PKCE state found for ${label}. Authorization flow may have expired (15 min TTL).`);\n    }\n\n    const expectedState = stateData.state;\n    if (actualState !== expectedState) {\n      const label = actualAccountId\n        ? `user ${actualUserId}, account ${actualAccountId}`\n        : `user ${actualUserId}`;\n      throw new Error(`State mismatch for ${label} - 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    // Note: we don't log clientId / secret length / URLs here — that's\n    // diagnostic noise on every code exchange and leaks key prefixes into\n    // logs. The downstream fetch failure path already produces a useful\n    // error with the IdP's response body.\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(mapKey);\n    if (this.config.usePKCE !== false && verifierData) {\n      params.append('code_verifier', verifierData.verifier);\n    }\n\n    let 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 the provider rejects client_secret (public client), retry without it\n    if (!response.ok && this.config.clientSecret) {\n      const errorText = await response.text();\n      if (isPublicClientError(errorText)) {\n        params.delete('client_secret');\n        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        if (!response.ok) {\n          const retryError = await response.text();\n          throw new Error(`Token exchange failed: ${response.status} ${response.statusText} - ${retryError}`);\n        }\n      } else {\n        throw new Error(`Token exchange failed: ${response.status} ${response.statusText} - ${errorText}`);\n      }\n    } else 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 and account scoping\n    await this.tokenStore.storeToken(data, actualUserId, actualAccountId);\n\n    // Clear PKCE data (one-time use)\n    this.codeVerifiers.delete(mapKey);\n    this.states.delete(mapKey);\n  }\n\n  /**\n   * Get valid token (auto-refreshes if needed)\n   * @param userId - User identifier for multi-user support\n   * @param accountId - Account alias for multi-account support\n   */\n  async getToken(userId?: string, accountId?: string): Promise<string> {\n    const mapKey = this.getMapKey(userId, accountId);\n\n    // If already refreshing for this user+account, wait for the existing refresh\n    if (this.refreshLocks.has(mapKey)) {\n      return this.refreshLocks.get(mapKey)!;\n    }\n\n    // Return cached token if valid\n    if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry, userId, accountId)) {\n      return this.tokenStore.getAccessToken(userId, accountId);\n    }\n\n    // Try to refresh if we have a refresh token\n    if (await this.tokenStore.hasRefreshToken(userId, accountId)) {\n      // Start refresh and lock it\n      const refreshPromise = this.refreshToken(userId, accountId);\n      this.refreshLocks.set(mapKey, refreshPromise);\n\n      try {\n        return await refreshPromise;\n      } finally {\n        // Always clean up lock, even on error\n        this.refreshLocks.delete(mapKey);\n      }\n    }\n\n    // No valid token and can't refresh\n    const userLabel = userId ? `user: ${userId}` : 'default user';\n    const accountLabel = accountId ? `, account: ${accountId}` : '';\n    throw new Error(`No valid token available for ${userLabel}${accountLabel}. 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   * @param accountId - Account alias for multi-account support\n   */\n  async refreshToken(userId?: string, accountId?: string): Promise<string> {\n    const refreshToken = await this.tokenStore.getRefreshToken(userId, accountId);\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    let 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 the provider rejects client_secret (public client), retry without it\n    if (!response.ok && this.config.clientSecret) {\n      const errorText = await response.text();\n      if (isPublicClientError(errorText)) {\n        params.delete('client_secret');\n        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        if (!response.ok) {\n          const retryError = await response.text();\n          throw new Error(`Token refresh failed: ${response.status} ${response.statusText} - ${retryError}`);\n        }\n      } else {\n        throw new Error(`Token refresh failed: ${response.status} ${response.statusText} - ${errorText}`);\n      }\n    } else 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    // Preserve existing refresh_token if the provider didn't return a new one.\n    // Google (and some other providers) only issue refresh_token on the initial\n    // authorization — refresh responses omit it. Without this, the stored\n    // refresh_token gets overwritten with undefined and subsequent refreshes fail.\n    if (!data.refresh_token) {\n      data.refresh_token = refreshToken;\n    }\n\n    // Store new token with user and account scoping\n    await this.tokenStore.storeToken(data, userId, accountId);\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   * @param accountId - Account alias for multi-account support\n   */\n  async isTokenValid(userId?: string, accountId?: string): Promise<boolean> {\n    return this.tokenStore.isValid(this.config.refreshBeforeExpiry, userId, accountId);\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   * @param accountId - Account alias for multi-account support\n   */\n  async revokeToken(revocationUrl?: string, userId?: string, accountId?: string): Promise<void> {\n    if (!revocationUrl) {\n      // Just clear from storage\n      await this.tokenStore.clear(userId, accountId);\n      return;\n    }\n\n    try {\n      const token = await this.tokenStore.getAccessToken(userId, accountId);\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, accountId);\n    }\n  }\n\n  /**\n   * List account aliases for a user.\n   * @param userId - User identifier (optional)\n   */\n  async listAccounts(userId?: string): Promise<string[]> {\n    return this.tokenStore.listAccounts(userId);\n  }\n\n  /**\n   * Re-key a token from one accountId to another.\n   * @see TokenStore.rekeyAccount\n   */\n  async rekeyAccount(userId: string, oldAccountId: string, newAccountId: string): Promise<boolean> {\n    return this.tokenStore.rekeyAccount(userId, oldAccountId, newAccountId);\n  }\n\n  /**\n   * Remove a specific account's stored token.\n   * @see TokenStore.removeAccount\n   */\n  async removeAccount(userId: string, accountId: string): Promise<boolean> {\n    return this.tokenStore.removeAccount(userId, accountId);\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/**\n * Detect OAuth errors indicating the app is a public client that must not\n * present a client_secret. Covers:\n * - Microsoft/Entra ID: AADSTS700025\n * - Generic OAuth servers that return \"invalid_client\" with a hint about public clients\n */\nfunction isPublicClientError(responseBody: string): boolean {\n  const lower = responseBody.toLowerCase();\n  return (\n    lower.includes('aadsts700025') ||\n    (lower.includes('invalid_client') && lower.includes('public'))\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   * `userId` / `accountId` are accepted for API compatibility with the\n   * generic OAuthManager surface (callers like `Connector.fetch` route them\n   * through unconditionally), but they are deliberately ignored for token\n   * storage: client_credentials is application-level auth — there is exactly\n   * ONE token per app regardless of which user is calling. Partitioning the\n   * token cache per user wastes storage and produces invalid 3-part\n   * `flow:clientId:userId` storage keys that strict host token-storage\n   * implementations (e.g. v25 MongoTokenStorage) reject. The caller's\n   * `userId` is still meaningful at the API-URL level (e.g. `/users/{id}/...`\n   * Microsoft Graph routes) — that mapping happens at the tool layer, not\n   * here.\n   */\n  async getToken(_userId?: string, _accountId?: string): Promise<string> {\n    if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry)) {\n      return this.tokenStore.getAccessToken();\n    }\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) under the singleton app-level key. See getToken\n    // doc above for why userId/accountId are ignored.\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 — just request\n   * a new one). userId/accountId ignored — see getToken.\n   */\n  async refreshToken(_userId?: string, _accountId?: string): Promise<string> {\n    await this.tokenStore.clear();\n    return this.requestToken();\n  }\n\n  /**\n   * Check if token is valid. userId/accountId ignored — see getToken.\n   */\n  async isTokenValid(_userId?: string, _accountId?: string): 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 { createPrivateKey } from 'crypto';\nimport { TokenStore } from '../domain/TokenStore.js';\nimport type { OAuthConfig } from '../types.js';\n\n/**\n * Normalize any PEM-encoded private key to PKCS#8 (which is what jose's\n * importPKCS8 requires). GitHub Apps, `openssl genrsa`, and many other tools\n * emit PKCS#1 (\"-----BEGIN RSA PRIVATE KEY-----\"); we accept that, EC\n * (\"-----BEGIN EC PRIVATE KEY-----\"), and native PKCS#8 transparently.\n */\nfunction normalizePrivateKeyPem(pem: string): string {\n  const trimmed = pem.trim();\n  if (trimmed.includes('-----BEGIN PRIVATE KEY-----')) return trimmed;\n  const keyObject = createPrivateKey({ key: trimmed, format: 'pem' });\n  const converted = keyObject.export({ format: 'pem', type: 'pkcs8' });\n  return typeof converted === 'string' ? converted : converted.toString('utf8');\n}\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 (raw). Deliberately NOT parsed here — parsing happens\n    // lazily inside `generateJWT` so that construction succeeds for test\n    // fixtures that pass placeholder strings and never actually sign a JWT.\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(\n          `Failed to read private key from ${config.privateKeyPath}: ${(error as Error).message}`\n        );\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    // Back-date `iat` by 60s to tolerate clock skew with the token endpoint\n    // (GitHub recommends this explicitly for GitHub Apps).\n    const nowSec = Math.floor(Date.now() / 1000);\n    const iat = nowSec - 60;\n    const alg = this.config.tokenSigningAlg || 'RS256';\n    // Default 1 hour; GitHub caps at 10 min, template overrides to 540.\n    const lifetime = this.config.tokenLifetimeSeconds ?? 3600;\n\n    // Parse private key. Normalize PKCS#1 / EC → PKCS#8 here (lazily), so\n    // construction of the flow with placeholder fixtures in tests doesn't\n    // trigger key parsing.\n    let pkcs8Pem: string;\n    try {\n      pkcs8Pem = normalizePrivateKeyPem(this.privateKey);\n    } catch (error) {\n      throw new Error(\n        `Invalid JWT Bearer private key: ${(error as Error).message}. ` +\n          `Supply a PEM-encoded PKCS#1, PKCS#8, or EC private key.`\n      );\n    }\n    const key = await importPKCS8(pkcs8Pem, alg);\n\n    // Build JWT payload. For RFC 7523, `sub` is conventional; for GitHub App\n    // auth it is not needed (only `iss` + `iat` + `exp`) but harmless.\n    // For Google Workspace domain-wide delegation, `sub` is the impersonated\n    // user's email (config.subject) — the resulting access token acts as\n    // that user. Without `subject`, falls back to `clientId` (service-account\n    // self-auth) which is correct for GCP / non-impersonation flows.\n    const scopeClaim = this.config.scope?.trim();\n    const extraClaims: Record<string, string> = scopeClaim ? { scope: scopeClaim } : {};\n    const builder = new SignJWT(extraClaims)\n      .setProtectedHeader({ alg })\n      .setIssuer(this.config.clientId)\n      .setIssuedAt(iat)\n      .setExpirationTime(iat + lifetime);\n    // GitHub App installation tokens reject JWTs with `aud`, `sub`, or `scope`.\n    // Only include those for RFC 7523 flows.\n    if ((this.config.tokenRequestStyle ?? 'form') !== 'bearer') {\n      builder\n        .setSubject(this.config.subject || this.config.clientId)\n        .setAudience(this.config.audience || this.config.tokenUrl);\n    }\n    const jwt = await builder.sign(key);\n\n    return jwt;\n  }\n\n  /**\n   * Get token using JWT Bearer assertion.\n   *\n   * `userId` / `accountId` are accepted for API compatibility with the\n   * generic OAuthManager surface but deliberately ignored for token storage:\n   * jwt_bearer is application-level auth (service account / GitHub App / RFC\n   * 7523 grant) — there is exactly ONE token per app regardless of which\n   * caller is requesting it. Partitioning the cache per user wastes storage\n   * and produces invalid 3-part `flow:clientId:userId` storage keys that\n   * strict host token-storage implementations (e.g. v25 MongoTokenStorage)\n   * reject. If the underlying API needs per-user impersonation, that\n   * happens at the API URL/header level (e.g. Microsoft Graph\n   * `/users/{id}/...` routes), not at token retrieval.\n   */\n  async getToken(_userId?: string, _accountId?: string): Promise<string> {\n    if (await this.tokenStore.isValid(this.config.refreshBeforeExpiry)) {\n      return this.tokenStore.getAccessToken();\n    }\n    return this.requestToken();\n  }\n\n  /**\n   * Request token using JWT assertion.\n   *\n   * Supports two delivery styles (controlled by `config.tokenRequestStyle`):\n   * - `'form'` (default, RFC 7523) — form-urlencoded body with grant_type + assertion\n   * - `'bearer'` (GitHub App installation tokens) — Authorization: Bearer <JWT> header\n   *   on an empty POST; response uses `token` + `expires_at` instead of\n   *   `access_token` + `expires_in`.\n   */\n  private async requestToken(): Promise<string> {\n    const assertion = await this.generateJWT();\n    const style = this.config.tokenRequestStyle ?? 'form';\n\n    // Diagnostic: decode the JWT we're about to send (header+payload, not\n    // signature) so auth failures surface with enough context to identify\n    // iss / iat / exp mismatches at a glance.\n    try {\n      const [headerB64, payloadB64] = assertion.split('.');\n      if (headerB64 && payloadB64) {\n        const dec = (s: string) =>\n          JSON.parse(Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8'));\n        console.log(\n          `[JWTBearer] POST ${this.config.tokenUrl} style=${style} header=${JSON.stringify(\n            dec(headerB64)\n          )} payload=${JSON.stringify(dec(payloadB64))}`\n        );\n      }\n    } catch {\n      /* ignore diagnostic decode failure */\n    }\n\n    let response: Response;\n    if (style === 'bearer') {\n      response = await fetch(this.config.tokenUrl, {\n        method: 'POST',\n        headers: {\n          Accept: 'application/vnd.github+json',\n          Authorization: `Bearer ${assertion}`,\n          'X-GitHub-Api-Version': '2022-11-28',\n        },\n      });\n    } else {\n      const params = new URLSearchParams({\n        grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n        assertion,\n      });\n      response = await fetch(this.config.tokenUrl, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n        body: params,\n      });\n    }\n\n    if (!response.ok) {\n      const error = await response.text();\n      throw new Error(\n        `JWT Bearer token request failed: ${response.status} ${response.statusText} - ${error}`\n      );\n    }\n\n    const data: any = await response.json();\n\n    // Normalize GitHub-style responses (`token` + `expires_at`) to the standard\n    // OAuth shape (`access_token` + `expires_in`) so downstream code and the\n    // TokenStore see a consistent schema.\n    if (style === 'bearer') {\n      const token: string = data.token ?? data.access_token;\n      const expiresIn: number =\n        typeof data.expires_in === 'number'\n          ? data.expires_in\n          : data.expires_at\n          ? Math.max(\n              60,\n              Math.floor((new Date(data.expires_at).getTime() - Date.now()) / 1000)\n            )\n          : 3600;\n      const normalized = { ...data, access_token: token, expires_in: expiresIn };\n      await this.tokenStore.storeToken(normalized);\n      return token;\n    }\n\n    await this.tokenStore.storeToken(data);\n    return data.access_token;\n  }\n\n  /**\n   * Refresh token (generate new JWT and request new token).\n   * userId/accountId ignored — see getToken.\n   */\n  async refreshToken(_userId?: string, _accountId?: string): Promise<string> {\n    await this.tokenStore.clear();\n    return this.requestToken();\n  }\n\n  /**\n   * Check if token is valid. userId/accountId ignored — see getToken.\n   */\n  async isTokenValid(_userId?: string, _accountId?: string): 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 * File-based token storage\n * Tokens are encrypted and stored in individual files with restrictive permissions\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { ITokenStorage, StoredToken } from '../../domain/ITokenStorage.js';\nimport { encrypt, decrypt } from '../../utils/encryption.js';\n\n/** Internal format stored on disk — includes the storage key for enumeration */\ninterface StoredTokenWithKey extends StoredToken {\n  _storageKey?: string;\n}\n\nexport interface FileStorageConfig {\n  directory: string; // Directory to store token files\n  encryptionKey: string; // Encryption key (REQUIRED - do not use auto-generated key!)\n}\n\nexport class FileStorage implements ITokenStorage {\n  private directory: string;\n  private encryptionKey: string;\n\n  constructor(config: FileStorageConfig) {\n    if (!config.encryptionKey) {\n      throw new Error(\n        'FileStorage requires an encryption key. Set OAUTH_ENCRYPTION_KEY in environment or provide config.encryptionKey'\n      );\n    }\n\n    this.directory = config.directory;\n    this.encryptionKey = config.encryptionKey;\n\n    // Ensure directory exists (async, don't block constructor)\n    this.ensureDirectory().catch((error) => {\n      console.error('Failed to create token directory:', error);\n    });\n  }\n\n  private async ensureDirectory(): Promise<void> {\n    try {\n      await fs.mkdir(this.directory, { recursive: true });\n      // Set directory permissions (owner only)\n      await fs.chmod(this.directory, 0o700);\n    } catch (error) {\n      // Directory might already exist, that's okay\n    }\n  }\n\n  /**\n   * Get file path for a token key (hashed for security)\n   */\n  private getFilePath(key: string): string {\n    // Hash the key for filename (prevents exposing sensitive key names)\n    const hash = crypto.createHash('sha256').update(key).digest('hex');\n    return path.join(this.directory, `${hash}.token`);\n  }\n\n  async storeToken(key: string, token: StoredToken): Promise<void> {\n    await this.ensureDirectory();\n\n    const filePath = this.getFilePath(key);\n    // Store the key inside the encrypted payload for enumeration via listKeys()\n    const tokenWithKey: StoredTokenWithKey = { ...token, _storageKey: key };\n    const plaintext = JSON.stringify(tokenWithKey);\n    const encrypted = encrypt(plaintext, this.encryptionKey);\n\n    // Write encrypted token to file\n    await fs.writeFile(filePath, encrypted, 'utf8');\n\n    // Set restrictive permissions (owner read/write only)\n    await fs.chmod(filePath, 0o600);\n  }\n\n  async getToken(key: string): Promise<StoredToken | null> {\n    const filePath = this.getFilePath(key);\n\n    try {\n      const encrypted = await fs.readFile(filePath, 'utf8');\n      const decrypted = decrypt(encrypted, this.encryptionKey);\n      const parsed = JSON.parse(decrypted) as StoredTokenWithKey;\n      // Strip internal _storageKey before returning\n      const { _storageKey, ...token } = parsed;\n      return token as StoredToken;\n    } catch (error: any) {\n      if (error.code === 'ENOENT') {\n        // File doesn't exist\n        return null;\n      }\n\n      console.error('Failed to read/decrypt token file:', error);\n\n      // Remove corrupted file\n      try {\n        await fs.unlink(filePath);\n      } catch {\n        // Ignore unlink errors\n      }\n\n      return null;\n    }\n  }\n\n  async deleteToken(key: string): Promise<void> {\n    const filePath = this.getFilePath(key);\n\n    try {\n      await fs.unlink(filePath);\n    } catch (error: any) {\n      if (error.code !== 'ENOENT') {\n        throw error;\n      }\n      // File doesn't exist, that's okay\n    }\n  }\n\n  async hasToken(key: string): Promise<boolean> {\n    const filePath = this.getFilePath(key);\n\n    try {\n      await fs.access(filePath);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * List all storage keys by decrypting each token file and reading _storageKey.\n   * Falls back to returning hashed filenames for tokens stored before multi-account support.\n   */\n  async listKeys(): Promise<string[]> {\n    try {\n      const files = await fs.readdir(this.directory);\n      const tokenFiles = files.filter((f) => f.endsWith('.token'));\n\n      const keys: string[] = [];\n      for (const file of tokenFiles) {\n        try {\n          const filePath = path.join(this.directory, file);\n          const encrypted = await fs.readFile(filePath, 'utf8');\n          const decrypted = decrypt(encrypted, this.encryptionKey);\n          const parsed = JSON.parse(decrypted) as StoredTokenWithKey;\n          if (parsed._storageKey) {\n            keys.push(parsed._storageKey);\n          }\n          // Skip tokens without _storageKey (legacy, pre-multi-account)\n        } catch {\n          // Skip corrupted/unreadable files\n        }\n      }\n\n      return keys;\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * List all token keys (for debugging)\n   */\n  async listTokens(): Promise<string[]> {\n    try {\n      const files = await fs.readdir(this.directory);\n      return files.filter((f) => f.endsWith('.token')).map((f) => f.replace('.token', ''));\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Clear all tokens\n   */\n  async clearAll(): Promise<void> {\n    try {\n      const files = await fs.readdir(this.directory);\n      const tokenFiles = files.filter((f) => f.endsWith('.token'));\n\n      await Promise.all(\n        tokenFiles.map((f) => fs.unlink(path.join(this.directory, f)).catch(() => {}))\n      );\n    } catch {\n      // Directory doesn't exist or can't read, that's okay\n    }\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 { FileStorage } from './infrastructure/storage/FileStorage.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   * @param accountId - Account alias for multi-account support (optional)\n   */\n  async getToken(userId?: string, accountId?: string): Promise<string> {\n    return this.flow.getToken(userId, accountId);\n  }\n\n  /**\n   * Force refresh the token\n   *\n   * @param userId - User identifier for multi-user support (optional)\n   * @param accountId - Account alias for multi-account support (optional)\n   */\n  async refreshToken(userId?: string, accountId?: string): Promise<string> {\n    return this.flow.refreshToken(userId, accountId);\n  }\n\n  /**\n   * Check if current token is valid\n   *\n   * @param userId - User identifier for multi-user support (optional)\n   * @param accountId - Account alias for multi-account support (optional)\n   */\n  async isTokenValid(userId?: string, accountId?: string): Promise<boolean> {\n    return this.flow.isTokenValid(userId, accountId);\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   * @param accountId - Account alias for multi-account support (optional)\n   * @returns Authorization URL for the user to visit\n   */\n  async startAuthFlow(userId?: string, accountId?: 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, accountId);\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   * @param accountId - Optional account alias (can be extracted from state if embedded)\n   */\n  async handleCallback(callbackUrl: string, userId?: string, accountId?: 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, accountId);\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   * @param accountId - Account alias for multi-account support (optional)\n   */\n  async revokeToken(revocationUrl?: string, userId?: string, accountId?: string): Promise<void> {\n    if (this.flow instanceof AuthCodePKCEFlow) {\n      await this.flow.revokeToken(revocationUrl, userId, accountId);\n    } else {\n      throw new Error('Token revocation not implemented for this flow');\n    }\n  }\n\n  /**\n   * List account aliases for a user (Authorization Code only)\n   *\n   * @param userId - User identifier (optional)\n   * @returns Array of account aliases (e.g., ['work', 'personal'])\n   */\n  async listAccounts(userId?: string): Promise<string[]> {\n    if (this.flow instanceof AuthCodePKCEFlow) {\n      return this.flow.listAccounts(userId);\n    }\n    return [];\n  }\n\n  /**\n   * Re-key a token from one accountId to another (Authorization Code only).\n   *\n   * @param userId - User identifier\n   * @param oldAccountId - Current account alias\n   * @param newAccountId - New account alias\n   * @returns true if re-keyed, false if no token found under oldAccountId\n   */\n  async rekeyAccount(userId: string, oldAccountId: string, newAccountId: string): Promise<boolean> {\n    if (!(this.flow instanceof AuthCodePKCEFlow)) {\n      throw new Error('rekeyAccount() is only available for authorization_code flow');\n    }\n    return this.flow.rekeyAccount(userId, oldAccountId, newAccountId);\n  }\n\n  /**\n   * Remove a specific account's stored token (Authorization Code only).\n   * Used when a user unlinks/disconnects one of their accounts.\n   *\n   * @param userId - User identifier\n   * @param accountId - Account alias to remove\n   * @returns true if a token was deleted, false if no token existed\n   */\n  async removeAccount(userId: string, accountId: string): Promise<boolean> {\n    if (!(this.flow instanceof AuthCodePKCEFlow)) {\n      throw new Error('removeAccount() is only available for authorization_code flow');\n    }\n    return this.flow.removeAccount(userId, accountId);\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 only if the built-in FileStorage is in play without an encryption\n    // key. Custom ITokenStorage implementations (MongoDB, Redis, app-specific)\n    // manage their own encryption and do not read OAUTH_ENCRYPTION_KEY —\n    // warning them is a false alarm that obscures real problems.\n    if (config.storage instanceof FileStorage && !process.env.OAUTH_ENCRYPTION_KEY) {\n      console.warn(\n        'WARNING: Using FileStorage without OAUTH_ENCRYPTION_KEY environment variable. ' +\n          'Tokens will be encrypted with an auto-generated key that changes on restart, ' +\n          'making previously persisted tokens undecryptable after a restart!'\n      );\n    }\n  }\n}\n","/**\n * StorageRegistry - Centralized storage backend registry\n *\n * Provides a single point of configuration for all storage backends\n * used across the library. Subsystems resolve their storage at execution\n * time (not construction time) via `resolve()`, which lazily creates\n * and caches a default when nothing has been configured.\n *\n * Storage types are split into two categories:\n * - **Global singletons**: customTools, media, agentDefinitions, connectorConfig, oauthTokens\n * - **Per-agent factories** (need agentId): sessions, persistentInstructions, workingMemory\n *\n * For multi-user / multi-tenant environments, factories receive an optional\n * `StorageContext` (opaque, like `ConnectorAccessContext`) so backends can\n * partition data by userId, tenantId, or any custom field.\n *\n * @example\n * ```typescript\n * import { StorageRegistry } from '@everworker/oneringai';\n *\n * // Single-tenant (simple)\n * StorageRegistry.configure({\n *   customTools: new MongoCustomToolStorage(),\n *   media: new S3MediaStorage(),\n *   sessions: (agentId) => new RedisContextStorage(agentId),\n * });\n *\n * // Multi-tenant\n * StorageRegistry.configure({\n *   sessions: (agentId, ctx) => new RedisContextStorage(agentId, ctx?.userId),\n *   customTools: new MongoCustomToolStorage(),  // global singletons are unaffected\n * });\n * ```\n */\n\nimport type { ICustomToolStorage } from '../domain/interfaces/ICustomToolStorage.js';\nimport type { IMediaStorage } from '../domain/interfaces/IMediaStorage.js';\nimport type { IAgentDefinitionStorage } from '../domain/interfaces/IAgentDefinitionStorage.js';\nimport type { IConnectorConfigStorage } from '../domain/interfaces/IConnectorConfigStorage.js';\nimport type { ITokenStorage } from '../connectors/oauth/domain/ITokenStorage.js';\nimport type { IContextStorage } from '../domain/interfaces/IContextStorage.js';\nimport type { IPersistentInstructionsStorage } from '../domain/interfaces/IPersistentInstructionsStorage.js';\nimport type { IMemoryStorage } from '../domain/interfaces/IMemoryStorage.js';\nimport type { IUserInfoStorage } from '../domain/interfaces/IUserInfoStorage.js';\nimport type { IRoutineDefinitionStorage } from '../domain/interfaces/IRoutineDefinitionStorage.js';\nimport type { IRoutineExecutionStorage } from '../domain/interfaces/IRoutineExecutionStorage.js';\nimport type { ICorrelationStorage } from '../domain/interfaces/ICorrelationStorage.js';\nimport type { IUserPermissionRulesStorage } from '../domain/interfaces/IUserPermissionRulesStorage.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Opaque context passed to per-agent storage factories.\n *\n * The library imposes no structure — consumers define their own shape\n * (e.g., `{ userId: 'alice', tenantId: 'acme' }`).\n *\n * Mirrors the `ConnectorAccessContext` pattern used by `Connector.scoped()`.\n */\nexport type StorageContext = Record<string, unknown>;\n\n/**\n * Storage configuration map.\n *\n * Global singletons are stored directly.\n * Per-agent factories are functions that accept an agentId (and optional\n * StorageContext for multi-tenant scenarios) and return a storage instance.\n */\nexport interface StorageConfig {\n  // Global singletons\n  media: IMediaStorage;\n  agentDefinitions: IAgentDefinitionStorage;\n  connectorConfig: IConnectorConfigStorage;\n  oauthTokens: ITokenStorage;\n\n  // Context-aware factories (optional StorageContext for multi-tenant)\n  customTools: (context?: StorageContext) => ICustomToolStorage;\n  sessions: (agentId: string, context?: StorageContext) => IContextStorage;\n  persistentInstructions: (agentId: string, context?: StorageContext) => IPersistentInstructionsStorage;\n  workingMemory: (context?: StorageContext) => IMemoryStorage;\n  userInfo: (context?: StorageContext) => IUserInfoStorage;\n  routineDefinitions: (context?: StorageContext) => IRoutineDefinitionStorage;\n  routineExecutions: (context?: StorageContext) => IRoutineExecutionStorage;\n\n  // Global singletons (partitioned by userId internally)\n  correlations: ICorrelationStorage;\n  permissionRules: IUserPermissionRulesStorage;\n}\n\n// ============================================================================\n// StorageRegistry\n// ============================================================================\n\nexport class StorageRegistry {\n  /** Internal storage map */\n  private static entries = new Map<string, unknown>();\n\n  /** Default context passed to all factory calls (set via setContext) */\n  private static _context: StorageContext | undefined;\n\n  /**\n   * Configure multiple storage backends at once.\n   *\n   * @example\n   * ```typescript\n   * // Single-tenant\n   * StorageRegistry.configure({\n   *   customTools: new MongoCustomToolStorage(),\n   *   sessions: (agentId) => new RedisContextStorage(agentId),\n   * });\n   *\n   * // Multi-tenant\n   * StorageRegistry.configure({\n   *   sessions: (agentId, ctx) => new TenantContextStorage(agentId, ctx?.tenantId),\n   *   persistentInstructions: (agentId, ctx) => new TenantInstructionsStorage(agentId, ctx?.userId),\n   * });\n   * ```\n   */\n  static configure(config: Partial<StorageConfig>): void {\n    for (const [key, value] of Object.entries(config)) {\n      if (value !== undefined) {\n        StorageRegistry.entries.set(key, value);\n      }\n    }\n  }\n\n  /**\n   * Set the default StorageContext.\n   *\n   * This context is automatically passed to all per-agent factory calls\n   * (sessions, persistentInstructions, workingMemory) when no explicit\n   * context is provided. Typically set once at app startup with global\n   * tenant/environment info, or per-request in multi-tenant servers.\n   *\n   * @example\n   * ```typescript\n   * // Single-tenant app — set once at init\n   * StorageRegistry.setContext({ tenantId: 'acme', environment: 'production' });\n   *\n   * // Multi-tenant server — set per-request\n   * app.use((req, res, next) => {\n   *   StorageRegistry.setContext({ userId: req.user.id, tenantId: req.tenant.id });\n   *   next();\n   * });\n   * ```\n   */\n  static setContext(context: StorageContext | undefined): void {\n    StorageRegistry._context = context;\n  }\n\n  /**\n   * Get the current default StorageContext.\n   */\n  static getContext(): StorageContext | undefined {\n    return StorageRegistry._context;\n  }\n\n  /**\n   * Set a single storage backend.\n   */\n  static set<K extends keyof StorageConfig>(key: K, value: StorageConfig[K]): void {\n    StorageRegistry.entries.set(key, value);\n  }\n\n  /**\n   * Get a storage backend (or undefined if not configured).\n   */\n  static get<K extends keyof StorageConfig>(key: K): StorageConfig[K] | undefined {\n    return StorageRegistry.entries.get(key) as StorageConfig[K] | undefined;\n  }\n\n  /**\n   * Resolve a storage backend, lazily creating and caching a default if needed.\n   *\n   * If a value has been configured via `set()` or `configure()`, returns that.\n   * Otherwise, calls `defaultFactory()`, caches the result, and returns it.\n   */\n  static resolve<K extends keyof StorageConfig>(key: K, defaultFactory: () => StorageConfig[K]): StorageConfig[K] {\n    const existing = StorageRegistry.entries.get(key) as StorageConfig[K] | undefined;\n    if (existing !== undefined) {\n      return existing;\n    }\n\n    const value = defaultFactory();\n    StorageRegistry.entries.set(key, value);\n    return value;\n  }\n\n  /**\n   * Remove a single storage backend.\n   */\n  static remove(key: keyof StorageConfig): boolean {\n    return StorageRegistry.entries.delete(key);\n  }\n\n  /**\n   * Check if a storage backend has been configured.\n   */\n  static has(key: keyof StorageConfig): boolean {\n    return StorageRegistry.entries.has(key);\n  }\n\n  /**\n   * Clear all configured storage backends and context.\n   * Useful for testing.\n   */\n  static reset(): void {\n    StorageRegistry.entries.clear();\n    StorageRegistry._context = undefined;\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        // Capture before reset so event carries the actual success count\n        const capturedSuccesses = this.consecutiveSuccesses;\n\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: capturedSuccesses,\n          timestamp: Date.now(),\n        });\n        break;\n      }\n    }\n  }\n\n  /**\n   * Remove failures outside the time window and cap array size\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    // Cap failures array to prevent unbounded growth\n    const maxFailures = Math.max(this.config.failureThreshold * 2, 20);\n    if (this.failures.length > maxFailures) {\n      this.failures = this.failures.slice(-maxFailures);\n    }\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 * ScopedConnectorRegistry - Filtered view over the Connector registry\n *\n * Provides access-controlled connector lookup by delegating to\n * Connector static methods and filtering through an IConnectorAccessPolicy.\n *\n * Security: get() on a denied connector throws the same \"not found\" error\n * listing only visible connectors — no information leakage.\n */\n\nimport { Connector } from './Connector.js';\nimport type { IConnectorRegistry } from '../domain/interfaces/IConnectorRegistry.js';\nimport type { IConnectorAccessPolicy, ConnectorAccessContext } from '../domain/interfaces/IConnectorAccessPolicy.js';\n\nexport class ScopedConnectorRegistry implements IConnectorRegistry {\n  constructor(\n    private readonly policy: IConnectorAccessPolicy,\n    private readonly context: ConnectorAccessContext\n  ) {}\n\n  get(name: string): Connector {\n    if (!Connector.has(name)) {\n      const available = this.list().join(', ') || 'none';\n      throw new Error(`Connector '${name}' not found. Available: ${available}`);\n    }\n    const connector = Connector.get(name);\n    if (!this.policy.canAccess(connector, this.context)) {\n      // Same error message shape — no information leakage about existence\n      const available = this.list().join(', ') || 'none';\n      throw new Error(`Connector '${name}' not found. Available: ${available}`);\n    }\n    return connector;\n  }\n\n  has(name: string): boolean {\n    if (!Connector.has(name)) return false;\n    const connector = Connector.get(name);\n    return this.policy.canAccess(connector, this.context);\n  }\n\n  list(): string[] {\n    return this.listAll().map((c) => c.name);\n  }\n\n  listAll(): Connector[] {\n    return Connector.listAll().filter((c) => this.policy.canAccess(c, this.context));\n  }\n\n  size(): number {\n    return this.listAll().length;\n  }\n\n  getDescriptionsForTools(): string {\n    const connectors = this.listAll();\n    if (connectors.length === 0) {\n      return 'No connectors registered yet.';\n    }\n    return connectors\n      .map((c) => `  - \"${c.name}\": ${c.displayName} - ${c.config.description || 'No description'}`)\n      .join('\\n');\n  }\n\n  getInfo(): Record<string, { displayName: string; description: string; baseURL: string }> {\n    const info: Record<string, { displayName: string; description: string; baseURL: string }> = {};\n    for (const connector of this.listAll()) {\n      info[connector.name] = {\n        displayName: connector.displayName,\n        description: connector.config.description || '',\n        baseURL: connector.baseURL,\n      };\n    }\n    return info;\n  }\n\n  getById(id: string): Connector {\n    const connector = Connector.getById(id);\n    if (!this.policy.canAccess(connector, this.context)) {\n      const available = this.list().join(', ') || 'none';\n      throw new Error(`Connector with id '${id}' not found. Available: ${available}`);\n    }\n    return connector;\n  }\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 { randomUUID } from 'crypto';\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 { StorageRegistry } from './StorageRegistry.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';\nimport type { IConnectorRegistry } from '../domain/interfaces/IConnectorRegistry.js';\nimport type { IConnectorAccessPolicy, ConnectorAccessContext } from '../domain/interfaces/IConnectorAccessPolicy.js';\nimport { ScopedConnectorRegistry } from './ScopedConnectorRegistry.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  // ============ Custom Registry ============\n\n  private static _customRegistry: IConnectorRegistry | null = null;\n\n  /**\n   * Set a custom connector registry implementation.\n   * When set, all static read methods (get, has, list, listAll, size, etc.)\n   * delegate to this registry instead of the internal Map.\n   *\n   * Use this to plug in multi-tenant, lazy-loading, or any custom connector\n   * resolution strategy. Pass null to revert to the built-in Map-based registry.\n   *\n   * @example\n   * ```typescript\n   * // Multi-tenant app — set per-request in middleware\n   * Connector.setRegistry(new TenantConnectorRegistry(tenantId));\n   *\n   * // Now Connector.get('microsoft') resolves via TenantConnectorRegistry\n   * ```\n   */\n  static setRegistry(registry: IConnectorRegistry | null): void {\n    Connector._customRegistry = registry;\n  }\n\n  /**\n   * Get the current custom registry (or null if using the built-in registry).\n   */\n  static getRegistry(): IConnectorRegistry | null {\n    return Connector._customRegistry;\n  }\n\n  // ============ Static Registry ============\n\n  private static registry: Map<string, Connector> = new Map();\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    if (Connector._customRegistry) return Connector._customRegistry.get(name);\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    if (Connector._customRegistry) return Connector._customRegistry.has(name);\n    return Connector.registry.has(name);\n  }\n\n  /**\n   * List all registered connector names\n   */\n  static list(): string[] {\n    if (Connector._customRegistry) return Connector._customRegistry.list();\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  // ============ Internal Map Bypass ============\n  // These methods read directly from the internal Map, bypassing any custom registry.\n  // Used by custom IConnectorRegistry implementations that need to read instances\n  // they've loaded via Connector.create() without infinite recursion.\n\n  /**\n   * Get a connector from the internal Map, bypassing the custom registry.\n   * Returns undefined if not found (does not throw).\n   */\n  static getFromMap(name: string): Connector | undefined {\n    return Connector.registry.get(name);\n  }\n\n  /**\n   * Check if a connector exists in the internal Map, bypassing the custom registry.\n   */\n  static hasInMap(name: string): boolean {\n    return Connector.registry.has(name);\n  }\n\n  /**\n   * List all connector instances from the internal Map, bypassing the custom registry.\n   */\n  static listAllFromMap(): Connector[] {\n    return Array.from(Connector.registry.values());\n  }\n\n  /**\n   * Call the custom registry's warmup() if available.\n   * Entry points (middleware, request handlers) should call this before\n   * using sync read methods to ensure connectors are loaded for the\n   * current context (e.g., tenant/group).\n   *\n   * No-op if no custom registry or no warmup method.\n   */\n  static async warmup(): Promise<void> {\n    if (Connector._customRegistry?.warmup) {\n      await Connector._customRegistry.warmup();\n    }\n  }\n\n  /**\n   * Get the default token storage for OAuth connectors.\n   * Resolves from StorageRegistry, falling back to MemoryStorage.\n   */\n  private static get defaultStorage(): ITokenStorage {\n    return StorageRegistry.resolve('oauthTokens', () => new MemoryStorage());\n  }\n\n  /**\n   * Set default token storage for OAuth connectors\n   */\n  static setDefaultStorage(storage: ITokenStorage): void {\n    StorageRegistry.set('oauthTokens', storage);\n  }\n\n  /**\n   * Get all registered connectors\n   */\n  static listAll(): Connector[] {\n    if (Connector._customRegistry) return Connector._customRegistry.listAll();\n    return Array.from(Connector.registry.values());\n  }\n\n  /**\n   * Get number of registered connectors\n   */\n  static size(): number {\n    if (Connector._customRegistry) return Connector._customRegistry.size();\n    return Connector.registry.size;\n  }\n\n  /**\n   * Get a connector by ID\n   */\n  static getById(id: string): Connector {\n    if (Connector._customRegistry?.getById) return Connector._customRegistry.getById(id);\n    for (const connector of Connector.registry.values()) {\n      if (connector.id === id) return connector;\n    }\n    throw new Error(`Connector with id '${id}' not found`);\n  }\n\n  // ============ Access Control ============\n\n  private static _accessPolicy: IConnectorAccessPolicy | null = null;\n\n  /**\n   * Set a global access policy for connector scoping.\n   * Pass null to clear the policy.\n   */\n  static setAccessPolicy(policy: IConnectorAccessPolicy | null): void {\n    Connector._accessPolicy = policy;\n  }\n\n  /**\n   * Get the current global access policy (or null if none set).\n   */\n  static getAccessPolicy(): IConnectorAccessPolicy | null {\n    return Connector._accessPolicy;\n  }\n\n  /**\n   * Create a scoped (filtered) view of the connector registry.\n   * Requires a global access policy to be set via setAccessPolicy().\n   *\n   * @param context - Opaque context passed to the policy (e.g., { userId, tenantId })\n   * @returns IConnectorRegistry that only exposes accessible connectors\n   * @throws Error if no access policy is set\n   */\n  static scoped(context: ConnectorAccessContext): IConnectorRegistry {\n    if (!Connector._accessPolicy) {\n      throw new Error('No access policy set. Call Connector.setAccessPolicy() first.');\n    }\n    return new ScopedConnectorRegistry(Connector._accessPolicy, context);\n  }\n\n  /**\n   * Return the static Connector methods as an IConnectorRegistry object (unfiltered).\n   * Useful when code accepts the interface but you want the full admin view.\n   */\n  static asRegistry(): IConnectorRegistry {\n    return {\n      get: (name: string) => Connector.get(name),\n      has: (name: string) => Connector.has(name),\n      list: () => Connector.list(),\n      listAll: () => Connector.listAll(),\n      size: () => Connector.size(),\n      getDescriptionsForTools: () => Connector.getDescriptionsForTools(),\n      getInfo: () => Connector.getInfo(),\n      getById: (id: string) => Connector.getById(id),\n    };\n  }\n\n  /**\n   * Get connector descriptions formatted for tool parameters\n   * Useful for generating dynamic tool descriptions\n   */\n  static getDescriptionsForTools(): string {\n    if (Connector._customRegistry) return Connector._customRegistry.getDescriptionsForTools();\n\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    if (Connector._customRegistry) return Connector._customRegistry.getInfo();\n\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  /**\n   * Backfill resolver for OAuth `authorization_code` connectors loaded from\n   * persisted configs that pre-date the `RefreshStrategy` annotation. Given a\n   * `serviceType` (e.g. `'microsoft'`), returns a patch that re-applies the\n   * vendor template's strategy: stamps `requiredScope` and merges the\n   * scope/authorizationParams. Returns `undefined` if no template is found\n   * or the strategy is a no-op (`automatic`/`never_expires`/`manual_setup`).\n   *\n   * Registered by `vendors/index.ts` at module-load time, so the lookup\n   * works for any host that imports `@everworker/oneringai`. Hosts that\n   * bypass `buildAuthConfig` (e.g. v25's GroupScopedConnectorRegistry, which\n   * reconstructs Connectors from decrypted DB configs) still get the right\n   * refresh-grant tokens on every authorize URL — no migration required.\n   */\n  private static refreshStrategyBackfill?: (\n    serviceType: string | undefined,\n    auth: ConnectorAuth & { type: 'oauth' },\n  ) => {\n    requiredScope?: string;\n    scope?: string;\n    authorizationParams?: Record<string, string>;\n  } | undefined;\n\n  /**\n   * Register the refresh-strategy backfill resolver. Called by\n   * `vendors/index.ts` once at boot. Idempotent (a second call replaces).\n   */\n  static setRefreshStrategyBackfill(\n    fn: NonNullable<typeof Connector.refreshStrategyBackfill>,\n  ): void {\n    Connector.refreshStrategyBackfill = fn;\n  }\n\n  // ============ Instance ============\n\n  readonly id: string;\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.id = config.id ?? randomUUID();\n    this.name = config.name;\n    this.vendor = config.vendor;\n    this.config = { ...config, id: this.id };\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   * @param userId - Optional user identifier for multi-user support\n   * @param accountId - Optional account alias for multi-account support (e.g., 'work', 'personal')\n   */\n  async getToken(userId?: string, accountId?: 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, accountId);\n  }\n\n  /**\n   * Start OAuth authorization flow\n   * Returns the URL to redirect the user to\n   *\n   * @param userId - Optional user identifier for multi-user support\n   * @param accountId - Optional account alias for multi-account support (e.g., 'work', 'personal')\n   */\n  async startAuth(userId?: string, accountId?: 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, accountId);\n  }\n\n  /**\n   * Handle OAuth callback\n   * Call this after user is redirected back from OAuth provider\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   * @param accountId - Optional account alias (can be extracted from state if embedded)\n   */\n  async handleCallback(callbackUrl: string, userId?: string, accountId?: 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, accountId);\n  }\n\n  /**\n   * Check if the connector has a valid token\n   *\n   * @param userId - Optional user identifier for multi-user support\n   * @param accountId - Optional account alias for multi-account support\n   */\n  async hasValidToken(userId?: string, accountId?: 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, accountId);\n        return !!token;\n      }\n      return false;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * List account aliases for a user on this connector.\n   * Only applicable for OAuth connectors with multi-account support.\n   *\n   * @param userId - Optional user identifier\n   * @returns Array of account aliases (e.g., ['work', 'personal'])\n   */\n  async listAccounts(userId?: string): Promise<string[]> {\n    if (!this.oauthManager) {\n      return [];\n    }\n    return this.oauthManager.listAccounts(userId);\n  }\n\n  /**\n   * Re-key a token from one accountId to another.\n   * Used to stabilize account IDs after OAuth — e.g., replacing a temporary\n   * random ID with the actual email address discovered post-authorization.\n   *\n   * @param userId - User identifier\n   * @param oldAccountId - Current account alias (temporary)\n   * @param newAccountId - Stable account alias (e.g., email)\n   * @returns true if re-keyed, false if no token found under oldAccountId\n   */\n  async rekeyAccount(userId: string, oldAccountId: string, newAccountId: string): Promise<boolean> {\n    if (!this.oauthManager) {\n      throw new Error(`Connector '${this.name}' is not an OAuth connector`);\n    }\n    return this.oauthManager.rekeyAccount(userId, oldAccountId, newAccountId);\n  }\n\n  /**\n   * Remove a specific account's stored token.\n   * Used when a user unlinks/disconnects one of their accounts.\n   * Only applicable for OAuth connectors with multi-account support.\n   *\n   * @param userId - User identifier\n   * @param accountId - Account alias to remove (e.g., 'work', 'personal')\n   * @returns true if a token was deleted, false if no token existed\n   */\n  async removeAccount(userId: string, accountId: string): Promise<boolean> {\n    if (!this.oauthManager) {\n      throw new Error(`Connector '${this.name}' is not an OAuth connector`);\n    }\n    return this.oauthManager.removeAccount(userId, accountId);\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   * @param accountId - Optional account alias for multi-account OAuth\n   * @returns Fetch Response\n   */\n  async fetch(\n    endpoint: string,\n    options?: ConnectorFetchOptions,\n    userId?: string,\n    accountId?: 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 (ensure proper slash between baseURL and relative endpoint)\n    let url: string;\n    if (endpoint.startsWith('http')) {\n      url = endpoint;\n    } else {\n      const base = (this.baseURL ?? '').replace(/\\/+$/, '');\n      const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n      url = `${base}${path}`;\n    }\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, accountId);\n      const auth = this.config.auth;\n\n      // Query-param auth (e.g., ipapi.co `?key=...`) — inject into URL and\n      // skip the auth header entirely.\n      let requestUrl = url;\n      const queryParamName =\n        auth.type === 'api_key' ? auth.queryParamName : undefined;\n      if (queryParamName) {\n        const parsed = new URL(requestUrl);\n        parsed.searchParams.set(queryParamName, token);\n        requestUrl = parsed.toString();\n      }\n\n      // Build auth header (skipped when key is in query param)\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(requestUrl, {\n          ...options,\n          signal: controller.signal,\n          headers: queryParamName\n            ? { ...options?.headers }\n            : {\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: this.scrubAuthQueryParam(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   * @param accountId - Optional account alias for multi-account OAuth\n   * @returns Parsed JSON response\n   */\n  async fetchJSON<T = unknown>(\n    endpoint: string,\n    options?: ConnectorFetchOptions,\n    userId?: string,\n    accountId?: string\n  ): Promise<T> {\n    const response = await this.fetch(endpoint, options, userId, accountId);\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  /**\n   * Strip the value of a known auth query parameter from a URL for logging.\n   * Used when `auth.queryParamName` is in play so the API key never lands in\n   * logs even if a caller passed a URL that already carried it, or a future\n   * change switches `logRequest`/`logResponse` to log the post-injection URL.\n   */\n  private scrubAuthQueryParam(url: string): string {\n    const auth = this.config.auth;\n    const paramName = auth.type === 'api_key' ? auth.queryParamName : undefined;\n    if (!paramName) return url;\n    try {\n      const parsed = new URL(url);\n      if (parsed.searchParams.has(paramName)) {\n        parsed.searchParams.set(paramName, '[REDACTED]');\n        return parsed.toString();\n      }\n      return url;\n    } catch {\n      return url;\n    }\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: this.scrubAuthQueryParam(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: this.scrubAuthQueryParam(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    if (this.circuitBreaker) {\n      this.circuitBreaker.removeAllListeners();\n    }\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    // Backfill RefreshStrategy for legacy configs that were saved before the\n    // `requiredScope` field existed. Without this, a Microsoft connector\n    // saved with an operator-overridden scope (e.g. `.default`) would lose\n    // refresh-token issuance on every reconstruction-from-DB. Only kicks in\n    // for `authorization_code` flows where the field is absent — never\n    // overrides an explicitly-stamped value.\n    let scope = auth.scope;\n    let requiredScope = auth.requiredScope;\n    let authorizationParams = auth.authorizationParams;\n    if (\n      auth.flow === 'authorization_code' &&\n      // `== null` (intentional double-equals) catches both `undefined` AND\n      // `null`. Some storage layers (MongoDB, Postgres jsonb, Firestore)\n      // preserve `null` literally rather than dropping the field — without\n      // this, a host-persisted `requiredScope: null` would silently bypass\n      // the backfill and break refresh-token issuance for legacy Microsoft /\n      // Salesforce / Atlassian / Twitter configs.\n      auth.requiredScope == null &&\n      Connector.refreshStrategyBackfill\n    ) {\n      const patch = Connector.refreshStrategyBackfill(this.config.serviceType, auth);\n      if (patch) {\n        if (patch.scope !== undefined) scope = patch.scope;\n        if (patch.requiredScope !== undefined) requiredScope = patch.requiredScope;\n        if (patch.authorizationParams !== undefined) authorizationParams = patch.authorizationParams;\n      }\n    }\n\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,\n      requiredScope,\n      usePKCE: auth.usePKCE,\n      privateKey: auth.privateKey,\n      privateKeyPath: auth.privateKeyPath,\n      audience: auth.audience,\n      subject: auth.subject,\n      tokenRequestStyle: auth.tokenRequestStyle,\n      tokenLifetimeSeconds: auth.tokenLifetimeSeconds,\n      refreshBeforeExpiry: auth.refreshBeforeExpiry,\n      authorizationParams,\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      subject: auth.subject,\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 ToolPermissionDeniedError extends AIError {\n  constructor(\n    public readonly toolName: string,\n    public readonly reason: string,\n    public readonly details?: {\n      policyName?: string;\n      approvalRequired?: boolean;\n      approvalKey?: string;\n    }\n  ) {\n    super(\n      `Tool '${toolName}' permission denied: ${reason}`,\n      'TOOL_PERMISSION_DENIED',\n      403\n    );\n    this.name = 'ToolPermissionDeniedError';\n    Object.setPrototypeOf(this, ToolPermissionDeniedError.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// ============ Document Reader Errors ============\n\n/**\n * Error thrown when document reading fails\n */\nexport class DocumentReadError extends AIError {\n  constructor(\n    public readonly source: string,\n    message: string,\n    originalError?: Error\n  ) {\n    super(\n      `Failed to read document '${source}': ${message}`,\n      'DOCUMENT_READ_ERROR',\n      500,\n      originalError\n    );\n    this.name = 'DocumentReadError';\n    Object.setPrototypeOf(this, DocumentReadError.prototype);\n  }\n}\n\n/**\n * Error thrown when a document format is not supported\n */\nexport class UnsupportedFormatError extends AIError {\n  constructor(\n    public readonly format: string,\n    public readonly family?: string\n  ) {\n    super(\n      `Unsupported document format: '${format}'${family ? ` (family: ${family})` : ''}`,\n      'UNSUPPORTED_FORMAT',\n      400\n    );\n    this.name = 'UnsupportedFormatError';\n    Object.setPrototypeOf(this, UnsupportedFormatError.prototype);\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   * Buffer is passed directly to File — wrapping in `new Uint8Array(buf)`\n   * would copy the payload before File snapshots it.\n   */\n  private prepareImageInput(image: Buffer | string): any {\n    if (Buffer.isBuffer(image)) {\n      return new File([image as BlobPart], '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 = await fs.promises.readFile(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   * Buffer is passed directly to File — wrapping in `new Uint8Array(buf)`\n   * would copy the payload before File snapshots it.\n   */\n  private prepareImageInput(image: Buffer | string): any {\n    if (Buffer.isBuffer(image)) {\n      return new File([image as BlobPart], '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 * Shared config extraction helpers for media provider factories\n * Eliminates duplication across createImageProvider, createAudioProvider,\n * createVideoProvider, and createEmbeddingProvider.\n */\n\nimport { Connector } from './Connector.js';\nimport type { OpenAIMediaConfig, GoogleConfig, GoogleMediaConfig, GrokMediaConfig } from '../domain/types/ProviderConfig.js';\n\n/**\n * Extract OpenAI/OpenAI-compatible config from connector.\n * Supports api_key auth and none auth (for Ollama/local providers).\n */\nexport function extractOpenAICompatConfig(connector: Connector, providerLabel?: string): OpenAIMediaConfig {\n  const auth = connector.config.auth;\n  let apiKey: string;\n\n  if (auth.type === 'api_key') {\n    apiKey = auth.apiKey;\n  } else if (auth.type === 'none') {\n    // Local providers like Ollama don't need a real key\n    apiKey = 'ollama';\n  } else {\n    throw new Error(`${providerLabel ?? 'Provider'} requires API key authentication`);\n  }\n\n  const options = connector.getOptions();\n\n  return {\n    auth: {\n      type: 'api_key',\n      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 config (simple API key only)\n */\nexport function 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 Google media config (with timeout/retry options)\n */\nexport function extractGoogleMediaConfig(connector: Connector): GoogleMediaConfig {\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  const options = connector.getOptions();\n\n  return {\n    auth: {\n      type: 'api_key',\n      apiKey: auth.apiKey,\n    },\n    timeout: options.timeout as number | undefined,\n    maxRetries: options.maxRetries as number | undefined,\n  };\n}\n\n/**\n * Extract Grok media config\n */\nexport function extractGrokMediaConfig(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 * 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 { extractOpenAICompatConfig, extractGoogleConfig, extractGrokMediaConfig } from './extractProviderConfig.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(extractOpenAICompatConfig(connector, 'OpenAI'));\n\n    case Vendor.Google:\n      return new GoogleImageProvider(extractGoogleConfig(connector));\n\n    case Vendor.Grok:\n      return new GrokImageProvider(extractGrokMediaConfig(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 * 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  | '1536x1536'\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' | '1:4' | '4:1' | '1:8' | '8:1' | '2:1' | '1:2';\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.5: State-of-the-art image generation */\n    GPT_IMAGE_1_5: 'gpt-image-1.5',\n    /** ChatGPT-Image-Latest: Image model used in ChatGPT (floating alias) */\n    CHATGPT_IMAGE_LATEST: 'chatgpt-image-latest',\n    /** GPT-Image-1: Previous generation image model */\n    GPT_IMAGE_1: 'gpt-image-1',\n    /** GPT-Image-1-Mini: Cost-efficient version of GPT Image 1 */\n    GPT_IMAGE_1_MINI: 'gpt-image-1-mini',\n    /** DALL-E 3: Deprecated. High quality image generation */\n    DALL_E_3: 'dall-e-3',\n    /** DALL-E 2: Deprecated. 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    /** Nano Banana 2: Gemini 3.1 Flash native image gen with 4K support */\n    GEMINI_3_1_FLASH_IMAGE: 'gemini-3.1-flash-image-preview',\n    /** Nano Banana Pro: Gemini 3 Pro professional design engine with reasoning */\n    GEMINI_3_PRO_IMAGE: 'gemini-3-pro-image-preview',\n    /** Nano Banana: Gemini 2.5 Flash native image gen/editing */\n    GEMINI_2_5_FLASH_IMAGE: 'gemini-2.5-flash-image',\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: March 2026\n */\nexport const IMAGE_MODEL_REGISTRY: Record<string, IImageModelDescription> = {\n  // ======================== OpenAI ========================\n\n  'gpt-image-1.5': {\n    name: 'gpt-image-1.5',\n    displayName: 'GPT Image 1.5',\n    provider: Vendor.OpenAI,\n    description: 'State-of-the-art image generation with better instruction following and prompt adherence',\n    isActive: true,\n    releaseDate: '2025-12-16',\n    sources: {\n      documentation: 'https://developers.openai.com/api/docs/models/gpt-image-1.5',\n      pricing: 'https://openai.com/pricing',\n      lastVerified: '2026-03-14',\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 (requires png or webp)',\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: 100,\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.034, // medium quality 1024x1024\n      perImageHD: 0.133, // high quality 1024x1024\n      currency: 'USD',\n    },\n  },\n\n  'chatgpt-image-latest': {\n    name: 'chatgpt-image-latest',\n    displayName: 'ChatGPT Image Latest',\n    provider: Vendor.OpenAI,\n    description: 'Image model used in ChatGPT. Floating alias pointing to current ChatGPT image snapshot',\n    isActive: true,\n    releaseDate: '2025-12-01',\n    sources: {\n      documentation: 'https://developers.openai.com/api/docs/models/chatgpt-image-latest',\n      pricing: 'https://openai.com/pricing',\n      lastVerified: '2026-03-14',\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 (requires png or webp)',\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: 100,\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.034, // medium quality 1024x1024\n      perImageHD: 0.133, // high quality 1024x1024\n      currency: 'USD',\n    },\n  },\n\n  'gpt-image-1': {\n    name: 'gpt-image-1',\n    displayName: 'GPT Image 1',\n    provider: Vendor.OpenAI,\n    description: 'Previous generation OpenAI image model. More expensive than GPT Image 1.5',\n    isActive: true,\n    releaseDate: '2025-04-01',\n    sources: {\n      documentation: 'https://developers.openai.com/api/docs/models/gpt-image-1',\n      pricing: 'https://openai.com/pricing',\n      lastVerified: '2026-03-14',\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.042, // medium quality 1024x1024\n      perImageHD: 0.167, // high quality 1024x1024\n      currency: 'USD',\n    },\n  },\n\n  'gpt-image-1-mini': {\n    name: 'gpt-image-1-mini',\n    displayName: 'GPT Image 1 Mini',\n    provider: Vendor.OpenAI,\n    description: 'Cost-efficient version of GPT Image 1. Cheapest OpenAI image model',\n    isActive: true,\n    releaseDate: '2025-06-01',\n    sources: {\n      documentation: 'https://developers.openai.com/api/docs/models/gpt-image-1-mini',\n      pricing: 'https://openai.com/pricing',\n      lastVerified: '2026-03-14',\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 (requires png or webp)',\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: 100,\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, // medium quality 1024x1024\n      perImageHD: 0.036, // high quality 1024x1024\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: 'Deprecated. High quality image generation with prompt revision. Migrate to gpt-image-1.5',\n    isActive: false,\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: 'Deprecated. Fast image generation with editing and variation support. Migrate to gpt-image-1-mini',\n    isActive: false,\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-03-04',\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-03-04',\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.06, // Updated per official pricing page (was $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-03-04',\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  // ======================== Google Nano Banana (Gemini Native Image) ========================\n\n  'gemini-3.1-flash-image-preview': {\n    name: 'gemini-3.1-flash-image-preview',\n    displayName: 'Nano Banana 2 (Gemini 3.1 Flash Image)',\n    provider: Vendor.Google,\n    description: 'High-efficiency native image generation and editing with 4K support and thinking capabilities',\n    isActive: true,\n    releaseDate: '2026-02-01',\n    sources: {\n      documentation: 'https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-image-preview',\n      pricing: 'https://ai.google.dev/pricing',\n      lastVerified: '2026-03-04',\n    },\n    capabilities: {\n      sizes: ['512x512', '1024x1024', '1536x1536', 'auto'],\n      aspectRatios: ['1:1', '1:4', '4:1', '1:8', '8:1'],\n      maxImagesPerRequest: 4,\n      outputFormats: ['png', 'jpeg'],\n      features: {\n        generation: true,\n        editing: true,\n        variations: false,\n        styleControl: false,\n        qualityControl: true, // Multiple resolution tiers: 0.5K, 1K, 2K, 4K\n        transparency: false,\n        promptRevision: false,\n      },\n      limits: { maxPromptLength: 131072 }, // 131K input tokens\n      vendorOptions: {\n        outputImageResolution: {\n          type: 'enum',\n          label: 'Resolution',\n          description: 'Output image resolution tier',\n          enum: ['0.5K', '1K', '2K', '4K'],\n          default: '1K',\n          controlType: 'select',\n        },\n      },\n    },\n    pricing: {\n      // Per-image, varies by resolution: $0.045 (512px), $0.067 (1K), $0.101 (2K), $0.151 (4K)\n      perImageStandard: 0.067, // 1K default\n      perImageHD: 0.151, // 4K\n      currency: 'USD',\n    },\n  },\n\n  'gemini-3-pro-image-preview': {\n    name: 'gemini-3-pro-image-preview',\n    displayName: 'Nano Banana Pro (Gemini 3 Pro Image)',\n    provider: Vendor.Google,\n    description: 'Professional design engine with reasoning for studio-quality 4K visuals, complex layouts, and precise text rendering',\n    isActive: true,\n    releaseDate: '2025-11-01',\n    sources: {\n      documentation: 'https://ai.google.dev/gemini-api/docs/models/gemini-3-pro-image-preview',\n      pricing: 'https://ai.google.dev/pricing',\n      lastVerified: '2026-03-04',\n    },\n    capabilities: {\n      sizes: ['1024x1024', 'auto'],\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: true,\n        variations: false,\n        styleControl: true, // Reasoning-driven design\n        qualityControl: true, // 1K, 2K, 4K tiers\n        transparency: false,\n        promptRevision: false,\n      },\n      limits: { maxPromptLength: 65536 }, // 65K input tokens\n      vendorOptions: {\n        outputImageResolution: {\n          type: 'enum',\n          label: 'Resolution',\n          description: 'Output image resolution tier',\n          enum: ['1K', '2K', '4K'],\n          default: '1K',\n          controlType: 'select',\n        },\n      },\n    },\n    pricing: {\n      // $0.134 per 1K/2K image, $0.24 per 4K image\n      perImageStandard: 0.134, // 1K/2K\n      perImageHD: 0.24, // 4K\n      currency: 'USD',\n    },\n  },\n\n  'gemini-2.5-flash-image': {\n    name: 'gemini-2.5-flash-image',\n    displayName: 'Nano Banana (Gemini 2.5 Flash Image)',\n    provider: Vendor.Google,\n    description: 'Native image generation and editing designed for fast, creative workflows',\n    isActive: true,\n    releaseDate: '2025-10-01',\n    sources: {\n      documentation: 'https://ai.google.dev/gemini-api/docs/models/gemini-2.5-flash-image',\n      pricing: 'https://ai.google.dev/pricing',\n      lastVerified: '2026-03-04',\n    },\n    capabilities: {\n      sizes: ['1024x1024', 'auto'],\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: true,\n        variations: false,\n        styleControl: false,\n        qualityControl: false,\n        transparency: false,\n        promptRevision: false,\n      },\n      limits: { maxPromptLength: 65536 }, // 65K input tokens\n    },\n    pricing: {\n      perImage: 0.039, // $0.039 per image\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-03-04',\n    },\n    capabilities: {\n      sizes: ['1024x1024'],\n      aspectRatios: ['1:1', '4:3', '3:4', '16:9', '9:16', '3:2', '2:3', '2:1', '1:2'],\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 '@everworker/oneringai';\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"]}