{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/core/log.ts","../src/config/config.ts","../src/clients/baseZuoraClient.ts","../src/clients/types.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/*\n * Copyright Zuora, Inc. 2025\n */\n\nimport * as os from 'os';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { Command } from 'commander';\nimport { VERSION } from './constants.js';\nimport { getMcpConfig } from './config/config.js';\nimport { zuoraClient } from './clients/types.js';\nimport { logger } from './utils/core/log.js';\nimport type { McpConfig } from './config/config.js';\nimport type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';\n\nexport function extractClientName(message: JSONRPCMessage): string | undefined {\n  if ('method' in message && message.method === 'initialize') {\n    const params = (message as any).params;\n    return params?.clientInfo?.name;\n  }\n  return undefined;\n}\n\nexport function buildHeaders(clientName?: string): Record<string, string> {\n  const origin = clientName || 'unknown';\n  const agentName = process.env.AGENT_NAME?.trim();\n  const userAgentContext = [\n    os.platform(),\n    `Node/${process.version}`,\n    `origin:${origin}`,\n    ...(agentName ? [`agent:${agentName}`] : []),\n  ].join('; ');\n\n  const headers: Record<string, string> = {\n    'User-Agent': `zuora-mcp/${VERSION} (${userAgentContext})`,\n    ...(process.env.ZUORA_VERSION && { 'Zuora-Version': process.env.ZUORA_VERSION }),\n  };\n\n  const entityIds = process.env.ZUORA_ENTITY_IDS?.trim();\n  if (entityIds) headers['Zuora-Entity-Ids'] = entityIds;\n\n  const orgIds = process.env.ZUORA_ORG_IDS?.trim();\n  if (orgIds) headers['Zuora-Org-Ids'] = orgIds;\n\n  return headers;\n}\n\nfunction isAuthError(error: any): boolean {\n  return error?.code === 401 || error?.code === 403;\n}\n\nasync function start(config: McpConfig): Promise<() => Promise<void>> {\n  const stdioTransport = new StdioServerTransport();\n  const { remoteUrl } = config;\n\n  let httpTransport: StreamableHTTPClientTransport | null = null;\n  let liveHeaders: Record<string, string> = {};\n  let lastToken: string | null = null;\n  let initPromise: Promise<void> | null = null;\n\n  async function refreshAuthHeader(): Promise<void> {\n    const token = await zuoraClient.getAccessToken();\n    if (token !== lastToken) {\n      logger.info(`OAuth token ${lastToken ? 'refreshed' : 'obtained'}`);\n      lastToken = token;\n      liveHeaders['Authorization'] = `Bearer ${token}`;\n    }\n  }\n\n  function createTransport(clientName?: string): StreamableHTTPClientTransport {\n    liveHeaders = buildHeaders(clientName);\n\n    const fetchWithTimeout = (url: string | URL, init?: RequestInit): Promise<Response> => {\n      if (init?.method === 'POST') {\n        const signals = [AbortSignal.timeout(config.timeoutMs)];\n        if (init.signal) signals.push(init.signal);\n        return fetch(url, { ...init, signal: AbortSignal.any(signals) });\n      }\n      return fetch(url, init);\n    };\n\n    const transport = new StreamableHTTPClientTransport(\n      new URL(remoteUrl),\n      {\n        requestInit: { headers: liveHeaders },\n        fetch: fetchWithTimeout,\n      }\n    );\n\n    transport.onmessage = async (message) => {\n      try {\n        await stdioTransport.send(message);\n      } catch (error) {\n        logger.error('Error sending message to client:', error);\n      }\n    };\n\n    transport.onerror = (error) => {\n      logger.error('Remote error:', error);\n    };\n\n    transport.onclose = async () => {\n      await stdioTransport.close();\n    };\n\n    return transport;\n  }\n\n  stdioTransport.onmessage = async (message) => {\n    try {\n      if (!initPromise) {\n        initPromise = (async () => {\n          const clientName = extractClientName(message);\n          httpTransport = createTransport(clientName);\n          await refreshAuthHeader();\n          await httpTransport.start();\n          logger.info(`Connected to ${remoteUrl}`);\n        })();\n      } else {\n        await refreshAuthHeader();\n      }\n\n      await initPromise;\n      await httpTransport!.send(message);\n    } catch (error: any) {\n      if (isAuthError(error)) {\n        logger.warn('Auth error, refreshing token and retrying...');\n        zuoraClient.invalidateToken();\n        lastToken = null;\n        try {\n          await refreshAuthHeader();\n          await httpTransport!.send(message);\n          return;\n        } catch (retryError: any) {\n          error = retryError;\n        }\n      }\n\n      logger.error('Error sending message to remote:', error);\n\n      if ('id' in message && message.id !== undefined) {\n        const errorMessage: JSONRPCMessage = {\n          jsonrpc: '2.0',\n          id: (message as any).id,\n          error: {\n            code: error?.code || -32603,\n            message: error?.message || 'Internal error',\n          },\n        };\n        await stdioTransport.send(errorMessage).catch(() => {});\n      }\n    }\n  };\n\n  stdioTransport.onerror = (error) => {\n    logger.error('Stdio error:', error);\n  };\n\n  stdioTransport.onclose = async () => {\n    await httpTransport?.close();\n  };\n\n  await stdioTransport.start();\n  logger.info('Zuora MCP server started');\n\n  return async () => {\n    await httpTransport?.close();\n    await stdioTransport.close();\n  };\n}\n\nasync function main() {\n  const program = new Command();\n\n  program\n      .name('zuora-mcp')\n      .description('MCP server for interacting with Zuora')\n      .version(VERSION)\n      .action(async () => {\n        try {\n          const config = getMcpConfig();\n          const cleanup = await start(config);\n\n          logger.info('Zuora MCP server is running');\n\n          const shutdown = async () => {\n            logger.info('Shutting down Zuora MCP server...');\n            await cleanup();\n            process.exit(0);\n          };\n\n          process.on('SIGINT', shutdown);\n          process.on('SIGTERM', shutdown);\n\n          await new Promise(() => {});\n        } catch (error) {\n          logger.error('Error starting Zuora MCP server:', error);\n          process.exit(1);\n        }\n      });\n\n  await program.parseAsync(process.argv);\n}\n\n// Guard: only run as CLI when executed directly, not when imported by tests.\n// Works in both CJS (built output via require.main) and Bun ESM test runner\n// (process.argv[1] matches this file's path).\nconst isMain = typeof require !== 'undefined'\n  ? require.main === module\n  : process.argv[1]?.endsWith('index.ts') || process.argv[1]?.endsWith('index.cjs');\n\nif (isMain) {\n  main().catch((error) => {\n    logger.error('\\n  Error starting Zuora MCP server:\\n');\n    logger.warn(`   ${error.message}\\n`);\n    process.exit(1);\n  });\n}\n","/*\n * Copyright Zuora, Inc. 2025\n */\n\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\ndeclare const __dirname: string;\nconst packageJSON = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n\n// Exported constant representing the current version of the application\nexport const VERSION: string = packageJSON.version;\n\n// Exported constant representing the name of the MCP server\nexport const MCP_SERVER_NAME: string = 'Zuora Developer MCP Server';\n\nexport const TEL_EVENT_TYPE: string = 'zuora-devx-mcp';","/*\n * Copyright Zuora, Inc. 2025\n */\n\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst RESET = '\\x1b[0m';\n\n// Note: console.error is used instead of console.log to avoid breaking the MCP server,\n// which listens to stdout (stdio) for command responses. Logs are directed to stderr.\n\n/**\n * ANSI color wrapper utility.\n * Each function wraps a given string with ANSI escape codes for terminal color output.\n */\nexport function red(text: string): string {\n\treturn `${RED}${text}${RESET}`;\n}\n\nexport function green(text: string): string {\n\treturn `${GREEN}${text}${RESET}`;\n}\n\nexport function yellow(text: string): string {\n\treturn `${YELLOW}${text}${RESET}`;\n}\n\nexport function blue(text: string): string {\n\treturn `${BLUE}${text}${RESET}`;\n}\n\n/**\n * Logging levels for structured and filtered output.\n */\nexport enum LogLevel {\n\tERROR = 0,\n\tWARN = 1,\n\tINFO = 2,\n\tDEBUG = 3,\n}\n\n/**\n * Logger class for consistent and colorized log output.\n * Supports multiple log levels and formatted messages.\n */\nexport class Logger {\n\tprivate level: LogLevel;\n\n\tconstructor(level: LogLevel = LogLevel.INFO) {\n\t\tthis.level = level;\n\t}\n\n\t/**\n\t * Updates the current log level\n\t */\n\tsetLevel(level: LogLevel): void {\n\t\tthis.level = level;\n\t}\n\n\t/**\n\t * Retrieves the current log level\n\t */\n\tgetLevel(): LogLevel {\n\t\treturn this.level;\n\t}\n\n\t/**\n\t * Formats a timestamp for log messages\n\t * Format: YYYY-MM-DD HH:mm:ss.SSS\n\t */\n\tprivate getTimestamp(): string {\n\t\tconst now = new Date();\n\t\tconst year = now.getFullYear();\n\t\tconst month = String(now.getMonth() + 1).padStart(2, '0');\n\t\tconst day = String(now.getDate()).padStart(2, '0');\n\t\tconst hours = String(now.getHours()).padStart(2, '0');\n\t\tconst minutes = String(now.getMinutes()).padStart(2, '0');\n\t\tconst seconds = String(now.getSeconds()).padStart(2, '0');\n\t\tconst ms = String(now.getMilliseconds()).padStart(3, '0');\n\t\t\n\t\treturn `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;\n\t}\n\n\t/**\n\t * Logs an error message if ERROR level is enabled\n\t */\n\terror(message: string, ...args: any[]): void {\n\t\tif (this.level >= LogLevel.ERROR) {\n\t\t\tconsole.error(`${this.getTimestamp()} ${red('[ERROR]')} ${message}`, ...args);\n\t\t}\n\t}\n\n\t/**\n\t * Logs a warning message if WARN level is enabled\n\t */\n\twarn(message: string, ...args: any[]): void {\n\t\tif (this.level >= LogLevel.WARN) {\n\t\t\tconsole.error(`${this.getTimestamp()} ${yellow('[WARN]')} ${message}`, ...args);\n\t\t}\n\t}\n\n\t/**\n\t * Logs an informational message if INFO level is enabled\n\t */\n\tinfo(message: string, ...args: any[]): void {\n\t\tif (this.level >= LogLevel.INFO) {\n\t\t\tconsole.error(`${this.getTimestamp()} ${blue('[INFO]')} ${message}`, ...args);\n\t\t}\n\t}\n\n\t/**\n\t * Logs a debug message if DEBUG level is enabled\n\t */\n\tdebug(message: string, ...args: any[]): void {\n\t\tif (this.level >= LogLevel.DEBUG) {\n\t\t\tconsole.error(`${this.getTimestamp()} ${green('[DEBUG]')} ${message}`, ...args);\n\t\t}\n\t}\n}\n\n/**\n * A shared logger instance using default INFO level\n */\nexport const logger = new Logger();\n","/*\n * Copyright Zuora, Inc. 2025\n */\n\nimport { logger } from '../utils/core/log.js';\n\nexport interface McpConfig {\n  remoteUrl: string;\n  restBaseUrl: string;\n  timeoutMs: number;\n}\n\n/**\n * Parses ZUORA_BASE_URL and derives { restBaseUrl, remoteUrl }.\n * remoteUrl is always restBaseUrl + /mcp.\n *\n * Primary format: REST base URL (e.g. https://rest.apisandbox.zuora.com)\n * → remoteUrl = https://rest.apisandbox.zuora.com/mcp\n *\n * Legacy format: short MCP host (e.g. https://apisandbox.zuora.com/mcp)\n * → restBaseUrl = https://rest.apisandbox.zuora.com, remoteUrl = https://rest.apisandbox.zuora.com/mcp\n */\nexport function parseZuoraUrl(raw: string): { remoteUrl: string; restBaseUrl: string } {\n  const url = raw.replace(/\\/+$/, '');\n  const parsed = new URL(url);\n\n  let restBaseUrl: string;\n\n  if (url.endsWith('/mcp')) {\n    const stagingHostMatch = parsed.hostname.match(/^staging(\\d+)\\.zuora\\.com$/);\n\n    if (stagingHostMatch) {\n      restBaseUrl = `${parsed.protocol}//rest-staging${stagingHostMatch[1]}.zuora.com`;\n    } else {\n      // Short MCP hostname given (e.g. apisandbox.zuora.com/mcp)\n      // Reconstruct REST base by adding \"rest.\" prefix\n      restBaseUrl = `${parsed.protocol}//rest.${parsed.hostname}`;\n    }\n  } else {\n    // REST base URL given directly — use as-is\n    restBaseUrl = url;\n  }\n\n  return {\n    remoteUrl: `${restBaseUrl}/mcp`,\n    restBaseUrl,\n  };\n}\n\nexport function getMcpConfig(): McpConfig {\n  const raw = process.env.ZUORA_BASE_URL || process.env.BASE_URL || '';\n\n  if (!raw) {\n    throw new Error('ZUORA_BASE_URL is required.');\n  }\n\n  const { remoteUrl, restBaseUrl } = parseZuoraUrl(raw);\n\n  try {\n    new URL(remoteUrl);\n  } catch {\n    throw new Error(`Derived MCP URL is not valid: ${remoteUrl}`);\n  }\n\n  const timeoutMs = parseInt(process.env.REMOTE_MCP_TIMEOUT_MS || '120000', 10);\n\n  logger.info(`Connecting to: ${remoteUrl}`);\n  return { remoteUrl, restBaseUrl, timeoutMs };\n}\n","/*\n * Copyright Zuora, Inc. 2025\n */\n\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { logger } from '../utils/core/log.js';\n\ninterface BaseZuoraResponse {\n  requestUrl: string;\n  requestMethod: string;\n  requestHeaders: Record<string, string>;\n  requestPayload?: any;\n}\n\nexport interface ZuoraApiSuccessResponse<T = any> extends BaseZuoraResponse {\n  type: 'success';\n  status: number;\n  statusText: string;\n  data: T;\n  headers: Record<string, any>;\n}\n\nexport interface ZuoraApiHttpErrorResponse extends BaseZuoraResponse {\n  type: 'http_error';\n  error: true;\n  status: number;\n  statusText: string;\n  data: any;\n  headers: Record<string, any>;\n}\n\nexport interface ZuoraApiNetworkErrorResponse extends BaseZuoraResponse {\n  type: 'network_error';\n  error: true;\n  message: string;\n}\n\nexport type ZuoraApiResponse<T = any> =\n  | ZuoraApiSuccessResponse<T>\n  | ZuoraApiHttpErrorResponse\n  | ZuoraApiNetworkErrorResponse;\n\nexport interface BaseRequestParams {\n  endpoint: string;\n  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  data?: any;\n  headers?: Record<string, string>;\n  queryParams?: Record<string, any>;\n  timeout?: number;\n  responseType?: 'json' | 'text' | 'arraybuffer';\n}\n\ntype OAuthTokenEndpoint = 'rest' | 'oneId';\n\nexport class BaseZuoraClient {\n  protected baseUrl: string;\n  protected authToken: string | null = null;\n  protected tokenExpiry: number | null = null;\n  protected tenantId: string | null = null;\n  protected defaultHeaders: Record<string, string> = {};\n  protected oauthTokenEndpoint: OAuthTokenEndpoint = 'rest';\n\n  constructor(baseUrl: string) {\n    this.baseUrl = baseUrl;\n    this.defaultHeaders = {\n      'Content-Type': 'application/json',\n    };\n  }\n\n  /**\n   * Sanitize headers to remove sensitive information\n   */\n  protected sanitizeHeaders(headers: Record<string, string>): Record<string, string> {\n    const sanitized = { ...headers };\n    \n    // Remove or mask sensitive headers\n    if (sanitized['Authorization']) {\n      const auth = sanitized['Authorization'];\n      if (auth.startsWith('Bearer ')) {\n        sanitized['Authorization'] = 'Bearer [REDACTED]';\n      } else {\n        sanitized['Authorization'] = '[REDACTED]';\n      }\n    }\n    \n    // Remove other potentially sensitive headers\n    const sensitiveHeaders = ['X-API-Key', 'X-Secret-Key', 'X-Auth-Token', 'Cookie', 'Csrf_token', 'set-cookie'];\n    sensitiveHeaders.forEach(header => {\n      if (sanitized[header]) {\n        sanitized[header] = '[REDACTED]';\n      }\n    });\n    \n    return sanitized;\n  }\n\n  /**\n   * Execute a raw HTTP request with full transparency\n   */\n  protected async executeRequest<T = any>(params: BaseRequestParams): Promise<ZuoraApiResponse<T>> {\n    const { \n      endpoint, \n      method, \n      data, \n      headers = {}, \n      queryParams, \n      timeout = 30000,\n      responseType = 'json'\n    } = params;\n    \n    const url = this.buildUrl(endpoint, queryParams);\n    const requestHeaders = await this.getAuthHeaders();\n    \n    // Attach entity scoping header from environment if provided and not already set\n    const entityIds = this.getEntityIdsFromEnv();\n    if (entityIds && !headers['Zuora-Entity-Ids'] && !requestHeaders['Zuora-Entity-Ids']) {\n      requestHeaders['Zuora-Entity-Ids'] = entityIds;\n    }\n\n    // Attach org scoping header from environment if provided and not already set\n    const orgIds = this.getOrgIdsFromEnv();\n    if (orgIds && !headers['Zuora-Org-Ids'] && !requestHeaders['Zuora-Org-Ids']) {\n      requestHeaders['Zuora-Org-Ids'] = orgIds;\n    }\n    \n    // Merge default headers, auth headers, and custom headers\n    Object.assign(requestHeaders, this.defaultHeaders, headers);\n\n    const axiosConfig: AxiosRequestConfig = {\n      url,\n      method,\n      data,\n      headers: requestHeaders,\n      timeout,\n      responseType,\n    };\n\n    try {\n      const response: AxiosResponse = await axios(axiosConfig);\n\n      // Return ZuoraApiSuccessResponse<T>\n      const successResponse: ZuoraApiSuccessResponse<T> = {\n        type: 'success',\n        status: response.status,\n        statusText: response.statusText,\n        data: response.data,\n        headers: response.headers,\n        requestUrl: url,\n        requestMethod: method,\n        requestHeaders: this.sanitizeHeaders(requestHeaders), // ✅ Sanitized headers\n        requestPayload: data, // ✅ Include request payload for transparency\n      };\n      return successResponse;\n    } catch (error: any) {\n      logger.error(`HTTP request failed: ${error.message}`);\n\n      if (error.response) {\n        // Server responded with error status - return ZuoraApiHttpErrorResponse\n        const httpErrorResponse: ZuoraApiHttpErrorResponse = {\n          type: 'http_error',\n          error: true,\n          status: error.response.status,\n          statusText: error.response.statusText,\n          data: error.response.data,\n          headers: error.response.headers,\n          requestUrl: url,\n          requestMethod: method,\n          requestHeaders: this.sanitizeHeaders(requestHeaders), // ✅ Sanitized headers\n          requestPayload: data, // ✅ Include request payload for debugging\n        };\n        return httpErrorResponse;\n      } else if (error.request) {\n        // Request was made but no response received - return ZuoraApiNetworkErrorResponse\n        const networkErrorResponse: ZuoraApiNetworkErrorResponse = {\n          type: 'network_error',\n          error: true,\n          message: 'No response received from server',\n          requestUrl: url,\n          requestMethod: method,\n          requestHeaders: this.sanitizeHeaders(requestHeaders), // ✅ Sanitized headers\n          requestPayload: data, // ✅ Include request payload for debugging\n        };\n        return networkErrorResponse;\n      } else {\n        // Error in request setup - return ZuoraApiNetworkErrorResponse\n        const setupErrorResponse: ZuoraApiNetworkErrorResponse = {\n          type: 'network_error',\n          error: true,\n          message: error.message,\n          requestUrl: url,\n          requestMethod: method,\n          requestHeaders: this.sanitizeHeaders(requestHeaders), // ✅ Sanitized headers\n          requestPayload: data, // ✅ Include request payload for debugging\n        };\n        return setupErrorResponse;\n      }\n    }\n  }\n\n  /**\n   * Build query string from parameters\n   * Extracted for reuse in subclasses\n   */\n  protected buildQueryString(queryParams: Record<string, any>): string {\n    const params = new URLSearchParams();\n    Object.entries(queryParams).forEach(([key, value]) => {\n      if (Array.isArray(value)) {\n        value.forEach(v => params.append(key, v));\n      } else if (value !== undefined && value !== null) {\n        params.append(key, String(value));\n      }\n    });\n    return params.toString();\n  }\n\n  protected buildUrl(endpoint: string, queryParams?: Record<string, any>): string {\n    const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n    let url = `${this.baseUrl}/${cleanEndpoint}`;\n    \n    if (queryParams) {\n      const queryString = this.buildQueryString(queryParams);\n      if (queryString) {\n        url += `?${queryString}`;\n      }\n    }\n    \n    return url;\n  }\n\n  public async getAuthHeaders(): Promise<Record<string, string>> {\n    const token = await this.getValidToken();\n    return {\n      'Authorization': `Bearer ${token}`,\n    };\n  }\n\n  /**\n   * Get a valid OAuth access token for use by external callers (e.g., proxy auth).\n   * Returns the cached token or fetches a new one when expired.\n   */\n  public async getAccessToken(): Promise<string> {\n    return this.getValidToken();\n  }\n\n  /**\n   * Invalidate the cached OAuth token so the next getAccessToken() fetches fresh.\n   */\n  public invalidateToken(): void {\n    this.authToken = null;\n    this.tokenExpiry = null;\n  }\n\n  /**\n   * Get valid OAuth token, refreshing if needed\n   */\n  protected async getValidToken(): Promise<string> {\n    const now = Date.now();\n    \n    if (this.authToken && this.tokenExpiry && now < this.tokenExpiry) {\n      return this.authToken;\n    }\n    \n    return await this.fetchNewToken();\n  }\n\n  /**\n   * Fetch OAuth response from Zuora\n   * Returns the full OAuth response data for subclasses that need additional fields\n   */\n  protected async fetchOAuthResponse(): Promise<{ access_token: string; expires_in: number; scope?: string }> {\n    const ZUORA_CLIENT_ID = process.env.ZUORA_CLIENT_ID;\n    const ZUORA_CLIENT_SECRET = process.env.ZUORA_CLIENT_SECRET;\n    \n    if (!ZUORA_CLIENT_ID || !ZUORA_CLIENT_SECRET) {\n      throw new Error('ZUORA_CLIENT_ID and ZUORA_CLIENT_SECRET environment variables are required');\n    }\n\n    const params = new URLSearchParams();\n    params.append('grant_type', 'client_credentials');\n    params.append('client_id', ZUORA_CLIENT_ID);\n    params.append('client_secret', ZUORA_CLIENT_SECRET);\n\n    const endpoints: OAuthTokenEndpoint[] = this.oauthTokenEndpoint === 'oneId'\n      ? ['oneId', 'rest']\n      : ['rest', 'oneId'];\n    let lastError: any;\n\n    for (let i = 0; i < endpoints.length; i++) {\n      const endpoint = endpoints[i];\n      try {\n        return await this.requestOAuthToken(endpoint, params);\n      } catch (error: any) {\n        lastError = error;\n        const nextEndpoint = endpoints[i + 1];\n\n        if (nextEndpoint) {\n          logger.warn(\n            `${this.getOAuthTokenEndpointLabel(endpoint)} OAuth token endpoint failed, trying ${this.getOAuthTokenEndpointLabel(nextEndpoint)} token endpoint:`,\n            error.message\n          );\n        }\n      }\n    }\n\n    logger.error('Failed to obtain OAuth token:', lastError.message);\n    throw new Error(`Authentication failed: ${lastError.message}`);\n  }\n\n  protected async requestOAuthToken(\n    endpoint: OAuthTokenEndpoint,\n    params: URLSearchParams\n  ): Promise<{ access_token: string; expires_in: number; scope?: string }> {\n    const response = await axios({\n      url: this.getOAuthTokenUrl(endpoint),\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      data: params,\n      timeout: 10000,\n    });\n\n    this.oauthTokenEndpoint = endpoint;\n    return response.data;\n  }\n\n  protected getOAuthTokenUrl(endpoint: OAuthTokenEndpoint): string {\n    if (endpoint === 'rest') {\n      return `${this.baseUrl}/oauth/token`;\n    }\n\n    return this.isStagingBaseUrl()\n      ? 'https://one.stg.na.zuora.com/oauth2/token'\n      : 'https://one.zuora.com/oauth2/token';\n  }\n\n  protected getOAuthTokenEndpointLabel(endpoint: OAuthTokenEndpoint): string {\n    return endpoint === 'rest' ? 'REST' : 'OneID';\n  }\n\n  protected isStagingBaseUrl(): boolean {\n    try {\n      const hostname = new URL(this.baseUrl).hostname.toLowerCase();\n      return hostname.includes('staging') || hostname.includes('.stg.') || hostname.includes('-stg');\n    } catch {\n      const lowerBaseUrl = this.baseUrl.toLowerCase();\n      return lowerBaseUrl.includes('staging') || lowerBaseUrl.includes('.stg.') || lowerBaseUrl.includes('-stg');\n    }\n  }\n\n  /**\n   * Fetch new OAuth token from Zuora\n   * Parses the response and caches the token\n   */\n  protected async fetchNewToken(): Promise<string> {\n    const oauthData = await this.fetchOAuthResponse();\n    const { access_token, expires_in, scope } = oauthData;\n    \n    this.authToken = access_token;\n    // Set expiry 5 minutes before actual expiry for safety\n    this.tokenExpiry = Date.now() + (expires_in - 300) * 1000;\n\n    // Parse tenant ID from scope\n    if (scope) {\n      const tenantMatch = scope.match(/tenant\\.(\\d+)/);\n      if (tenantMatch && tenantMatch[1]) {\n        this.tenantId = tenantMatch[1];\n      } else {\n        logger.warn('Tenant ID not found in OAuth token scope');\n      }\n    }\n\n    return access_token;\n  }\n\n  /**\n   * Set custom headers that will be included in all requests\n   */\n  public setHeaders(headers: Record<string, string>): void {\n    Object.assign(this.defaultHeaders, headers);\n  }\n\n  /**\n   * Read Zuora entity IDs from environment (optional header override)\n   */\n  protected getEntityIdsFromEnv(): string | undefined {\n    const ids = process.env.ZUORA_ENTITY_IDS;\n    if (!ids) {\n      return undefined;\n    }\n    return ids.trim();\n  }\n\n  /**\n   * Read Zuora org IDs from environment (optional header override)\n   */\n  protected getOrgIdsFromEnv(): string | undefined {\n    const ids = process.env.ZUORA_ORG_IDS;\n    if (!ids) {\n      return undefined;\n    }\n    return ids.trim();\n  }\n\n  /**\n   * Update base URL\n   */\n  public setBaseUrl(baseUrl: string): void {\n    this.baseUrl = baseUrl;\n  }\n\n  /**\n   * Get the base URL (for approval checks)\n   */\n  public getBaseUrl(): string {\n    return this.baseUrl;\n  }\n\n  /**\n   * Get the tenant ID extracted from OAuth token scope\n   * If tenant ID is not available, attempts to fetch a new token to extract it\n   */\n  public async getTenantId(): Promise<string | null> {\n    // If we don't have a tenant ID yet, try fetching a token\n    if (!this.tenantId) {\n      try {\n        await this.getValidToken();\n      } catch (error) {\n        logger.info('Failed to fetch token for tenant ID extraction:', error);\n      }\n    }\n    \n    return this.tenantId;\n  }\n} \n","/*\n * Copyright Zuora, Inc. 2025\n */\n\nimport { BaseZuoraClient } from './baseZuoraClient.js';\nimport { parseZuoraUrl } from '../config/config.js';\n\nconst raw = process.env.ZUORA_BASE_URL || process.env.BASE_URL || 'https://rest.zuora.com';\nconst { restBaseUrl } = parseZuoraUrl(raw);\n\nexport const zuoraClient = new BaseZuoraClient(restBaseUrl);\n"],"mappings":"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","names":["raw","restBaseUrl","axios"]}