{"version":3,"file":"botium-connector-chatgpt-cjs.cjs","sources":["../src/Capabilities.js","../src/connectorResponsesApi.js","../index.js"],"sourcesContent":["export default {\n  CHATGPT_API_KEY: 'CHATGPT_API_KEY',\n  CHATGPT_MODEL: 'CHATGPT_MODEL',\n  CHATGPT_PROMPT: 'CHATGPT_PROMPT',\n  CHATGPT_TEMPERATURE: 'CHATGPT_TEMPERATURE',\n  CHATGPT_MAX_TOKENS: 'CHATGPT_MAX_TOKENS',\n  CHATGPT_REASONING_EFFORT: 'CHATGPT_REASONING_EFFORT',\n  CHATGPT_FILE_SEND_MODE: 'CHATGPT_FILE_SEND_MODE',\n  CHATGPT_TOOLS: 'CHATGPT_TOOLS',\n  CHATGPT_INCLUDE: 'CHATGPT_INCLUDE',\n  CHATGPT_RESPOND_AS_BOTIUM_JSON: 'CHATGPT_RESPOND_AS_BOTIUM_JSON'\n}\n","import createDebug from 'debug'\nimport OpenAI from 'openai'\nimport { toFile } from 'openai/uploads'\nimport _ from 'lodash'\nimport XLSX from 'xlsx'\n\nimport Capabilities from './Capabilities.js'\n\nconst debug = createDebug('botium-connector-chatgpt')\n\n// JSON Schema for Botium-style message output when CHATGPT_RESPOND_AS_BOTIUM_JSON is enabled\nconst BOTIUM_JSON_SCHEMA = {\n  type: 'object',\n  additionalProperties: false,\n  // For strict schemas, OpenAI requires all properties to be listed in \"required\"\n  required: ['messageText', 'buttons', 'media', 'attachments', 'cards', 'intent'],\n  properties: {\n    messageText: { type: 'string' },\n    buttons: {\n      type: 'array',\n      items: {\n        type: 'object',\n        additionalProperties: false,\n        required: ['text', 'payload'],\n        properties: {\n          text: { type: 'string' },\n          payload: { type: 'string' }\n        }\n      }\n    },\n    media: {\n      type: 'array',\n      items: {\n        type: 'object',\n        additionalProperties: false,\n        required: ['mediaUri', 'buffer', 'mimeType', 'altText'],\n        properties: {\n          mediaUri: { type: ['string', 'null'] },\n          buffer: { type: ['string', 'null'] },\n          mimeType: { type: 'string' },\n          altText: { type: ['string', 'null'] }\n        }\n      }\n    },\n    attachments: {\n      type: 'array',\n      items: {\n        type: 'object',\n        additionalProperties: false,\n        required: ['name', 'mimeType', 'base64'],\n        properties: {\n          name: { type: 'string' },\n          mimeType: { type: 'string' },\n          base64: { type: 'string' }\n        }\n      }\n    },\n    cards: {\n      type: 'array',\n      items: {\n        type: 'object',\n        additionalProperties: false,\n        required: ['title', 'subtitle', 'imageUri', 'buttons'],\n        properties: {\n          title: { type: 'string' },\n          subtitle: { type: 'string' },\n          imageUri: { type: 'string' },\n          buttons: {\n            type: 'array',\n            items: {\n              type: 'object',\n              additionalProperties: false,\n              required: ['text', 'payload'],\n              properties: {\n                text: { type: 'string' },\n                payload: { type: 'string' }\n              }\n            }\n          }\n        }\n      }\n    },\n    intent: { type: 'string' }\n  }\n}\n\nconst RequiredCapabilities = [\n  Capabilities.CHATGPT_API_KEY,\n  Capabilities.CHATGPT_MODEL\n]\n\n/**\n * attachments response is now swiped out, but it could be merged in the future\n */\nconst BOTIUM_JSON_INSTRUCTIONS = `\nRead the text provided by the user and return it.\n\nYou may use buttons, media, attachments, and cards only when appropriate for the response.\n\nWhen returning a Base64 file (for example an Excel file), you must not create a button for it.\n\nInstead:\n\nReturn the Base64 file strictly as a attachment using\nattachment: { name: \"<NAME>\", buffer: \"<BASE64_STRING>\", mime_type: \"<MIME_TYPE>\" }\n\nDo not wrap Base64 links in a button, link, or clickable element of any kind.\n\nDo not alter, shorten, or reformat Base64 strings.\n\nDo not infer that Base64 content is a URL. Treat it strictly as file data.\n`\n\n/**\n * Masks base64 data in objects for better log readability\n * @param {any} obj - Object to mask\n * @returns {any} Object with base64 strings masked\n */\nfunction maskBase64InObject (obj) {\n  if (typeof obj === 'string') {\n    // Check for data URLs with base64 (e.g., data:image/png;base64,...)\n    if (obj.startsWith('data:') && obj.includes(';base64,')) {\n      const base64Part = obj.split(';base64,')[1]\n      if (base64Part && base64Part.length > 50) {\n        return `data:${obj.split(';')[0]};base64,[base64_data_masked:${base64Part.length}_chars]`\n      }\n    }\n    // Check if string looks like base64 (long alphanumeric string)\n    // Remove whitespace/newlines for detection, but keep original length for masking\n    const trimmed = obj.trim().replace(/\\s/g, '')\n    if (trimmed.length > 50 && /^[A-Za-z0-9+/=]+$/.test(trimmed)) {\n      // Additional check: base64 strings typically have length divisible by 4 (with padding)\n      // and contain a good mix of characters\n      const hasGoodBase64Ratio = (trimmed.match(/[A-Za-z0-9]/g) || []).length / trimmed.length > 0.8\n      if (hasGoodBase64Ratio) {\n        return `[base64_data_masked:${obj.length}_chars]`\n      }\n    }\n    return obj\n  }\n  if (Buffer.isBuffer(obj)) {\n    return `[buffer_masked:${obj.length}_bytes]`\n  }\n  if (Array.isArray(obj)) {\n    return obj.map(item => maskBase64InObject(item))\n  }\n  // Handle Error objects specially\n  if (obj instanceof Error) {\n    const maskedError = {\n      name: obj.name,\n      message: maskBase64InObject(obj.message), // Mask base64 in error messages too\n      stack: obj.stack\n    }\n    // Copy any additional properties and mask them (including non-enumerable ones)\n    const allKeys = new Set(Object.keys(obj))\n    // Check for common error properties that might contain response data\n    const commonProps = ['response', 'request', 'data', 'body', 'config', 'cause']\n    commonProps.forEach(prop => {\n      if (obj[prop] !== undefined) {\n        allKeys.add(prop)\n      }\n    })\n    for (const key of allKeys) {\n      if (!['name', 'message', 'stack'].includes(key)) {\n        maskedError[key] = maskBase64InObject(obj[key])\n      }\n    }\n    return maskedError\n  }\n  if (obj && typeof obj === 'object') {\n    // Handle Buffer serialization format from JSON.stringify\n    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n      return `[buffer_masked:${obj.data.length}_bytes]`\n    }\n    const masked = {}\n    for (const [key, value] of Object.entries(obj)) {\n      // Mask buffer fields (common in media objects)\n      if (key === 'buffer') {\n        if (Buffer.isBuffer(value)) {\n          masked[key] = `[buffer_masked:${value.length}_bytes]`\n        } else if (typeof value === 'string') {\n          // Always mask buffer strings that look like base64 (remove whitespace for detection)\n          const trimmed = value.trim().replace(/\\s/g, '')\n          if (trimmed.length > 50 && /^[A-Za-z0-9+/=]+$/.test(trimmed)) {\n            masked[key] = `[base64_data_masked:${value.length}_chars]`\n          } else {\n            // Even if not clearly base64, mask long buffer strings\n            if (value.length > 200) {\n              masked[key] = `[buffer_data_masked:${value.length}_chars]`\n            } else {\n              masked[key] = maskBase64InObject(value)\n            }\n          }\n        } else if (value && typeof value === 'object' && value.type === 'Buffer' && Array.isArray(value.data)) {\n          masked[key] = `[buffer_masked:${value.data.length}_bytes]`\n        } else {\n          masked[key] = maskBase64InObject(value)\n        }\n      } else if (key === 'mediaUri') {\n        // Mask mediaUri if it contains base64 data (not a URL)\n        if (typeof value === 'string' && value.length > 100 && /^[A-Za-z0-9+/=]+$/.test(value) && !value.startsWith('http')) {\n          masked[key] = `[base64_data_masked:${value.length}_chars]`\n        } else {\n          masked[key] = maskBase64InObject(value)\n        }\n      } else if (key === 'text') {\n        // Handle text fields that may contain JSON strings with base64 (common in API responses)\n        if (typeof value === 'string') {\n          const trimmed = value.trim()\n          // Check if it's a JSON string\n          if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n            try {\n              const parsed = JSON.parse(value)\n              if (parsed && typeof parsed === 'object') {\n                // Recursively mask the parsed object to handle nested base64\n                const maskedParsed = maskBase64InObject(parsed)\n                masked[key] = JSON.stringify(maskedParsed)\n              } else {\n                masked[key] = maskBase64InObject(value)\n              }\n            } catch (e) {\n              // JSON parse failed - might be malformed or too large\n              // Check if it contains base64 patterns and mask aggressively\n              if (value.includes('\"buffer\"') && value.length > 500) {\n                // Likely contains base64 in buffer field, try to mask it\n                // Use regex to find and mask base64 strings in buffer fields\n                masked[key] = value.replace(/\"buffer\"\\s*:\\s*\"([^\"]+)\"/g, (match, base64Content) => {\n                  if (base64Content.length > 50) {\n                    return `\"buffer\":\"[base64_data_masked:${base64Content.length}_chars]\"`\n                  }\n                  return match\n                })\n                // Also check for file_base64\n                masked[key] = masked[key].replace(/\"file_base64\"\\s*:\\s*\"([^\"]+)\"/g, (match, base64Content) => {\n                  if (base64Content.length > 50) {\n                    return `\"file_base64\":\"[base64_data_masked:${base64Content.length}_chars]\"`\n                  }\n                  return match\n                })\n              } else {\n                // Not JSON, check if it's base64 itself\n                const trimmedForBase64 = trimmed.replace(/\\s/g, '')\n                if (trimmedForBase64.length > 50 && /^[A-Za-z0-9+/=]+$/.test(trimmedForBase64)) {\n                  masked[key] = `[base64_data_masked:${value.length}_chars]`\n                } else {\n                  masked[key] = value\n                }\n              }\n            }\n          } else {\n            // Not JSON, check if it's base64\n            const trimmedForBase64 = trimmed.replace(/\\s/g, '')\n            if (trimmedForBase64.length > 50 && /^[A-Za-z0-9+/=]+$/.test(trimmedForBase64)) {\n              masked[key] = `[base64_data_masked:${value.length}_chars]`\n            } else {\n              masked[key] = maskBase64InObject(value)\n            }\n          }\n        } else {\n          masked[key] = maskBase64InObject(value)\n        }\n      } else if (key === 'file_base64' || key === 'output') {\n        // Check if output contains file_base64 (can be in function_call_output objects)\n        if (typeof value === 'string') {\n          try {\n            const parsed = JSON.parse(value)\n            if (parsed && typeof parsed === 'object') {\n              // Recursively mask the parsed object to handle nested base64\n              const maskedParsed = maskBase64InObject(parsed)\n              masked[key] = JSON.stringify(maskedParsed)\n            } else {\n              masked[key] = maskBase64InObject(value)\n            }\n          } catch (e) {\n            // Not JSON, check if it's a long base64 string itself\n            if (value.length > 100 && /^[A-Za-z0-9+/=]+$/.test(value)) {\n              masked[key] = `[base64_data_masked:${value.length}_chars]`\n            } else {\n              masked[key] = value\n            }\n          }\n        } else {\n          masked[key] = maskBase64InObject(value)\n        }\n      } else if (key === 'output_text') {\n        // Handle output_text which may contain JSON strings with base64 data\n        if (typeof value === 'string') {\n          try {\n            // Try to parse as JSON to mask base64 within it\n            const parsed = JSON.parse(value)\n            if (parsed && typeof parsed === 'object') {\n              // Recursively mask the parsed object\n              masked[key] = JSON.stringify(maskBase64InObject(parsed))\n            } else {\n              masked[key] = maskBase64InObject(value)\n            }\n          } catch (e) {\n            // Not JSON, check if it's a long base64 string itself\n            if (value.length > 100 && /^[A-Za-z0-9+/=]+$/.test(value)) {\n              masked[key] = `[base64_data_masked:${value.length}_chars]`\n            } else {\n              masked[key] = value\n            }\n          }\n        } else {\n          masked[key] = maskBase64InObject(value)\n        }\n      } else {\n        masked[key] = maskBase64InObject(value)\n      }\n    }\n    return masked\n  }\n  return obj\n}\n\nclass BotiumConnectorChatGPTResponsesAPI {\n  constructor ({ queueBotSays, caps }) {\n    this.queueBotSays = queueBotSays\n    this.caps = caps\n    this.openai = null\n    this.fileSendMode = null\n    this.lastResponseId = null\n  }\n\n  Validate () {\n    debug('Validate called')\n    for (const cap of RequiredCapabilities) {\n      if (!this.caps[cap]) throw new Error(`${cap} capability required`)\n    }\n    if (this.caps[Capabilities.CHATGPT_FILE_SEND_MODE]) {\n      const mode = String(this.caps[Capabilities.CHATGPT_FILE_SEND_MODE]).toLowerCase()\n      if (mode !== 'base64' && mode !== 'upload') {\n        throw new Error(`CHATGPT_FILE_SEND_MODE must be \"base64\" or \"upload\", got \"${this.caps[Capabilities.CHATGPT_FILE_SEND_MODE]}\"`)\n      }\n    }\n  }\n\n  Build () {\n    debug('Build called')\n    this.openai = new OpenAI({\n      apiKey: this.caps[Capabilities.CHATGPT_API_KEY]\n    })\n    this.fileSendMode = String(this.caps[Capabilities.CHATGPT_FILE_SEND_MODE] || 'upload').toLowerCase() === 'upload' ? 'upload' : 'base64'\n    this.respondAsBotiumJson = this.caps[Capabilities.CHATGPT_RESPOND_AS_BOTIUM_JSON]\n  }\n\n  /**\n   * Creates an Excel file from data and returns it as a base64 string\n   * @param {Array} data - Array of arrays representing rows and columns\n   * @param {string} sheetName - Name of the sheet (default: 'Sheet1')\n   * @returns {string} Excel file base64 string\n   */\n  createExcelFile (data) {\n    debug('[Excel] createExcelFile called')\n    try {\n      const worksheet = XLSX.utils.aoa_to_sheet(data)\n      const workbook = XLSX.utils.book_new()\n      XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')\n      // Convert workbook Buffer to base64 string\n      const buffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })\n      const base64 = buffer.toString('base64')\n      return base64\n    } catch (error) {\n      debug('[Excel] Error creating Excel file:', error?.message || error)\n      throw new Error(`Failed to create Excel file: ${error?.message || error}`)\n    }\n  }\n\n  /**\n   * Gets the Excel creation tool definition for OpenAI Responses API\n   * @returns {Object} Tool definition\n   */\n  getExcelCreationTool () {\n    return {\n      type: 'function',\n      name: 'createExcelFile',\n      description: 'Creates an Excel (.xlsx) file from tabular data. The function accepts data as an array of arrays (rows) and returns the file in base64 format.',\n      parameters: {\n        type: 'object',\n        properties: {\n          data: {\n            type: 'array',\n            description: 'Array of arrays representing rows and columns. First row can be headers.',\n            items: {\n              type: 'array',\n              items: {\n                oneOf: [\n                  { type: 'string' },\n                  { type: 'number' },\n                  { type: 'boolean' }\n                ]\n              }\n            }\n          }\n        },\n        required: ['data']\n      }\n    }\n  }\n\n  /**\n   * Builds parameters for OpenAI Responses API call\n   * @param {Array} input - The input conversation array\n   * @returns {Object} Parameters object for API call\n   */\n  async callOpenAi (input) {\n    debug(`OpenAI input: ${JSON.stringify(maskBase64InObject(input))}`)\n    const params = {\n      model: this.caps[Capabilities.CHATGPT_MODEL],\n      instructions: (this.caps[Capabilities.CHATGPT_PROMPT] || '') + (this.respondAsBotiumJson ? BOTIUM_JSON_INSTRUCTIONS : ''),\n      previous_response_id: this.lastResponseId,\n      input: input\n    }\n\n    if (this.respondAsBotiumJson) {\n      params.text = {\n        format: {\n          type: 'json_schema',\n          name: 'botium_message',\n          schema: BOTIUM_JSON_SCHEMA,\n          strict: true\n        }\n      }\n    }\n\n    // Initialize tools array with Excel creation tool\n    const tools = [this.getExcelCreationTool()]\n\n    // Add any additional tools from capabilities\n    if (!_.isNil(this.caps[Capabilities.CHATGPT_TOOLS])) {\n      const additionalTools = this.caps[Capabilities.CHATGPT_TOOLS].split(',').map(tool => ({ type: tool.trim() }))\n      tools.push(...additionalTools)\n    }\n\n    params.tools = tools\n\n    if (!_.isNil(this.caps[Capabilities.CHATGPT_INCLUDE])) {\n      params.include = this.caps[Capabilities.CHATGPT_INCLUDE].split(',').map(include => include.trim())\n    }\n    if (!_.isNil(this.caps[Capabilities.CHATGPT_TEMPERATURE])) {\n      params.temperature = this.caps[Capabilities.CHATGPT_TEMPERATURE]\n    }\n    if (!_.isNil(this.caps[Capabilities.CHATGPT_MAX_TOKENS])) {\n      params.max_output_tokens = this.caps[Capabilities.CHATGPT_MAX_TOKENS]\n    }\n    if (!_.isNil(this.caps[Capabilities.CHATGPT_REASONING_EFFORT])) {\n      params.reasoning = { effort: this.caps[Capabilities.CHATGPT_REASONING_EFFORT] }\n    }\n\n    debug(`OpenAI params: ${JSON.stringify(maskBase64InObject(params))}`)\n    const result = await this.openai.responses.create(params)\n    debug(`OpenAI response: ${JSON.stringify(maskBase64InObject(result))}`)\n\n    // Update lastResponseId after successful API call\n    if (result?.id) {\n      this.lastResponseId = result.id\n    }\n\n    return result\n  }\n\n  /**\n   * Processes tool outputs from response and extracts Excel files\n   * @param {Object} response - The API response object\n   * @returns {Object} Object containing excelMedia array and optional followUpResponse\n   */\n  async extractExcelFilesFromResponse (response) {\n    let followUpResponse = null\n    const excelAttachments = []\n\n    try {\n      // Check for function calls in response.output\n      if (Array.isArray(response.output)) {\n        const functionCalls = []\n        const functionCallOutputs = []\n\n        response.output.forEach((item) => {\n          if (item.type === 'function_call') {\n            debug('[Excel] Found function_call:', item.name)\n            // Collect function calls to add to conversation\n            functionCalls.push(item)\n\n            if (item.name === 'createExcelFile') {\n              debug('[Excel] Processing createExcelFile function call')\n              try {\n                // Execute the function logic for createExcelFile\n                const args = typeof item.arguments === 'string'\n                  ? JSON.parse(item.arguments)\n                  : item.arguments\n\n                const excelBase64 = this.createExcelFile(args.data)\n                excelAttachments.push({\n                  name: 'excel.xlsx',\n                  mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n                  base64: excelBase64\n                })\n                // Provide function call results to the model\n                functionCallOutputs.push({\n                  type: 'function_call_output',\n                  call_id: item.call_id,\n                  output: ''\n                  // output: JSON.stringify({\n                  //   file_base64: excelBase64\n                  // })\n                })\n              } catch (error) {\n                debug('[Excel] Error executing createExcelFile:', error?.message || error)\n              }\n            }\n          }\n        })\n\n        // If we have function call outputs, make a follow-up API call\n        if (functionCallOutputs.length > 0) {\n          debug('[Excel] Making follow-up API call', { outputs: functionCallOutputs.length, responseId: response.id })\n\n          // For Responses API with function calls:\n          // - Use previous_response_id to reference the response containing function calls\n          // - Only pass function call outputs in input array, not the full conversation\n          const input = functionCallOutputs\n\n          try {\n            followUpResponse = await this.callOpenAi(input)\n            // Reference the previous response that contains the function calls\n          } catch (error) {\n            debug('[Excel] Error in follow-up API call:', error?.message || error)\n            throw error\n          }\n        } else {\n          debug('[Excel] No function call outputs, skipping follow-up API call')\n        }\n      }\n    } catch (error) {\n      debug('[Excel] Error extracting Excel files from response:', error?.message || error)\n    }\n\n    debug('[Excel] extractExcelFilesFromResponse completed')\n    return { followUpResponse, excelAttachments }\n  }\n\n  async Start () {\n    debug('Start called')\n    this.lastResponseId = null\n  }\n\n  async UserSays (msg) {\n    debug(`UserSays called with message: ${JSON.stringify(maskBase64InObject(msg))}`)\n    const uploadedFileIds = []\n    const buildUserContent = async () => {\n      const content = []\n      if (msg.messageText) {\n        content.push({ type: 'input_text', text: msg.messageText })\n      }\n\n      for (const a of (msg.media || [])) {\n        const name = a.mediaUri || a?.altText || a?.name\n        const buffer = a?.buffer ? (Buffer.isBuffer(a.buffer) ? a.buffer : Buffer.from(a.buffer)) : null\n        const mimeType = a?.mimeType\n        if (!buffer) {\n          debug(`Skipping attachment without buffer: ${name}`)\n          continue\n        }\n        const isImage = mimeType?.startsWith('image/')\n        const isStructuredTextMime = ['application/json', 'application/xml', 'application/yaml', 'application/x-yaml', 'application/csv'].includes(mimeType)\n        const isTextByMime = mimeType?.startsWith('text/') || isStructuredTextMime\n        const isTextByName = /\\.(txt|md|json|xml|ya?ml|csv)$/i.test(name)\n        const isText = isTextByMime || (!mimeType && isTextByName)\n\n        if (isImage) {\n          if (this.fileSendMode === 'base64') {\n            debug('Sending image as base64')\n            const imageUrl = `data:${mimeType};base64,${buffer.toString('base64')}`\n            content.push({\n              type: 'input_image',\n              image_url: imageUrl\n            })\n          } else {\n            debug('Uploading image to OpenAI')\n            let uploaded = null\n            try {\n              const fileForUpload = await toFile(buffer, name, { type: mimeType || 'application/octet-stream' })\n              uploaded = await this.openai.files.create({\n                file: fileForUpload,\n                purpose: 'assistants'\n              })\n              debug(`Upload finished, id=${uploaded?.id || 'n/a'}`)\n            } catch (e) {\n              debug(`Error uploading image to OpenAI: ${e?.message || e}`)\n              throw new Error(`Error uploading image to OpenAI: ${e?.message || e}`)\n            }\n\n            if (uploaded?.id) {\n              uploadedFileIds.push(uploaded.id)\n              content.push({\n                type: 'input_image',\n                file_id: uploaded.id\n              })\n            } else {\n              debug(`Upload did not return id for ${name}, skipping`)\n            }\n          }\n        } else if (isText) {\n          debug('Sending text inline')\n          const textContent = buffer.toString('utf8')\n          content.push({\n            type: 'input_text',\n            text: `File attachment (prepared, no need to download or read out)\\nname:\\n${name}\\nContent:\\n${textContent}`\n          })\n          debug(`Inline text attachment content: ${JSON.stringify(maskBase64InObject(content))}`)\n        } else {\n          debug(`Skipping attachment of file \"${name}\" type ${mimeType}`)\n        }\n      }\n\n      // Return as message format for Responses API\n      return [{\n        type: 'message',\n        role: 'user',\n        content: content\n      }]\n    }\n\n    const currentUserContent = await buildUserContent()\n\n    try {\n      debug(`Calling OpenAI with currentUserContent: ${JSON.stringify(maskBase64InObject(currentUserContent))}`)\n      const response = await this.callOpenAi(currentUserContent)\n      // Extract Excel files from response\n      const { followUpResponse, excelAttachments } = await this.extractExcelFilesFromResponse(response)\n      debug(`FollowUpResponse: ${JSON.stringify(maskBase64InObject(followUpResponse))}`)\n      const responseToUse = followUpResponse || response\n\n      let assistantText = ''\n      let botiumJson = null\n\n      if (responseToUse.output_text) {\n        const outputText = responseToUse.output_text\n\n        // If we're expecting Botium JSON, try to parse output_text as JSON first\n        if (this.respondAsBotiumJson) {\n          debug('Parsing Openai Response as Botium JSON')\n          try {\n            const parsed = JSON.parse(outputText)\n            if (parsed && typeof parsed === 'object') {\n              debug('Parsed Openai Response as Botium JSON succesfully')\n              botiumJson = parsed\n              assistantText = parsed.messageText || outputText\n            } else {\n              debug('Parsed Openai Response as Botium JSON failed, fallback to assistantText')\n              assistantText = outputText\n            }\n          } catch (e) {\n            debug(`Parsed Openai Response as Botium JSON failed with error: ${e?.message || e}, fallback to assistantText`)\n            // Not JSON or parse failed, use as-is\n            assistantText = outputText\n          }\n        } else {\n          assistantText = outputText\n          debug(`Botium format disabled, assistant text extracted: ${assistantText}`)\n        }\n      } else {\n        debug('No output_text found in response')\n      }\n\n      if (assistantText || botiumJson) {\n        const botMsg = {\n          sender: 'bot',\n          sourceData: maskBase64InObject(responseToUse)\n        }\n        if (botiumJson) {\n          botMsg.messageText = botiumJson.messageText\n          if (Array.isArray(botiumJson.buttons)) botMsg.buttons = botiumJson.buttons\n          if (Array.isArray(botiumJson.media)) botMsg.media = botiumJson.media\n          if (Array.isArray(botiumJson.attachments)) botMsg.attachments = botiumJson.attachments\n          if (Array.isArray(botiumJson.cards)) botMsg.cards = botiumJson.cards\n          if (!_.isNil(botiumJson.intent)) botMsg.intent = botiumJson.intent\n        } else if (assistantText) {\n          botMsg.messageText = assistantText\n        }\n        // it has no sense to get attachments from the response? It just makes the prompt longer, and\n        // openai might change the base64 string?\n        if (Array.isArray(excelAttachments)) botMsg.attachments = excelAttachments\n\n        setTimeout(() => this.queueBotSays(botMsg), 0)\n      } else {\n        debug('[Debug] Not queuing message - no content found')\n      }\n    } catch (error) {\n      debug(`error: ${JSON.stringify(maskBase64InObject(error))}`)\n      debug('Error sending message to ChatGPT (Responses API):', error?.message || error)\n      throw new Error(`Error from ChatGPT: ${error.message}`)\n    } finally {\n      if (uploadedFileIds.length > 0) {\n        try {\n          await Promise.all(uploadedFileIds.map(id => this.openai.files.del(id).catch(e => debug(`File delete failed for ${id}: ${e?.message || e}`))))\n        } catch (e) {\n          debug(`Cleanup error: ${e?.message || e}`)\n        }\n      }\n    }\n  }\n\n  async Stop () {\n    debug('Stop called')\n    this.lastResponseId = null\n  }\n\n  async Clean () {\n    debug('Clean called')\n    this.openai = null\n  }\n}\n\nexport default BotiumConnectorChatGPTResponsesAPI\n","import fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\n\nimport PluginClass from './src/connectorResponsesApi.js'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\nconst logo = fs.readFileSync(path.join(__dirname, 'logo.png')).toString('base64')\n\nexport default {\n  PluginVersion: 1,\n  PluginClass: PluginClass,\n  PluginDesc: {\n    name: 'ChatGPT (OpenAI)',\n    avatar: logo,\n    provider: 'OpenAI',\n    features: {\n      sendAttachments: true\n    },\n    capabilities: [\n      {\n        name: 'CHATGPT_API_KEY',\n        label: 'OpenAI API Key',\n        type: 'secret',\n        required: true,\n        description: 'OpenAI API key used for authentication.'\n      },\n      {\n        name: 'CHATGPT_MODEL',\n        label: 'Model',\n        type: 'string',\n        required: true,\n        description: 'Chat model to use (e.g., gpt-4o, gpt-4o-mini).'\n      },\n      {\n        name: 'CHATGPT_PROMPT',\n        label: 'System Prompt',\n        type: 'text',\n        required: false,\n        description: 'Optional system prompt to initialize the assistant.'\n      },\n      {\n        name: 'CHATGPT_FILE_SEND_MODE',\n        label: 'File Send Mode',\n        type: 'choice',\n        required: false,\n        advanced: true,\n        description: 'How to send attachments to OpenAI.',\n        choices: [\n          { name: 'Base64 (image only)', key: 'base64' },\n          { name: 'Upload (all file types)', key: 'upload' }\n        ]\n      },\n      {\n        name: 'CHATGPT_RESPOND_AS_BOTIUM_JSON',\n        label: 'Respond as Botium JSON',\n        type: 'boolean',\n        required: false,\n        advanced: true,\n        description: 'If enabled, requests a Botium-style JSON (messageText, buttons, media, cards, intent) using OpenAI JSON Schema. Mandatory for Excel file creation.'\n      }\n    ]\n  }\n}\n"],"names":["createDebug","OpenAI","XLSX","_","toFile","__dirname","path","fileURLToPath","fs","PluginClass"],"mappings":"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"}