{"version":3,"sources":["/home/mkabumattar/work/withrawi/rawi/dist/chunk-OK6HOE55.cjs","../src/core/configs/managers/interactive.manager.ts"],"names":["InteractiveConfigManager","#validator","ConfigValidator","profile","#isValidProfileName"],"mappings":"AAAA;AACA,wDAAwC,wDAAgD,wDAAgD,4CCDjF,4EACrC,IAULA,CAAAA,CAAN,KAA+B,CAC3BC,CAAAA,CAAAA,CAAa,IAAIC,mBAAAA,CAE1B,MAAM,UAAA,CAAWC,CAAAA,CAAmC,CAClD,EAAA,CAAIA,CAAAA,CAAS,CACX,EAAA,CAAI,CAAC,IAAA,CAAKC,CAAAA,CAAAA,CAAoBD,CAAO,CAAA,CACnC,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyBA,CAAO,CAAA,CAAA;ADf4S","file":"/home/mkabumattar/work/withrawi/rawi/dist/chunk-OK6HOE55.cjs","sourcesContent":[null,"import {confirm, input, password, search, select} from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport {getAllProviders, getProvider} from '../../providers/index.js';\nimport {\n  DEFAULT_LANGUAGE,\n  DEFAULT_PROFILE,\n  type SupportedLanguage,\n  type SupportedProvider,\n} from '../../shared/index.js';\nimport {ConfigValidator} from '../validators/config.validator.js';\n\nexport class InteractiveConfigManager {\n  readonly #validator = new ConfigValidator();\n\n  async getProfile(profile?: string): Promise<string> {\n    if (profile) {\n      if (!this.#isValidProfileName(profile)) {\n        throw new Error(`Invalid profile name: ${profile}`);\n      }\n      return profile;\n    }\n\n    return input({\n      message: 'Profile Name:',\n      default: DEFAULT_PROFILE,\n      validate: (input: string) => {\n        if (!input.trim()) {\n          return 'Profile name is required';\n        }\n        if (!this.#isValidProfileName(input.trim())) {\n          return 'Profile name can only contain letters, numbers, hyphens, and underscores';\n        }\n        return true;\n      },\n    });\n  }\n\n  async selectProvider(\n    defaultProvider?: SupportedProvider,\n  ): Promise<SupportedProvider> {\n    const providers = getAllProviders();\n    const choices = providers.map((p) => ({\n      name: `${p.displayName} (${p.name})`,\n      value: p.name as SupportedProvider,\n      description: `${p.name} - ${p.displayName}`,\n    }));\n\n    if (choices.length > 5) {\n      return search({\n        message: 'Select AI Provider (type to search):',\n        source: async (input) => {\n          if (!input) {\n            if (defaultProvider) {\n              const defaultChoice = choices.find(\n                (choice) => choice.value === defaultProvider,\n              );\n              const otherChoices = choices.filter(\n                (choice) => choice.value !== defaultProvider,\n              );\n              return defaultChoice ? [defaultChoice, ...otherChoices] : choices;\n            }\n            return choices;\n          }\n\n          const filtered = choices.filter(\n            (choice) =>\n              choice.name.toLowerCase().includes(input.toLowerCase()) ||\n              choice.value.toLowerCase().includes(input.toLowerCase()) ||\n              choice.description?.toLowerCase().includes(input.toLowerCase()),\n          );\n\n          return filtered;\n        },\n      });\n    } else {\n      return select({\n        message: 'Select AI Provider:',\n        choices,\n        default: defaultProvider,\n      });\n    }\n  }\n\n  async selectModel(\n    provider: SupportedProvider,\n    defaultModel?: string,\n  ): Promise<string> {\n    const providerConfig = getProvider(provider);\n\n    if (!providerConfig) {\n      throw new Error(`Unknown provider: ${provider}`);\n    }\n\n    const choices = providerConfig.models.map((model) => ({\n      name: model.displayName || model.name,\n      value: model.name,\n      description: model.description || '',\n    }));\n\n    if (choices.length === 0) {\n      throw new Error(`No models available for provider: ${provider}`);\n    }\n\n    if (choices.length > 5) {\n      return search({\n        message: `Select ${providerConfig.displayName} Model (type to search):`,\n        source: async (input) => {\n          if (!input) {\n            if (defaultModel) {\n              const defaultChoice = choices.find(\n                (choice) => choice.value === defaultModel,\n              );\n              const otherChoices = choices.filter(\n                (choice) => choice.value !== defaultModel,\n              );\n              return defaultChoice ? [defaultChoice, ...otherChoices] : choices;\n            }\n            return choices;\n          }\n\n          const filtered = choices.filter(\n            (choice) =>\n              choice.name.toLowerCase().includes(input.toLowerCase()) ||\n              choice.value.toLowerCase().includes(input.toLowerCase()) ||\n              choice.description?.toLowerCase().includes(input.toLowerCase()),\n          );\n\n          return filtered;\n        },\n      });\n    } else {\n      return select({\n        message: `Select ${providerConfig.displayName} Model:`,\n        choices,\n        default: defaultModel,\n      });\n    }\n  }\n\n  async getApiKey(\n    defaultApiKey?: string,\n    provider?: SupportedProvider,\n  ): Promise<string> {\n    const message = provider\n      ? `${getProvider(provider)?.displayName || provider} API Key:`\n      : 'API Key:';\n\n    let apiKey: string;\n\n    if (defaultApiKey) {\n      const useExisting = await confirm({\n        message: `Use existing API key (${this.#maskApiKey(defaultApiKey)})?`,\n        default: true,\n      });\n\n      if (useExisting) {\n        return defaultApiKey;\n      }\n    }\n\n    do {\n      apiKey = await password({\n        message,\n        mask: '*',\n        validate: (input: string) => {\n          if (!input.trim()) {\n            return 'API key is required';\n          }\n\n          if (provider) {\n            const validation = this.#validator.validateApiKey(\n              input.trim(),\n              provider,\n            );\n            if (!validation.isValid) {\n              return validation.errors[0] || 'Invalid API key';\n            }\n\n            if (validation.warnings.length > 0) {\n              console.log(\n                chalk.yellow(`Warning: ${validation.warnings.join(', ')}`),\n              );\n            }\n          }\n\n          return true;\n        },\n      });\n    } while (!apiKey.trim());\n\n    return apiKey.trim();\n  }\n\n  async getTemperature(defaultTemperature = 0.7): Promise<number> {\n    const input_result = await input({\n      message: 'Temperature (0.0 - 2.0):',\n      default: defaultTemperature.toString(),\n      validate: (input: string) => {\n        const num = Number.parseFloat(input);\n        if (Number.isNaN(num)) {\n          return 'Temperature must be a number';\n        }\n        if (num < 0 || num > 2) {\n          return 'Temperature must be between 0.0 and 2.0';\n        }\n        return true;\n      },\n    });\n\n    return Number.parseFloat(input_result);\n  }\n\n  async getMaxTokens(defaultMaxTokens = 2048): Promise<number> {\n    const input_result = await input({\n      message: 'Max Tokens (1 - 100000):',\n      default: defaultMaxTokens.toString(),\n      validate: (input: string) => {\n        const num = Number.parseInt(input, 10);\n        if (Number.isNaN(num)) {\n          return 'Max tokens must be a number';\n        }\n        if (num < 1 || num > 100000) {\n          return 'Max tokens must be between 1 and 100000';\n        }\n        return true;\n      },\n    });\n\n    return Number.parseInt(input_result, 10);\n  }\n\n  async getLanguage(\n    defaultLanguage: SupportedLanguage = DEFAULT_LANGUAGE,\n  ): Promise<SupportedLanguage> {\n    const languages: Array<{name: string; value: SupportedLanguage}> = [\n      {name: 'English', value: 'english'},\n      {name: 'Arabic', value: 'arabic'},\n    ];\n\n    return select({\n      message: 'Response Language:',\n      choices: languages,\n      default: defaultLanguage,\n    });\n  }\n\n  #isValidProfileName(name: string): boolean {\n    const profileNameRegex = /^[a-zA-Z0-9_-]+$/;\n    return profileNameRegex.test(name) && name.length <= 50;\n  }\n\n  #maskApiKey(apiKey: string): string {\n    if (apiKey.length <= 8) {\n      return '*'.repeat(apiKey.length);\n    }\n    return `${apiKey.slice(0, 4)}${'*'.repeat(apiKey.length - 8)}${apiKey.slice(-4)}`;\n  }\n}\n"]}