{"version":3,"sources":["../../src/config/logger.config.ts","../../src/config/env.config.ts","../../src/cache/localcache.ts","../../src/cache/rediscache.ts","../../src/cache/rediscache.client.ts","../../src/cache/cacheengine.ts","../../src/config/event.config.ts","../../src/api/controllers/business.controller.ts","../../src/api/controllers/call.controller.ts","../../src/api/controllers/chat.controller.ts","../../src/api/controllers/group.controller.ts","../../src/api/types/wa.types.ts","../../src/api/guards/auth.guard.ts","../../src/api/guards/instance.guard.ts","../../src/utils/sendTelemetry.ts","../../src/api/guards/telemetry.guard.ts","../../src/api/integrations/channel/channel.router.ts","../../src/api/abstract/abstract.router.ts","../../src/api/integrations/channel/evolution/evolution.router.ts","../../src/api/integrations/channel/meta/meta.router.ts","../../src/api/integrations/chatbot/chatwoot/dto/chatwoot.dto.ts","../../src/api/integrations/event/event.dto.ts","../../src/api/integrations/integration.dto.ts","../../src/api/dto/instance.dto.ts","../../src/validate/instance.schema.ts","../../src/api/integrations/channel/whatsapp/baileys.router.ts","../../src/validate/business.schema.ts","../../src/validate/chat.schema.ts","../../src/validate/group.schema.ts","../../src/validate/label.schema.ts","../../src/validate/message.schema.ts","../../src/validate/proxy.schema.ts","../../src/validate/settings.schema.ts","../../src/validate/template.schema.ts","../../src/validate/templateDelete.schema.ts","../../src/validate/templateEdit.schema.ts","../../src/api/integrations/chatbot/chatwoot/validate/chatwoot.schema.ts","../../src/api/integrations/chatbot/dify/validate/dify.schema.ts","../../src/api/integrations/chatbot/evoai/validate/evoai.schema.ts","../../src/api/integrations/chatbot/evolutionBot/validate/evolutionBot.schema.ts","../../src/api/integrations/chatbot/flowise/validate/flowise.schema.ts","../../src/api/integrations/chatbot/n8n/validate/n8n.schema.ts","../../src/api/integrations/chatbot/openai/validate/openai.schema.ts","../../src/api/integrations/chatbot/typebot/validate/typebot.schema.ts","../../src/api/integrations/event/event.schema.ts","../../src/api/integrations/event/event.controller.ts","../../src/api/integrations/event/pusher/pusher.schema.ts","../../src/api/integrations/event/webhook/webhook.schema.ts","../../src/api/integrations/chatbot/chatwoot/routes/chatwoot.router.ts","../../src/api/dto/chatbot.dto.ts","../../src/api/integrations/chatbot/base-chatbot.dto.ts","../../src/api/integrations/chatbot/dify/dto/dify.dto.ts","../../src/api/integrations/chatbot/dify/routes/dify.router.ts","../../src/api/integrations/chatbot/openai/dto/openai.dto.ts","../../src/api/integrations/chatbot/openai/routes/openai.router.ts","../../src/api/integrations/chatbot/typebot/dto/typebot.dto.ts","../../src/api/integrations/chatbot/typebot/routes/typebot.router.ts","../../src/api/integrations/chatbot/chatbot.router.ts","../../src/api/integrations/chatbot/evoai/routes/evoai.router.ts","../../src/api/integrations/chatbot/evoai/dto/evoai.dto.ts","../../src/api/integrations/chatbot/evolutionBot/routes/evolutionBot.router.ts","../../src/api/integrations/chatbot/evolutionBot/dto/evolutionBot.dto.ts","../../src/api/integrations/chatbot/flowise/routes/flowise.router.ts","../../src/api/integrations/chatbot/flowise/dto/flowise.dto.ts","../../src/api/integrations/chatbot/n8n/routes/n8n.router.ts","../../src/api/integrations/chatbot/n8n/dto/n8n.dto.ts","../../src/api/integrations/event/kafka/kafka.router.ts","../../src/api/integrations/event/nats/nats.router.ts","../../src/api/integrations/event/pusher/pusher.router.ts","../../src/api/integrations/event/rabbitmq/rabbitmq.router.ts","../../src/api/integrations/event/sqs/sqs.router.ts","../../src/api/integrations/event/webhook/webhook.router.ts","../../src/api/integrations/event/websocket/websocket.router.ts","../../src/api/integrations/event/event.router.ts","../../src/api/integrations/storage/s3/dto/media.dto.ts","../../src/api/integrations/storage/s3/validate/s3.schema.ts","../../src/api/integrations/storage/s3/routes/s3.router.ts","../../src/api/integrations/storage/storage.router.ts","../../src/utils/fetchLatestWaWebVersion.ts","../../src/api/routes/index.router.ts","../../src/api/dto/chat.dto.ts","../../src/utils/errorResponse.ts","../../src/api/routes/business.router.ts","../../src/api/dto/call.dto.ts","../../src/api/routes/call.router.ts","../../src/api/repository/repository.service.ts","../../src/api/routes/chat.router.ts","../../src/api/dto/group.dto.ts","../../src/api/routes/group.router.ts","../../src/api/routes/instance.router.ts","../../src/api/dto/label.dto.ts","../../src/api/routes/label.router.ts","../../src/api/dto/proxy.dto.ts","../../src/api/routes/proxy.router.ts","../../src/api/dto/sendMessage.dto.ts","../../src/api/routes/sendMessage.router.ts","../../src/api/dto/settings.dto.ts","../../src/api/routes/settings.router.ts","../../src/api/dto/template.dto.ts","../../src/api/routes/template.router.ts","../../src/api/routes/view.router.ts","../../src/exceptions/400.exception.ts","../../src/exceptions/401.exception.ts","../../src/exceptions/403.exception.ts","../../src/exceptions/404.exception.ts","../../src/exceptions/500.exception.ts","../../src/api/controllers/instance.controller.ts","../../src/api/controllers/label.controller.ts","../../src/utils/makeProxyAgent.ts","../../src/api/controllers/proxy.controller.ts","../../src/api/controllers/sendMessage.controller.ts","../../src/api/controllers/settings.controller.ts","../../src/api/controllers/template.controller.ts","../../src/api/integrations/storage/s3/libs/minio.server.ts","../../src/api/integrations/chatbot/chatwoot/libs/postgres.client.ts","../../src/api/integrations/chatbot/chatwoot/utils/chatwoot-import-helper.ts","../../src/api/integrations/chatbot/chatwoot/services/chatwoot.service.ts","../../src/utils/i18n.ts","../../src/api/integrations/chatbot/dify/services/dify.service.ts","../../src/api/integrations/chatbot/base-chatbot.service.ts","../../src/api/integrations/chatbot/openai/services/openai.service.ts","../../src/utils/getConversationMessage.ts","../../src/api/integrations/chatbot/typebot/services/typebot.service.ts","../../src/api/services/channel.service.ts","../../src/utils/createJid.ts","../../src/api/integrations/channel/evolution/evolution.channel.service.ts","../../src/utils/renderStatus.ts","../../src/api/integrations/channel/meta/whatsapp.business.service.ts","../../src/api/services/cache.service.ts","../../src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts","../../src/utils/onWhatsappCache.ts","../../src/utils/use-multi-file-auth-state-provider-files.ts","../../src/utils/use-multi-file-auth-state-redis-db.ts","../../src/api/integrations/channel/whatsapp/baileysMessage.processor.ts","../../src/api/integrations/channel/whatsapp/voiceCalls/useVoiceCallsBaileys.ts","../../src/api/integrations/channel/channel.controller.ts","../../src/api/integrations/channel/evolution/evolution.controller.ts","../../src/api/integrations/channel/meta/meta.controller.ts","../../src/api/integrations/channel/whatsapp/baileys.controller.ts","../../src/utils/advancedOperatorsSearch.ts","../../src/utils/findBotByTrigger.ts","../../src/api/integrations/chatbot/chatbot.controller.ts","../../src/api/integrations/chatbot/chatwoot/controllers/chatwoot.controller.ts","../../src/api/integrations/chatbot/base-chatbot.controller.ts","../../src/api/integrations/chatbot/dify/controllers/dify.controller.ts","../../src/api/integrations/chatbot/evoai/controllers/evoai.controller.ts","../../src/api/integrations/chatbot/evoai/services/evoai.service.ts","../../src/api/integrations/chatbot/evolutionBot/controllers/evolutionBot.controller.ts","../../src/api/integrations/chatbot/evolutionBot/services/evolutionBot.service.ts","../../src/api/integrations/chatbot/flowise/controllers/flowise.controller.ts","../../src/api/integrations/chatbot/flowise/services/flowise.service.ts","../../src/api/integrations/chatbot/n8n/controllers/n8n.controller.ts","../../src/api/integrations/chatbot/n8n/services/n8n.service.ts","../../src/api/integrations/chatbot/openai/controllers/openai.controller.ts","../../src/api/integrations/chatbot/typebot/controllers/typebot.controller.ts","../../src/api/integrations/event/kafka/kafka.controller.ts","../../src/api/integrations/event/nats/nats.controller.ts","../../src/api/integrations/event/pusher/pusher.controller.ts","../../src/api/integrations/event/rabbitmq/rabbitmq.controller.ts","../../src/api/integrations/event/sqs/sqs.controller.ts","../../src/api/integrations/event/webhook/webhook.controller.ts","../../src/api/integrations/event/websocket/websocket.controller.ts","../../src/api/integrations/event/event.manager.ts","../../src/api/integrations/storage/s3/controllers/s3.controller.ts","../../src/api/integrations/storage/s3/services/s3.service.ts","../../src/api/provider/sessions.ts","../../src/config/path.config.ts","../../src/api/services/monitor.service.ts","../../src/api/services/proxy.service.ts","../../src/api/services/settings.service.ts","../../src/api/services/template.service.ts","../../src/api/server.module.ts","../../src/utils/use-multi-file-auth-state-prisma.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport fs from 'fs';\n\nimport { configService, Log } from './env.config';\nconst packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));\n\nconst formatDateLog = (timestamp: number) =>\n  dayjs(timestamp)\n    .toDate()\n    .toString()\n    .replace(/\\sGMT.+/, '');\n\nenum Color {\n  LOG = '\\x1b[32m',\n  INFO = '\\x1b[34m',\n  WARN = '\\x1b[33m',\n  ERROR = '\\x1b[31m',\n  DEBUG = '\\x1b[36m',\n  VERBOSE = '\\x1b[37m',\n  DARK = '\\x1b[30m',\n}\n\nenum Command {\n  RESET = '\\x1b[0m',\n  BRIGHT = '\\x1b[1m',\n  UNDERSCORE = '\\x1b[4m',\n}\n\nenum Level {\n  LOG = Color.LOG + '%s' + Command.RESET,\n  DARK = Color.DARK + '%s' + Command.RESET,\n  INFO = Color.INFO + '%s' + Command.RESET,\n  WARN = Color.WARN + '%s' + Command.RESET,\n  ERROR = Color.ERROR + '%s' + Command.RESET,\n  DEBUG = Color.DEBUG + '%s' + Command.RESET,\n  VERBOSE = Color.VERBOSE + '%s' + Command.RESET,\n}\n\nenum Type {\n  LOG = 'LOG',\n  WARN = 'WARN',\n  INFO = 'INFO',\n  DARK = 'DARK',\n  ERROR = 'ERROR',\n  DEBUG = 'DEBUG',\n  VERBOSE = 'VERBOSE',\n}\n\nenum Background {\n  LOG = '\\x1b[42m',\n  INFO = '\\x1b[44m',\n  WARN = '\\x1b[43m',\n  DARK = '\\x1b[40m',\n  ERROR = '\\x1b[41m',\n  DEBUG = '\\x1b[46m',\n  VERBOSE = '\\x1b[47m',\n}\n\nexport class Logger {\n  private readonly configService = configService;\n  private context: string;\n\n  constructor(context = 'Logger') {\n    this.context = context;\n  }\n\n  private instance = null;\n\n  public setContext(value: string) {\n    this.context = value;\n  }\n\n  public setInstance(value: string) {\n    this.instance = value;\n  }\n\n  private console(value: any, type: Type) {\n    const types: Type[] = [];\n\n    this.configService.get<Log>('LOG').LEVEL.forEach((level) => types.push(Type[level]));\n\n    const typeValue = typeof value;\n    if (types.includes(type)) {\n      if (configService.get<Log>('LOG').COLOR) {\n        console.log(\n          /*Command.UNDERSCORE +*/ Command.BRIGHT + Level[type],\n          '[Evolution API]',\n          Command.BRIGHT + Color[type],\n          this.instance ? `[${this.instance}]` : '',\n          Command.BRIGHT + Color[type],\n          `v${packageJson.version}`,\n          Command.BRIGHT + Color[type],\n          process.pid.toString(),\n          Command.RESET,\n          Command.BRIGHT + Color[type],\n          '-',\n          Command.BRIGHT + Color.VERBOSE,\n          `${formatDateLog(Date.now())}  `,\n          Command.RESET,\n          Color[type] + Background[type] + Command.BRIGHT,\n          `${type} ` + Command.RESET,\n          Color.WARN + Command.BRIGHT,\n          `[${this.context}]` + Command.RESET,\n          Color[type] + Command.BRIGHT,\n          `[${typeValue}]` + Command.RESET,\n          Color[type],\n          typeValue !== 'object' ? value : '',\n          Command.RESET,\n        );\n        typeValue === 'object' ? console.log(/*Level.DARK,*/ value, '\\n') : '';\n      } else {\n        console.log(\n          '[Evolution API]',\n          this.instance ? `[${this.instance}]` : '',\n          process.pid.toString(),\n          '-',\n          `${formatDateLog(Date.now())}  `,\n          `${type} `,\n          `[${this.context}]`,\n          `[${typeValue}]`,\n          value,\n        );\n      }\n    }\n  }\n\n  public log(value: any) {\n    this.console(value, Type.LOG);\n  }\n\n  public info(value: any) {\n    this.console(value, Type.INFO);\n  }\n\n  public warn(value: any) {\n    this.console(value, Type.WARN);\n  }\n\n  public error(value: any) {\n    this.console(value, Type.ERROR);\n  }\n\n  public verbose(value: any) {\n    this.console(value, Type.VERBOSE);\n  }\n\n  public debug(value: any) {\n    this.console(value, Type.DEBUG);\n  }\n\n  public dark(value: any) {\n    this.console(value, Type.DARK);\n  }\n}\n","import { isBooleanString } from 'class-validator';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nexport type HttpServer = {\n  NAME: string;\n  TYPE: 'http' | 'https';\n  PORT: number;\n  URL: string;\n  DISABLE_DOCS: boolean;\n  DISABLE_MANAGER: boolean;\n};\n\nexport type HttpMethods = 'POST' | 'GET' | 'PUT' | 'DELETE';\nexport type Cors = {\n  ORIGIN: string[];\n  METHODS: HttpMethods[];\n  CREDENTIALS: boolean;\n};\n\nexport type LogBaileys = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport type LogLevel = 'ERROR' | 'WARN' | 'DEBUG' | 'INFO' | 'LOG' | 'VERBOSE' | 'DARK' | 'WEBHOOKS' | 'WEBSOCKET';\n\nexport type Log = {\n  LEVEL: LogLevel[];\n  COLOR: boolean;\n  BAILEYS: LogBaileys;\n};\n\nexport type ProviderSession = {\n  ENABLED: boolean;\n  HOST: string;\n  PORT: string;\n  PREFIX: string;\n};\n\nexport type SaveData = {\n  INSTANCE: boolean;\n  HISTORIC: boolean;\n  NEW_MESSAGE: boolean;\n  MESSAGE_UPDATE: boolean;\n  CONTACTS: boolean;\n  CHATS: boolean;\n  LABELS: boolean;\n  IS_ON_WHATSAPP: boolean;\n  IS_ON_WHATSAPP_DAYS: number;\n};\n\nexport type DBConnection = {\n  URI: string;\n  CLIENT_NAME: string;\n};\nexport type Database = {\n  CONNECTION: DBConnection;\n  PROVIDER: string;\n  SAVE_DATA: SaveData;\n  DELETE_DATA: DeleteData;\n};\n\nexport type DeleteData = {\n  LOGICAL_MESSAGE_DELETE: boolean;\n};\nexport type EventsRabbitmq = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n};\n\nexport type Rabbitmq = {\n  ENABLED: boolean;\n  URI: string;\n  FRAME_MAX: number;\n  EXCHANGE_NAME: string;\n  GLOBAL_ENABLED: boolean;\n  EVENTS: EventsRabbitmq;\n  PREFIX_KEY?: string;\n};\n\nexport type Nats = {\n  ENABLED: boolean;\n  URI: string;\n  EXCHANGE_NAME: string;\n  GLOBAL_ENABLED: boolean;\n  EVENTS: EventsRabbitmq;\n  PREFIX_KEY?: string;\n};\n\nexport type Sqs = {\n  ENABLED: boolean;\n  GLOBAL_ENABLED: boolean;\n  GLOBAL_FORCE_SINGLE_QUEUE: boolean;\n  GLOBAL_PREFIX_NAME: string;\n  ACCESS_KEY_ID: string;\n  SECRET_ACCESS_KEY: string;\n  ACCOUNT_ID: string;\n  REGION: string;\n  MAX_PAYLOAD_SIZE: number;\n  EVENTS: {\n    APPLICATION_STARTUP: boolean;\n    CALL: boolean;\n    CHATS_DELETE: boolean;\n    CHATS_SET: boolean;\n    CHATS_UPDATE: boolean;\n    CHATS_UPSERT: boolean;\n    CONNECTION_UPDATE: boolean;\n    CONTACTS_SET: boolean;\n    CONTACTS_UPDATE: boolean;\n    CONTACTS_UPSERT: boolean;\n    GROUP_PARTICIPANTS_UPDATE: boolean;\n    GROUPS_UPDATE: boolean;\n    GROUPS_UPSERT: boolean;\n    LABELS_ASSOCIATION: boolean;\n    LABELS_EDIT: boolean;\n    LOGOUT_INSTANCE: boolean;\n    MESSAGES_DELETE: boolean;\n    MESSAGES_EDITED: boolean;\n    MESSAGES_SET: boolean;\n    MESSAGES_UPDATE: boolean;\n    MESSAGES_UPSERT: boolean;\n    PRESENCE_UPDATE: boolean;\n    QRCODE_UPDATED: boolean;\n    REMOVE_INSTANCE: boolean;\n    SEND_MESSAGE: boolean;\n    TYPEBOT_CHANGE_STATUS: boolean;\n    TYPEBOT_START: boolean;\n  };\n};\n\nexport type Kafka = {\n  ENABLED: boolean;\n  CLIENT_ID: string;\n  BROKERS: string[];\n  CONNECTION_TIMEOUT: number;\n  REQUEST_TIMEOUT: number;\n  GLOBAL_ENABLED: boolean;\n  CONSUMER_GROUP_ID: string;\n  TOPIC_PREFIX: string;\n  NUM_PARTITIONS: number;\n  REPLICATION_FACTOR: number;\n  AUTO_CREATE_TOPICS: boolean;\n  EVENTS: EventsRabbitmq;\n  SASL?: {\n    ENABLED: boolean;\n    MECHANISM: string;\n    USERNAME: string;\n    PASSWORD: string;\n  };\n  SSL?: {\n    ENABLED: boolean;\n    REJECT_UNAUTHORIZED: boolean;\n    CA?: string;\n    KEY?: string;\n    CERT?: string;\n  };\n};\n\nexport type Websocket = {\n  ENABLED: boolean;\n  GLOBAL_EVENTS: boolean;\n  ALLOWED_HOSTS?: string;\n};\n\nexport type WaBusiness = {\n  TOKEN_WEBHOOK: string;\n  URL: string;\n  VERSION: string;\n  LANGUAGE: string;\n};\n\nexport type EventsWebhook = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n  ERRORS: boolean;\n  ERRORS_WEBHOOK: string;\n};\n\nexport type EventsPusher = {\n  APPLICATION_STARTUP: boolean;\n  INSTANCE_CREATE: boolean;\n  INSTANCE_DELETE: boolean;\n  QRCODE_UPDATED: boolean;\n  MESSAGES_SET: boolean;\n  MESSAGES_UPSERT: boolean;\n  MESSAGES_EDITED: boolean;\n  MESSAGES_UPDATE: boolean;\n  MESSAGES_DELETE: boolean;\n  SEND_MESSAGE: boolean;\n  SEND_MESSAGE_UPDATE: boolean;\n  CONTACTS_SET: boolean;\n  CONTACTS_UPDATE: boolean;\n  CONTACTS_UPSERT: boolean;\n  PRESENCE_UPDATE: boolean;\n  CHATS_SET: boolean;\n  CHATS_UPDATE: boolean;\n  CHATS_DELETE: boolean;\n  CHATS_UPSERT: boolean;\n  CONNECTION_UPDATE: boolean;\n  LABELS_EDIT: boolean;\n  LABELS_ASSOCIATION: boolean;\n  GROUPS_UPSERT: boolean;\n  GROUP_UPDATE: boolean;\n  GROUP_PARTICIPANTS_UPDATE: boolean;\n  CALL: boolean;\n  TYPEBOT_START: boolean;\n  TYPEBOT_CHANGE_STATUS: boolean;\n};\n\nexport type ApiKey = { KEY: string };\n\nexport type Auth = {\n  API_KEY: ApiKey;\n  EXPOSE_IN_FETCH_INSTANCES: boolean;\n};\n\nexport type DelInstance = number | boolean;\n\nexport type Language = string | 'en';\n\nexport type GlobalWebhook = {\n  URL: string;\n  ENABLED: boolean;\n  WEBHOOK_BY_EVENTS: boolean;\n};\n\nexport type GlobalPusher = {\n  ENABLED: boolean;\n  APP_ID: string;\n  KEY: string;\n  SECRET: string;\n  CLUSTER: string;\n  USE_TLS: boolean;\n};\n\nexport type CacheConfRedis = {\n  ENABLED: boolean;\n  URI: string;\n  PREFIX_KEY: string;\n  TTL: number;\n  SAVE_INSTANCES: boolean;\n};\nexport type CacheConfLocal = {\n  ENABLED: boolean;\n  TTL: number;\n};\nexport type SslConf = { PRIVKEY: string; FULLCHAIN: string };\nexport type Webhook = {\n  GLOBAL?: GlobalWebhook;\n  EVENTS: EventsWebhook;\n  REQUEST?: {\n    TIMEOUT_MS?: number;\n  };\n  RETRY?: {\n    MAX_ATTEMPTS?: number;\n    INITIAL_DELAY_SECONDS?: number;\n    USE_EXPONENTIAL_BACKOFF?: boolean;\n    MAX_DELAY_SECONDS?: number;\n    JITTER_FACTOR?: number;\n    NON_RETRYABLE_STATUS_CODES?: number[];\n  };\n};\nexport type Pusher = { ENABLED: boolean; GLOBAL?: GlobalPusher; EVENTS: EventsPusher };\nexport type ConfigSessionPhone = { CLIENT: string; NAME: string };\nexport type QrCode = { LIMIT: number; COLOR: string };\nexport type Typebot = { ENABLED: boolean; API_VERSION: string; SEND_MEDIA_BASE64: boolean };\nexport type Chatwoot = {\n  ENABLED: boolean;\n  MESSAGE_DELETE: boolean;\n  MESSAGE_READ: boolean;\n  BOT_CONTACT: boolean;\n  IMPORT: {\n    DATABASE: {\n      CONNECTION: {\n        URI: string;\n      };\n    };\n    PLACEHOLDER_MEDIA_MESSAGE: boolean;\n  };\n};\nexport type Openai = { ENABLED: boolean; API_KEY_GLOBAL?: string };\nexport type Dify = { ENABLED: boolean };\nexport type N8n = { ENABLED: boolean };\nexport type Evoai = { ENABLED: boolean };\nexport type Flowise = { ENABLED: boolean };\n\nexport type S3 = {\n  ACCESS_KEY: string;\n  SECRET_KEY: string;\n  ENDPOINT: string;\n  BUCKET_NAME: string;\n  ENABLE: boolean;\n  PORT?: number;\n  USE_SSL?: boolean;\n  REGION?: string;\n  SKIP_POLICY?: boolean;\n  SAVE_VIDEO?: boolean;\n};\n\nexport type CacheConf = { REDIS: CacheConfRedis; LOCAL: CacheConfLocal };\nexport type Metrics = {\n  ENABLED: boolean;\n  AUTH_REQUIRED: boolean;\n  USER?: string;\n  PASSWORD?: string;\n  ALLOWED_IPS?: string;\n};\n\nexport type Telemetry = {\n  ENABLED: boolean;\n  URL?: string;\n};\n\nexport type Proxy = {\n  HOST?: string;\n  PORT?: string;\n  PROTOCOL?: string;\n  USERNAME?: string;\n  PASSWORD?: string;\n};\n\nexport type AudioConverter = {\n  API_URL?: string;\n  API_KEY?: string;\n};\n\nexport type Facebook = {\n  APP_ID?: string;\n  CONFIG_ID?: string;\n  USER_TOKEN?: string;\n};\n\nexport type Sentry = {\n  DSN?: string;\n};\n\nexport type EventEmitter = {\n  MAX_LISTENERS: number;\n};\n\nexport type Production = boolean;\n\nexport interface Env {\n  SERVER: HttpServer;\n  CORS: Cors;\n  SSL_CONF: SslConf;\n  PROVIDER: ProviderSession;\n  DATABASE: Database;\n  RABBITMQ: Rabbitmq;\n  NATS: Nats;\n  SQS: Sqs;\n  KAFKA: Kafka;\n  WEBSOCKET: Websocket;\n  WA_BUSINESS: WaBusiness;\n  LOG: Log;\n  DEL_INSTANCE: DelInstance;\n  DEL_TEMP_INSTANCES: boolean;\n  LANGUAGE: Language;\n  WEBHOOK: Webhook;\n  PUSHER: Pusher;\n  CONFIG_SESSION_PHONE: ConfigSessionPhone;\n  QRCODE: QrCode;\n  TYPEBOT: Typebot;\n  CHATWOOT: Chatwoot;\n  OPENAI: Openai;\n  DIFY: Dify;\n  N8N: N8n;\n  EVOAI: Evoai;\n  FLOWISE: Flowise;\n  CACHE: CacheConf;\n  S3?: S3;\n  AUTHENTICATION: Auth;\n  METRICS: Metrics;\n  TELEMETRY: Telemetry;\n  PROXY: Proxy;\n  AUDIO_CONVERTER: AudioConverter;\n  FACEBOOK: Facebook;\n  SENTRY: Sentry;\n  EVENT_EMITTER: EventEmitter;\n  PRODUCTION?: Production;\n}\n\nexport type Key = keyof Env;\n\nexport class ConfigService {\n  constructor() {\n    this.loadEnv();\n  }\n\n  private env: Env;\n\n  public get<T = any>(key: Key) {\n    return this.env[key] as T;\n  }\n\n  private loadEnv() {\n    this.env = this.envProcess();\n    this.env.PRODUCTION = process.env?.NODE_ENV === 'PROD';\n    if (process.env?.DOCKER_ENV === 'true') {\n      this.env.SERVER.TYPE = process.env.SERVER_TYPE as 'http' | 'http';\n      this.env.SERVER.PORT = Number.parseInt(process.env.SERVER_PORT) || 8080;\n    }\n  }\n\n  private envProcess(): Env {\n    return {\n      SERVER: {\n        NAME: process.env?.SERVER_NAME || 'evolution',\n        TYPE: (process.env.SERVER_TYPE as 'http' | 'https') || 'http',\n        PORT: Number.parseInt(process.env.SERVER_PORT) || 8080,\n        URL: process.env.SERVER_URL,\n        DISABLE_DOCS: process.env?.SERVER_DISABLE_DOCS === 'true',\n        DISABLE_MANAGER: process.env?.SERVER_DISABLE_MANAGER === 'true',\n      },\n      CORS: {\n        ORIGIN: process.env.CORS_ORIGIN?.split(',') || ['*'],\n        METHODS:\n          (process.env.CORS_METHODS?.split(',') as HttpMethods[]) ||\n          (['POST', 'GET', 'PUT', 'DELETE'] as HttpMethods[]),\n        CREDENTIALS: process.env?.CORS_CREDENTIALS === 'true',\n      },\n      SSL_CONF: {\n        PRIVKEY: process.env?.SSL_CONF_PRIVKEY || '',\n        FULLCHAIN: process.env?.SSL_CONF_FULLCHAIN || '',\n      },\n      PROVIDER: {\n        ENABLED: process.env?.PROVIDER_ENABLED === 'true',\n        HOST: process.env.PROVIDER_HOST,\n        PORT: process.env?.PROVIDER_PORT || '5656',\n        PREFIX: process.env?.PROVIDER_PREFIX || 'evolution',\n      },\n      DATABASE: {\n        CONNECTION: {\n          URI: process.env.DATABASE_CONNECTION_URI || '',\n          CLIENT_NAME: process.env.DATABASE_CONNECTION_CLIENT_NAME || 'evolution',\n        },\n        PROVIDER: process.env.DATABASE_PROVIDER || 'postgresql',\n        SAVE_DATA: {\n          INSTANCE: process.env?.DATABASE_SAVE_DATA_INSTANCE === 'true',\n          NEW_MESSAGE: process.env?.DATABASE_SAVE_DATA_NEW_MESSAGE === 'true',\n          MESSAGE_UPDATE: process.env?.DATABASE_SAVE_MESSAGE_UPDATE === 'true',\n          CONTACTS: process.env?.DATABASE_SAVE_DATA_CONTACTS === 'true',\n          CHATS: process.env?.DATABASE_SAVE_DATA_CHATS === 'true',\n          HISTORIC: process.env?.DATABASE_SAVE_DATA_HISTORIC === 'true',\n          LABELS: process.env?.DATABASE_SAVE_DATA_LABELS === 'true',\n          IS_ON_WHATSAPP: process.env?.DATABASE_SAVE_IS_ON_WHATSAPP === 'true',\n          IS_ON_WHATSAPP_DAYS: Number.parseInt(process.env?.DATABASE_SAVE_IS_ON_WHATSAPP_DAYS ?? '7'),\n        },\n        DELETE_DATA: {\n          LOGICAL_MESSAGE_DELETE: process.env?.DATABASE_DELETE_MESSAGE === 'true',\n        },\n      },\n      RABBITMQ: {\n        ENABLED: process.env?.RABBITMQ_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.RABBITMQ_GLOBAL_ENABLED === 'true',\n        PREFIX_KEY: process.env?.RABBITMQ_PREFIX_KEY,\n        EXCHANGE_NAME: process.env?.RABBITMQ_EXCHANGE_NAME || 'evolution_exchange',\n        URI: process.env.RABBITMQ_URI || '',\n        FRAME_MAX: Number.parseInt(process.env.RABBITMQ_FRAME_MAX) || 8192,\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.RABBITMQ_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.RABBITMQ_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.RABBITMQ_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.RABBITMQ_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.RABBITMQ_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.RABBITMQ_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.RABBITMQ_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.RABBITMQ_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.RABBITMQ_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.RABBITMQ_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.RABBITMQ_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.RABBITMQ_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.RABBITMQ_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.RABBITMQ_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.RABBITMQ_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.RABBITMQ_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.RABBITMQ_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.RABBITMQ_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.RABBITMQ_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.RABBITMQ_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.RABBITMQ_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.RABBITMQ_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.RABBITMQ_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.RABBITMQ_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.RABBITMQ_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.RABBITMQ_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      NATS: {\n        ENABLED: process.env?.NATS_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.NATS_GLOBAL_ENABLED === 'true',\n        PREFIX_KEY: process.env?.NATS_PREFIX_KEY,\n        EXCHANGE_NAME: process.env?.NATS_EXCHANGE_NAME || 'evolution_exchange',\n        URI: process.env.NATS_URI || '',\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.NATS_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.NATS_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.NATS_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.NATS_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.NATS_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.NATS_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.NATS_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.NATS_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.NATS_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.NATS_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.NATS_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.NATS_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.NATS_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.NATS_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.NATS_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.NATS_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.NATS_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.NATS_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.NATS_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.NATS_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.NATS_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.NATS_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.NATS_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.NATS_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.NATS_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.NATS_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.NATS_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.NATS_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      SQS: {\n        ENABLED: process.env?.SQS_ENABLED === 'true',\n        GLOBAL_ENABLED: process.env?.SQS_GLOBAL_ENABLED === 'true',\n        GLOBAL_FORCE_SINGLE_QUEUE: process.env?.SQS_GLOBAL_FORCE_SINGLE_QUEUE === 'true',\n        GLOBAL_PREFIX_NAME: process.env?.SQS_GLOBAL_PREFIX_NAME || 'global',\n        ACCESS_KEY_ID: process.env.SQS_ACCESS_KEY_ID || '',\n        SECRET_ACCESS_KEY: process.env.SQS_SECRET_ACCESS_KEY || '',\n        ACCOUNT_ID: process.env.SQS_ACCOUNT_ID || '',\n        REGION: process.env.SQS_REGION || '',\n        MAX_PAYLOAD_SIZE: Number.parseInt(process.env.SQS_MAX_PAYLOAD_SIZE ?? '1048576'),\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.SQS_GLOBAL_APPLICATION_STARTUP === 'true',\n          CALL: process.env?.SQS_GLOBAL_CALL === 'true',\n          CHATS_DELETE: process.env?.SQS_GLOBAL_CHATS_DELETE === 'true',\n          CHATS_SET: process.env?.SQS_GLOBAL_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.SQS_GLOBAL_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.SQS_GLOBAL_CHATS_UPSERT === 'true',\n          CONNECTION_UPDATE: process.env?.SQS_GLOBAL_CONNECTION_UPDATE === 'true',\n          CONTACTS_SET: process.env?.SQS_GLOBAL_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.SQS_GLOBAL_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.SQS_GLOBAL_CONTACTS_UPSERT === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.SQS_GLOBAL_GROUP_PARTICIPANTS_UPDATE === 'true',\n          GROUPS_UPDATE: process.env?.SQS_GLOBAL_GROUPS_UPDATE === 'true',\n          GROUPS_UPSERT: process.env?.SQS_GLOBAL_GROUPS_UPSERT === 'true',\n          LABELS_ASSOCIATION: process.env?.SQS_GLOBAL_LABELS_ASSOCIATION === 'true',\n          LABELS_EDIT: process.env?.SQS_GLOBAL_LABELS_EDIT === 'true',\n          LOGOUT_INSTANCE: process.env?.SQS_GLOBAL_LOGOUT_INSTANCE === 'true',\n          MESSAGES_DELETE: process.env?.SQS_GLOBAL_MESSAGES_DELETE === 'true',\n          MESSAGES_EDITED: process.env?.SQS_GLOBAL_MESSAGES_EDITED === 'true',\n          MESSAGES_SET: process.env?.SQS_GLOBAL_MESSAGES_SET === 'true',\n          MESSAGES_UPDATE: process.env?.SQS_GLOBAL_MESSAGES_UPDATE === 'true',\n          MESSAGES_UPSERT: process.env?.SQS_GLOBAL_MESSAGES_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.SQS_GLOBAL_PRESENCE_UPDATE === 'true',\n          QRCODE_UPDATED: process.env?.SQS_GLOBAL_QRCODE_UPDATED === 'true',\n          REMOVE_INSTANCE: process.env?.SQS_GLOBAL_REMOVE_INSTANCE === 'true',\n          SEND_MESSAGE: process.env?.SQS_GLOBAL_SEND_MESSAGE === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.SQS_GLOBAL_TYPEBOT_CHANGE_STATUS === 'true',\n          TYPEBOT_START: process.env?.SQS_GLOBAL_TYPEBOT_START === 'true',\n        },\n      },\n      KAFKA: {\n        ENABLED: process.env?.KAFKA_ENABLED === 'true',\n        CLIENT_ID: process.env?.KAFKA_CLIENT_ID || 'evolution-api',\n        BROKERS: process.env?.KAFKA_BROKERS?.split(',') || ['localhost:9092'],\n        CONNECTION_TIMEOUT: Number.parseInt(process.env?.KAFKA_CONNECTION_TIMEOUT || '3000'),\n        REQUEST_TIMEOUT: Number.parseInt(process.env?.KAFKA_REQUEST_TIMEOUT || '30000'),\n        GLOBAL_ENABLED: process.env?.KAFKA_GLOBAL_ENABLED === 'true',\n        CONSUMER_GROUP_ID: process.env?.KAFKA_CONSUMER_GROUP_ID || 'evolution-api-consumers',\n        TOPIC_PREFIX: process.env?.KAFKA_TOPIC_PREFIX || 'evolution',\n        NUM_PARTITIONS: Number.parseInt(process.env?.KAFKA_NUM_PARTITIONS || '1'),\n        REPLICATION_FACTOR: Number.parseInt(process.env?.KAFKA_REPLICATION_FACTOR || '1'),\n        AUTO_CREATE_TOPICS: process.env?.KAFKA_AUTO_CREATE_TOPICS === 'true',\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.KAFKA_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.KAFKA_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.KAFKA_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.KAFKA_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.KAFKA_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.KAFKA_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.KAFKA_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.KAFKA_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.KAFKA_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.KAFKA_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.KAFKA_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.KAFKA_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPSERT: process.env?.KAFKA_EVENTS_CONTACTS_UPSERT === 'true',\n          CONTACTS_UPDATE: process.env?.KAFKA_EVENTS_CONTACTS_UPDATE === 'true',\n          PRESENCE_UPDATE: process.env?.KAFKA_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.KAFKA_EVENTS_CHATS_SET === 'true',\n          CHATS_UPSERT: process.env?.KAFKA_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_UPDATE: process.env?.KAFKA_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_DELETE: process.env?.KAFKA_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.KAFKA_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.KAFKA_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.KAFKA_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.KAFKA_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.KAFKA_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.KAFKA_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.KAFKA_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.KAFKA_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.KAFKA_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n        SASL:\n          process.env?.KAFKA_SASL_ENABLED === 'true'\n            ? {\n                ENABLED: true,\n                MECHANISM: process.env?.KAFKA_SASL_MECHANISM || 'plain',\n                USERNAME: process.env?.KAFKA_SASL_USERNAME || '',\n                PASSWORD: process.env?.KAFKA_SASL_PASSWORD || '',\n              }\n            : undefined,\n        SSL:\n          process.env?.KAFKA_SSL_ENABLED === 'true'\n            ? {\n                ENABLED: true,\n                REJECT_UNAUTHORIZED: process.env?.KAFKA_SSL_REJECT_UNAUTHORIZED !== 'false',\n                CA: process.env?.KAFKA_SSL_CA,\n                KEY: process.env?.KAFKA_SSL_KEY,\n                CERT: process.env?.KAFKA_SSL_CERT,\n              }\n            : undefined,\n      },\n      WEBSOCKET: {\n        ENABLED: process.env?.WEBSOCKET_ENABLED === 'true',\n        GLOBAL_EVENTS: process.env?.WEBSOCKET_GLOBAL_EVENTS === 'true',\n        ALLOWED_HOSTS: process.env?.WEBSOCKET_ALLOWED_HOSTS,\n      },\n      PUSHER: {\n        ENABLED: process.env?.PUSHER_ENABLED === 'true',\n        GLOBAL: {\n          ENABLED: process.env?.PUSHER_GLOBAL_ENABLED === 'true',\n          APP_ID: process.env?.PUSHER_GLOBAL_APP_ID || '',\n          KEY: process.env?.PUSHER_GLOBAL_KEY || '',\n          SECRET: process.env?.PUSHER_GLOBAL_SECRET || '',\n          CLUSTER: process.env?.PUSHER_GLOBAL_CLUSTER || '',\n          USE_TLS: process.env?.PUSHER_GLOBAL_USE_TLS === 'true',\n        },\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.PUSHER_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.PUSHER_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.PUSHER_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.PUSHER_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.PUSHER_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.PUSHER_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.PUSHER_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.PUSHER_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.PUSHER_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.PUSHER_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.PUSHER_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.PUSHER_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.PUSHER_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.PUSHER_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.PUSHER_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.PUSHER_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.PUSHER_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.PUSHER_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.PUSHER_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.PUSHER_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.PUSHER_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.PUSHER_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.PUSHER_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.PUSHER_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.PUSHER_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.PUSHER_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.PUSHER_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.PUSHER_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n        },\n      },\n      WA_BUSINESS: {\n        TOKEN_WEBHOOK: process.env.WA_BUSINESS_TOKEN_WEBHOOK || 'evolution',\n        URL: process.env.WA_BUSINESS_URL || 'https://graph.facebook.com',\n        VERSION: process.env.WA_BUSINESS_VERSION || 'v18.0',\n        LANGUAGE: process.env.WA_BUSINESS_LANGUAGE || 'en',\n      },\n      LOG: {\n        LEVEL:\n          (process.env?.LOG_LEVEL?.split(',') as LogLevel[]) ||\n          (['ERROR', 'WARN', 'DEBUG', 'INFO', 'LOG', 'VERBOSE', 'DARK', 'WEBHOOKS', 'WEBSOCKET'] as LogLevel[]),\n        COLOR: process.env?.LOG_COLOR === 'true',\n        BAILEYS: (process.env?.LOG_BAILEYS as LogBaileys) || 'error',\n      },\n      DEL_INSTANCE: isBooleanString(process.env?.DEL_INSTANCE)\n        ? process.env.DEL_INSTANCE === 'true'\n        : Number.parseInt(process.env.DEL_INSTANCE) || false,\n      DEL_TEMP_INSTANCES: isBooleanString(process.env?.DEL_TEMP_INSTANCES)\n        ? process.env.DEL_TEMP_INSTANCES === 'true'\n        : true,\n      LANGUAGE: process.env?.LANGUAGE || 'en',\n      WEBHOOK: {\n        GLOBAL: {\n          URL: process.env?.WEBHOOK_GLOBAL_URL || '',\n          ENABLED: process.env?.WEBHOOK_GLOBAL_ENABLED === 'true',\n          WEBHOOK_BY_EVENTS: process.env?.WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS === 'true',\n        },\n        EVENTS: {\n          APPLICATION_STARTUP: process.env?.WEBHOOK_EVENTS_APPLICATION_STARTUP === 'true',\n          INSTANCE_CREATE: process.env?.WEBHOOK_EVENTS_INSTANCE_CREATE === 'true',\n          INSTANCE_DELETE: process.env?.WEBHOOK_EVENTS_INSTANCE_DELETE === 'true',\n          QRCODE_UPDATED: process.env?.WEBHOOK_EVENTS_QRCODE_UPDATED === 'true',\n          MESSAGES_SET: process.env?.WEBHOOK_EVENTS_MESSAGES_SET === 'true',\n          MESSAGES_UPSERT: process.env?.WEBHOOK_EVENTS_MESSAGES_UPSERT === 'true',\n          MESSAGES_EDITED: process.env?.WEBHOOK_EVENTS_MESSAGES_EDITED === 'true',\n          MESSAGES_UPDATE: process.env?.WEBHOOK_EVENTS_MESSAGES_UPDATE === 'true',\n          MESSAGES_DELETE: process.env?.WEBHOOK_EVENTS_MESSAGES_DELETE === 'true',\n          SEND_MESSAGE: process.env?.WEBHOOK_EVENTS_SEND_MESSAGE === 'true',\n          SEND_MESSAGE_UPDATE: process.env?.WEBHOOK_EVENTS_SEND_MESSAGE_UPDATE === 'true',\n          CONTACTS_SET: process.env?.WEBHOOK_EVENTS_CONTACTS_SET === 'true',\n          CONTACTS_UPDATE: process.env?.WEBHOOK_EVENTS_CONTACTS_UPDATE === 'true',\n          CONTACTS_UPSERT: process.env?.WEBHOOK_EVENTS_CONTACTS_UPSERT === 'true',\n          PRESENCE_UPDATE: process.env?.WEBHOOK_EVENTS_PRESENCE_UPDATE === 'true',\n          CHATS_SET: process.env?.WEBHOOK_EVENTS_CHATS_SET === 'true',\n          CHATS_UPDATE: process.env?.WEBHOOK_EVENTS_CHATS_UPDATE === 'true',\n          CHATS_UPSERT: process.env?.WEBHOOK_EVENTS_CHATS_UPSERT === 'true',\n          CHATS_DELETE: process.env?.WEBHOOK_EVENTS_CHATS_DELETE === 'true',\n          CONNECTION_UPDATE: process.env?.WEBHOOK_EVENTS_CONNECTION_UPDATE === 'true',\n          LABELS_EDIT: process.env?.WEBHOOK_EVENTS_LABELS_EDIT === 'true',\n          LABELS_ASSOCIATION: process.env?.WEBHOOK_EVENTS_LABELS_ASSOCIATION === 'true',\n          GROUPS_UPSERT: process.env?.WEBHOOK_EVENTS_GROUPS_UPSERT === 'true',\n          GROUP_UPDATE: process.env?.WEBHOOK_EVENTS_GROUPS_UPDATE === 'true',\n          GROUP_PARTICIPANTS_UPDATE: process.env?.WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true',\n          CALL: process.env?.WEBHOOK_EVENTS_CALL === 'true',\n          TYPEBOT_START: process.env?.WEBHOOK_EVENTS_TYPEBOT_START === 'true',\n          TYPEBOT_CHANGE_STATUS: process.env?.WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS === 'true',\n          ERRORS: process.env?.WEBHOOK_EVENTS_ERRORS === 'true',\n          ERRORS_WEBHOOK: process.env?.WEBHOOK_EVENTS_ERRORS_WEBHOOK || '',\n        },\n        REQUEST: {\n          TIMEOUT_MS: Number.parseInt(process.env?.WEBHOOK_REQUEST_TIMEOUT_MS) || 30000,\n        },\n        RETRY: {\n          MAX_ATTEMPTS: Number.parseInt(process.env?.WEBHOOK_RETRY_MAX_ATTEMPTS) || 10,\n          INITIAL_DELAY_SECONDS: Number.parseInt(process.env?.WEBHOOK_RETRY_INITIAL_DELAY_SECONDS) || 5,\n          USE_EXPONENTIAL_BACKOFF: process.env?.WEBHOOK_RETRY_USE_EXPONENTIAL_BACKOFF !== 'false',\n          MAX_DELAY_SECONDS: Number.parseInt(process.env?.WEBHOOK_RETRY_MAX_DELAY_SECONDS) || 300,\n          JITTER_FACTOR: Number.parseFloat(process.env?.WEBHOOK_RETRY_JITTER_FACTOR) || 0.2,\n          NON_RETRYABLE_STATUS_CODES: process.env?.WEBHOOK_RETRY_NON_RETRYABLE_STATUS_CODES?.split(',').map(Number) || [\n            400, 401, 403, 404, 422,\n          ],\n        },\n      },\n      CONFIG_SESSION_PHONE: {\n        CLIENT: process.env?.CONFIG_SESSION_PHONE_CLIENT || 'Evolution API',\n        NAME: process.env?.CONFIG_SESSION_PHONE_NAME || 'Chrome',\n      },\n      QRCODE: {\n        LIMIT: Number.parseInt(process.env.QRCODE_LIMIT) || 30,\n        COLOR: process.env.QRCODE_COLOR || '#198754',\n      },\n      TYPEBOT: {\n        ENABLED: process.env?.TYPEBOT_ENABLED === 'true',\n        API_VERSION: process.env?.TYPEBOT_API_VERSION || 'old',\n        SEND_MEDIA_BASE64: process.env?.TYPEBOT_SEND_MEDIA_BASE64 === 'true',\n      },\n      CHATWOOT: {\n        ENABLED: process.env?.CHATWOOT_ENABLED === 'true',\n        MESSAGE_DELETE: process.env.CHATWOOT_MESSAGE_DELETE === 'true',\n        MESSAGE_READ: process.env.CHATWOOT_MESSAGE_READ === 'true',\n        BOT_CONTACT: !process.env.CHATWOOT_BOT_CONTACT || process.env.CHATWOOT_BOT_CONTACT === 'true',\n        IMPORT: {\n          DATABASE: {\n            CONNECTION: {\n              URI: process.env.CHATWOOT_IMPORT_DATABASE_CONNECTION_URI || '',\n            },\n          },\n          PLACEHOLDER_MEDIA_MESSAGE: process.env?.CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE === 'true',\n        },\n      },\n      OPENAI: {\n        ENABLED: process.env?.OPENAI_ENABLED === 'true',\n        API_KEY_GLOBAL: process.env?.OPENAI_API_KEY_GLOBAL || null,\n      },\n      DIFY: {\n        ENABLED: process.env?.DIFY_ENABLED === 'true',\n      },\n      N8N: {\n        ENABLED: process.env?.N8N_ENABLED === 'true',\n      },\n      EVOAI: {\n        ENABLED: process.env?.EVOAI_ENABLED === 'true',\n      },\n      FLOWISE: {\n        ENABLED: process.env?.FLOWISE_ENABLED === 'true',\n      },\n      CACHE: {\n        REDIS: {\n          ENABLED: process.env?.CACHE_REDIS_ENABLED === 'true',\n          URI: process.env?.CACHE_REDIS_URI || '',\n          PREFIX_KEY: process.env?.CACHE_REDIS_PREFIX_KEY || 'evolution-cache',\n          TTL: Number.parseInt(process.env?.CACHE_REDIS_TTL) || 604800,\n          SAVE_INSTANCES: process.env?.CACHE_REDIS_SAVE_INSTANCES === 'true',\n        },\n        LOCAL: {\n          ENABLED: process.env?.CACHE_LOCAL_ENABLED === 'true',\n          TTL: Number.parseInt(process.env?.CACHE_REDIS_TTL) || 86400,\n        },\n      },\n      S3: {\n        ACCESS_KEY: process.env?.S3_ACCESS_KEY,\n        SECRET_KEY: process.env?.S3_SECRET_KEY,\n        ENDPOINT: process.env?.S3_ENDPOINT,\n        BUCKET_NAME: process.env?.S3_BUCKET,\n        ENABLE: process.env?.S3_ENABLED === 'true',\n        PORT: Number.parseInt(process.env?.S3_PORT || '9000'),\n        USE_SSL: process.env?.S3_USE_SSL === 'true',\n        REGION: process.env?.S3_REGION,\n        SKIP_POLICY: process.env?.S3_SKIP_POLICY === 'true',\n        SAVE_VIDEO: process.env?.S3_SAVE_VIDEO === 'true',\n      },\n      AUTHENTICATION: {\n        API_KEY: {\n          KEY: process.env.AUTHENTICATION_API_KEY || 'BQYHJGJHJ',\n        },\n        EXPOSE_IN_FETCH_INSTANCES: process.env?.AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES === 'true',\n      },\n      METRICS: {\n        ENABLED: process.env?.PROMETHEUS_METRICS === 'true',\n        AUTH_REQUIRED: process.env?.METRICS_AUTH_REQUIRED === 'true',\n        USER: process.env?.METRICS_USER,\n        PASSWORD: process.env?.METRICS_PASSWORD,\n        ALLOWED_IPS: process.env?.METRICS_ALLOWED_IPS,\n      },\n      TELEMETRY: {\n        ENABLED: process.env?.TELEMETRY_ENABLED === undefined || process.env?.TELEMETRY_ENABLED === 'true',\n        URL: process.env?.TELEMETRY_URL,\n      },\n      PROXY: {\n        HOST: process.env?.PROXY_HOST,\n        PORT: process.env?.PROXY_PORT,\n        PROTOCOL: process.env?.PROXY_PROTOCOL,\n        USERNAME: process.env?.PROXY_USERNAME,\n        PASSWORD: process.env?.PROXY_PASSWORD,\n      },\n      AUDIO_CONVERTER: {\n        API_URL: process.env?.API_AUDIO_CONVERTER,\n        API_KEY: process.env?.API_AUDIO_CONVERTER_KEY,\n      },\n      FACEBOOK: {\n        APP_ID: process.env?.FACEBOOK_APP_ID,\n        CONFIG_ID: process.env?.FACEBOOK_CONFIG_ID,\n        USER_TOKEN: process.env?.FACEBOOK_USER_TOKEN,\n      },\n      SENTRY: {\n        DSN: process.env?.SENTRY_DSN,\n      },\n      EVENT_EMITTER: {\n        MAX_LISTENERS: Number.parseInt(process.env?.EVENT_EMITTER_MAX_LISTENERS) || 50,\n      },\n    };\n  }\n}\n\nexport const configService = new ConfigService();\n","import { ICache } from '@api/abstract/abstract.cache';\nimport { CacheConf, CacheConfLocal, ConfigService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BufferJSON } from 'baileys';\nimport NodeCache from 'node-cache';\n\nexport class LocalCache implements ICache {\n  private readonly logger = new Logger('LocalCache');\n  private conf: CacheConfLocal;\n  static localCache = new NodeCache();\n\n  constructor(\n    private readonly configService: ConfigService,\n    private readonly module: string,\n  ) {\n    this.conf = this.configService.get<CacheConf>('CACHE')?.LOCAL;\n  }\n\n  async get(key: string): Promise<any> {\n    return LocalCache.localCache.get(this.buildKey(key));\n  }\n\n  async set(key: string, value: any, ttl?: number) {\n    return LocalCache.localCache.set(this.buildKey(key), value, ttl || this.conf.TTL);\n  }\n\n  async has(key: string) {\n    return LocalCache.localCache.has(this.buildKey(key));\n  }\n\n  async delete(key: string) {\n    return LocalCache.localCache.del(this.buildKey(key));\n  }\n\n  async deleteAll(appendCriteria?: string) {\n    const keys = await this.keys(appendCriteria);\n    if (!keys?.length) {\n      return 0;\n    }\n\n    return LocalCache.localCache.del(keys);\n  }\n\n  async keys(appendCriteria?: string) {\n    const filter = `${this.buildKey('')}${appendCriteria ? `${appendCriteria}:` : ''}`;\n\n    return LocalCache.localCache.keys().filter((key) => key.substring(0, filter.length) === filter);\n  }\n\n  buildKey(key: string) {\n    return `${this.module}:${key}`;\n  }\n\n  async hGet(key: string, field: string) {\n    try {\n      const data = LocalCache.localCache.get(this.buildKey(key)) as object;\n\n      if (data && field in data) {\n        return JSON.parse(data[field], BufferJSON.reviver);\n      }\n\n      return null;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async hSet(key: string, field: string, value: any) {\n    try {\n      const json = JSON.stringify(value, BufferJSON.replacer);\n\n      let hash = LocalCache.localCache.get(this.buildKey(key));\n\n      if (!hash) {\n        hash = {};\n      }\n\n      hash[field] = json;\n      LocalCache.localCache.set(this.buildKey(key), hash);\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async hDelete(key: string, field: string) {\n    try {\n      const data = LocalCache.localCache.get(this.buildKey(key)) as object;\n\n      if (data && field in data) {\n        delete data[field];\n        LocalCache.localCache.set(this.buildKey(key), data);\n        return 1;\n      }\n\n      return 0;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n}\n","import { ICache } from '@api/abstract/abstract.cache';\nimport { CacheConf, CacheConfRedis, ConfigService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BufferJSON } from 'baileys';\nimport { RedisClientType } from 'redis';\n\nimport { redisClient } from './rediscache.client';\n\nexport class RedisCache implements ICache {\n  private readonly logger = new Logger('RedisCache');\n  private client: RedisClientType;\n  private conf: CacheConfRedis;\n\n  constructor(\n    private readonly configService: ConfigService,\n    private readonly module: string,\n  ) {\n    this.conf = this.configService.get<CacheConf>('CACHE')?.REDIS;\n    this.client = redisClient.getConnection();\n  }\n  async get(key: string): Promise<any> {\n    try {\n      return JSON.parse(await this.client.get(this.buildKey(key)));\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async hGet(key: string, field: string) {\n    try {\n      const data = await this.client.hGet(this.buildKey(key), field);\n\n      if (data) {\n        return JSON.parse(data, BufferJSON.reviver);\n      }\n\n      return null;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async set(key: string, value: any, ttl?: number) {\n    try {\n      await this.client.setEx(this.buildKey(key), ttl || this.conf?.TTL, JSON.stringify(value));\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async hSet(key: string, field: string, value: any) {\n    try {\n      const json = JSON.stringify(value, BufferJSON.replacer);\n\n      await this.client.hSet(this.buildKey(key), field, json);\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async has(key: string) {\n    try {\n      return (await this.client.exists(this.buildKey(key))) > 0;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async delete(key: string) {\n    try {\n      return await this.client.del(this.buildKey(key));\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async hDelete(key: string, field: string) {\n    try {\n      return await this.client.hDel(this.buildKey(key), field);\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async deleteAll(appendCriteria?: string) {\n    try {\n      const keys = await this.keys(appendCriteria);\n      if (!keys?.length) {\n        return 0;\n      }\n\n      return await this.client.del(keys);\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async keys(appendCriteria?: string) {\n    try {\n      const match = `${this.buildKey('')}${appendCriteria ? `${appendCriteria}:` : ''}*`;\n      const keys = [];\n      for await (const key of this.client.scanIterator({\n        MATCH: match,\n        COUNT: 100,\n      })) {\n        keys.push(key);\n      }\n\n      return [...new Set(keys)];\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  buildKey(key: string) {\n    return `${this.conf?.PREFIX_KEY}:${this.module}:${key}`;\n  }\n}\n","import { CacheConf, CacheConfRedis, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { createClient, RedisClientType } from 'redis';\n\nclass Redis {\n  private logger = new Logger('Redis');\n  private client: RedisClientType = null;\n  private conf: CacheConfRedis;\n  private connected = false;\n\n  constructor() {\n    this.conf = configService.get<CacheConf>('CACHE')?.REDIS;\n  }\n\n  getConnection(): RedisClientType {\n    if (this.connected) {\n      return this.client;\n    } else {\n      this.client = createClient({\n        url: this.conf.URI,\n      });\n\n      this.client.on('connect', () => {\n        this.logger.verbose('redis connecting');\n      });\n\n      this.client.on('ready', () => {\n        this.logger.verbose('redis ready');\n        this.connected = true;\n      });\n\n      this.client.on('error', () => {\n        this.logger.error('redis disconnected');\n        this.connected = false;\n      });\n\n      this.client.on('end', () => {\n        this.logger.verbose('redis connection ended');\n        this.connected = false;\n      });\n\n      try {\n        this.client.connect();\n        this.connected = true;\n      } catch (e) {\n        this.connected = false;\n        this.logger.error('redis connect exception caught: ' + e);\n        return null;\n      }\n\n      return this.client;\n    }\n  }\n}\n\nexport const redisClient = new Redis();\n","import { ICache } from '@api/abstract/abstract.cache';\nimport { CacheConf, ConfigService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\n\nimport { LocalCache } from './localcache';\nimport { RedisCache } from './rediscache';\n\nconst logger = new Logger('CacheEngine');\n\nexport class CacheEngine {\n  private engine: ICache;\n\n  constructor(\n    private readonly configService: ConfigService,\n    module: string,\n  ) {\n    const cacheConf = configService.get<CacheConf>('CACHE');\n\n    if (cacheConf?.REDIS?.ENABLED && cacheConf?.REDIS?.URI !== '') {\n      logger.verbose(`RedisCache initialized for ${module}`);\n      this.engine = new RedisCache(configService, module);\n    } else if (cacheConf?.LOCAL?.ENABLED) {\n      logger.verbose(`LocalCache initialized for ${module}`);\n      this.engine = new LocalCache(configService, module);\n    }\n  }\n\n  public getEngine() {\n    return this.engine;\n  }\n}\n","import { configService, EventEmitter as EventEmitterConfig } from '@config/env.config';\nimport EventEmitter2 from 'eventemitter2';\n\nconst eventEmitterConfig = configService.get<EventEmitterConfig>('EVENT_EMITTER');\n\nexport const eventEmitter = new EventEmitter2({\n  delimiter: '.',\n  newListener: false,\n  ignoreErrors: false,\n  maxListeners: eventEmitterConfig.MAX_LISTENERS,\n});\n","import { getCatalogDto, getCollectionsDto } from '@api/dto/business.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\n\nexport class BusinessController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async fetchCatalog({ instanceName }: InstanceDto, data: getCatalogDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchCatalog(instanceName, data);\n  }\n\n  public async fetchCollections({ instanceName }: InstanceDto, data: getCollectionsDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchCollections(instanceName, data);\n  }\n}\n","import { OfferCallDto } from '@api/dto/call.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\n\nexport class CallController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async offerCall({ instanceName }: InstanceDto, data: OfferCallDto) {\n    return await this.waMonitor.waInstances[instanceName].offerCall(data);\n  }\n}\n","import {\n  ArchiveChatDto,\n  BlockUserDto,\n  DeleteMessage,\n  getBase64FromMediaMessageDto,\n  MarkChatUnreadDto,\n  NumberDto,\n  PrivacySettingDto,\n  ProfileNameDto,\n  ProfilePictureDto,\n  ProfileStatusDto,\n  ReadMessageDto,\n  SendPresenceDto,\n  UpdateMessageDto,\n  WhatsAppNumberDto,\n} from '@api/dto/chat.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { Query } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Contact, Message, MessageUpdate } from '@prisma/client';\n\nexport class ChatController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async whatsappNumber({ instanceName }: InstanceDto, data: WhatsAppNumberDto) {\n    return await this.waMonitor.waInstances[instanceName].whatsappNumber(data);\n  }\n\n  public async readMessage({ instanceName }: InstanceDto, data: ReadMessageDto) {\n    return await this.waMonitor.waInstances[instanceName].markMessageAsRead(data);\n  }\n\n  public async archiveChat({ instanceName }: InstanceDto, data: ArchiveChatDto) {\n    return await this.waMonitor.waInstances[instanceName].archiveChat(data);\n  }\n\n  public async markChatUnread({ instanceName }: InstanceDto, data: MarkChatUnreadDto) {\n    return await this.waMonitor.waInstances[instanceName].markChatUnread(data);\n  }\n\n  public async deleteMessage({ instanceName }: InstanceDto, data: DeleteMessage) {\n    return await this.waMonitor.waInstances[instanceName].deleteMessage(data);\n  }\n\n  public async fetchProfilePicture({ instanceName }: InstanceDto, data: NumberDto) {\n    return await this.waMonitor.waInstances[instanceName].profilePicture(data.number);\n  }\n\n  public async fetchProfile({ instanceName }: InstanceDto, data: NumberDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchProfile(instanceName, data.number);\n  }\n\n  public async fetchContacts({ instanceName }: InstanceDto, query: Query<Contact>) {\n    return await this.waMonitor.waInstances[instanceName].fetchContacts(query);\n  }\n\n  public async getBase64FromMediaMessage({ instanceName }: InstanceDto, data: getBase64FromMediaMessageDto) {\n    return await this.waMonitor.waInstances[instanceName].getBase64FromMediaMessage(data);\n  }\n\n  public async fetchMessages({ instanceName }: InstanceDto, query: Query<Message>) {\n    return await this.waMonitor.waInstances[instanceName].fetchMessages(query);\n  }\n\n  public async fetchStatusMessage({ instanceName }: InstanceDto, query: Query<MessageUpdate>) {\n    return await this.waMonitor.waInstances[instanceName].fetchStatusMessage(query);\n  }\n\n  public async fetchChats({ instanceName }: InstanceDto, query: Query<Contact>) {\n    return await this.waMonitor.waInstances[instanceName].fetchChats(query);\n  }\n\n  public async findChatByRemoteJid({ instanceName }: InstanceDto, remoteJid: string) {\n    return await this.waMonitor.waInstances[instanceName].findChatByRemoteJid(remoteJid);\n  }\n\n  public async sendPresence({ instanceName }: InstanceDto, data: SendPresenceDto) {\n    return await this.waMonitor.waInstances[instanceName].sendPresence(data);\n  }\n\n  public async fetchPrivacySettings({ instanceName }: InstanceDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchPrivacySettings();\n  }\n\n  public async updatePrivacySettings({ instanceName }: InstanceDto, data: PrivacySettingDto) {\n    return await this.waMonitor.waInstances[instanceName].updatePrivacySettings(data);\n  }\n\n  public async fetchBusinessProfile({ instanceName }: InstanceDto, data: ProfilePictureDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchBusinessProfile(data.number);\n  }\n\n  public async updateProfileName({ instanceName }: InstanceDto, data: ProfileNameDto) {\n    return await this.waMonitor.waInstances[instanceName].updateProfileName(data.name);\n  }\n\n  public async updateProfileStatus({ instanceName }: InstanceDto, data: ProfileStatusDto) {\n    return await this.waMonitor.waInstances[instanceName].updateProfileStatus(data.status);\n  }\n\n  public async updateProfilePicture({ instanceName }: InstanceDto, data: ProfilePictureDto) {\n    return await this.waMonitor.waInstances[instanceName].updateProfilePicture(data.picture);\n  }\n\n  public async removeProfilePicture({ instanceName }: InstanceDto) {\n    return await this.waMonitor.waInstances[instanceName].removeProfilePicture();\n  }\n\n  public async updateMessage({ instanceName }: InstanceDto, data: UpdateMessageDto) {\n    return await this.waMonitor.waInstances[instanceName].updateMessage(data);\n  }\n\n  public async blockUser({ instanceName }: InstanceDto, data: BlockUserDto) {\n    return await this.waMonitor.waInstances[instanceName].blockUser(data);\n  }\n}\n","import {\n  AcceptGroupInvite,\n  CreateGroupDto,\n  GetParticipant,\n  GroupDescriptionDto,\n  GroupInvite,\n  GroupJid,\n  GroupPictureDto,\n  GroupSendInvite,\n  GroupSubjectDto,\n  GroupToggleEphemeralDto,\n  GroupUpdateParticipantDto,\n  GroupUpdateSettingDto,\n} from '@api/dto/group.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\n\nexport class GroupController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async createGroup(instance: InstanceDto, create: CreateGroupDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].createGroup(create);\n  }\n\n  public async updateGroupPicture(instance: InstanceDto, update: GroupPictureDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].updateGroupPicture(update);\n  }\n\n  public async updateGroupSubject(instance: InstanceDto, update: GroupSubjectDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].updateGroupSubject(update);\n  }\n\n  public async updateGroupDescription(instance: InstanceDto, update: GroupDescriptionDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].updateGroupDescription(update);\n  }\n\n  public async findGroupInfo(instance: InstanceDto, groupJid: GroupJid) {\n    return await this.waMonitor.waInstances[instance.instanceName].findGroup(groupJid);\n  }\n\n  public async fetchAllGroups(instance: InstanceDto, getPaticipants: GetParticipant) {\n    return await this.waMonitor.waInstances[instance.instanceName].fetchAllGroups(getPaticipants);\n  }\n\n  public async inviteCode(instance: InstanceDto, groupJid: GroupJid) {\n    return await this.waMonitor.waInstances[instance.instanceName].inviteCode(groupJid);\n  }\n\n  public async inviteInfo(instance: InstanceDto, inviteCode: GroupInvite) {\n    return await this.waMonitor.waInstances[instance.instanceName].inviteInfo(inviteCode);\n  }\n\n  public async sendInvite(instance: InstanceDto, data: GroupSendInvite) {\n    return await this.waMonitor.waInstances[instance.instanceName].sendInvite(data);\n  }\n\n  public async acceptInviteCode(instance: InstanceDto, inviteCode: AcceptGroupInvite) {\n    return await this.waMonitor.waInstances[instance.instanceName].acceptInviteCode(inviteCode);\n  }\n\n  public async revokeInviteCode(instance: InstanceDto, groupJid: GroupJid) {\n    return await this.waMonitor.waInstances[instance.instanceName].revokeInviteCode(groupJid);\n  }\n\n  public async findParticipants(instance: InstanceDto, groupJid: GroupJid) {\n    return await this.waMonitor.waInstances[instance.instanceName].findParticipants(groupJid);\n  }\n\n  public async updateGParticipate(instance: InstanceDto, update: GroupUpdateParticipantDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].updateGParticipant(update);\n  }\n\n  public async updateGSetting(instance: InstanceDto, update: GroupUpdateSettingDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].updateGSetting(update);\n  }\n\n  public async toggleEphemeral(instance: InstanceDto, update: GroupToggleEphemeralDto) {\n    return await this.waMonitor.waInstances[instance.instanceName].toggleEphemeral(update);\n  }\n\n  public async leaveGroup(instance: InstanceDto, groupJid: GroupJid) {\n    return await this.waMonitor.waInstances[instance.instanceName].leaveGroup(groupJid);\n  }\n}\n","/* eslint-disable @typescript-eslint/no-namespace */\nimport { JsonValue } from '@prisma/client/runtime/library';\nimport { AuthenticationState, WAConnectionState } from 'baileys';\n\nexport enum Events {\n  APPLICATION_STARTUP = 'application.startup',\n  INSTANCE_CREATE = 'instance.create',\n  INSTANCE_DELETE = 'instance.delete',\n  QRCODE_UPDATED = 'qrcode.updated',\n  CONNECTION_UPDATE = 'connection.update',\n  STATUS_INSTANCE = 'status.instance',\n  MESSAGES_SET = 'messages.set',\n  MESSAGES_UPSERT = 'messages.upsert',\n  MESSAGES_EDITED = 'messages.edited',\n  MESSAGES_UPDATE = 'messages.update',\n  MESSAGES_DELETE = 'messages.delete',\n  SEND_MESSAGE = 'send.message',\n  SEND_MESSAGE_UPDATE = 'send.message.update',\n  CONTACTS_SET = 'contacts.set',\n  CONTACTS_UPSERT = 'contacts.upsert',\n  CONTACTS_UPDATE = 'contacts.update',\n  PRESENCE_UPDATE = 'presence.update',\n  CHATS_SET = 'chats.set',\n  CHATS_UPDATE = 'chats.update',\n  CHATS_UPSERT = 'chats.upsert',\n  CHATS_DELETE = 'chats.delete',\n  GROUPS_UPSERT = 'groups.upsert',\n  GROUPS_UPDATE = 'groups.update',\n  GROUP_PARTICIPANTS_UPDATE = 'group-participants.update',\n  CALL = 'call',\n  TYPEBOT_START = 'typebot.start',\n  TYPEBOT_CHANGE_STATUS = 'typebot.change-status',\n  LABELS_EDIT = 'labels.edit',\n  LABELS_ASSOCIATION = 'labels.association',\n  CREDS_UPDATE = 'creds.update',\n  MESSAGING_HISTORY_SET = 'messaging-history.set',\n  REMOVE_INSTANCE = 'remove.instance',\n  LOGOUT_INSTANCE = 'logout.instance',\n}\n\nexport declare namespace wa {\n  export type QrCode = {\n    count?: number;\n    pairingCode?: string;\n    base64?: string;\n    code?: string;\n  };\n\n  export type Instance = {\n    id?: string;\n    qrcode?: QrCode;\n    pairingCode?: string;\n    authState?: { state: AuthenticationState; saveCreds: () => void };\n    name?: string;\n    ownerJid?: string;\n    wuid?: string;\n    profileName?: string;\n    profilePictureUrl?: string;\n    token?: string;\n    number?: string;\n    integration?: string;\n    businessId?: string;\n  };\n\n  export type LocalChatwoot = {\n    enabled?: boolean;\n    accountId?: string;\n    token?: string;\n    url?: string;\n    nameInbox?: string;\n    signMsg?: boolean;\n    signDelimiter?: string;\n    number?: string;\n    reopenConversation?: boolean;\n    conversationPending?: boolean;\n    mergeBrazilContacts?: boolean;\n    importContacts?: boolean;\n    importMessages?: boolean;\n    daysLimitImportMessages?: number;\n  };\n\n  export type LocalSettings = {\n    rejectCall?: boolean;\n    msgCall?: string;\n    groupsIgnore?: boolean;\n    alwaysOnline?: boolean;\n    readMessages?: boolean;\n    readStatus?: boolean;\n    syncFullHistory?: boolean;\n    wavoipToken?: string;\n  };\n\n  export type LocalEvent = {\n    enabled?: boolean;\n    events?: JsonValue;\n  };\n\n  export type LocalWebHook = LocalEvent & {\n    url?: string;\n    headers?: JsonValue;\n    webhookByEvents?: boolean;\n    webhookBase64?: boolean;\n  };\n\n  export type LocalPusher = LocalEvent & {\n    appId?: string;\n    key?: string;\n    secret?: string;\n    cluster?: string;\n    useTLS?: boolean;\n  };\n\n  type Session = {\n    remoteJid?: string;\n    sessionId?: string;\n    createdAt?: number;\n  };\n\n  export type LocalProxy = {\n    enabled?: boolean;\n    host?: string;\n    port?: string;\n    protocol?: string;\n    username?: string;\n    password?: string;\n  };\n\n  export type StateConnection = {\n    instance?: string;\n    state?: WAConnectionState | 'refused';\n    statusReason?: number;\n  };\n\n  export type StatusMessage = 'ERROR' | 'PENDING' | 'SERVER_ACK' | 'DELIVERY_ACK' | 'READ' | 'DELETED' | 'PLAYED';\n}\n\nexport const TypeMediaMessage = [\n  'imageMessage',\n  'documentMessage',\n  'audioMessage',\n  'videoMessage',\n  'stickerMessage',\n  'ptvMessage',\n];\n\nexport const MessageSubtype = [\n  'ephemeralMessage',\n  'documentWithCaptionMessage',\n  'viewOnceMessage',\n  'viewOnceMessageV2',\n];\n\nexport const Integration = {\n  WHATSAPP_BUSINESS: 'WHATSAPP-BUSINESS',\n  WHATSAPP_BAILEYS: 'WHATSAPP-BAILEYS',\n  EVOLUTION: 'EVOLUTION',\n};\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { prismaRepository } from '@api/server.module';\nimport { Auth, configService, Database } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { ForbiddenException, UnauthorizedException } from '@exceptions';\nimport { NextFunction, Request, Response } from 'express';\n\nconst logger = new Logger('GUARD');\n\nasync function apikey(req: Request, _: Response, next: NextFunction) {\n  const env = configService.get<Auth>('AUTHENTICATION').API_KEY;\n  const key = req.get('apikey');\n  const db = configService.get<Database>('DATABASE');\n\n  if (!key) {\n    throw new UnauthorizedException();\n  }\n\n  if (env.KEY === key) {\n    return next();\n  }\n\n  if ((req.originalUrl.includes('/instance/create') || req.originalUrl.includes('/instance/fetchInstances')) && !key) {\n    throw new ForbiddenException('Missing global api key', 'The global api key must be set');\n  }\n  const param = req.params as unknown as InstanceDto;\n\n  try {\n    if (param?.instanceName) {\n      const instance = await prismaRepository.instance.findUnique({\n        where: { name: param.instanceName },\n      });\n      if (instance.token === key) {\n        return next();\n      }\n    } else {\n      if (req.originalUrl.includes('/instance/fetchInstances') && db.SAVE_DATA.INSTANCE) {\n        const instanceByKey = await prismaRepository.instance.findFirst({\n          where: { token: key },\n        });\n        if (instanceByKey) {\n          return next();\n        }\n      }\n    }\n  } catch (error) {\n    logger.error(error);\n  }\n\n  throw new UnauthorizedException();\n}\n\nexport const authGuard = { apikey };\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { cache, prismaRepository, waMonitor } from '@api/server.module';\nimport { CacheConf, configService } from '@config/env.config';\nimport { BadRequestException, ForbiddenException, InternalServerErrorException, NotFoundException } from '@exceptions';\nimport { NextFunction, Request, Response } from 'express';\n\nasync function getInstance(instanceName: string) {\n  try {\n    const cacheConf = configService.get<CacheConf>('CACHE');\n\n    const exists = !!waMonitor.waInstances[instanceName];\n\n    if (cacheConf.REDIS.ENABLED && cacheConf.REDIS.SAVE_INSTANCES) {\n      const keyExists = await cache.has(instanceName);\n\n      return exists || keyExists;\n    }\n\n    return exists || (await prismaRepository.instance.findMany({ where: { name: instanceName } })).length > 0;\n  } catch (error) {\n    throw new InternalServerErrorException(error?.toString());\n  }\n}\n\nexport async function instanceExistsGuard(req: Request, _: Response, next: NextFunction) {\n  if (req.originalUrl.includes('/instance/create') || req.originalUrl.includes('/instance/fetchInstances')) {\n    return next();\n  }\n\n  const param = req.params as unknown as InstanceDto;\n  if (!param?.instanceName) {\n    throw new BadRequestException('\"instanceName\" not provided.');\n  }\n\n  if (!(await getInstance(param.instanceName))) {\n    throw new NotFoundException(`The \"${param.instanceName}\" instance does not exist`);\n  }\n\n  next();\n}\n\nexport async function instanceLoggedGuard(req: Request, _: Response, next: NextFunction) {\n  if (req.originalUrl.includes('/instance/create')) {\n    const instance = req.body as InstanceDto;\n    if (await getInstance(instance.instanceName)) {\n      throw new ForbiddenException(`This name \"${instance.instanceName}\" is already in use.`);\n    }\n\n    if (waMonitor.waInstances[instance.instanceName]) {\n      delete waMonitor.waInstances[instance.instanceName];\n    }\n  }\n\n  next();\n}\n","import { configService, Telemetry } from '@config/env.config';\nimport axios from 'axios';\nimport fs from 'fs';\n\nconst packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));\n\nexport interface TelemetryData {\n  route: string;\n  apiVersion: string;\n  timestamp: Date;\n}\n\nexport const sendTelemetry = async (route: string): Promise<void> => {\n  const telemetryConfig = configService.get<Telemetry>('TELEMETRY');\n\n  if (!telemetryConfig.ENABLED) {\n    return;\n  }\n\n  if (route === '/') {\n    return;\n  }\n\n  const telemetry: TelemetryData = {\n    route,\n    apiVersion: `${packageJson.version}`,\n    timestamp: new Date(),\n  };\n\n  const url =\n    telemetryConfig.URL && telemetryConfig.URL !== '' ? telemetryConfig.URL : 'https://log.evolution-api.com/telemetry';\n\n  axios\n    .post(url, telemetry)\n    .then(() => {})\n    .catch(() => {});\n};\n","import { sendTelemetry } from '@utils/sendTelemetry';\nimport { NextFunction, Request, Response } from 'express';\n\nclass Telemetry {\n  public collectTelemetry(req: Request, res: Response, next: NextFunction): void {\n    sendTelemetry(req.path);\n\n    next();\n  }\n}\n\nexport default Telemetry;\n","import { Router } from 'express';\n\nimport { EvolutionRouter } from './evolution/evolution.router';\nimport { MetaRouter } from './meta/meta.router';\nimport { BaileysRouter } from './whatsapp/baileys.router';\n\nexport class ChannelRouter {\n  public readonly router: Router;\n\n  constructor(configService: any, ...guards: any[]) {\n    this.router = Router();\n\n    this.router.use('/', new EvolutionRouter(configService).router);\n    this.router.use('/', new MetaRouter(configService).router);\n    this.router.use('/baileys', new BaileysRouter(...guards).router);\n  }\n}\n","import 'express-async-errors';\n\nimport { GetParticipant, GroupInvite } from '@api/dto/group.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { Request } from 'express';\nimport { JSONSchema7 } from 'json-schema';\nimport { validate } from 'jsonschema';\n\ntype DataValidate<T> = {\n  request: Request;\n  schema: JSONSchema7;\n  ClassRef: any;\n  execute: (instance: InstanceDto, data: T) => Promise<any>;\n};\n\nconst logger = new Logger('Validate');\n\nexport abstract class RouterBroker {\n  constructor() {}\n  public routerPath(path: string, param = true) {\n    let route = '/' + path;\n    param ? (route += '/:instanceName') : null;\n\n    return route;\n  }\n\n  public async dataValidate<T>(args: DataValidate<T>) {\n    const { request, schema, ClassRef, execute } = args;\n\n    const ref = new ClassRef();\n    const body = request.body;\n    const instance = request.params as unknown as InstanceDto;\n\n    if (request?.query && Object.keys(request.query).length > 0) {\n      Object.assign(instance, request.query);\n    }\n\n    if (request.originalUrl.includes('/instance/create')) {\n      Object.assign(instance, body);\n    }\n\n    Object.assign(ref, body);\n\n    const v = schema ? validate(ref, schema) : { valid: true, errors: [] };\n\n    if (!v.valid) {\n      const message: any[] = v.errors.map(({ stack, schema }) => {\n        let message: string;\n        if (schema['description']) {\n          message = schema['description'];\n        } else {\n          message = stack.replace('instance.', '');\n        }\n        return message;\n      });\n      logger.error(message);\n      throw new BadRequestException(message);\n    }\n\n    return await execute(instance, ref);\n  }\n\n  public async groupNoValidate<T>(args: DataValidate<T>) {\n    const { request, ClassRef, schema, execute } = args;\n\n    const instance = request.params as unknown as InstanceDto;\n\n    const ref = new ClassRef();\n\n    Object.assign(ref, request.body);\n\n    const v = validate(ref, schema);\n\n    if (!v.valid) {\n      const message: any[] = v.errors.map(({ property, stack, schema }) => {\n        let message: string;\n        if (schema['description']) {\n          message = schema['description'];\n        } else {\n          message = stack.replace('instance.', '');\n        }\n        return {\n          property: property.replace('instance.', ''),\n          message,\n        };\n      });\n      logger.error([...message]);\n      throw new BadRequestException(...message);\n    }\n\n    return await execute(instance, ref);\n  }\n\n  public async groupValidate<T>(args: DataValidate<T>) {\n    const { request, ClassRef, schema, execute } = args;\n\n    const instance = request.params as unknown as InstanceDto;\n    const body = request.body;\n\n    let groupJid = body?.groupJid;\n\n    if (!groupJid) {\n      if (request.query?.groupJid) {\n        groupJid = request.query.groupJid;\n      } else {\n        throw new BadRequestException('The group id needs to be informed in the query', 'ex: \"groupJid=120362@g.us\"');\n      }\n    }\n\n    if (!groupJid.endsWith('@g.us')) {\n      groupJid = groupJid + '@g.us';\n    }\n\n    Object.assign(body, {\n      groupJid: groupJid,\n    });\n\n    const ref = new ClassRef();\n\n    Object.assign(ref, body);\n\n    const v = validate(ref, schema);\n\n    if (!v.valid) {\n      const message: any[] = v.errors.map(({ property, stack, schema }) => {\n        let message: string;\n        if (schema['description']) {\n          message = schema['description'];\n        } else {\n          message = stack.replace('instance.', '');\n        }\n        return {\n          property: property.replace('instance.', ''),\n          message,\n        };\n      });\n      logger.error([...message]);\n      throw new BadRequestException(...message);\n    }\n\n    return await execute(instance, ref);\n  }\n\n  public async inviteCodeValidate<T>(args: DataValidate<T>) {\n    const { request, ClassRef, schema, execute } = args;\n\n    const inviteCode = request.query as unknown as GroupInvite;\n\n    if (!inviteCode?.inviteCode) {\n      throw new BadRequestException(\n        'The group invite code id needs to be informed in the query',\n        'ex: \"inviteCode=F1EX5QZxO181L3TMVP31gY\" (Obtained from group join link)',\n      );\n    }\n\n    const instance = request.params as unknown as InstanceDto;\n    const body = request.body;\n\n    const ref = new ClassRef();\n\n    Object.assign(body, inviteCode);\n    Object.assign(ref, body);\n\n    const v = validate(ref, schema);\n\n    if (!v.valid) {\n      const message: any[] = v.errors.map(({ property, stack, schema }) => {\n        let message: string;\n        if (schema['description']) {\n          message = schema['description'];\n        } else {\n          message = stack.replace('instance.', '');\n        }\n        return {\n          property: property.replace('instance.', ''),\n          message,\n        };\n      });\n      logger.error([...message]);\n      throw new BadRequestException(...message);\n    }\n\n    return await execute(instance, ref);\n  }\n\n  public async getParticipantsValidate<T>(args: DataValidate<T>) {\n    const { request, ClassRef, schema, execute } = args;\n\n    const getParticipants = request.query as unknown as GetParticipant;\n\n    if (!getParticipants?.getParticipants) {\n      throw new BadRequestException('The getParticipants needs to be informed in the query');\n    }\n\n    const instance = request.params as unknown as InstanceDto;\n    const body = request.body;\n\n    const ref = new ClassRef();\n\n    Object.assign(body, getParticipants);\n    Object.assign(ref, body);\n\n    const v = validate(ref, schema);\n\n    if (!v.valid) {\n      const message: any[] = v.errors.map(({ property, stack, schema }) => {\n        let message: string;\n        if (schema['description']) {\n          message = schema['description'];\n        } else {\n          message = stack.replace('instance.', '');\n        }\n        return {\n          property: property.replace('instance.', ''),\n          message,\n        };\n      });\n      logger.error([...message]);\n      throw new BadRequestException(...message);\n    }\n\n    return await execute(instance, ref);\n  }\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { evolutionController } from '@api/server.module';\nimport { ConfigService } from '@config/env.config';\nimport { Router } from 'express';\n\nexport class EvolutionRouter extends RouterBroker {\n  constructor(readonly configService: ConfigService) {\n    super();\n    this.router.post(this.routerPath('webhook/evolution', false), async (req, res) => {\n      const { body } = req;\n      const response = await evolutionController.receiveWebhook(body);\n\n      return res.status(200).json(response);\n    });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { metaController } from '@api/server.module';\nimport { ConfigService, WaBusiness } from '@config/env.config';\nimport { Router } from 'express';\n\nexport class MetaRouter extends RouterBroker {\n  constructor(readonly configService: ConfigService) {\n    super();\n    this.router\n      .get(this.routerPath('webhook/meta', false), async (req, res) => {\n        if (req.query['hub.verify_token'] === configService.get<WaBusiness>('WA_BUSINESS').TOKEN_WEBHOOK)\n          res.send(req.query['hub.challenge']);\n        else res.send('Error, wrong validation token');\n      })\n      .post(this.routerPath('webhook/meta', false), async (req, res) => {\n        const { body } = req;\n        const response = await metaController.receiveWebhook(body);\n\n        return res.status(200).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { Constructor } from '@api/integrations/integration.dto';\n\nexport class ChatwootDto {\n  enabled?: boolean;\n  accountId?: string;\n  token?: string;\n  url?: string;\n  nameInbox?: string;\n  signMsg?: boolean;\n  signDelimiter?: string;\n  number?: string;\n  reopenConversation?: boolean;\n  conversationPending?: boolean;\n  mergeBrazilContacts?: boolean;\n  importContacts?: boolean;\n  importMessages?: boolean;\n  daysLimitImportMessages?: number;\n  autoCreate?: boolean;\n  organization?: string;\n  logo?: string;\n  ignoreJids?: string[];\n}\n\nexport function ChatwootInstanceMixin<TBase extends Constructor>(Base: TBase) {\n  return class extends Base {\n    chatwootAccountId?: string;\n    chatwootToken?: string;\n    chatwootUrl?: string;\n    chatwootSignMsg?: boolean;\n    chatwootReopenConversation?: boolean;\n    chatwootConversationPending?: boolean;\n    chatwootMergeBrazilContacts?: boolean;\n    chatwootImportContacts?: boolean;\n    chatwootImportMessages?: boolean;\n    chatwootDaysLimitImportMessages?: number;\n    chatwootNameInbox?: string;\n    chatwootOrganization?: string;\n    chatwootLogo?: string;\n    chatwootAutoCreate?: boolean;\n  };\n}\n","import { Constructor } from '@api/integrations/integration.dto';\nimport { JsonValue } from '@prisma/client/runtime/library';\n\nexport class EventDto {\n  webhook?: {\n    enabled?: boolean;\n    events?: string[];\n    url?: string;\n    headers?: JsonValue;\n    byEvents?: boolean;\n    base64?: boolean;\n  };\n\n  websocket?: {\n    enabled?: boolean;\n    events?: string[];\n  };\n\n  sqs?: {\n    enabled?: boolean;\n    events?: string[];\n  };\n\n  rabbitmq?: {\n    enabled?: boolean;\n    events?: string[];\n  };\n\n  nats?: {\n    enabled?: boolean;\n    events?: string[];\n  };\n\n  pusher?: {\n    enabled?: boolean;\n    appId?: string;\n    key?: string;\n    secret?: string;\n    cluster?: string;\n    useTLS?: boolean;\n    events?: string[];\n  };\n\n  kafka?: {\n    enabled?: boolean;\n    events?: string[];\n  };\n}\n\nexport function EventInstanceMixin<TBase extends Constructor>(Base: TBase) {\n  return class extends Base {\n    webhook?: {\n      enabled?: boolean;\n      events?: string[];\n      headers?: JsonValue;\n      url?: string;\n      byEvents?: boolean;\n      base64?: boolean;\n    };\n\n    websocket?: {\n      enabled?: boolean;\n      events?: string[];\n    };\n\n    sqs?: {\n      enabled?: boolean;\n      events?: string[];\n    };\n\n    rabbitmq?: {\n      enabled?: boolean;\n      events?: string[];\n    };\n\n    nats?: {\n      enabled?: boolean;\n      events?: string[];\n    };\n\n    pusher?: {\n      enabled?: boolean;\n      appId?: string;\n      key?: string;\n      secret?: string;\n      cluster?: string;\n      useTLS?: boolean;\n      events?: string[];\n    };\n\n    kafka?: {\n      enabled?: boolean;\n      events?: string[];\n    };\n  };\n}\n","import { ChatwootInstanceMixin } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { EventInstanceMixin } from '@api/integrations/event/event.dto';\n\nexport type Constructor<T = {}> = new (...args: any[]) => T;\n\nexport class IntegrationDto extends EventInstanceMixin(ChatwootInstanceMixin(class {})) {}\n","import { IntegrationDto } from '@api/integrations/integration.dto';\nimport { JsonValue } from '@prisma/client/runtime/library';\nimport { WAPresence } from 'baileys';\n\nexport class InstanceDto extends IntegrationDto {\n  instanceName: string;\n  instanceId?: string;\n  qrcode?: boolean;\n  businessId?: string;\n  number?: string;\n  integration?: string;\n  token?: string;\n  status?: string;\n  ownerJid?: string;\n  connectionStatus?: string;\n  profileName?: string;\n  profilePicUrl?: string;\n  // settings\n  rejectCall?: boolean;\n  msgCall?: string;\n  groupsIgnore?: boolean;\n  alwaysOnline?: boolean;\n  readMessages?: boolean;\n  readStatus?: boolean;\n  syncFullHistory?: boolean;\n  wavoipToken?: string;\n  // proxy\n  proxyHost?: string;\n  proxyPort?: string;\n  proxyProtocol?: string;\n  proxyUsername?: string;\n  proxyPassword?: string;\n  webhook?: {\n    enabled?: boolean;\n    events?: string[];\n    headers?: JsonValue;\n    url?: string;\n    byEvents?: boolean;\n    base64?: boolean;\n  };\n  chatwootAccountId?: string;\n  chatwootConversationPending?: boolean;\n  chatwootAutoCreate?: boolean;\n  chatwootDaysLimitImportMessages?: number;\n  chatwootImportContacts?: boolean;\n  chatwootImportMessages?: boolean;\n  chatwootLogo?: string;\n  chatwootMergeBrazilContacts?: boolean;\n  chatwootNameInbox?: string;\n  chatwootOrganization?: string;\n  chatwootReopenConversation?: boolean;\n  chatwootSignMsg?: boolean;\n  chatwootToken?: string;\n  chatwootUrl?: string;\n}\n\nexport class SetPresenceDto {\n  presence: WAPresence;\n}\n","import { Integration } from '@api/types/wa.types';\nimport { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const instanceSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    // Instance\n    instanceName: { type: 'string' },\n    token: { type: 'string' },\n    number: { type: 'string', pattern: '^\\\\d+[\\\\.@\\\\w-]+' },\n    businessId: { type: 'string' },\n    qrcode: { type: 'boolean' },\n    Integration: {\n      type: 'string',\n      enum: Object.values(Integration),\n    },\n    // Settings\n    rejectCall: { type: 'boolean' },\n    msgCall: { type: 'string' },\n    groupsIgnore: { type: 'boolean' },\n    alwaysOnline: { type: 'boolean' },\n    readMessages: { type: 'boolean' },\n    readStatus: { type: 'boolean' },\n    syncFullHistory: { type: 'boolean' },\n    wavoipToken: { type: 'string' },\n    // Proxy\n    proxyHost: { type: 'string' },\n    proxyPort: { type: 'string' },\n    proxyProtocol: { type: 'string' },\n    proxyUsername: { type: 'string' },\n    proxyPassword: { type: 'string' },\n    // Webhook\n    webhookUrl: { type: 'string' },\n    webhookByEvents: { type: 'boolean' },\n    webhookBase64: { type: 'boolean' },\n    webhookEvents: {\n      type: 'array',\n      minItems: 0,\n      items: {\n        type: 'string',\n        enum: [\n          'APPLICATION_STARTUP',\n          'QRCODE_UPDATED',\n          'MESSAGES_SET',\n          'MESSAGES_UPSERT',\n          'MESSAGES_EDITED',\n          'MESSAGES_UPDATE',\n          'MESSAGES_DELETE',\n          'SEND_MESSAGE',\n          'SEND_MESSAGE_UPDATE',\n          'CONTACTS_SET',\n          'CONTACTS_UPSERT',\n          'CONTACTS_UPDATE',\n          'PRESENCE_UPDATE',\n          'CHATS_SET',\n          'CHATS_UPSERT',\n          'CHATS_UPDATE',\n          'CHATS_DELETE',\n          'GROUPS_UPSERT',\n          'GROUP_UPDATE',\n          'GROUP_PARTICIPANTS_UPDATE',\n          'CONNECTION_UPDATE',\n          'LABELS_EDIT',\n          'LABELS_ASSOCIATION',\n          'CALL',\n          'TYPEBOT_START',\n          'TYPEBOT_CHANGE_STATUS',\n        ],\n      },\n    },\n    // RabbitMQ\n    rabbitmqEnabled: { type: 'boolean' },\n    rabbitmqEvents: {\n      type: 'array',\n      minItems: 0,\n      items: {\n        type: 'string',\n        enum: [\n          'APPLICATION_STARTUP',\n          'QRCODE_UPDATED',\n          'MESSAGES_SET',\n          'MESSAGES_UPSERT',\n          'MESSAGES_EDITED',\n          'MESSAGES_UPDATE',\n          'MESSAGES_DELETE',\n          'SEND_MESSAGE',\n          'SEND_MESSAGE_UPDATE',\n          'CONTACTS_SET',\n          'CONTACTS_UPSERT',\n          'CONTACTS_UPDATE',\n          'PRESENCE_UPDATE',\n          'CHATS_SET',\n          'CHATS_UPSERT',\n          'CHATS_UPDATE',\n          'CHATS_DELETE',\n          'GROUPS_UPSERT',\n          'GROUP_UPDATE',\n          'GROUP_PARTICIPANTS_UPDATE',\n          'CONNECTION_UPDATE',\n          'LABELS_EDIT',\n          'LABELS_ASSOCIATION',\n          'CALL',\n          'TYPEBOT_START',\n          'TYPEBOT_CHANGE_STATUS',\n        ],\n      },\n    },\n    // NATS\n    natsEnabled: { type: 'boolean' },\n    natsEvents: {\n      type: 'array',\n      minItems: 0,\n      items: {\n        type: 'string',\n        enum: [\n          'APPLICATION_STARTUP',\n          'QRCODE_UPDATED',\n          'MESSAGES_SET',\n          'MESSAGES_UPSERT',\n          'MESSAGES_EDITED',\n          'MESSAGES_UPDATE',\n          'MESSAGES_DELETE',\n          'SEND_MESSAGE',\n          'SEND_MESSAGE_UPDATE',\n          'CONTACTS_SET',\n          'CONTACTS_UPSERT',\n          'CONTACTS_UPDATE',\n          'PRESENCE_UPDATE',\n          'CHATS_SET',\n          'CHATS_UPSERT',\n          'CHATS_UPDATE',\n          'CHATS_DELETE',\n          'GROUPS_UPSERT',\n          'GROUP_UPDATE',\n          'GROUP_PARTICIPANTS_UPDATE',\n          'CONNECTION_UPDATE',\n          'LABELS_EDIT',\n          'LABELS_ASSOCIATION',\n          'CALL',\n          'TYPEBOT_START',\n          'TYPEBOT_CHANGE_STATUS',\n        ],\n      },\n    },\n    // SQS\n    sqsEnabled: { type: 'boolean' },\n    sqsEvents: {\n      type: 'array',\n      minItems: 0,\n      items: {\n        type: 'string',\n        enum: [\n          'APPLICATION_STARTUP',\n          'QRCODE_UPDATED',\n          'MESSAGES_SET',\n          'MESSAGES_UPSERT',\n          'MESSAGES_EDITED',\n          'MESSAGES_UPDATE',\n          'MESSAGES_DELETE',\n          'SEND_MESSAGE',\n          'SEND_MESSAGE_UPDATE',\n          'CONTACTS_SET',\n          'CONTACTS_UPSERT',\n          'CONTACTS_UPDATE',\n          'PRESENCE_UPDATE',\n          'CHATS_SET',\n          'CHATS_UPSERT',\n          'CHATS_UPDATE',\n          'CHATS_DELETE',\n          'GROUPS_UPSERT',\n          'GROUP_UPDATE',\n          'GROUP_PARTICIPANTS_UPDATE',\n          'CONNECTION_UPDATE',\n          'LABELS_EDIT',\n          'LABELS_ASSOCIATION',\n          'CALL',\n          'TYPEBOT_START',\n          'TYPEBOT_CHANGE_STATUS',\n        ],\n      },\n    },\n    // Chatwoot\n    chatwootAccountId: { type: 'string' },\n    chatwootToken: { type: 'string' },\n    chatwootUrl: { type: 'string' },\n    chatwootSignMsg: { type: 'boolean' },\n    chatwootReopenConversation: { type: 'boolean' },\n    chatwootConversationPending: { type: 'boolean' },\n    chatwootImportContacts: { type: 'boolean' },\n    chatwootNameInbox: { type: 'string' },\n    chatwootMergeBrazilContacts: { type: 'boolean' },\n    chatwootImportMessages: { type: 'boolean' },\n    chatwootDaysLimitImportMessages: { type: 'number' },\n  },\n  ...isNotEmpty('instanceName'),\n};\n\nexport const presenceOnlySchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    presence: {\n      type: 'string',\n      enum: ['unavailable', 'available', 'composing', 'recording', 'paused'],\n    },\n  },\n  required: ['presence'],\n};\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { baileysController } from '@api/server.module';\nimport { instanceSchema } from '@validate/instance.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class BaileysRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('onWhatsapp'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.onWhatsapp(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('profilePictureUrl'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.profilePictureUrl(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('assertSessions'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.assertSessions(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('createParticipantNodes'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.createParticipantNodes(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('getUSyncDevices'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.getUSyncDevices(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('generateMessageTag'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.generateMessageTag(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('sendNode'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.sendNode(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('signalRepositoryDecryptMessage'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.signalRepositoryDecryptMessage(instance, req.body),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('getAuthState'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => baileysController.getAuthState(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { JSONSchema7 } from 'json-schema';\n\nexport const catalogSchema: JSONSchema7 = {\n  type: 'object',\n  properties: {\n    number: { type: 'string' },\n    limit: { type: 'number' },\n  },\n};\n\nexport const collectionsSchema: JSONSchema7 = {\n  type: 'object',\n  properties: {\n    number: { type: 'string' },\n    limit: { type: 'number' },\n  },\n};\n","import { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nconst numberDefinition: JSONSchema7Definition = {\n  type: 'string',\n  description: 'Invalid format',\n};\n\nexport const whatsappNumberSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    numbers: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        description: '\"numbers\" must be an array of numeric strings',\n      },\n    },\n  },\n};\n\nexport const readMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    readMessages: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        properties: {\n          id: { type: 'string' },\n          fromMe: { type: 'boolean', enum: [true, false] },\n          remoteJid: { type: 'string' },\n        },\n        required: ['id', 'fromMe', 'remoteJid'],\n        ...isNotEmpty('id', 'remoteJid'),\n      },\n    },\n  },\n  required: ['readMessages'],\n};\n\nexport const archiveChatSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    chat: { type: 'string' },\n    lastMessage: {\n      type: 'object',\n      properties: {\n        key: {\n          type: 'object',\n          properties: {\n            id: { type: 'string' },\n            remoteJid: { type: 'string' },\n            fromMe: { type: 'boolean', enum: [true, false] },\n          },\n          required: ['id', 'fromMe', 'remoteJid'],\n          ...isNotEmpty('id', 'remoteJid'),\n        },\n        messageTimestamp: { type: 'integer', minLength: 1 },\n      },\n      required: ['key'],\n      ...isNotEmpty('messageTimestamp'),\n    },\n    archive: { type: 'boolean', enum: [true, false] },\n  },\n  required: ['archive'],\n};\n\nexport const markChatUnreadSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    chat: { type: 'string' },\n    lastMessage: {\n      type: 'object',\n      properties: {\n        key: {\n          type: 'object',\n          properties: {\n            id: { type: 'string' },\n            remoteJid: { type: 'string' },\n            fromMe: { type: 'boolean', enum: [true, false] },\n          },\n          required: ['id', 'fromMe', 'remoteJid'],\n          ...isNotEmpty('id', 'remoteJid'),\n        },\n        messageTimestamp: { type: 'integer', minLength: 1 },\n      },\n      required: ['key'],\n      ...isNotEmpty('messageTimestamp'),\n    },\n  },\n  required: ['lastMessage'],\n};\n\nexport const deleteMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    id: { type: 'string' },\n    fromMe: { type: 'boolean', enum: [true, false] },\n    remoteJid: { type: 'string' },\n    participant: { type: 'string' },\n  },\n  required: ['id', 'fromMe', 'remoteJid'],\n  ...isNotEmpty('id', 'remoteJid', 'participant'),\n};\n\nexport const profilePictureSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { type: 'string' },\n    picture: { type: 'string' },\n  },\n};\n\nexport const updateMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { type: 'string' },\n    text: { type: 'string' },\n    key: {\n      type: 'object',\n      properties: {\n        id: { type: 'string' },\n        remoteJid: { type: 'string' },\n        fromMe: { type: 'boolean', enum: [true, false] },\n      },\n      required: ['id', 'fromMe', 'remoteJid'],\n      ...isNotEmpty('id', 'remoteJid'),\n    },\n  },\n  ...isNotEmpty('number', 'text', 'key'),\n};\n\nexport const presenceSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    delay: { type: 'number' },\n    presence: {\n      type: 'string',\n      enum: ['unavailable', 'available', 'composing', 'recording', 'paused'],\n    },\n  },\n  required: ['number', 'presence', 'delay'],\n};\n\nexport const blockUserSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { type: 'string' },\n    status: { type: 'string', enum: ['block', 'unblock'] },\n  },\n  required: ['number', 'status'],\n  ...isNotEmpty('number', 'status'),\n};\n\nexport const contactValidateSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    where: {\n      type: 'object',\n      properties: {\n        _id: { type: 'string', minLength: 1 },\n        pushName: { type: 'string', minLength: 1 },\n        id: { type: 'string', minLength: 1 },\n        remoteJid: { type: 'string', minLength: 1 },\n      },\n      ...isNotEmpty('_id', 'id', 'pushName', 'remoteJid'),\n    },\n  },\n};\n\nexport const messageValidateSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    where: {\n      type: 'object',\n      properties: {\n        _id: { type: 'string', minLength: 1 },\n        key: {\n          type: 'object',\n          if: {\n            propertyNames: {\n              enum: ['fromMe', 'remoteJid', 'id'],\n            },\n          },\n          then: {\n            properties: {\n              remoteJid: {\n                type: 'string',\n                minLength: 1,\n                description: 'The property cannot be empty',\n              },\n              id: {\n                type: 'string',\n                minLength: 1,\n                description: 'The property cannot be empty',\n              },\n              fromMe: { type: 'boolean', enum: [true, false] },\n            },\n          },\n        },\n        message: { type: 'object' },\n      },\n      ...isNotEmpty('_id'),\n    },\n    limit: { type: 'integer' },\n  },\n};\n\nexport const messageUpSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    where: {\n      type: 'object',\n      properties: {\n        _id: { type: 'string' },\n        remoteJid: { type: 'string' },\n        id: { type: 'string' },\n        fromMe: { type: 'boolean', enum: [true, false] },\n        participant: { type: 'string' },\n        status: {\n          type: 'string',\n          enum: ['ERROR', 'PENDING', 'SERVER_ACK', 'DELIVERY_ACK', 'READ', 'PLAYED'],\n        },\n      },\n      ...isNotEmpty('_id', 'remoteJid', 'id', 'status'),\n    },\n    limit: { type: 'integer' },\n  },\n};\n\nexport const privacySettingsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    readreceipts: { type: 'string', enum: ['all', 'none'] },\n    profile: {\n      type: 'string',\n      enum: ['all', 'contacts', 'contact_blacklist', 'none'],\n    },\n    status: {\n      type: 'string',\n      enum: ['all', 'contacts', 'contact_blacklist', 'none'],\n    },\n    online: { type: 'string', enum: ['all', 'match_last_seen'] },\n    last: { type: 'string', enum: ['all', 'contacts', 'contact_blacklist', 'none'] },\n    groupadd: {\n      type: 'string',\n      enum: ['all', 'contacts', 'contact_blacklist', 'none'],\n    },\n  },\n  required: ['readreceipts', 'profile', 'status', 'online', 'last', 'groupadd'],\n  ...isNotEmpty('readreceipts', 'profile', 'status', 'online', 'last', 'groupadd'),\n};\n\nexport const profileNameSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    name: { type: 'string' },\n  },\n  ...isNotEmpty('name'),\n};\n\nexport const profileStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    status: { type: 'string' },\n  },\n  ...isNotEmpty('status'),\n};\n\nexport const profileSchema: JSONSchema7 = {\n  type: 'object',\n  properties: {\n    wuid: { type: 'string' },\n    name: { type: 'string' },\n    picture: { type: 'string' },\n    status: { type: 'string' },\n    isBusiness: { type: 'boolean' },\n  },\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const createGroupSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    subject: { type: 'string' },\n    description: { type: 'string' },\n    profilePicture: { type: 'string' },\n    promoteParticipants: { type: 'boolean', enum: [true, false] },\n    participants: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        minLength: 10,\n        pattern: '\\\\d+',\n        description: '\"participants\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['subject', 'participants'],\n  ...isNotEmpty('subject', 'description', 'profilePicture'),\n};\n\nexport const groupJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string', pattern: '^[\\\\d-]+@g.us$' },\n  },\n  required: ['groupJid'],\n  ...isNotEmpty('groupJid'),\n};\n\nexport const getParticipantsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    getParticipants: { type: 'string', enum: ['true', 'false'] },\n  },\n  required: ['getParticipants'],\n  ...isNotEmpty('getParticipants'),\n};\n\nexport const groupSendInviteSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    description: { type: 'string' },\n    numbers: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        minLength: 10,\n        pattern: '\\\\d+',\n        description: '\"numbers\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['groupJid', 'description', 'numbers'],\n  ...isNotEmpty('groupJid', 'description', 'numbers'),\n};\n\nexport const groupInviteSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    inviteCode: { type: 'string', pattern: '^[a-zA-Z0-9]{22}$' },\n  },\n  required: ['inviteCode'],\n  ...isNotEmpty('inviteCode'),\n};\n\nexport const AcceptGroupInviteSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    inviteCode: { type: 'string', pattern: '^[a-zA-Z0-9]{22}$' },\n  },\n  required: ['inviteCode'],\n  ...isNotEmpty('inviteCode'),\n};\n\nexport const updateParticipantsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    action: {\n      type: 'string',\n      enum: ['add', 'remove', 'promote', 'demote'],\n    },\n    participants: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        minLength: 10,\n        pattern: '\\\\d+',\n        description: '\"participants\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['groupJid', 'action', 'participants'],\n  ...isNotEmpty('groupJid', 'action'),\n};\n\nexport const updateSettingsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    action: {\n      type: 'string',\n      enum: ['announcement', 'not_announcement', 'locked', 'unlocked'],\n    },\n  },\n  required: ['groupJid', 'action'],\n  ...isNotEmpty('groupJid', 'action'),\n};\n\nexport const toggleEphemeralSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    expiration: {\n      type: 'number',\n      enum: [0, 86400, 604800, 7776000],\n    },\n  },\n  required: ['groupJid', 'expiration'],\n  ...isNotEmpty('groupJid', 'expiration'),\n};\n\nexport const updateGroupPictureSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    image: { type: 'string' },\n  },\n  required: ['groupJid', 'image'],\n  ...isNotEmpty('groupJid', 'image'),\n};\n\nexport const updateGroupSubjectSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    subject: { type: 'string' },\n  },\n  required: ['groupJid', 'subject'],\n  ...isNotEmpty('groupJid', 'subject'),\n};\n\nexport const updateGroupDescriptionSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    groupJid: { type: 'string' },\n    description: { type: 'string' },\n  },\n  required: ['groupJid', 'description'],\n  ...isNotEmpty('groupJid', 'description'),\n};\n","import { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nconst numberDefinition: JSONSchema7Definition = {\n  type: 'string',\n  description: 'Invalid format',\n};\n\nexport const handleLabelSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    labelId: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['number', 'labelId', 'action'],\n  ...isNotEmpty('number', 'labelId', 'action'),\n};\n","import { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nconst numberDefinition: JSONSchema7Definition = {\n  type: 'string',\n  description: 'Invalid format',\n};\n\nexport const templateMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    name: { type: 'string' },\n    language: { type: 'string' },\n    components: { type: 'array' },\n    webhookUrl: { type: 'string' },\n  },\n  required: ['name', 'language'],\n};\n\nconst quotedOptionsSchema: JSONSchema7 = {\n  properties: {\n    key: {\n      type: 'object',\n      properties: {\n        id: { type: 'string' },\n        remoteJid: { type: 'string' },\n        fromMe: { type: 'boolean', enum: [true, false] },\n      },\n      required: ['id'],\n      ...isNotEmpty('id'),\n    },\n    message: { type: 'object' },\n  },\n};\n\nexport const offerCallSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    isVideo: { type: 'boolean', enum: [true, false] },\n    callDuration: { type: 'integer', minimum: 1, maximum: 15 },\n  },\n  required: ['number', 'callDuration'],\n};\n\nexport const textMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    text: { type: 'string' },\n    linkPreview: { type: 'boolean' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number', 'text'],\n};\n\nexport const mediaMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    mediatype: { type: 'string', enum: ['image', 'document', 'video', 'audio'] },\n    mimetype: { type: 'string' },\n    media: { type: 'string' },\n    fileName: { type: 'string' },\n    caption: { type: 'string' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number', 'mediatype'],\n};\n\nexport const ptvMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    video: { type: 'string' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number'],\n};\n\nexport const audioMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    audio: { type: 'string' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number'],\n};\n\nexport const statusMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    type: { type: 'string', enum: ['text', 'image', 'audio', 'video'] },\n    content: { type: 'string' },\n    caption: { type: 'string' },\n    backgroundColor: { type: 'string' },\n    font: { type: 'integer', minimum: 0, maximum: 5 },\n    statusJidList: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"statusJidList\" must be an array of numeric strings',\n      },\n    },\n    allContacts: { type: 'boolean', enum: [true, false] },\n  },\n  required: ['type'],\n};\n\nexport const stickerMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    sticker: { type: 'string' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number'],\n};\n\nexport const locationMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    latitude: { type: 'number' },\n    longitude: { type: 'number' },\n    name: { type: 'string' },\n    address: { type: 'string' },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number', 'latitude', 'longitude', 'name', 'address'],\n};\n\nexport const contactMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    contact: {\n      type: 'array',\n      items: {\n        type: 'object',\n        properties: {\n          fullName: { type: 'string' },\n          wuid: {\n            type: 'string',\n            minLength: 10,\n            pattern: '\\\\d+',\n            description: '\"wuid\" must be a numeric string',\n          },\n          phoneNumber: { type: 'string', minLength: 10 },\n          organization: { type: 'string' },\n          email: { type: 'string' },\n          url: { type: 'string' },\n        },\n        required: ['fullName', 'phoneNumber'],\n        ...isNotEmpty('fullName'),\n      },\n      minItems: 1,\n      uniqueItems: true,\n    },\n  },\n  required: ['number', 'contact'],\n};\n\nexport const reactionMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    key: {\n      type: 'object',\n      properties: {\n        id: { type: 'string' },\n        remoteJid: { type: 'string' },\n        fromMe: { type: 'boolean', enum: [true, false] },\n      },\n      required: ['id', 'remoteJid', 'fromMe'],\n      ...isNotEmpty('id', 'remoteJid'),\n    },\n    reaction: { type: 'string' },\n  },\n  required: ['key', 'reaction'],\n};\n\nexport const pollMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    name: { type: 'string' },\n    selectableCount: { type: 'integer', minimum: 0, maximum: 10 },\n    values: {\n      type: 'array',\n      minItems: 2,\n      maxItems: 10,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n      },\n    },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number', 'name', 'selectableCount', 'values'],\n};\n\nexport const listMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    title: { type: 'string' },\n    description: { type: 'string' },\n    footerText: { type: 'string' },\n    buttonText: { type: 'string' },\n    sections: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'object',\n        properties: {\n          title: { type: 'string' },\n          rows: {\n            type: 'array',\n            minItems: 1,\n            uniqueItems: true,\n            items: {\n              type: 'object',\n              properties: {\n                title: { type: 'string' },\n                description: { type: 'string' },\n                rowId: { type: 'string' },\n              },\n              required: ['title', 'rowId'],\n              ...isNotEmpty('title', 'description', 'rowId'),\n            },\n          },\n        },\n        required: ['title', 'rows'],\n        ...isNotEmpty('title'),\n      },\n    },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number', 'title', 'footerText', 'buttonText', 'sections'],\n};\n\nexport const buttonsMessageSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    number: { ...numberDefinition },\n    thumbnailUrl: { type: 'string' },\n    title: { type: 'string' },\n    description: { type: 'string' },\n    footer: { type: 'string' },\n    buttons: {\n      type: 'array',\n      items: {\n        type: 'object',\n        properties: {\n          type: {\n            type: 'string',\n            enum: ['reply', 'copy', 'url', 'call', 'pix'],\n          },\n          displayText: { type: 'string' },\n          id: { type: 'string' },\n          url: { type: 'string' },\n          phoneNumber: { type: 'string' },\n          currency: { type: 'string' },\n          name: { type: 'string' },\n          keyType: { type: 'string', enum: ['phone', 'email', 'cpf', 'cnpj', 'random'] },\n          key: { type: 'string' },\n        },\n        required: ['type'],\n        ...isNotEmpty('id', 'url', 'phoneNumber'),\n      },\n    },\n    delay: {\n      type: 'integer',\n      description: 'Enter a value in milliseconds',\n    },\n    quoted: { ...quotedOptionsSchema },\n    everyOne: { type: 'boolean', enum: [true, false] },\n    mentioned: {\n      type: 'array',\n      minItems: 1,\n      uniqueItems: true,\n      items: {\n        type: 'string',\n        pattern: '^\\\\d+',\n        description: '\"mentioned\" must be an array of numeric strings',\n      },\n    },\n  },\n  required: ['number'],\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const proxySchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean', enum: [true, false] },\n    host: { type: 'string' },\n    port: { type: 'string' },\n    protocol: { type: 'string' },\n    username: { type: 'string' },\n    password: { type: 'string' },\n  },\n  required: ['enabled', 'host', 'port', 'protocol'],\n  ...isNotEmpty('enabled', 'host', 'port', 'protocol'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const settingsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    rejectCall: { type: 'boolean' },\n    msgCall: { type: 'string' },\n    groupsIgnore: { type: 'boolean' },\n    alwaysOnline: { type: 'boolean' },\n    readMessages: { type: 'boolean' },\n    readStatus: { type: 'boolean' },\n    syncFullHistory: { type: 'boolean' },\n    wavoipToken: { type: 'string' },\n  },\n  required: ['rejectCall', 'groupsIgnore', 'alwaysOnline', 'readMessages', 'readStatus', 'syncFullHistory'],\n  ...isNotEmpty('rejectCall', 'groupsIgnore', 'alwaysOnline', 'readMessages', 'readStatus', 'syncFullHistory'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const templateSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    name: { type: 'string' },\n    category: { type: 'string', enum: ['AUTHENTICATION', 'MARKETING', 'UTILITY'] },\n    allowCategoryChange: { type: 'boolean' },\n    language: { type: 'string' },\n    components: { type: 'array' },\n    webhookUrl: { type: 'string' },\n  },\n  required: ['name', 'category', 'language', 'components'],\n  ...isNotEmpty('name', 'category', 'language', 'components'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties: Record<string, unknown> = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  } as JSONSchema7;\n};\n\nexport const templateDeleteSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    name: { type: 'string' },\n    hsmId: { type: 'string' },\n  },\n  required: ['name'],\n  ...isNotEmpty('name'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties: Record<string, unknown> = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  } as JSONSchema7;\n};\n\nexport const templateEditSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    templateId: { type: 'string' },\n    category: { type: 'string', enum: ['AUTHENTICATION', 'MARKETING', 'UTILITY'] },\n    allowCategoryChange: { type: 'boolean' },\n    ttl: { type: 'number' },\n    components: { type: 'array' },\n  },\n  required: ['templateId'],\n  ...isNotEmpty('templateId'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const chatwootSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean', enum: [true, false] },\n    accountId: { type: 'string' },\n    token: { type: 'string' },\n    url: { type: 'string' },\n    signMsg: { type: 'boolean', enum: [true, false] },\n    signDelimiter: { type: ['string', 'null'] },\n    nameInbox: { type: ['string', 'null'] },\n    reopenConversation: { type: 'boolean', enum: [true, false] },\n    conversationPending: { type: 'boolean', enum: [true, false] },\n    autoCreate: { type: 'boolean', enum: [true, false] },\n    importContacts: { type: 'boolean', enum: [true, false] },\n    mergeBrazilContacts: { type: 'boolean', enum: [true, false] },\n    importMessages: { type: 'boolean', enum: [true, false] },\n    daysLimitImportMessages: { type: 'number' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n  },\n  required: ['enabled', 'accountId', 'token', 'url', 'signMsg', 'reopenConversation', 'conversationPending'],\n  ...isNotEmpty('enabled', 'accountId', 'token', 'url', 'signMsg', 'reopenConversation', 'conversationPending'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const difySchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    botType: { type: 'string', enum: ['chatBot', 'textGenerator', 'agent', 'workflow'] },\n    apiUrl: { type: 'string' },\n    apiKey: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: ['enabled', 'botType', 'triggerType'],\n  ...isNotEmpty('enabled', 'botType', 'triggerType'),\n};\n\nexport const difyStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const difySettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    difyIdFallback: { type: 'string' },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: [\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ],\n  ...isNotEmpty(\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ),\n};\n\nexport const difyIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const evoaiSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    agentUrl: { type: 'string' },\n    apiKey: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: ['enabled', 'agentUrl', 'triggerType'],\n  ...isNotEmpty('enabled', 'agentUrl', 'triggerType'),\n};\n\nexport const evoaiStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const evoaiSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    botIdFallback: { type: 'string' },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: [\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ],\n  ...isNotEmpty(\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ),\n};\n\nexport const evoaiIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const evolutionBotSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    apiUrl: { type: 'string' },\n    apiKey: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: ['enabled', 'apiUrl', 'triggerType'],\n  ...isNotEmpty('enabled', 'apiUrl', 'triggerType'),\n};\n\nexport const evolutionBotStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const evolutionBotSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    botIdFallback: { type: 'string' },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: [\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ],\n  ...isNotEmpty(\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ),\n};\n\nexport const evolutionBotIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const flowiseSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    apiUrl: { type: 'string' },\n    apiKey: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: ['enabled', 'apiUrl', 'triggerType'],\n  ...isNotEmpty('enabled', 'apiUrl', 'triggerType'),\n};\n\nexport const flowiseStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const flowiseSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    flowiseIdFallback: { type: 'string' },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: [\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n  ],\n  ...isNotEmpty(\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n  ),\n};\n\nexport const flowiseIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const n8nSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    webhookUrl: { type: 'string' },\n    basicAuthUser: { type: 'string' },\n    basicAuthPassword: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: ['enabled', 'webhookUrl', 'triggerType'],\n  ...isNotEmpty('enabled', 'webhookUrl', 'triggerType'),\n};\n\nexport const n8nStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const n8nSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    botIdFallback: { type: 'string' },\n    splitMessages: { type: 'boolean' },\n    timePerChar: { type: 'integer' },\n  },\n  required: [\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ],\n  ...isNotEmpty(\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n    'splitMessages',\n    'timePerChar',\n  ),\n};\n\nexport const n8nIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const openaiSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    openaiCredsId: { type: 'string' },\n    botType: { type: 'string', enum: ['assistant', 'chatCompletion'] },\n    assistantId: { type: 'string' },\n    functionUrl: { type: 'string' },\n    model: { type: 'string' },\n    systemMessages: { type: 'array', items: { type: 'string' } },\n    assistantMessages: { type: 'array', items: { type: 'string' } },\n    userMessages: { type: 'array', items: { type: 'string' } },\n    maxTokens: { type: 'integer' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n  },\n  required: ['enabled', 'openaiCredsId', 'botType', 'triggerType'],\n  ...isNotEmpty('enabled', 'openaiCredsId', 'botType', 'triggerType'),\n};\n\nexport const openaiCredsSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    name: { type: 'string' },\n    apiKey: { type: 'string' },\n  },\n  required: ['name', 'apiKey'],\n  ...isNotEmpty('name', 'apiKey'),\n};\n\nexport const openaiStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const openaiSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    openaiCredsId: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    speechToText: { type: 'boolean' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n    openaiIdFallback: { type: 'string' },\n  },\n  required: [\n    'openaiCredsId',\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n  ],\n  ...isNotEmpty(\n    'openaiCredsId',\n    'expire',\n    'keywordFinish',\n    'delayMessage',\n    'unknownMessage',\n    'listeningFromMe',\n    'stopBotFromMe',\n    'keepOpen',\n    'debounceTime',\n    'ignoreJids',\n  ),\n};\n\nexport const openaiIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const typebotSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    enabled: { type: 'boolean' },\n    description: { type: 'string' },\n    url: { type: 'string' },\n    typebot: { type: 'string' },\n    triggerType: { type: 'string', enum: ['all', 'keyword', 'none', 'advanced'] },\n    triggerOperator: { type: 'string', enum: ['equals', 'contains', 'startsWith', 'endsWith', 'regex'] },\n    triggerValue: { type: 'string' },\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n  },\n  required: ['enabled', 'url', 'typebot', 'triggerType'],\n  ...isNotEmpty('enabled', 'url', 'typebot', 'triggerType'),\n};\n\nexport const typebotStatusSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    status: { type: 'string', enum: ['opened', 'closed', 'paused', 'delete'] },\n  },\n  required: ['remoteJid', 'status'],\n  ...isNotEmpty('remoteJid', 'status'),\n};\n\nexport const typebotStartSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    url: { type: 'string' },\n    typebot: { type: 'string' },\n  },\n  required: ['remoteJid', 'url', 'typebot'],\n  ...isNotEmpty('remoteJid', 'url', 'typebot'),\n};\n\nexport const typebotSettingSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    expire: { type: 'integer' },\n    keywordFinish: { type: 'string' },\n    delayMessage: { type: 'integer' },\n    unknownMessage: { type: 'string' },\n    listeningFromMe: { type: 'boolean' },\n    stopBotFromMe: { type: 'boolean' },\n    keepOpen: { type: 'boolean' },\n    debounceTime: { type: 'integer' },\n    typebotIdFallback: { type: 'string' },\n    ignoreJids: { type: 'array', items: { type: 'string' } },\n  },\n  required: ['expire', 'keywordFinish', 'delayMessage', 'unknownMessage', 'listeningFromMe', 'stopBotFromMe'],\n  ...isNotEmpty('expire', 'keywordFinish', 'delayMessage', 'unknownMessage', 'listeningFromMe', 'stopBotFromMe'),\n};\n\nexport const typebotIgnoreJidSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    remoteJid: { type: 'string' },\n    action: { type: 'string', enum: ['add', 'remove'] },\n  },\n  required: ['remoteJid', 'action'],\n  ...isNotEmpty('remoteJid', 'action'),\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nimport { EventController } from './event.controller';\n\nexport * from '@api/integrations/event/pusher/pusher.schema';\nexport * from '@api/integrations/event/webhook/webhook.schema';\n\nexport const eventSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    websocket: {\n      $ref: '#/$defs/event',\n    },\n    rabbitmq: {\n      $ref: '#/$defs/event',\n    },\n    nats: {\n      $ref: '#/$defs/event',\n    },\n    sqs: {\n      $ref: '#/$defs/event',\n    },\n    kafka: {\n      $ref: '#/$defs/event',\n    },\n  },\n  $defs: {\n    event: {\n      type: 'object',\n      properties: {\n        enabled: { type: 'boolean', enum: [true, false] },\n        events: {\n          type: 'array',\n          minItems: 0,\n          items: {\n            type: 'string',\n            enum: EventController.events,\n          },\n        },\n      },\n      required: ['enabled'],\n    },\n  },\n};\n","import { EventDto } from '@api/integrations/event/event.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { wa } from '@api/types/wa.types';\n\nexport type EmitData = {\n  instanceName: string;\n  origin: string;\n  event: string;\n  data: any;\n  serverUrl: string;\n  dateTime: string;\n  sender: string;\n  apiKey?: string;\n  local?: boolean;\n  integration?: string[];\n  extra?: Record<string, any>;\n};\n\nexport interface EventControllerInterface {\n  set(instanceName: string, data: any): Promise<any>;\n  get(instanceName: string): Promise<any>;\n  emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    local,\n    extra,\n  }: EmitData): Promise<void>;\n}\n\nexport class EventController {\n  public prismaRepository: PrismaRepository;\n  protected waMonitor: WAMonitoringService;\n  private integrationStatus: boolean;\n  private integrationName: string;\n\n  constructor(\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n    integrationStatus: boolean,\n    integrationName: string,\n  ) {\n    this.prisma = prismaRepository;\n    this.monitor = waMonitor;\n    this.status = integrationStatus;\n    this.name = integrationName;\n  }\n\n  public set prisma(prisma: PrismaRepository) {\n    this.prismaRepository = prisma;\n  }\n\n  public get prisma() {\n    return this.prismaRepository;\n  }\n\n  public set monitor(waMonitor: WAMonitoringService) {\n    this.waMonitor = waMonitor;\n  }\n\n  public get monitor() {\n    return this.waMonitor;\n  }\n\n  public set name(name: string) {\n    this.integrationName = name;\n  }\n\n  public get name() {\n    return this.integrationName;\n  }\n\n  public set status(status: boolean) {\n    this.integrationStatus = status;\n  }\n\n  public get status() {\n    return this.integrationStatus;\n  }\n\n  public async set(instanceName: string, data: EventDto): Promise<wa.LocalEvent> {\n    if (!this.status) {\n      return;\n    }\n\n    if (!data[this.name]?.enabled) {\n      data[this.name].events = [];\n    } else {\n      if (0 === data[this.name].events.length) {\n        data[this.name].events = EventController.events;\n      }\n    }\n\n    return this.prisma[this.name].upsert({\n      where: {\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n      update: {\n        enabled: data[this.name]?.enabled,\n        events: data[this.name].events,\n      },\n      create: {\n        enabled: data[this.name]?.enabled,\n        events: data[this.name].events,\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n    });\n  }\n\n  public async get(instanceName: string): Promise<wa.LocalEvent> {\n    if (!this.status) {\n      return;\n    }\n\n    if (undefined === this.monitor.waInstances[instanceName]) {\n      return null;\n    }\n\n    const data = await this.prisma[this.name].findUnique({\n      where: {\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n    });\n\n    if (!data) {\n      return null;\n    }\n\n    return data;\n  }\n\n  public static readonly events = [\n    'APPLICATION_STARTUP',\n    'QRCODE_UPDATED',\n    'MESSAGES_SET',\n    'MESSAGES_UPSERT',\n    'MESSAGES_EDITED',\n    'MESSAGES_UPDATE',\n    'MESSAGES_DELETE',\n    'SEND_MESSAGE',\n    'SEND_MESSAGE_UPDATE',\n    'CONTACTS_SET',\n    'CONTACTS_UPSERT',\n    'CONTACTS_UPDATE',\n    'PRESENCE_UPDATE',\n    'CHATS_SET',\n    'CHATS_UPSERT',\n    'CHATS_UPDATE',\n    'CHATS_DELETE',\n    'GROUPS_UPSERT',\n    'GROUP_UPDATE',\n    'GROUP_PARTICIPANTS_UPDATE',\n    'CONNECTION_UPDATE',\n    'LABELS_EDIT',\n    'LABELS_ASSOCIATION',\n    'CALL',\n    'TYPEBOT_START',\n    'TYPEBOT_CHANGE_STATUS',\n    'REMOVE_INSTANCE',\n    'LOGOUT_INSTANCE',\n    'INSTANCE_CREATE',\n    'INSTANCE_DELETE',\n    'STATUS_INSTANCE',\n  ];\n}\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nimport { EventController } from '../event.controller';\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\nexport const pusherSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    pusher: {\n      type: 'object',\n      properties: {\n        enabled: { type: 'boolean' },\n        appId: { type: 'string' },\n        key: { type: 'string' },\n        secret: { type: 'string' },\n        cluster: { type: 'string' },\n        useTLS: { type: 'boolean' },\n        events: {\n          type: 'array',\n          minItems: 0,\n          items: {\n            type: 'string',\n            enum: EventController.events,\n          },\n        },\n      },\n      required: ['enabled', 'appId', 'key', 'secret', 'cluster', 'useTLS'],\n      ...isNotEmpty('enabled', 'appId', 'key', 'secret', 'cluster', 'useTLS'),\n    },\n  },\n  required: ['pusher'],\n};\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nimport { EventController } from '../event.controller';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const webhookSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    webhook: {\n      type: 'object',\n      properties: {\n        enabled: { type: 'boolean' },\n        url: { type: 'string' },\n        headers: { type: 'object' },\n        byEvents: { type: 'boolean' },\n        base64: { type: 'boolean' },\n        events: {\n          type: 'array',\n          minItems: 0,\n          items: {\n            type: 'string',\n            enum: EventController.events,\n          },\n        },\n      },\n      required: ['enabled', 'url'],\n      ...isNotEmpty('enabled', 'url'),\n    },\n  },\n  required: ['webhook'],\n};\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { chatwootController } from '@api/server.module';\nimport { chatwootSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class ChatwootRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ChatwootDto>({\n          request: req,\n          schema: chatwootSchema,\n          ClassRef: ChatwootDto,\n          execute: (instance, data) => chatwootController.createChatwoot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => chatwootController.findChatwoot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('webhook'), async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => chatwootController.receiveWebhook(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class Session {\n  remoteJid?: string;\n  sessionId?: string;\n  status?: string;\n  createdAt?: number;\n  updateAt?: number;\n}\n\nexport class IgnoreJidDto {\n  remoteJid?: string;\n  action?: string;\n}\n","import { TriggerOperator, TriggerType } from '@prisma/client';\n\n/**\n * Base DTO for all chatbot integrations\n * Contains common properties shared by all chatbot types\n */\nexport class BaseChatbotDto {\n  enabled?: boolean;\n  description: string;\n  expire?: number;\n  keywordFinish?: string;\n  delayMessage?: number;\n  unknownMessage?: string;\n  listeningFromMe?: boolean;\n  stopBotFromMe?: boolean;\n  keepOpen?: boolean;\n  debounceTime?: number;\n  triggerType: TriggerType;\n  triggerOperator?: TriggerOperator;\n  triggerValue?: string;\n  ignoreJids?: string[];\n  splitMessages?: boolean;\n  timePerChar?: number;\n}\n\n/**\n * Base settings DTO for all chatbot integrations\n */\nexport class BaseChatbotSettingDto {\n  expire?: number;\n  keywordFinish?: string;\n  delayMessage?: number;\n  unknownMessage?: string;\n  listeningFromMe?: boolean;\n  stopBotFromMe?: boolean;\n  keepOpen?: boolean;\n  debounceTime?: number;\n  ignoreJids?: any;\n  splitMessages?: boolean;\n  timePerChar?: number;\n  fallbackId?: string; // Unified fallback ID field for all integrations\n}\n","import { $Enums } from '@prisma/client';\n\nimport { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class DifyDto extends BaseChatbotDto {\n  botType?: $Enums.DifyBotType;\n  apiUrl?: string;\n  apiKey?: string;\n}\n\nexport class DifySettingDto extends BaseChatbotSettingDto {\n  difyIdFallback?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { DifyDto, DifySettingDto } from '@api/integrations/chatbot/dify/dto/dify.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { difyController } from '@api/server.module';\nimport {\n  difyIgnoreJidSchema,\n  difySchema,\n  difySettingSchema,\n  difyStatusSchema,\n  instanceSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class DifyRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<DifyDto>({\n          request: req,\n          schema: difySchema,\n          ClassRef: DifyDto,\n          execute: (instance, data) => difyController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => difyController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:difyId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => difyController.fetchBot(instance, req.params.difyId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:difyId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<DifyDto>({\n          request: req,\n          schema: difySchema,\n          ClassRef: DifyDto,\n          execute: (instance, data) => difyController.updateBot(instance, req.params.difyId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:difyId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => difyController.deleteBot(instance, req.params.difyId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<DifySettingDto>({\n          request: req,\n          schema: difySettingSchema,\n          ClassRef: DifySettingDto,\n          execute: (instance, data) => difyController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => difyController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: difyStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => difyController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:difyId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => difyController.fetchSessions(instance, req.params.difyId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: difyIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => difyController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class OpenaiCredsDto {\n  name: string;\n  apiKey: string;\n}\n\nexport class OpenaiDto extends BaseChatbotDto {\n  openaiCredsId: string;\n  botType: string;\n  assistantId?: string;\n  functionUrl?: string;\n  model?: string;\n  systemMessages?: string[];\n  assistantMessages?: string[];\n  userMessages?: string[];\n  maxTokens?: number;\n}\n\nexport class OpenaiSettingDto extends BaseChatbotSettingDto {\n  openaiCredsId?: string;\n  openaiIdFallback?: string;\n  speechToText?: boolean;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { OpenaiCredsDto, OpenaiDto, OpenaiSettingDto } from '@api/integrations/chatbot/openai/dto/openai.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { openaiController } from '@api/server.module';\nimport {\n  instanceSchema,\n  openaiCredsSchema,\n  openaiIgnoreJidSchema,\n  openaiSchema,\n  openaiSettingSchema,\n  openaiStatusSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class OpenaiRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('creds'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<OpenaiCredsDto>({\n          request: req,\n          schema: openaiCredsSchema,\n          ClassRef: OpenaiCredsDto,\n          execute: (instance, data) => openaiController.createOpenaiCreds(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('creds'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.findOpenaiCreds(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('creds/:openaiCredsId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.deleteCreds(instance, req.params.openaiCredsId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<OpenaiDto>({\n          request: req,\n          schema: openaiSchema,\n          ClassRef: OpenaiDto,\n          execute: (instance, data) => openaiController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:openaiBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.fetchBot(instance, req.params.openaiBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:openaiBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<OpenaiDto>({\n          request: req,\n          schema: openaiSchema,\n          ClassRef: OpenaiDto,\n          execute: (instance, data) => openaiController.updateBot(instance, req.params.openaiBotId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:openaiBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.deleteBot(instance, req.params.openaiBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<OpenaiSettingDto>({\n          request: req,\n          schema: openaiSettingSchema,\n          ClassRef: OpenaiSettingDto,\n          execute: (instance, data) => openaiController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: openaiStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => openaiController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:openaiBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.fetchSessions(instance, req.params.openaiBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: openaiIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => openaiController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('getModels'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => openaiController.getModels(instance, req.query.openaiCredsId as string),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class PrefilledVariables {\n  remoteJid?: string;\n  pushName?: string;\n  messageType?: string;\n  additionalData?: { [key: string]: any };\n}\n\nexport class TypebotDto extends BaseChatbotDto {\n  url: string;\n  typebot: string;\n}\n\nexport class TypebotSettingDto extends BaseChatbotSettingDto {\n  typebotIdFallback?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { TypebotDto, TypebotSettingDto } from '@api/integrations/chatbot/typebot/dto/typebot.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { typebotController } from '@api/server.module';\nimport {\n  instanceSchema,\n  typebotIgnoreJidSchema,\n  typebotSchema,\n  typebotSettingSchema,\n  typebotStartSchema,\n  typebotStatusSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class TypebotRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<TypebotDto>({\n          request: req,\n          schema: typebotSchema,\n          ClassRef: TypebotDto,\n          execute: (instance, data) => typebotController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => typebotController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:typebotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => typebotController.fetchBot(instance, req.params.typebotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:typebotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<TypebotDto>({\n          request: req,\n          schema: typebotSchema,\n          ClassRef: TypebotDto,\n          execute: (instance, data) => typebotController.updateBot(instance, req.params.typebotId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:typebotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => typebotController.deleteBot(instance, req.params.typebotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<TypebotSettingDto>({\n          request: req,\n          schema: typebotSettingSchema,\n          ClassRef: TypebotSettingDto,\n          execute: (instance, data) => typebotController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => typebotController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('start'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: typebotStartSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => typebotController.startBot(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: typebotStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => typebotController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:typebotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => typebotController.fetchSessions(instance, req.params.typebotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: typebotIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => typebotController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { ChatwootRouter } from '@api/integrations/chatbot/chatwoot/routes/chatwoot.router';\nimport { DifyRouter } from '@api/integrations/chatbot/dify/routes/dify.router';\nimport { OpenaiRouter } from '@api/integrations/chatbot/openai/routes/openai.router';\nimport { TypebotRouter } from '@api/integrations/chatbot/typebot/routes/typebot.router';\nimport { Router } from 'express';\n\nimport { EvoaiRouter } from './evoai/routes/evoai.router';\nimport { EvolutionBotRouter } from './evolutionBot/routes/evolutionBot.router';\nimport { FlowiseRouter } from './flowise/routes/flowise.router';\nimport { N8nRouter } from './n8n/routes/n8n.router';\n\nexport class ChatbotRouter {\n  public readonly router: Router;\n\n  constructor(...guards: any[]) {\n    this.router = Router();\n\n    this.router.use('/evolutionBot', new EvolutionBotRouter(...guards).router);\n    this.router.use('/chatwoot', new ChatwootRouter(...guards).router);\n    this.router.use('/typebot', new TypebotRouter(...guards).router);\n    this.router.use('/openai', new OpenaiRouter(...guards).router);\n    this.router.use('/dify', new DifyRouter(...guards).router);\n    this.router.use('/flowise', new FlowiseRouter(...guards).router);\n    this.router.use('/n8n', new N8nRouter(...guards).router);\n    this.router.use('/evoai', new EvoaiRouter(...guards).router);\n  }\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { evoaiController } from '@api/server.module';\nimport {\n  evoaiIgnoreJidSchema,\n  evoaiSchema,\n  evoaiSettingSchema,\n  evoaiStatusSchema,\n  instanceSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { EvoaiDto, EvoaiSettingDto } from '../dto/evoai.dto';\n\nexport class EvoaiRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvoaiDto>({\n          request: req,\n          schema: evoaiSchema,\n          ClassRef: EvoaiDto,\n          execute: (instance, data) => evoaiController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evoaiController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:evoaiId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evoaiController.fetchBot(instance, req.params.evoaiId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:evoaiId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvoaiDto>({\n          request: req,\n          schema: evoaiSchema,\n          ClassRef: EvoaiDto,\n          execute: (instance, data) => evoaiController.updateBot(instance, req.params.evoaiId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:evoaiId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evoaiController.deleteBot(instance, req.params.evoaiId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvoaiSettingDto>({\n          request: req,\n          schema: evoaiSettingSchema,\n          ClassRef: EvoaiSettingDto,\n          execute: (instance, data) => evoaiController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evoaiController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: evoaiStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => evoaiController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:evoaiId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evoaiController.fetchSessions(instance, req.params.evoaiId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: evoaiIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => evoaiController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class EvoaiDto extends BaseChatbotDto {\n  agentUrl?: string;\n  apiKey?: string;\n}\n\nexport class EvoaiSettingDto extends BaseChatbotSettingDto {\n  evoaiIdFallback?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { evolutionBotController } from '@api/server.module';\nimport { instanceSchema } from '@validate/instance.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { EvolutionBotDto, EvolutionBotSettingDto } from '../dto/evolutionBot.dto';\nimport {\n  evolutionBotIgnoreJidSchema,\n  evolutionBotSchema,\n  evolutionBotSettingSchema,\n  evolutionBotStatusSchema,\n} from '../validate/evolutionBot.schema';\n\nexport class EvolutionBotRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvolutionBotDto>({\n          request: req,\n          schema: evolutionBotSchema,\n          ClassRef: EvolutionBotDto,\n          execute: (instance, data) => evolutionBotController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evolutionBotController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:evolutionBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evolutionBotController.fetchBot(instance, req.params.evolutionBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:evolutionBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvolutionBotDto>({\n          request: req,\n          schema: evolutionBotSchema,\n          ClassRef: EvolutionBotDto,\n          execute: (instance, data) => evolutionBotController.updateBot(instance, req.params.evolutionBotId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:evolutionBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evolutionBotController.deleteBot(instance, req.params.evolutionBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EvolutionBotSettingDto>({\n          request: req,\n          schema: evolutionBotSettingSchema,\n          ClassRef: EvolutionBotSettingDto,\n          execute: (instance, data) => evolutionBotController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evolutionBotController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: evolutionBotStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => evolutionBotController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:evolutionBotId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => evolutionBotController.fetchSessions(instance, req.params.evolutionBotId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: evolutionBotIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => evolutionBotController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class EvolutionBotDto extends BaseChatbotDto {\n  apiUrl: string;\n  apiKey: string;\n}\n\nexport class EvolutionBotSettingDto extends BaseChatbotSettingDto {\n  botIdFallback?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { flowiseController } from '@api/server.module';\nimport { instanceSchema } from '@validate/instance.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { FlowiseDto, FlowiseSettingDto } from '../dto/flowise.dto';\nimport {\n  flowiseIgnoreJidSchema,\n  flowiseSchema,\n  flowiseSettingSchema,\n  flowiseStatusSchema,\n} from '../validate/flowise.schema';\n\nexport class FlowiseRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<FlowiseDto>({\n          request: req,\n          schema: flowiseSchema,\n          ClassRef: FlowiseDto,\n          execute: (instance, data) => flowiseController.createBot(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => flowiseController.findBot(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:flowiseId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => flowiseController.fetchBot(instance, req.params.flowiseId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:flowiseId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<FlowiseDto>({\n          request: req,\n          schema: flowiseSchema,\n          ClassRef: FlowiseDto,\n          execute: (instance, data) => flowiseController.updateBot(instance, req.params.flowiseId, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:flowiseId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => flowiseController.deleteBot(instance, req.params.flowiseId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<FlowiseSettingDto>({\n          request: req,\n          schema: flowiseSettingSchema,\n          ClassRef: FlowiseSettingDto,\n          execute: (instance, data) => flowiseController.settings(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => flowiseController.fetchSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: flowiseStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => flowiseController.changeStatus(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:flowiseId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => flowiseController.fetchSessions(instance, req.params.flowiseId),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: flowiseIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => flowiseController.ignoreJid(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class FlowiseDto extends BaseChatbotDto {\n  apiUrl: string;\n  apiKey?: string;\n}\n\nexport class FlowiseSettingDto extends BaseChatbotSettingDto {\n  flowiseIdFallback?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { n8nController } from '@api/server.module';\nimport {\n  instanceSchema,\n  n8nIgnoreJidSchema,\n  n8nSchema,\n  n8nSettingSchema,\n  n8nStatusSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { N8nDto, N8nSettingDto } from '../dto/n8n.dto';\n\nexport class N8nRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<N8nDto>({\n          request: req,\n          schema: n8nSchema,\n          ClassRef: N8nDto,\n          execute: (instance, data) => n8nController.createBot(instance, data),\n        });\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => n8nController.findBot(instance),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetch/:n8nId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => n8nController.fetchBot(instance, req.params.n8nId),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .put(this.routerPath('update/:n8nId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<N8nDto>({\n          request: req,\n          schema: n8nSchema,\n          ClassRef: N8nDto,\n          execute: (instance, data) => n8nController.updateBot(instance, req.params.n8nId, data),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete/:n8nId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => n8nController.deleteBot(instance, req.params.n8nId),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('settings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<N8nSettingDto>({\n          request: req,\n          schema: n8nSettingSchema,\n          ClassRef: N8nSettingDto,\n          execute: (instance, data) => n8nController.settings(instance, data),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => n8nController.fetchSettings(instance),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('changeStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: n8nStatusSchema,\n          ClassRef: InstanceDto,\n          execute: (instance, data) => n8nController.changeStatus(instance, data),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchSessions/:n8nId'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => n8nController.fetchSessions(instance, req.params.n8nId),\n        });\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('ignoreJid'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<IgnoreJidDto>({\n          request: req,\n          schema: n8nIgnoreJidSchema,\n          ClassRef: IgnoreJidDto,\n          execute: (instance, data) => n8nController.ignoreJid(instance, data),\n        });\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { BaseChatbotDto, BaseChatbotSettingDto } from '../../base-chatbot.dto';\n\nexport class N8nDto extends BaseChatbotDto {\n  // N8n specific fields\n  webhookUrl?: string;\n  basicAuthUser?: string;\n  basicAuthPass?: string;\n}\n\nexport class N8nSettingDto extends BaseChatbotSettingDto {\n  // N8n has no specific fields\n}\n\nexport class N8nMessageDto {\n  chatInput: string;\n  sessionId: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { eventSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class KafkaRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: eventSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.kafka.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.kafka.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { eventSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class NatsRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: eventSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.nats.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.nats.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { instanceSchema, pusherSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\nexport class PusherRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: pusherSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.pusher.set(instance.instanceName, data),\n        });\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.pusher.get(instance.instanceName),\n        });\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { eventSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class RabbitmqRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: eventSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.rabbitmq.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.rabbitmq.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { eventSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class SqsRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: eventSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.sqs.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.sqs.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { ConfigService } from '@config/env.config';\nimport { instanceSchema, webhookSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class WebhookRouter extends RouterBroker {\n  constructor(\n    readonly configService: ConfigService,\n    ...guards: RequestHandler[]\n  ) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: webhookSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.webhook.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.webhook.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { EventDto } from '@api/integrations/event/event.dto';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { eventManager } from '@api/server.module';\nimport { eventSchema, instanceSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nexport class WebsocketRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<EventDto>({\n          request: req,\n          schema: eventSchema,\n          ClassRef: EventDto,\n          execute: (instance, data) => eventManager.websocket.set(instance.instanceName, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => eventManager.websocket.get(instance.instanceName),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { KafkaRouter } from '@api/integrations/event/kafka/kafka.router';\nimport { NatsRouter } from '@api/integrations/event/nats/nats.router';\nimport { PusherRouter } from '@api/integrations/event/pusher/pusher.router';\nimport { RabbitmqRouter } from '@api/integrations/event/rabbitmq/rabbitmq.router';\nimport { SqsRouter } from '@api/integrations/event/sqs/sqs.router';\nimport { WebhookRouter } from '@api/integrations/event/webhook/webhook.router';\nimport { WebsocketRouter } from '@api/integrations/event/websocket/websocket.router';\nimport { Router } from 'express';\n\nexport class EventRouter {\n  public readonly router: Router;\n\n  constructor(configService: any, ...guards: any[]) {\n    this.router = Router();\n\n    this.router.use('/webhook', new WebhookRouter(configService, ...guards).router);\n    this.router.use('/websocket', new WebsocketRouter(...guards).router);\n    this.router.use('/rabbitmq', new RabbitmqRouter(...guards).router);\n    this.router.use('/nats', new NatsRouter(...guards).router);\n    this.router.use('/pusher', new PusherRouter(...guards).router);\n    this.router.use('/sqs', new SqsRouter(...guards).router);\n    this.router.use('/kafka', new KafkaRouter(...guards).router);\n  }\n}\n","export class MediaDto {\n  id?: string;\n  type?: string;\n  messageId?: number;\n  expiry?: number;\n}\n","import { JSONSchema7 } from 'json-schema';\nimport { v4 } from 'uuid';\n\nconst isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {\n  const properties = {};\n  propertyNames.forEach(\n    (property) =>\n      (properties[property] = {\n        minLength: 1,\n        description: `The \"${property}\" cannot be empty`,\n      }),\n  );\n  return {\n    if: {\n      propertyNames: {\n        enum: [...propertyNames],\n      },\n    },\n    then: { properties },\n  };\n};\n\nexport const s3Schema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    id: { type: 'string' },\n    type: { type: 'string' },\n    messageId: { type: 'integer' },\n  },\n  ...isNotEmpty('id', 'type', 'messageId'),\n};\n\nexport const s3UrlSchema: JSONSchema7 = {\n  $id: v4(),\n  type: 'object',\n  properties: {\n    id: { type: 'string', pattern: '\\\\d+', minLength: 1 },\n    expiry: { type: 'string', pattern: '\\\\d+', minLength: 1 },\n  },\n  ...isNotEmpty('id'),\n  required: ['id'],\n};\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { MediaDto } from '@api/integrations/storage/s3/dto/media.dto';\nimport { s3Schema, s3UrlSchema } from '@api/integrations/storage/s3/validate/s3.schema';\nimport { HttpStatus } from '@api/routes/index.router';\nimport { s3Controller } from '@api/server.module';\nimport { RequestHandler, Router } from 'express';\n\nexport class S3Router extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('getMedia'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<MediaDto>({\n          request: req,\n          schema: s3Schema,\n          ClassRef: MediaDto,\n          execute: (instance, data) => s3Controller.getMedia(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('getMediaUrl'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<MediaDto>({\n          request: req,\n          schema: s3UrlSchema,\n          ClassRef: MediaDto,\n          execute: (instance, data) => s3Controller.getMediaUrl(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { S3Router } from '@api/integrations/storage/s3/routes/s3.router';\nimport { Router } from 'express';\n\nexport class StorageRouter {\n  public readonly router: Router;\n\n  constructor(...guards: any[]) {\n    this.router = Router();\n\n    this.router.use('/s3', new S3Router(...guards).router);\n  }\n}\n","import axios, { AxiosRequestConfig } from 'axios';\nimport { fetchLatestBaileysVersion, WAVersion } from 'baileys';\n\nexport const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) => {\n  try {\n    const { data } = await axios.get('https://web.whatsapp.com/sw.js', {\n      ...options,\n      responseType: 'json',\n    });\n\n    const regex = /\\\\?\"client_revision\\\\?\":\\s*(\\d+)/;\n    const match = data.match(regex);\n\n    if (!match?.[1]) {\n      return {\n        version: (await fetchLatestBaileysVersion()).version as WAVersion,\n        isLatest: false,\n        error: {\n          message: 'Could not find client revision in the fetched content',\n        },\n      };\n    }\n\n    const clientRevision = match[1];\n\n    return {\n      version: [2, 3000, +clientRevision] as WAVersion,\n      isLatest: true,\n    };\n  } catch (error) {\n    return {\n      version: (await fetchLatestBaileysVersion()).version as WAVersion,\n      isLatest: false,\n      error,\n    };\n  }\n};\n","import { authGuard } from '@api/guards/auth.guard';\nimport { instanceExistsGuard, instanceLoggedGuard } from '@api/guards/instance.guard';\nimport Telemetry from '@api/guards/telemetry.guard';\nimport { ChannelRouter } from '@api/integrations/channel/channel.router';\nimport { ChatbotRouter } from '@api/integrations/chatbot/chatbot.router';\nimport { EventRouter } from '@api/integrations/event/event.router';\nimport { StorageRouter } from '@api/integrations/storage/storage.router';\nimport { waMonitor } from '@api/server.module';\nimport { configService, Database, Facebook } from '@config/env.config';\nimport { fetchLatestWaWebVersion } from '@utils/fetchLatestWaWebVersion';\nimport { NextFunction, Request, Response, Router } from 'express';\nimport fs from 'fs';\nimport mimeTypes from 'mime-types';\nimport path from 'path';\n\nimport { BusinessRouter } from './business.router';\nimport { CallRouter } from './call.router';\nimport { ChatRouter } from './chat.router';\nimport { GroupRouter } from './group.router';\nimport { InstanceRouter } from './instance.router';\nimport { LabelRouter } from './label.router';\nimport { ProxyRouter } from './proxy.router';\nimport { MessageRouter } from './sendMessage.router';\nimport { SettingsRouter } from './settings.router';\nimport { TemplateRouter } from './template.router';\nimport { ViewsRouter } from './view.router';\n\nenum HttpStatus {\n  OK = 200,\n  CREATED = 201,\n  NOT_FOUND = 404,\n  FORBIDDEN = 403,\n  BAD_REQUEST = 400,\n  UNAUTHORIZED = 401,\n  INTERNAL_SERVER_ERROR = 500,\n}\n\nconst router: Router = Router();\nconst serverConfig = configService.get('SERVER');\nconst databaseConfig = configService.get<Database>('DATABASE');\nconst guards = [instanceExistsGuard, instanceLoggedGuard, authGuard['apikey']];\n\nconst telemetry = new Telemetry();\n\nconst packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));\n\n// Middleware for metrics IP whitelist\nconst metricsIPWhitelist = (req: Request, res: Response, next: NextFunction) => {\n  const metricsConfig = configService.get('METRICS');\n  const allowedIPs = metricsConfig.ALLOWED_IPS?.split(',').map((ip) => ip.trim()) || ['127.0.0.1'];\n  const clientIPs = [\n    req.ip,\n    req.connection.remoteAddress,\n    req.socket.remoteAddress,\n    req.headers['x-forwarded-for'],\n  ].filter((ip) => ip !== undefined);\n\n  if (allowedIPs.filter((ip) => clientIPs.includes(ip)) === 0) {\n    return res.status(403).send('Forbidden: IP not allowed');\n  }\n\n  next();\n};\n\n// Middleware for metrics Basic Authentication\nconst metricsBasicAuth = (req: Request, res: Response, next: NextFunction) => {\n  const metricsConfig = configService.get('METRICS');\n  const metricsUser = metricsConfig.USER;\n  const metricsPass = metricsConfig.PASSWORD;\n\n  if (!metricsUser || !metricsPass) {\n    return res.status(500).send('Metrics authentication not configured');\n  }\n\n  const auth = req.get('Authorization');\n  if (!auth || !auth.startsWith('Basic ')) {\n    res.set('WWW-Authenticate', 'Basic realm=\"Evolution API Metrics\"');\n    return res.status(401).send('Authentication required');\n  }\n\n  const credentials = Buffer.from(auth.slice(6), 'base64').toString();\n  const [user, pass] = credentials.split(':');\n\n  if (user !== metricsUser || pass !== metricsPass) {\n    return res.status(401).send('Invalid credentials');\n  }\n\n  next();\n};\n\n// Expose Prometheus metrics when enabled by env flag\nconst metricsConfig = configService.get('METRICS');\nif (metricsConfig.ENABLED) {\n  const metricsMiddleware = [];\n\n  // Add IP whitelist if configured\n  if (metricsConfig.ALLOWED_IPS) {\n    metricsMiddleware.push(metricsIPWhitelist);\n  }\n\n  // Add Basic Auth if required\n  if (metricsConfig.AUTH_REQUIRED) {\n    metricsMiddleware.push(metricsBasicAuth);\n  }\n\n  router.get('/metrics', ...metricsMiddleware, async (req, res) => {\n    res.set('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n    res.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n    const escapeLabel = (value: unknown) =>\n      String(value ?? '')\n        .replace(/\\\\/g, '\\\\\\\\')\n        .replace(/\\n/g, '\\\\n')\n        .replace(/\"/g, '\\\\\"');\n\n    const lines: string[] = [];\n\n    const clientName = databaseConfig.CONNECTION.CLIENT_NAME || 'unknown';\n    const serverUrl = serverConfig.URL || '';\n\n    // environment info\n    lines.push('# HELP evolution_environment_info Environment information');\n    lines.push('# TYPE evolution_environment_info gauge');\n    lines.push(\n      `evolution_environment_info{version=\"${escapeLabel(packageJson.version)}\",clientName=\"${escapeLabel(\n        clientName,\n      )}\",serverUrl=\"${escapeLabel(serverUrl)}\"} 1`,\n    );\n\n    const instances = (waMonitor && waMonitor.waInstances) || {};\n    const instanceEntries = Object.entries(instances);\n\n    // total instances\n    lines.push('# HELP evolution_instances_total Total number of instances');\n    lines.push('# TYPE evolution_instances_total gauge');\n    lines.push(`evolution_instances_total ${instanceEntries.length}`);\n\n    // per-instance status\n    lines.push('# HELP evolution_instance_up 1 if instance state is open, else 0');\n    lines.push('# TYPE evolution_instance_up gauge');\n    lines.push('# HELP evolution_instance_state Instance state as a labelled metric');\n    lines.push('# TYPE evolution_instance_state gauge');\n\n    for (const [name, instance] of instanceEntries) {\n      const state = instance?.connectionStatus?.state || 'unknown';\n      const integration = instance?.integration || '';\n      const up = state === 'open' ? 1 : 0;\n\n      lines.push(\n        `evolution_instance_up{instance=\"${escapeLabel(name)}\",integration=\"${escapeLabel(integration)}\"} ${up}`,\n      );\n      lines.push(\n        `evolution_instance_state{instance=\"${escapeLabel(name)}\",integration=\"${escapeLabel(\n          integration,\n        )}\",state=\"${escapeLabel(state)}\"} 1`,\n      );\n    }\n\n    res.send(lines.join('\\n') + '\\n');\n  });\n}\n\nif (!serverConfig.DISABLE_MANAGER) router.use('/manager', new ViewsRouter().router);\n\nrouter.get('/assets/*', (req, res) => {\n  const fileName = req.params[0];\n\n  // Security: Reject paths containing traversal patterns\n  if (!fileName || fileName.includes('..') || fileName.includes('\\\\') || path.isAbsolute(fileName)) {\n    return res.status(403).send('Forbidden');\n  }\n\n  const basePath = path.join(process.cwd(), 'manager', 'dist');\n  const assetsPath = path.join(basePath, 'assets');\n  const filePath = path.join(assetsPath, fileName);\n\n  // Security: Ensure the resolved path is within the assets directory\n  const resolvedPath = path.resolve(filePath);\n  const resolvedAssetsPath = path.resolve(assetsPath);\n\n  if (!resolvedPath.startsWith(resolvedAssetsPath + path.sep) && resolvedPath !== resolvedAssetsPath) {\n    return res.status(403).send('Forbidden');\n  }\n\n  if (fs.existsSync(resolvedPath)) {\n    res.set('Content-Type', mimeTypes.lookup(resolvedPath) || 'text/css');\n    res.send(fs.readFileSync(resolvedPath));\n  } else {\n    res.status(404).send('File not found');\n  }\n});\n\nrouter\n  .use((req, res, next) => telemetry.collectTelemetry(req, res, next))\n\n  .get('/', async (req, res) => {\n    res.status(HttpStatus.OK).json({\n      status: HttpStatus.OK,\n      message: 'Welcome to the Evolution API, it is working!',\n      version: packageJson.version,\n      clientName: databaseConfig.CONNECTION.CLIENT_NAME,\n      manager: !serverConfig.DISABLE_MANAGER ? `${req.protocol}://${req.get('host')}/manager` : undefined,\n      documentation: `https://doc.evolution-api.com`,\n      whatsappWebVersion: (await fetchLatestWaWebVersion({})).version.join('.'),\n    });\n  })\n  .post('/verify-creds', authGuard['apikey'], async (req, res) => {\n    const facebookConfig = configService.get<Facebook>('FACEBOOK');\n    return res.status(HttpStatus.OK).json({\n      status: HttpStatus.OK,\n      message: 'Credentials are valid',\n      facebookAppId: facebookConfig.APP_ID,\n      facebookConfigId: facebookConfig.CONFIG_ID,\n      facebookUserToken: facebookConfig.USER_TOKEN,\n    });\n  })\n  .use('/instance', new InstanceRouter(configService, ...guards).router)\n  .use('/message', new MessageRouter(...guards).router)\n  .use('/call', new CallRouter(...guards).router)\n  .use('/chat', new ChatRouter(...guards).router)\n  .use('/business', new BusinessRouter(...guards).router)\n  .use('/group', new GroupRouter(...guards).router)\n  .use('/template', new TemplateRouter(configService, ...guards).router)\n  .use('/settings', new SettingsRouter(...guards).router)\n  .use('/proxy', new ProxyRouter(...guards).router)\n  .use('/label', new LabelRouter(...guards).router)\n  .use('', new ChannelRouter(configService, ...guards).router)\n  .use('', new EventRouter(configService, ...guards).router)\n  .use('', new ChatbotRouter(...guards).router)\n  .use('', new StorageRouter(...guards).router);\n\nexport { HttpStatus, router };\n","import {\n  proto,\n  WAPresence,\n  WAPrivacyGroupAddValue,\n  WAPrivacyOnlineValue,\n  WAPrivacyValue,\n  WAReadReceiptsValue,\n} from 'baileys';\n\nexport class OnWhatsAppDto {\n  constructor(\n    public readonly jid: string,\n    public readonly exists: boolean,\n    public readonly number: string,\n    public readonly name?: string,\n    public readonly lid?: string,\n  ) {}\n}\n\nexport class getBase64FromMediaMessageDto {\n  message: proto.WebMessageInfo;\n  convertToMp4?: boolean;\n}\n\nexport class WhatsAppNumberDto {\n  numbers: string[];\n}\n\nexport class NumberDto {\n  number: string;\n}\n\nexport class NumberBusiness {\n  wid?: string;\n  jid?: string;\n  exists?: boolean;\n  isBusiness: boolean;\n  name?: string;\n  message?: string;\n  description?: string;\n  email?: string;\n  websites?: string[];\n  website?: string[];\n  address?: string;\n  about?: string;\n  vertical?: string;\n  profilehandle?: string;\n}\n\nexport class ProfileNameDto {\n  name: string;\n}\n\nexport class ProfileStatusDto {\n  status: string;\n}\n\nexport class ProfilePictureDto {\n  number?: string;\n  // url or base64\n  picture?: string;\n}\n\nclass Key {\n  id: string;\n  fromMe: boolean;\n  remoteJid: string;\n}\nexport class ReadMessageDto {\n  readMessages: Key[];\n}\n\nexport class LastMessage {\n  key: Key;\n  messageTimestamp?: number;\n}\n\nexport class ArchiveChatDto {\n  lastMessage?: LastMessage;\n  chat?: string;\n  archive: boolean;\n}\n\nexport class MarkChatUnreadDto {\n  lastMessage?: LastMessage;\n  chat?: string;\n}\n\nexport class PrivacySettingDto {\n  readreceipts: WAReadReceiptsValue;\n  profile: WAPrivacyValue;\n  status: WAPrivacyValue;\n  online: WAPrivacyOnlineValue;\n  last: WAPrivacyValue;\n  groupadd: WAPrivacyGroupAddValue;\n}\n\nexport class DeleteMessage {\n  id: string;\n  fromMe: boolean;\n  remoteJid: string;\n  participant?: string;\n}\nexport class Options {\n  delay?: number;\n  presence?: WAPresence;\n}\nclass OptionsMessage {\n  options: Options;\n}\nexport class Metadata extends OptionsMessage {\n  number: string;\n}\n\nexport class SendPresenceDto extends Metadata {\n  presence: WAPresence;\n  delay: number;\n}\n\nexport class UpdateMessageDto extends Metadata {\n  number: string;\n  key: proto.IMessageKey;\n  text: string;\n}\n\nexport class BlockUserDto {\n  number: string;\n  status: 'block' | 'unblock';\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport interface MetaErrorResponse {\n  status: number;\n  error: string;\n  message: string;\n  details: {\n    whatsapp_error: string;\n    whatsapp_code: string | number;\n    error_user_title: string;\n    error_user_msg: string;\n    error_type: string;\n    error_subcode: number | null;\n    fbtrace_id: string | null;\n    context: string;\n    type: string;\n  };\n  timestamp: string;\n}\n\n/**\n * Creates standardized error response for Meta/WhatsApp API errors\n */\nexport function createMetaErrorResponse(error: any, context: string): MetaErrorResponse {\n  // Extract Meta/WhatsApp specific error fields\n  const metaError = error.template || error;\n  const errorUserTitle = metaError.error_user_title || metaError.message || 'Unknown error';\n  const errorUserMsg = metaError.error_user_msg || metaError.message || 'Unknown error';\n\n  return {\n    status: HttpStatus.BAD_REQUEST,\n    error: 'Bad Request',\n    message: errorUserTitle,\n    details: {\n      whatsapp_error: errorUserMsg,\n      whatsapp_code: metaError.code || 'UNKNOWN_ERROR',\n      error_user_title: errorUserTitle,\n      error_user_msg: errorUserMsg,\n      error_type: metaError.type || 'UNKNOWN',\n      error_subcode: metaError.error_subcode || null,\n      fbtrace_id: metaError.fbtrace_id || null,\n      context,\n      type: 'whatsapp_api_error',\n    },\n    timestamp: new Date().toISOString(),\n  };\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { NumberDto } from '@api/dto/chat.dto';\nimport { businessController } from '@api/server.module';\nimport { createMetaErrorResponse } from '@utils/errorResponse';\nimport { catalogSchema, collectionsSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class BusinessRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('getCatalog'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<NumberDto>({\n            request: req,\n            schema: catalogSchema,\n            ClassRef: NumberDto,\n            execute: (instance, data) => businessController.fetchCatalog(instance, data),\n          });\n\n          return res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          // Log error for debugging\n          console.error('Business catalog error:', error);\n\n          // Use utility function to create standardized error response\n          const errorResponse = createMetaErrorResponse(error, 'business_catalog');\n          return res.status(errorResponse.status).json(errorResponse);\n        }\n      })\n\n      .post(this.routerPath('getCollections'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<NumberDto>({\n            request: req,\n            schema: collectionsSchema,\n            ClassRef: NumberDto,\n            execute: (instance, data) => businessController.fetchCollections(instance, data),\n          });\n\n          return res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          // Log error for debugging\n          console.error('Business collections error:', error);\n\n          // Use utility function to create standardized error response\n          const errorResponse = createMetaErrorResponse(error, 'business_collections');\n          return res.status(errorResponse.status).json(errorResponse);\n        }\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class Metadata {\n  number: string;\n}\n\nexport class OfferCallDto extends Metadata {\n  isVideo?: boolean;\n  callDuration?: number;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { OfferCallDto } from '@api/dto/call.dto';\nimport { callController } from '@api/server.module';\nimport { offerCallSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class CallRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router.post(this.routerPath('offer'), ...guards, async (req, res) => {\n      const response = await this.dataValidate<OfferCallDto>({\n        request: req,\n        schema: offerCallSchema,\n        ClassRef: OfferCallDto,\n        execute: (instance, data) => callController.offerCall(instance, data),\n      });\n\n      return res.status(HttpStatus.CREATED).json(response);\n    });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { ConfigService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { PrismaClient } from '@prisma/client';\n\nexport class Query<T> {\n  where?: T;\n  sort?: 'asc' | 'desc';\n  page?: number;\n  offset?: number;\n}\n\nexport class PrismaRepository extends PrismaClient {\n  constructor(private readonly configService: ConfigService) {\n    super();\n  }\n\n  private readonly logger = new Logger('PrismaRepository');\n\n  public async onModuleInit() {\n    await this.$connect();\n    this.logger.info('Repository:Prisma - ON');\n  }\n\n  public async onModuleDestroy() {\n    await this.$disconnect();\n    this.logger.warn('Repository:Prisma - OFF');\n  }\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport {\n  ArchiveChatDto,\n  BlockUserDto,\n  DeleteMessage,\n  getBase64FromMediaMessageDto,\n  MarkChatUnreadDto,\n  NumberDto,\n  PrivacySettingDto,\n  ProfileNameDto,\n  ProfilePictureDto,\n  ProfileStatusDto,\n  ReadMessageDto,\n  SendPresenceDto,\n  UpdateMessageDto,\n  WhatsAppNumberDto,\n} from '@api/dto/chat.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { Query } from '@api/repository/repository.service';\nimport { chatController } from '@api/server.module';\nimport { Contact, Message, MessageUpdate } from '@prisma/client';\nimport {\n  archiveChatSchema,\n  blockUserSchema,\n  contactValidateSchema,\n  deleteMessageSchema,\n  markChatUnreadSchema,\n  messageUpSchema,\n  messageValidateSchema,\n  presenceSchema,\n  privacySettingsSchema,\n  profileNameSchema,\n  profilePictureSchema,\n  profileSchema,\n  profileStatusSchema,\n  readMessageSchema,\n  updateMessageSchema,\n  whatsappNumberSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class ChatRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('whatsappNumbers'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<WhatsAppNumberDto>({\n            request: req,\n            schema: whatsappNumberSchema,\n            ClassRef: WhatsAppNumberDto,\n            execute: (instance, data) => chatController.whatsappNumber(instance, data),\n          });\n\n          return res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          console.log(error);\n          return res.status(HttpStatus.BAD_REQUEST).json(error);\n        }\n      })\n      .post(this.routerPath('markMessageAsRead'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ReadMessageDto>({\n          request: req,\n          schema: readMessageSchema,\n          ClassRef: ReadMessageDto,\n          execute: (instance, data) => chatController.readMessage(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('archiveChat'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ArchiveChatDto>({\n          request: req,\n          schema: archiveChatSchema,\n          ClassRef: ArchiveChatDto,\n          execute: (instance, data) => chatController.archiveChat(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('markChatUnread'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<MarkChatUnreadDto>({\n          request: req,\n          schema: markChatUnreadSchema,\n          ClassRef: MarkChatUnreadDto,\n          execute: (instance, data) => chatController.markChatUnread(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .delete(this.routerPath('deleteMessageForEveryone'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<DeleteMessage>({\n          request: req,\n          schema: deleteMessageSchema,\n          ClassRef: DeleteMessage,\n          execute: (instance, data) => chatController.deleteMessage(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('fetchProfilePictureUrl'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<NumberDto>({\n          request: req,\n          schema: profilePictureSchema,\n          ClassRef: NumberDto,\n          execute: (instance, data) => chatController.fetchProfilePicture(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('getBase64FromMediaMessage'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<getBase64FromMediaMessageDto>({\n          request: req,\n          schema: null,\n          ClassRef: getBase64FromMediaMessageDto,\n          execute: (instance, data) => chatController.getBase64FromMediaMessage(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      // TODO: corrigir updateMessage para medias tambem\n      .post(this.routerPath('updateMessage'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<UpdateMessageDto>({\n          request: req,\n          schema: updateMessageSchema,\n          ClassRef: UpdateMessageDto,\n          execute: (instance, data) => chatController.updateMessage(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('sendPresence'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<null>({\n          request: req,\n          schema: presenceSchema,\n          ClassRef: SendPresenceDto,\n          execute: (instance, data) => chatController.sendPresence(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateBlockStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<BlockUserDto>({\n          request: req,\n          schema: blockUserSchema,\n          ClassRef: BlockUserDto,\n          execute: (instance, data) => chatController.blockUser(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('findContacts'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<Query<Contact>>({\n          request: req,\n          schema: contactValidateSchema,\n          ClassRef: Query<Contact>,\n          execute: (instance, data) => chatController.fetchContacts(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('findMessages'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<Query<Message>>({\n          request: req,\n          schema: messageValidateSchema,\n          ClassRef: Query<Message>,\n          execute: (instance, data) => chatController.fetchMessages(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('findStatusMessage'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<Query<MessageUpdate>>({\n          request: req,\n          schema: messageUpSchema,\n          ClassRef: Query<MessageUpdate>,\n          execute: (instance, data) => chatController.fetchStatusMessage(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('findChats'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<Query<Contact>>({\n          request: req,\n          schema: contactValidateSchema,\n          ClassRef: Query<Contact>,\n          execute: (instance, data) => chatController.fetchChats(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('findChatByRemoteJid'), ...guards, async (req, res) => {\n        const instance = req.params as unknown as InstanceDto;\n        const { remoteJid } = req.query as unknown as { remoteJid: string };\n        if (!remoteJid) {\n          return res.status(HttpStatus.BAD_REQUEST).json({ error: 'remoteJid is a required query parameter' });\n        }\n        const response = await chatController.findChatByRemoteJid(instance, remoteJid);\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      // Profile routes\n      .post(this.routerPath('fetchBusinessProfile'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProfilePictureDto>({\n          request: req,\n          schema: profilePictureSchema,\n          ClassRef: ProfilePictureDto,\n          execute: (instance, data) => chatController.fetchBusinessProfile(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('fetchProfile'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<NumberDto>({\n          request: req,\n          schema: profileSchema,\n          ClassRef: NumberDto,\n          execute: (instance, data) => chatController.fetchProfile(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('updateProfileName'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProfileNameDto>({\n          request: req,\n          schema: profileNameSchema,\n          ClassRef: ProfileNameDto,\n          execute: (instance, data) => chatController.updateProfileName(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('updateProfileStatus'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProfileStatusDto>({\n          request: req,\n          schema: profileStatusSchema,\n          ClassRef: ProfileStatusDto,\n          execute: (instance, data) => chatController.updateProfileStatus(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('updateProfilePicture'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProfilePictureDto>({\n          request: req,\n          schema: profilePictureSchema,\n          ClassRef: ProfilePictureDto,\n          execute: (instance, data) => chatController.updateProfilePicture(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('removeProfilePicture'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProfilePictureDto>({\n          request: req,\n          schema: profilePictureSchema,\n          ClassRef: ProfilePictureDto,\n          execute: (instance) => chatController.removeProfilePicture(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchPrivacySettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => chatController.fetchPrivacySettings(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('updatePrivacySettings'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<PrivacySettingDto>({\n          request: req,\n          schema: privacySettingsSchema,\n          ClassRef: PrivacySettingDto,\n          execute: (instance, data) => chatController.updatePrivacySettings(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class CreateGroupDto {\n  subject: string;\n  participants: string[];\n  description?: string;\n  promoteParticipants?: boolean;\n}\n\nexport class GroupPictureDto {\n  groupJid: string;\n  image: string;\n}\n\nexport class GroupSubjectDto {\n  groupJid: string;\n  subject: string;\n}\n\nexport class GroupDescriptionDto {\n  groupJid: string;\n  description: string;\n}\n\nexport class GroupJid {\n  groupJid: string;\n}\n\nexport class GetParticipant {\n  getParticipants: string;\n}\n\nexport class GroupInvite {\n  inviteCode: string;\n}\n\nexport class AcceptGroupInvite {\n  inviteCode: string;\n}\n\nexport class GroupSendInvite {\n  groupJid: string;\n  description: string;\n  numbers: string[];\n}\n\nexport class GroupUpdateParticipantDto extends GroupJid {\n  action: 'add' | 'remove' | 'promote' | 'demote';\n  participants: string[];\n}\n\nexport class GroupUpdateSettingDto extends GroupJid {\n  action: 'announcement' | 'not_announcement' | 'unlocked' | 'locked';\n}\n\nexport class GroupToggleEphemeralDto extends GroupJid {\n  expiration: 0 | 86400 | 604800 | 7776000;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport {\n  AcceptGroupInvite,\n  CreateGroupDto,\n  GetParticipant,\n  GroupDescriptionDto,\n  GroupInvite,\n  GroupJid,\n  GroupPictureDto,\n  GroupSendInvite,\n  GroupSubjectDto,\n  GroupToggleEphemeralDto,\n  GroupUpdateParticipantDto,\n  GroupUpdateSettingDto,\n} from '@api/dto/group.dto';\nimport { groupController } from '@api/server.module';\nimport {\n  AcceptGroupInviteSchema,\n  createGroupSchema,\n  getParticipantsSchema,\n  groupInviteSchema,\n  groupJidSchema,\n  groupSendInviteSchema,\n  toggleEphemeralSchema,\n  updateGroupDescriptionSchema,\n  updateGroupPictureSchema,\n  updateGroupSubjectSchema,\n  updateParticipantsSchema,\n  updateSettingsSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class GroupRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<CreateGroupDto>({\n          request: req,\n          schema: createGroupSchema,\n          ClassRef: CreateGroupDto,\n          execute: (instance, data) => groupController.createGroup(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateGroupSubject'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupSubjectDto>({\n          request: req,\n          schema: updateGroupSubjectSchema,\n          ClassRef: GroupSubjectDto,\n          execute: (instance, data) => groupController.updateGroupSubject(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateGroupPicture'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupPictureDto>({\n          request: req,\n          schema: updateGroupPictureSchema,\n          ClassRef: GroupPictureDto,\n          execute: (instance, data) => groupController.updateGroupPicture(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateGroupDescription'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupDescriptionDto>({\n          request: req,\n          schema: updateGroupDescriptionSchema,\n          ClassRef: GroupDescriptionDto,\n          execute: (instance, data) => groupController.updateGroupDescription(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('findGroupInfos'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupJid>({\n          request: req,\n          schema: groupJidSchema,\n          ClassRef: GroupJid,\n          execute: (instance, data) => groupController.findGroupInfo(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchAllGroups'), ...guards, async (req, res) => {\n        const response = await this.getParticipantsValidate<GetParticipant>({\n          request: req,\n          schema: getParticipantsSchema,\n          ClassRef: GetParticipant,\n          execute: (instance, data) => groupController.fetchAllGroups(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('participants'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupJid>({\n          request: req,\n          schema: groupJidSchema,\n          ClassRef: GroupJid,\n          execute: (instance, data) => groupController.findParticipants(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('inviteCode'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupJid>({\n          request: req,\n          schema: groupJidSchema,\n          ClassRef: GroupJid,\n          execute: (instance, data) => groupController.inviteCode(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('inviteInfo'), ...guards, async (req, res) => {\n        const response = await this.inviteCodeValidate<GroupInvite>({\n          request: req,\n          schema: groupInviteSchema,\n          ClassRef: GroupInvite,\n          execute: (instance, data) => groupController.inviteInfo(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('acceptInviteCode'), ...guards, async (req, res) => {\n        const response = await this.inviteCodeValidate<AcceptGroupInvite>({\n          request: req,\n          schema: AcceptGroupInviteSchema,\n          ClassRef: AcceptGroupInvite,\n          execute: (instance, data) => groupController.acceptInviteCode(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('sendInvite'), ...guards, async (req, res) => {\n        const response = await this.groupNoValidate<GroupSendInvite>({\n          request: req,\n          schema: groupSendInviteSchema,\n          ClassRef: GroupSendInvite,\n          execute: (instance, data) => groupController.sendInvite(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('revokeInviteCode'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupJid>({\n          request: req,\n          schema: groupJidSchema,\n          ClassRef: GroupJid,\n          execute: (instance, data) => groupController.revokeInviteCode(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateParticipant'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupUpdateParticipantDto>({\n          request: req,\n          schema: updateParticipantsSchema,\n          ClassRef: GroupUpdateParticipantDto,\n          execute: (instance, data) => groupController.updateGParticipate(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('updateSetting'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupUpdateSettingDto>({\n          request: req,\n          schema: updateSettingsSchema,\n          ClassRef: GroupUpdateSettingDto,\n          execute: (instance, data) => groupController.updateGSetting(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('toggleEphemeral'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupToggleEphemeralDto>({\n          request: req,\n          schema: toggleEphemeralSchema,\n          ClassRef: GroupToggleEphemeralDto,\n          execute: (instance, data) => groupController.toggleEphemeral(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .delete(this.routerPath('leaveGroup'), ...guards, async (req, res) => {\n        const response = await this.groupValidate<GroupJid>({\n          request: req,\n          schema: {},\n          ClassRef: GroupJid,\n          execute: (instance, data) => groupController.leaveGroup(instance, data),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto, SetPresenceDto } from '@api/dto/instance.dto';\nimport { instanceController } from '@api/server.module';\nimport { ConfigService } from '@config/env.config';\nimport { instanceSchema, presenceOnlySchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class InstanceRouter extends RouterBroker {\n  constructor(\n    readonly configService: ConfigService,\n    ...guards: RequestHandler[]\n  ) {\n    super();\n    this.router\n      .post('/create', ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.createInstance(instance),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('restart'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.restartInstance(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('connect'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.connectToWhatsapp(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('connectionState'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.connectionState(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .get(this.routerPath('fetchInstances', false), ...guards, async (req, res) => {\n        const key = req.get('apikey');\n\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.fetchInstances(instance, key),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('setPresence'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<null>({\n          request: req,\n          schema: presenceOnlySchema,\n          ClassRef: SetPresenceDto,\n          execute: (instance, data) => instanceController.setPresence(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .delete(this.routerPath('logout'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.logout(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .delete(this.routerPath('delete'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => instanceController.deleteInstance(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class LabelDto {\n  id?: string;\n  name: string;\n  color: string;\n  predefinedId?: string;\n}\n\nexport class HandleLabelDto {\n  number: string;\n  labelId: string;\n  action: 'add' | 'remove';\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { HandleLabelDto, LabelDto } from '@api/dto/label.dto';\nimport { labelController } from '@api/server.module';\nimport { handleLabelSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class LabelRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .get(this.routerPath('findLabels'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<LabelDto>({\n          request: req,\n          schema: null,\n          ClassRef: LabelDto,\n          execute: (instance) => labelController.fetchLabels(instance),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      })\n      .post(this.routerPath('handleLabel'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<HandleLabelDto>({\n          request: req,\n          schema: handleLabelSchema,\n          ClassRef: HandleLabelDto,\n          execute: (instance, data) => labelController.handleLabel(instance, data),\n        });\n\n        return res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class ProxyDto {\n  enabled?: boolean;\n  host: string;\n  port: string;\n  protocol: string;\n  username?: string;\n  password?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { ProxyDto } from '@api/dto/proxy.dto';\nimport { proxyController } from '@api/server.module';\nimport { instanceSchema, proxySchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class ProxyRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<ProxyDto>({\n          request: req,\n          schema: proxySchema,\n          ClassRef: ProxyDto,\n          execute: (instance, data) => proxyController.createProxy(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: instanceSchema,\n          ClassRef: InstanceDto,\n          execute: (instance) => proxyController.findProxy(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { proto, WAPresence } from 'baileys';\n\nexport class Quoted {\n  key: proto.IMessageKey;\n  message: proto.IMessage;\n}\n\nexport class Options {\n  delay?: number;\n  presence?: WAPresence;\n  quoted?: Quoted;\n  linkPreview?: boolean;\n  encoding?: boolean;\n  mentionsEveryOne?: boolean;\n  mentioned?: string[];\n  webhookUrl?: string;\n}\n\nexport class MediaMessage {\n  mediatype: MediaType;\n  mimetype?: string;\n  caption?: string;\n  // for document\n  fileName?: string;\n  // url or base64\n  media: string;\n}\n\nexport class StatusMessage {\n  type: string;\n  content: string;\n  statusJidList?: string[];\n  allContacts?: boolean;\n  caption?: string;\n  backgroundColor?: string;\n  font?: number;\n}\n\nexport class Metadata {\n  number: string;\n  delay?: number;\n  quoted?: Quoted;\n  linkPreview?: boolean;\n  mentionsEveryOne?: boolean;\n  mentioned?: string[];\n  encoding?: boolean;\n  notConvertSticker?: boolean;\n}\n\nexport class SendTextDto extends Metadata {\n  text: string;\n}\nexport class SendPresence extends Metadata {\n  text: string;\n}\n\nexport class SendStatusDto extends Metadata {\n  type: string;\n  content: string;\n  statusJidList?: string[];\n  allContacts?: boolean;\n  caption?: string;\n  backgroundColor?: string;\n  font?: number;\n}\n\nexport class SendPollDto extends Metadata {\n  name: string;\n  selectableCount: number;\n  values: string[];\n  messageSecret?: Uint8Array;\n}\n\nexport type MediaType = 'image' | 'document' | 'video' | 'audio' | 'ptv';\n\nexport class SendMediaDto extends Metadata {\n  mediatype: MediaType;\n  mimetype?: string;\n  caption?: string;\n  // for document\n  fileName?: string;\n  // url or base64\n  media: string;\n}\n\nexport class SendPtvDto extends Metadata {\n  video: string;\n}\n\nexport class SendStickerDto extends Metadata {\n  sticker: string;\n}\n\nexport class SendAudioDto extends Metadata {\n  audio: string;\n}\n\nexport type TypeButton = 'reply' | 'copy' | 'url' | 'call' | 'pix';\n\nexport type KeyType = 'phone' | 'email' | 'cpf' | 'cnpj' | 'random';\n\nexport class Button {\n  type: TypeButton;\n  displayText?: string;\n  id?: string;\n  url?: string;\n  copyCode?: string;\n  phoneNumber?: string;\n  currency?: string;\n  name?: string;\n  keyType?: KeyType;\n  key?: string;\n}\n\nexport class SendButtonsDto extends Metadata {\n  thumbnailUrl?: string;\n  title: string;\n  description?: string;\n  footer?: string;\n  buttons: Button[];\n}\n\nexport class SendLocationDto extends Metadata {\n  latitude: number;\n  longitude: number;\n  name?: string;\n  address?: string;\n}\n\nclass Row {\n  title: string;\n  description: string;\n  rowId: string;\n}\nclass Section {\n  title: string;\n  rows: Row[];\n}\nexport class SendListDto extends Metadata {\n  title: string;\n  description?: string;\n  footerText?: string;\n  buttonText: string;\n  sections: Section[];\n}\n\nexport class ContactMessage {\n  fullName: string;\n  wuid: string;\n  phoneNumber: string;\n  organization?: string;\n  email?: string;\n  url?: string;\n}\n\nexport class SendTemplateDto extends Metadata {\n  name: string;\n  language: string;\n  components: any;\n  webhookUrl?: string;\n}\nexport class SendContactDto extends Metadata {\n  contact: ContactMessage[];\n}\n\nexport class SendReactionDto {\n  key: proto.IMessageKey;\n  reaction: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport {\n  SendAudioDto,\n  SendButtonsDto,\n  SendContactDto,\n  SendListDto,\n  SendLocationDto,\n  SendMediaDto,\n  SendPollDto,\n  SendPtvDto,\n  SendReactionDto,\n  SendStatusDto,\n  SendStickerDto,\n  SendTemplateDto,\n  SendTextDto,\n} from '@api/dto/sendMessage.dto';\nimport { sendMessageController } from '@api/server.module';\nimport {\n  audioMessageSchema,\n  buttonsMessageSchema,\n  contactMessageSchema,\n  listMessageSchema,\n  locationMessageSchema,\n  mediaMessageSchema,\n  pollMessageSchema,\n  ptvMessageSchema,\n  reactionMessageSchema,\n  statusMessageSchema,\n  stickerMessageSchema,\n  templateMessageSchema,\n  textMessageSchema,\n} from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\nimport multer from 'multer';\n\nimport { HttpStatus } from './index.router';\n\nconst upload = multer({ storage: multer.memoryStorage() });\n\nexport class MessageRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('sendTemplate'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendTemplateDto>({\n          request: req,\n          schema: templateMessageSchema,\n          ClassRef: SendTemplateDto,\n          execute: (instance, data) => sendMessageController.sendTemplate(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendText'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendTextDto>({\n          request: req,\n          schema: textMessageSchema,\n          ClassRef: SendTextDto,\n          execute: (instance, data) => sendMessageController.sendText(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendMedia'), ...guards, upload.single('file'), async (req, res) => {\n        const bodyData = req.body;\n\n        const response = await this.dataValidate<SendMediaDto>({\n          request: req,\n          schema: mediaMessageSchema,\n          ClassRef: SendMediaDto,\n          execute: (instance) => sendMessageController.sendMedia(instance, bodyData, req.file as any),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendPtv'), ...guards, upload.single('file'), async (req, res) => {\n        const bodyData = req.body;\n\n        const response = await this.dataValidate<SendPtvDto>({\n          request: req,\n          schema: ptvMessageSchema,\n          ClassRef: SendPtvDto,\n          execute: (instance) => sendMessageController.sendPtv(instance, bodyData, req.file as any),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendWhatsAppAudio'), ...guards, upload.single('file'), async (req, res) => {\n        const bodyData = req.body;\n\n        const response = await this.dataValidate<SendAudioDto>({\n          request: req,\n          schema: audioMessageSchema,\n          ClassRef: SendMediaDto,\n          execute: (instance) => sendMessageController.sendWhatsAppAudio(instance, bodyData, req.file as any),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      // TODO: Revisar funcionamento do envio de Status\n      .post(this.routerPath('sendStatus'), ...guards, upload.single('file'), async (req, res) => {\n        const bodyData = req.body;\n\n        const response = await this.dataValidate<SendStatusDto>({\n          request: req,\n          schema: statusMessageSchema,\n          ClassRef: SendStatusDto,\n          execute: (instance) => sendMessageController.sendStatus(instance, bodyData, req.file as any),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendSticker'), ...guards, upload.single('file'), async (req, res) => {\n        const bodyData = req.body;\n\n        const response = await this.dataValidate<SendStickerDto>({\n          request: req,\n          schema: stickerMessageSchema,\n          ClassRef: SendStickerDto,\n          execute: (instance) => sendMessageController.sendSticker(instance, bodyData, req.file as any),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendLocation'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendLocationDto>({\n          request: req,\n          schema: locationMessageSchema,\n          ClassRef: SendLocationDto,\n          execute: (instance, data) => sendMessageController.sendLocation(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendContact'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendContactDto>({\n          request: req,\n          schema: contactMessageSchema,\n          ClassRef: SendContactDto,\n          execute: (instance, data) => sendMessageController.sendContact(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendReaction'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendReactionDto>({\n          request: req,\n          schema: reactionMessageSchema,\n          ClassRef: SendReactionDto,\n          execute: (instance, data) => sendMessageController.sendReaction(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendPoll'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendPollDto>({\n          request: req,\n          schema: pollMessageSchema,\n          ClassRef: SendPollDto,\n          execute: (instance, data) => sendMessageController.sendPoll(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendList'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendListDto>({\n          request: req,\n          schema: listMessageSchema,\n          ClassRef: SendListDto,\n          execute: (instance, data) => sendMessageController.sendList(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      })\n      .post(this.routerPath('sendButtons'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SendButtonsDto>({\n          request: req,\n          schema: buttonsMessageSchema,\n          ClassRef: SendButtonsDto,\n          execute: (instance, data) => sendMessageController.sendButtons(instance, data),\n        });\n\n        return res.status(HttpStatus.CREATED).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class SettingsDto {\n  rejectCall?: boolean;\n  msgCall?: string;\n  groupsIgnore?: boolean;\n  alwaysOnline?: boolean;\n  readMessages?: boolean;\n  readStatus?: boolean;\n  syncFullHistory?: boolean;\n  wavoipToken?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { SettingsDto } from '@api/dto/settings.dto';\nimport { settingsController } from '@api/server.module';\nimport { settingsSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class SettingsRouter extends RouterBroker {\n  constructor(...guards: RequestHandler[]) {\n    super();\n    this.router\n      .post(this.routerPath('set'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<SettingsDto>({\n          request: req,\n          schema: settingsSchema,\n          ClassRef: SettingsDto,\n          execute: (instance, data) => settingsController.createSettings(instance, data),\n        });\n\n        res.status(HttpStatus.CREATED).json(response);\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        const response = await this.dataValidate<InstanceDto>({\n          request: req,\n          schema: null,\n          ClassRef: InstanceDto,\n          execute: (instance) => settingsController.findSettings(instance),\n        });\n\n        res.status(HttpStatus.OK).json(response);\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","export class TemplateDto {\n  name: string;\n  category: string;\n  allowCategoryChange: boolean;\n  language: string;\n  components: any;\n  webhookUrl?: string;\n}\n\nexport class TemplateEditDto {\n  templateId: string;\n  category?: 'AUTHENTICATION' | 'MARKETING' | 'UTILITY';\n  allowCategoryChange?: boolean;\n  ttl?: number;\n  components?: any;\n}\n\nexport class TemplateDeleteDto {\n  name: string;\n  hsmId?: string;\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { TemplateDeleteDto, TemplateDto, TemplateEditDto } from '@api/dto/template.dto';\nimport { templateController } from '@api/server.module';\nimport { ConfigService } from '@config/env.config';\nimport { createMetaErrorResponse } from '@utils/errorResponse';\nimport { templateDeleteSchema } from '@validate/templateDelete.schema';\nimport { templateEditSchema } from '@validate/templateEdit.schema';\nimport { instanceSchema, templateSchema } from '@validate/validate.schema';\nimport { RequestHandler, Router } from 'express';\n\nimport { HttpStatus } from './index.router';\n\nexport class TemplateRouter extends RouterBroker {\n  constructor(\n    readonly configService: ConfigService,\n    ...guards: RequestHandler[]\n  ) {\n    super();\n    this.router\n      .post(this.routerPath('create'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<TemplateDto>({\n            request: req,\n            schema: templateSchema,\n            ClassRef: TemplateDto,\n            execute: (instance, data) => templateController.createTemplate(instance, data),\n          });\n\n          res.status(HttpStatus.CREATED).json(response);\n        } catch (error) {\n          // Log error for debugging\n          console.error('Template creation error:', error);\n\n          // Use utility function to create standardized error response\n          const errorResponse = createMetaErrorResponse(error, 'template_creation');\n          res.status(errorResponse.status).json(errorResponse);\n        }\n      })\n      .post(this.routerPath('edit'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<TemplateEditDto>({\n            request: req,\n            schema: templateEditSchema,\n            ClassRef: TemplateEditDto,\n            execute: (instance, data) => templateController.editTemplate(instance, data),\n          });\n\n          res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          console.error('Template edit error:', error);\n          const errorResponse = createMetaErrorResponse(error, 'template_edit');\n          res.status(errorResponse.status).json(errorResponse);\n        }\n      })\n      .delete(this.routerPath('delete'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<TemplateDeleteDto>({\n            request: req,\n            schema: templateDeleteSchema,\n            ClassRef: TemplateDeleteDto,\n            execute: (instance, data) => templateController.deleteTemplate(instance, data),\n          });\n\n          res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          console.error('Template delete error:', error);\n          const errorResponse = createMetaErrorResponse(error, 'template_delete');\n          res.status(errorResponse.status).json(errorResponse);\n        }\n      })\n      .get(this.routerPath('find'), ...guards, async (req, res) => {\n        try {\n          const response = await this.dataValidate<InstanceDto>({\n            request: req,\n            schema: instanceSchema,\n            ClassRef: InstanceDto,\n            execute: (instance) => templateController.findTemplate(instance),\n          });\n\n          res.status(HttpStatus.OK).json(response);\n        } catch (error) {\n          // Log error for debugging\n          console.error('Template find error:', error);\n\n          // Use utility function to create standardized error response\n          const errorResponse = createMetaErrorResponse(error, 'template_find');\n          res.status(errorResponse.status).json(errorResponse);\n        }\n      });\n  }\n\n  public readonly router: Router = Router();\n}\n","import { RouterBroker } from '@api/abstract/abstract.router';\nimport express, { Router } from 'express';\nimport path from 'path';\n\nexport class ViewsRouter extends RouterBroker {\n  public readonly router: Router;\n\n  constructor() {\n    super();\n    this.router = Router();\n\n    const basePath = path.join(process.cwd(), 'manager', 'dist');\n    const indexPath = path.join(basePath, 'index.html');\n\n    this.router.use(express.static(basePath));\n\n    this.router.get('*', (req, res) => {\n      res.sendFile(indexPath);\n    });\n  }\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport class BadRequestException {\n  constructor(...objectError: any[]) {\n    throw {\n      status: HttpStatus.BAD_REQUEST,\n      error: 'Bad Request',\n      message: objectError.length > 0 ? objectError : undefined,\n    };\n  }\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport class UnauthorizedException {\n  constructor(...objectError: any[]) {\n    throw {\n      status: HttpStatus.UNAUTHORIZED,\n      error: 'Unauthorized',\n      message: objectError.length > 0 ? objectError : 'Unauthorized',\n    };\n  }\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport class ForbiddenException {\n  constructor(...objectError: any[]) {\n    throw {\n      status: HttpStatus.FORBIDDEN,\n      error: 'Forbidden',\n      message: objectError.length > 0 ? objectError : undefined,\n    };\n  }\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport class NotFoundException {\n  constructor(...objectError: any[]) {\n    throw {\n      status: HttpStatus.NOT_FOUND,\n      error: 'Not Found',\n      message: objectError.length > 0 ? objectError : undefined,\n    };\n  }\n}\n","import { HttpStatus } from '@api/routes/index.router';\n\nexport class InternalServerErrorException {\n  constructor(...objectError: any[]) {\n    throw {\n      status: HttpStatus.INTERNAL_SERVER_ERROR,\n      error: 'Internal Server Error',\n      message: objectError.length > 0 ? objectError : undefined,\n    };\n  }\n}\n","import { InstanceDto, SetPresenceDto } from '@api/dto/instance.dto';\nimport { ChatwootService } from '@api/integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { channelController, eventManager } from '@api/server.module';\nimport { CacheService } from '@api/services/cache.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { SettingsService } from '@api/services/settings.service';\nimport { Events, Integration, wa } from '@api/types/wa.types';\nimport { Auth, Chatwoot, ConfigService, HttpServer, WaBusiness } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException, InternalServerErrorException, UnauthorizedException } from '@exceptions';\nimport { delay } from 'baileys';\nimport { isArray, isURL } from 'class-validator';\nimport EventEmitter2 from 'eventemitter2';\nimport { v4 } from 'uuid';\n\nimport { ProxyController } from './proxy.controller';\n\nexport class InstanceController {\n  constructor(\n    private readonly waMonitor: WAMonitoringService,\n    private readonly configService: ConfigService,\n    private readonly prismaRepository: PrismaRepository,\n    private readonly eventEmitter: EventEmitter2,\n    private readonly chatwootService: ChatwootService,\n    private readonly settingsService: SettingsService,\n    private readonly proxyService: ProxyController,\n    private readonly cache: CacheService,\n    private readonly chatwootCache: CacheService,\n    private readonly baileysCache: CacheService,\n    private readonly providerFiles: ProviderFiles,\n  ) {}\n\n  private readonly logger = new Logger('InstanceController');\n\n  public async createInstance(instanceData: InstanceDto) {\n    try {\n      const instance = channelController.init(instanceData, {\n        configService: this.configService,\n        eventEmitter: this.eventEmitter,\n        prismaRepository: this.prismaRepository,\n        cache: this.cache,\n        chatwootCache: this.chatwootCache,\n        baileysCache: this.baileysCache,\n        providerFiles: this.providerFiles,\n      });\n\n      if (!instance) {\n        throw new BadRequestException('Invalid integration');\n      }\n\n      const instanceId = v4();\n\n      instanceData.instanceId = instanceId;\n\n      let hash: string;\n\n      if (!instanceData.token) hash = v4().toUpperCase();\n      else hash = instanceData.token;\n\n      await this.waMonitor.saveInstance({\n        instanceId,\n        integration: instanceData.integration,\n        instanceName: instanceData.instanceName,\n        ownerJid: instanceData.ownerJid,\n        profileName: instanceData.profileName,\n        profilePicUrl: instanceData.profilePicUrl,\n        hash,\n        number: instanceData.number,\n        businessId: instanceData.businessId,\n        status: instanceData.status,\n      });\n\n      instance.setInstance({\n        instanceName: instanceData.instanceName,\n        instanceId,\n        integration: instanceData.integration,\n        token: hash,\n        number: instanceData.number,\n        businessId: instanceData.businessId,\n      });\n\n      this.waMonitor.waInstances[instance.instanceName] = instance;\n      this.waMonitor.delInstanceTime(instance.instanceName);\n\n      // set events\n      await eventManager.setInstance(instance.instanceName, instanceData);\n\n      instance.sendDataWebhook(Events.INSTANCE_CREATE, {\n        instanceName: instanceData.instanceName,\n        instanceId: instanceId,\n      });\n\n      const instanceDto: InstanceDto = {\n        instanceName: instance.instanceName,\n        instanceId: instance.instanceId,\n        connectionStatus:\n          typeof instance.connectionStatus === 'string'\n            ? instance.connectionStatus\n            : instance.connectionStatus?.state || 'unknown',\n      };\n\n      if (instanceData.proxyHost && instanceData.proxyPort && instanceData.proxyProtocol) {\n        const testProxy = await this.proxyService.testProxy({\n          host: instanceData.proxyHost,\n          port: instanceData.proxyPort,\n          protocol: instanceData.proxyProtocol,\n          username: instanceData.proxyUsername,\n          password: instanceData.proxyPassword,\n        });\n        if (!testProxy) {\n          throw new BadRequestException('Invalid proxy');\n        }\n        await this.proxyService.createProxy(instanceDto, {\n          enabled: true,\n          host: instanceData.proxyHost,\n          port: instanceData.proxyPort,\n          protocol: instanceData.proxyProtocol,\n          username: instanceData.proxyUsername,\n          password: instanceData.proxyPassword,\n        });\n      }\n\n      const settings: wa.LocalSettings = {\n        rejectCall: instanceData.rejectCall === true,\n        msgCall: instanceData.msgCall || '',\n        groupsIgnore: instanceData.groupsIgnore === true,\n        alwaysOnline: instanceData.alwaysOnline === true,\n        readMessages: instanceData.readMessages === true,\n        readStatus: instanceData.readStatus === true,\n        syncFullHistory: instanceData.syncFullHistory === true,\n        wavoipToken: instanceData.wavoipToken || '',\n      };\n\n      await this.settingsService.create(instanceDto, settings);\n\n      let webhookWaBusiness = null,\n        accessTokenWaBusiness = '';\n\n      if (instanceData.integration === Integration.WHATSAPP_BUSINESS) {\n        if (!instanceData.number) {\n          throw new BadRequestException('number is required');\n        }\n        const urlServer = this.configService.get<HttpServer>('SERVER').URL;\n        webhookWaBusiness = `${urlServer}/webhook/meta`;\n        accessTokenWaBusiness = this.configService.get<WaBusiness>('WA_BUSINESS').TOKEN_WEBHOOK;\n      }\n\n      if (!instanceData.chatwootAccountId || !instanceData.chatwootToken || !instanceData.chatwootUrl) {\n        let getQrcode: wa.QrCode;\n\n        if (instanceData.qrcode && instanceData.integration === Integration.WHATSAPP_BAILEYS) {\n          await instance.connectToWhatsapp(instanceData.number);\n          await delay(5000);\n          getQrcode = instance.qrCode;\n        }\n\n        const result = {\n          instance: {\n            instanceName: instance.instanceName,\n            instanceId: instanceId,\n            integration: instanceData.integration,\n            webhookWaBusiness,\n            accessTokenWaBusiness,\n            status:\n              typeof instance.connectionStatus === 'string'\n                ? instance.connectionStatus\n                : instance.connectionStatus?.state || 'unknown',\n          },\n          hash,\n          webhook: {\n            webhookUrl: instanceData?.webhook?.url,\n            webhookHeaders: instanceData?.webhook?.headers,\n            webhookByEvents: instanceData?.webhook?.byEvents,\n            webhookBase64: instanceData?.webhook?.base64,\n          },\n          websocket: {\n            enabled: instanceData?.websocket?.enabled,\n          },\n          rabbitmq: {\n            enabled: instanceData?.rabbitmq?.enabled,\n          },\n          nats: {\n            enabled: instanceData?.nats?.enabled,\n          },\n          sqs: {\n            enabled: instanceData?.sqs?.enabled,\n          },\n          settings,\n          qrcode: getQrcode,\n        };\n\n        return result;\n      }\n\n      if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED)\n        throw new BadRequestException('Chatwoot is not enabled');\n\n      if (!instanceData.chatwootAccountId) {\n        throw new BadRequestException('accountId is required');\n      }\n\n      if (!instanceData.chatwootToken) {\n        throw new BadRequestException('token is required');\n      }\n\n      if (!instanceData.chatwootUrl) {\n        throw new BadRequestException('url is required');\n      }\n\n      if (!isURL(instanceData.chatwootUrl, { require_tld: false })) {\n        throw new BadRequestException('Invalid \"url\" property in chatwoot');\n      }\n\n      if (instanceData.chatwootSignMsg !== true && instanceData.chatwootSignMsg !== false) {\n        throw new BadRequestException('signMsg is required');\n      }\n\n      if (instanceData.chatwootReopenConversation !== true && instanceData.chatwootReopenConversation !== false) {\n        throw new BadRequestException('reopenConversation is required');\n      }\n\n      if (instanceData.chatwootConversationPending !== true && instanceData.chatwootConversationPending !== false) {\n        throw new BadRequestException('conversationPending is required');\n      }\n\n      const urlServer = this.configService.get<HttpServer>('SERVER').URL;\n\n      try {\n        this.chatwootService.create(instanceDto, {\n          enabled: true,\n          accountId: instanceData.chatwootAccountId,\n          token: instanceData.chatwootToken,\n          url: instanceData.chatwootUrl,\n          signMsg: instanceData.chatwootSignMsg || false,\n          nameInbox: instanceData.chatwootNameInbox ?? instance.instanceName.split('-cwId-')[0],\n          number: instanceData.number,\n          reopenConversation: instanceData.chatwootReopenConversation || false,\n          conversationPending: instanceData.chatwootConversationPending || false,\n          importContacts: instanceData.chatwootImportContacts ?? true,\n          mergeBrazilContacts: instanceData.chatwootMergeBrazilContacts ?? false,\n          importMessages: instanceData.chatwootImportMessages ?? true,\n          daysLimitImportMessages: instanceData.chatwootDaysLimitImportMessages ?? 60,\n          organization: instanceData.chatwootOrganization,\n          logo: instanceData.chatwootLogo,\n          autoCreate: instanceData.chatwootAutoCreate !== false,\n        });\n      } catch (error) {\n        this.logger.log(error);\n      }\n\n      return {\n        instance: {\n          instanceName: instance.instanceName,\n          instanceId: instanceId,\n          integration: instanceData.integration,\n          webhookWaBusiness,\n          accessTokenWaBusiness,\n          status:\n            typeof instance.connectionStatus === 'string'\n              ? instance.connectionStatus\n              : instance.connectionStatus?.state || 'unknown',\n        },\n        hash,\n        webhook: {\n          webhookUrl: instanceData?.webhook?.url,\n          webhookHeaders: instanceData?.webhook?.headers,\n          webhookByEvents: instanceData?.webhook?.byEvents,\n          webhookBase64: instanceData?.webhook?.base64,\n        },\n        websocket: {\n          enabled: instanceData?.websocket?.enabled,\n        },\n        rabbitmq: {\n          enabled: instanceData?.rabbitmq?.enabled,\n        },\n        nats: {\n          enabled: instanceData?.nats?.enabled,\n        },\n        sqs: {\n          enabled: instanceData?.sqs?.enabled,\n        },\n        settings,\n        chatwoot: {\n          enabled: true,\n          accountId: instanceData.chatwootAccountId,\n          token: instanceData.chatwootToken,\n          url: instanceData.chatwootUrl,\n          signMsg: instanceData.chatwootSignMsg || false,\n          reopenConversation: instanceData.chatwootReopenConversation || false,\n          conversationPending: instanceData.chatwootConversationPending || false,\n          mergeBrazilContacts: instanceData.chatwootMergeBrazilContacts ?? false,\n          importContacts: instanceData.chatwootImportContacts ?? true,\n          importMessages: instanceData.chatwootImportMessages ?? true,\n          daysLimitImportMessages: instanceData.chatwootDaysLimitImportMessages || 60,\n          number: instanceData.number,\n          nameInbox: instanceData.chatwootNameInbox ?? instance.instanceName,\n          webhookUrl: `${urlServer}/chatwoot/webhook/${encodeURIComponent(instance.instanceName)}`,\n        },\n      };\n    } catch (error) {\n      this.waMonitor.deleteInstance(instanceData.instanceName);\n      this.logger.error(isArray(error.message) ? error.message[0] : error.message);\n      throw new BadRequestException(isArray(error.message) ? error.message[0] : error.message);\n    }\n  }\n\n  public async connectToWhatsapp({ instanceName, number = null }: InstanceDto) {\n    try {\n      const instance = this.waMonitor.waInstances[instanceName];\n      const state = instance?.connectionStatus?.state;\n\n      if (!state) {\n        throw new BadRequestException('The \"' + instanceName + '\" instance does not exist');\n      }\n\n      if (state == 'open') {\n        return await this.connectionState({ instanceName });\n      }\n\n      if (state == 'connecting') {\n        return instance.qrCode;\n      }\n\n      if (state == 'close') {\n        await instance.connectToWhatsapp(number);\n\n        await delay(2000);\n        return instance.qrCode;\n      }\n\n      return {\n        instance: {\n          instanceName: instanceName,\n          status: state,\n        },\n        qrcode: instance?.qrCode,\n      };\n    } catch (error) {\n      this.logger.error(error);\n      return { error: true, message: error.toString() };\n    }\n  }\n\n  public async restartInstance({ instanceName }: InstanceDto) {\n    try {\n      const instance = this.waMonitor.waInstances[instanceName];\n      const state = instance?.connectionStatus?.state;\n\n      if (!state) {\n        throw new BadRequestException('The \"' + instanceName + '\" instance does not exist');\n      }\n\n      if (state === 'close') {\n        throw new BadRequestException('The \"' + instanceName + '\" instance is not connected');\n      }\n      this.logger.info(`Restarting instance: ${instanceName}`);\n\n      if (typeof instance.restart === 'function') {\n        await instance.restart();\n        // Wait a bit for the reconnection to be established\n        await new Promise((r) => setTimeout(r, 2000));\n        return {\n          instance: {\n            instanceName: instanceName,\n            status: instance.connectionStatus?.state || 'connecting',\n          },\n        };\n      }\n\n      // Fallback for Baileys (uses different mechanism)\n      if (state === 'open' || state === 'connecting') {\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) instance.clearCacheChatwoot();\n\n        instance.client?.ws?.close();\n        instance.client?.end(new Error('restart'));\n        return await this.connectToWhatsapp({ instanceName });\n      }\n\n      return {\n        instance: {\n          instanceName: instanceName,\n          status: state,\n        },\n      };\n    } catch (error) {\n      this.logger.error(error);\n      return { error: true, message: error.toString() };\n    }\n  }\n\n  public async connectionState({ instanceName }: InstanceDto) {\n    return {\n      instance: {\n        instanceName: instanceName,\n        state: this.waMonitor.waInstances[instanceName]?.connectionStatus?.state,\n      },\n    };\n  }\n\n  public async fetchInstances({ instanceName, instanceId, number }: InstanceDto, key: string) {\n    const env = this.configService.get<Auth>('AUTHENTICATION').API_KEY;\n\n    if (env.KEY !== key) {\n      const instancesByKey = await this.prismaRepository.instance.findMany({\n        where: {\n          token: key,\n          name: instanceName || undefined,\n          id: instanceId || undefined,\n        },\n      });\n\n      if (instancesByKey.length > 0) {\n        const names = instancesByKey.map((instance) => instance.name);\n\n        return this.waMonitor.instanceInfo(names);\n      } else {\n        throw new UnauthorizedException();\n      }\n    }\n\n    if (instanceId || number) {\n      return this.waMonitor.instanceInfoById(instanceId, number);\n    }\n\n    const instanceNames = instanceName ? [instanceName] : null;\n\n    return this.waMonitor.instanceInfo(instanceNames);\n  }\n\n  public async setPresence({ instanceName }: InstanceDto, data: SetPresenceDto) {\n    return await this.waMonitor.waInstances[instanceName].setPresence(data);\n  }\n\n  public async logout({ instanceName }: InstanceDto) {\n    const { instance } = await this.connectionState({ instanceName });\n\n    if (instance.state === 'close') {\n      throw new BadRequestException('The \"' + instanceName + '\" instance is not connected');\n    }\n\n    try {\n      await this.waMonitor.waInstances[instanceName]?.logoutInstance();\n\n      return { status: 'SUCCESS', error: false, response: { message: 'Instance logged out' } };\n    } catch (error) {\n      throw new InternalServerErrorException(error.toString());\n    }\n  }\n\n  public async deleteInstance({ instanceName }: InstanceDto) {\n    const { instance } = await this.connectionState({ instanceName });\n    try {\n      const waInstances = this.waMonitor.waInstances[instanceName];\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) waInstances?.clearCacheChatwoot();\n\n      if (instance.state === 'connecting' || instance.state === 'open') {\n        await this.logout({ instanceName });\n      }\n\n      try {\n        waInstances?.sendDataWebhook(Events.INSTANCE_DELETE, {\n          instanceName,\n          instanceId: waInstances.instanceId,\n        });\n      } catch (error) {\n        this.logger.error(error);\n      }\n\n      this.eventEmitter.emit('remove.instance', instanceName, 'inner');\n      return { status: 'SUCCESS', error: false, response: { message: 'Instance deleted' } };\n    } catch (error) {\n      throw new BadRequestException(error.toString());\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { HandleLabelDto } from '@api/dto/label.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\n\nexport class LabelController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async fetchLabels({ instanceName }: InstanceDto) {\n    return await this.waMonitor.waInstances[instanceName].fetchLabels();\n  }\n\n  public async handleLabel({ instanceName }: InstanceDto, data: HandleLabelDto) {\n    return await this.waMonitor.waInstances[instanceName].handleLabel(data);\n  }\n}\n","import { socksDispatcher } from 'fetch-socks';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\nimport { ProxyAgent } from 'undici';\n\ntype Proxy = {\n  host: string;\n  password?: string;\n  port: string;\n  protocol: string;\n  username?: string;\n};\n\nfunction selectProxyAgent(proxyUrl: string): HttpsProxyAgent<string> | SocksProxyAgent {\n  const url = new URL(proxyUrl);\n\n  // NOTE: The following constants are not used in the function but are defined for clarity.\n  // When a proxy URL is used to build the URL object, the protocol returned by procotol's property contains a `:` at\n  // the end so, we add the protocol constants without the `:` to avoid confusion.\n  const PROXY_HTTP_PROTOCOL = 'http:';\n  const PROXY_SOCKS_PROTOCOL = 'socks:';\n  const PROXY_SOCKS5_PROTOCOL = 'socks5:';\n\n  switch (url.protocol) {\n    case PROXY_HTTP_PROTOCOL:\n      return new HttpsProxyAgent(url);\n    case PROXY_SOCKS_PROTOCOL:\n    case PROXY_SOCKS5_PROTOCOL: {\n      let urlSocks = '';\n\n      if (url.username && url.password) {\n        urlSocks = `socks://${url.username}:${url.password}@${url.hostname}:${url.port}`;\n      } else {\n        urlSocks = `socks://${url.hostname}:${url.port}`;\n      }\n\n      return new SocksProxyAgent(urlSocks);\n    }\n    default:\n      throw new Error(`Unsupported proxy protocol: ${url.protocol}`);\n  }\n}\n\nexport function makeProxyAgent(proxy: Proxy | string): HttpsProxyAgent<string> | SocksProxyAgent {\n  if (typeof proxy === 'string') {\n    return selectProxyAgent(proxy);\n  }\n\n  const { host, password, port, protocol, username } = proxy;\n  let proxyUrl = `${protocol}://${host}:${port}`;\n\n  if (username && password) {\n    proxyUrl = `${protocol}://${username}:${password}@${host}:${port}`;\n  }\n\n  return selectProxyAgent(proxyUrl);\n}\n\nexport function makeProxyAgentUndici(proxy: Proxy | string): ProxyAgent {\n  let proxyUrl: string;\n  let protocol: string;\n\n  if (typeof proxy === 'string') {\n    const url = new URL(proxy);\n    protocol = url.protocol.replace(':', '');\n    proxyUrl = proxy;\n  } else {\n    const { host, password, port, protocol: proto, username } = proxy;\n    protocol = (proto || 'http').replace(':', '');\n\n    if (protocol === 'socks') {\n      protocol = 'socks5';\n    }\n\n    const auth = username && password ? `${username}:${password}@` : '';\n    proxyUrl = `${protocol}://${auth}${host}:${port}`;\n  }\n\n  protocol = protocol.toLowerCase();\n\n  const PROXY_HTTP_PROTOCOL = 'http';\n  const PROXY_HTTPS_PROTOCOL = 'https';\n  const PROXY_SOCKS4_PROTOCOL = 'socks4';\n  const PROXY_SOCKS5_PROTOCOL = 'socks5';\n\n  switch (protocol) {\n    case PROXY_HTTP_PROTOCOL:\n    case PROXY_HTTPS_PROTOCOL:\n      return new ProxyAgent(proxyUrl);\n\n    case PROXY_SOCKS4_PROTOCOL:\n    case PROXY_SOCKS5_PROTOCOL: {\n      let type: 4 | 5 = 5;\n\n      if (PROXY_SOCKS4_PROTOCOL === protocol) type = 4;\n\n      const url = new URL(proxyUrl);\n\n      return socksDispatcher({\n        type: type,\n        host: url.hostname,\n        port: Number(url.port),\n        userId: url.username || undefined,\n        password: url.password || undefined,\n      });\n    }\n\n    default:\n      throw new Error(`Unsupported proxy protocol: ${protocol}`);\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ProxyDto } from '@api/dto/proxy.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { ProxyService } from '@api/services/proxy.service';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException, NotFoundException } from '@exceptions';\nimport { makeProxyAgent } from '@utils/makeProxyAgent';\nimport axios from 'axios';\n\nconst logger = new Logger('ProxyController');\n\nexport class ProxyController {\n  constructor(\n    private readonly proxyService: ProxyService,\n    private readonly waMonitor: WAMonitoringService,\n  ) {}\n\n  public async createProxy(instance: InstanceDto, data: ProxyDto) {\n    if (!this.waMonitor.waInstances[instance.instanceName]) {\n      throw new NotFoundException(`The \"${instance.instanceName}\" instance does not exist`);\n    }\n\n    if (!data?.enabled) {\n      data.host = '';\n      data.port = '';\n      data.protocol = '';\n      data.username = '';\n      data.password = '';\n    }\n\n    if (data.host) {\n      const testProxy = await this.testProxy(data);\n      if (!testProxy) {\n        throw new BadRequestException('Invalid proxy');\n      }\n    }\n\n    return this.proxyService.create(instance, data);\n  }\n\n  public async findProxy(instance: InstanceDto) {\n    if (!this.waMonitor.waInstances[instance.instanceName]) {\n      throw new NotFoundException(`The \"${instance.instanceName}\" instance does not exist`);\n    }\n\n    return this.proxyService.find(instance);\n  }\n\n  public async testProxy(proxy: ProxyDto) {\n    try {\n      const serverIp = await axios.get('https://icanhazip.com/');\n      const response = await axios.get('https://icanhazip.com/', {\n        httpsAgent: makeProxyAgent(proxy),\n      });\n\n      const result = response?.data !== serverIp?.data;\n      if (result) {\n        logger.info('testProxy: proxy connection successful');\n      } else {\n        logger.warn(\"testProxy: proxy connection doesn't change the origin IP\");\n      }\n\n      return result;\n    } catch (error) {\n      if (axios.isAxiosError(error)) {\n        logger.error('testProxy error: axios error: ' + error.message);\n      } else {\n        logger.error('testProxy error: unexpected error: ' + error);\n      }\n\n      return false;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport {\n  SendAudioDto,\n  SendButtonsDto,\n  SendContactDto,\n  SendListDto,\n  SendLocationDto,\n  SendMediaDto,\n  SendPollDto,\n  SendPtvDto,\n  SendReactionDto,\n  SendStatusDto,\n  SendStickerDto,\n  SendTemplateDto,\n  SendTextDto,\n} from '@api/dto/sendMessage.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { BadRequestException } from '@exceptions';\nimport { isBase64, isURL } from 'class-validator';\nimport emojiRegex from 'emoji-regex';\n\nconst regex = emojiRegex();\n\nfunction isEmoji(str: string) {\n  if (str === '') return true;\n\n  const match = str.match(regex);\n  return match?.length === 1 && match[0] === str;\n}\n\nexport class SendMessageController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async sendTemplate({ instanceName }: InstanceDto, data: SendTemplateDto) {\n    return await this.waMonitor.waInstances[instanceName].templateMessage(data);\n  }\n\n  public async sendText({ instanceName }: InstanceDto, data: SendTextDto) {\n    return await this.waMonitor.waInstances[instanceName].textMessage(data);\n  }\n\n  public async sendMedia({ instanceName }: InstanceDto, data: SendMediaDto, file?: any) {\n    if (isBase64(data?.media) && !data?.fileName && data?.mediatype === 'document') {\n      throw new BadRequestException('For base64 the file name must be informed.');\n    }\n\n    if (file || isURL(data?.media) || isBase64(data?.media)) {\n      return await this.waMonitor.waInstances[instanceName].mediaMessage(data, file);\n    }\n    throw new BadRequestException('Owned media must be a url or base64');\n  }\n\n  public async sendPtv({ instanceName }: InstanceDto, data: SendPtvDto, file?: any) {\n    if (file || isURL(data?.video) || isBase64(data?.video)) {\n      return await this.waMonitor.waInstances[instanceName].ptvMessage(data, file);\n    }\n    throw new BadRequestException('Owned media must be a url or base64');\n  }\n\n  public async sendSticker({ instanceName }: InstanceDto, data: SendStickerDto, file?: any) {\n    if (file || isURL(data.sticker) || isBase64(data.sticker)) {\n      return await this.waMonitor.waInstances[instanceName].mediaSticker(data, file);\n    }\n    throw new BadRequestException('Owned media must be a url or base64');\n  }\n\n  public async sendWhatsAppAudio({ instanceName }: InstanceDto, data: SendAudioDto, file?: any) {\n    if (file?.buffer || isURL(data.audio) || isBase64(data.audio)) {\n      // Si file existe y tiene buffer, o si es una URL o Base64, continúa\n      return await this.waMonitor.waInstances[instanceName].audioWhatsapp(data, file);\n    } else {\n      console.error('El archivo no tiene buffer o el audio no es una URL o Base64 válida');\n      throw new BadRequestException('Owned media must be a url, base64, or valid file with buffer');\n    }\n  }\n\n  public async sendButtons({ instanceName }: InstanceDto, data: SendButtonsDto) {\n    return await this.waMonitor.waInstances[instanceName].buttonMessage(data);\n  }\n\n  public async sendLocation({ instanceName }: InstanceDto, data: SendLocationDto) {\n    return await this.waMonitor.waInstances[instanceName].locationMessage(data);\n  }\n\n  public async sendList({ instanceName }: InstanceDto, data: SendListDto) {\n    return await this.waMonitor.waInstances[instanceName].listMessage(data);\n  }\n\n  public async sendContact({ instanceName }: InstanceDto, data: SendContactDto) {\n    return await this.waMonitor.waInstances[instanceName].contactMessage(data);\n  }\n\n  public async sendReaction({ instanceName }: InstanceDto, data: SendReactionDto) {\n    if (!isEmoji(data.reaction)) {\n      throw new BadRequestException('Reaction must be a single emoji or empty string');\n    }\n    return await this.waMonitor.waInstances[instanceName].reactionMessage(data);\n  }\n\n  public async sendPoll({ instanceName }: InstanceDto, data: SendPollDto) {\n    return await this.waMonitor.waInstances[instanceName].pollMessage(data);\n  }\n\n  public async sendStatus({ instanceName }: InstanceDto, data: SendStatusDto, file?: any) {\n    return await this.waMonitor.waInstances[instanceName].statusMessage(data, file);\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { SettingsDto } from '@api/dto/settings.dto';\nimport { SettingsService } from '@api/services/settings.service';\n\nexport class SettingsController {\n  constructor(private readonly settingsService: SettingsService) {}\n\n  public async createSettings(instance: InstanceDto, data: SettingsDto) {\n    return this.settingsService.create(instance, data);\n  }\n\n  public async findSettings(instance: InstanceDto) {\n    const settings = this.settingsService.find(instance);\n    return settings;\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { TemplateDto } from '@api/dto/template.dto';\nimport { TemplateService } from '@api/services/template.service';\n\nexport class TemplateController {\n  constructor(private readonly templateService: TemplateService) {}\n\n  public async createTemplate(instance: InstanceDto, data: TemplateDto) {\n    return this.templateService.create(instance, data);\n  }\n\n  public async findTemplate(instance: InstanceDto) {\n    return this.templateService.find(instance);\n  }\n\n  public async editTemplate(\n    instance: InstanceDto,\n    data: { templateId: string; category?: string; components?: any; allowCategoryChange?: boolean; ttl?: number },\n  ) {\n    return this.templateService.edit(instance, data);\n  }\n\n  public async deleteTemplate(instance: InstanceDto, data: { name: string; hsmId?: string }) {\n    return this.templateService.delete(instance, data);\n  }\n}\n","import { ConfigService, S3 } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport * as MinIo from 'minio';\nimport { join } from 'path';\nimport { Readable, Transform } from 'stream';\n\nconst logger = new Logger('S3 Service');\n\nconst BUCKET = new ConfigService().get<S3>('S3');\n\ninterface Metadata extends MinIo.ItemBucketMetadata {\n  'Content-Type': string;\n}\n\nconst minioClient = (() => {\n  if (BUCKET?.ENABLE) {\n    return new MinIo.Client({\n      endPoint: BUCKET.ENDPOINT,\n      port: BUCKET.PORT,\n      useSSL: BUCKET.USE_SSL,\n      accessKey: BUCKET.ACCESS_KEY,\n      secretKey: BUCKET.SECRET_KEY,\n      region: BUCKET.REGION,\n    });\n  }\n})();\n\nconst bucketName = BUCKET.BUCKET_NAME;\n\nconst bucketExists = async () => {\n  if (minioClient) {\n    try {\n      const list = await minioClient.listBuckets();\n      return list.find((bucket) => bucket.name === bucketName);\n    } catch {\n      return false;\n    }\n  }\n};\n\nconst setBucketPolicy = async () => {\n  if (minioClient) {\n    const policy = {\n      Version: '2012-10-17',\n      Statement: [\n        {\n          Effect: 'Allow',\n          Principal: '*',\n          Action: ['s3:GetObject'],\n          Resource: [`arn:aws:s3:::${bucketName}/*`],\n        },\n      ],\n    };\n    await minioClient.setBucketPolicy(bucketName, JSON.stringify(policy));\n  }\n};\n\nconst createBucket = async () => {\n  if (minioClient) {\n    try {\n      const exists = await bucketExists();\n      if (!exists) {\n        await minioClient.makeBucket(bucketName);\n      }\n      if (!BUCKET.SKIP_POLICY) {\n        await setBucketPolicy();\n      }\n      logger.info(`S3 Bucket ${bucketName} - ON`);\n      return true;\n    } catch (error) {\n      logger.error('S3 ERROR:');\n      logger.error(error);\n      return false;\n    }\n  }\n};\n\ncreateBucket();\n\nconst uploadFile = async (fileName: string, file: Buffer | Transform | Readable, size: number, metadata: Metadata) => {\n  if (minioClient) {\n    const objectName = join('evolution-api', fileName);\n    try {\n      metadata['custom-header-application'] = 'evolution-api';\n      return await minioClient.putObject(bucketName, objectName, file, size, metadata);\n    } catch (error) {\n      logger.error(error);\n      return error;\n    }\n  }\n};\n\nconst getObjectUrl = async (fileName: string, expiry?: number) => {\n  if (minioClient) {\n    try {\n      const objectName = join('evolution-api', fileName);\n      if (expiry) {\n        return await minioClient.presignedGetObject(bucketName, objectName, expiry);\n      }\n      return await minioClient.presignedGetObject(bucketName, objectName);\n    } catch (error) {\n      throw new BadRequestException(error?.message);\n    }\n  }\n};\n\nconst uploadTempFile = async (\n  folder: string,\n  fileName: string,\n  file: Buffer | Transform | Readable,\n  size: number,\n  metadata: Metadata,\n) => {\n  if (minioClient) {\n    const objectName = join(folder, fileName);\n    try {\n      metadata['custom-header-application'] = 'evolution-api';\n      return await minioClient.putObject(bucketName, objectName, file, size, metadata);\n    } catch (error) {\n      logger.error(error);\n      return error;\n    }\n  }\n};\n\nconst deleteFile = async (folder: string, fileName: string) => {\n  if (minioClient) {\n    const objectName = join(folder, fileName);\n    try {\n      return await minioClient.removeObject(bucketName, objectName);\n    } catch (error) {\n      logger.error(error);\n      return error;\n    }\n  }\n};\n\nexport { BUCKET, deleteFile, getObjectUrl, uploadFile, uploadTempFile };\n","import { Chatwoot, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport postgresql from 'pg';\n\nconst { Pool } = postgresql;\n\nclass Postgres {\n  private logger = new Logger('Postgres');\n  private pool;\n  private connected = false;\n\n  getConnection(connectionString: string) {\n    if (this.connected) {\n      return this.pool;\n    } else {\n      this.pool = new Pool({\n        connectionString,\n        ssl: {\n          rejectUnauthorized: false,\n        },\n      });\n\n      this.pool.on('error', () => {\n        this.logger.error('postgres disconnected');\n        this.connected = false;\n      });\n\n      try {\n        this.connected = true;\n      } catch (e) {\n        this.connected = false;\n        this.logger.error('postgres connect exception caught: ' + e);\n        return null;\n      }\n\n      return this.pool;\n    }\n  }\n\n  getChatwootConnection() {\n    const uri = configService.get<Chatwoot>('CHATWOOT').IMPORT.DATABASE.CONNECTION.URI;\n\n    return this.getConnection(uri);\n  }\n}\n\nexport const postgresClient = new Postgres();\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { postgresClient } from '@api/integrations/chatbot/chatwoot/libs/postgres.client';\nimport { ChatwootService } from '@api/integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { Chatwoot, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { inbox } from '@figuro/chatwoot-sdk';\nimport { Chatwoot as ChatwootModel, Contact, Message } from '@prisma/client';\nimport { proto } from 'baileys';\n\ntype ChatwootUser = {\n  user_type: string;\n  user_id: number;\n};\n\ntype FksChatwoot = {\n  phone_number: string;\n  contact_id: string;\n  conversation_id: string;\n};\n\ntype firstLastTimestamp = {\n  first: number;\n  last: number;\n};\n\ntype IWebMessageInfo = Omit<proto.IWebMessageInfo, 'key'> & Partial<Pick<proto.IWebMessageInfo, 'key'>>;\n\nclass ChatwootImport {\n  private logger = new Logger('ChatwootImport');\n  private repositoryMessagesCache = new Map<string, Set<string>>();\n  private historyMessages = new Map<string, Message[]>();\n  private historyContacts = new Map<string, Contact[]>();\n\n  public getRepositoryMessagesCache(instance: InstanceDto) {\n    return this.repositoryMessagesCache.has(instance.instanceName)\n      ? this.repositoryMessagesCache.get(instance.instanceName)\n      : null;\n  }\n\n  public setRepositoryMessagesCache(instance: InstanceDto, repositoryMessagesCache: Set<string>) {\n    this.repositoryMessagesCache.set(instance.instanceName, repositoryMessagesCache);\n  }\n\n  public deleteRepositoryMessagesCache(instance: InstanceDto) {\n    this.repositoryMessagesCache.delete(instance.instanceName);\n  }\n\n  public addHistoryMessages(instance: InstanceDto, messagesRaw: Message[]) {\n    const actualValue = this.historyMessages.has(instance.instanceName)\n      ? this.historyMessages.get(instance.instanceName)\n      : [];\n    this.historyMessages.set(instance.instanceName, [...actualValue, ...messagesRaw]);\n  }\n\n  public addHistoryContacts(instance: InstanceDto, contactsRaw: Contact[]) {\n    const actualValue = this.historyContacts.has(instance.instanceName)\n      ? this.historyContacts.get(instance.instanceName)\n      : [];\n    this.historyContacts.set(instance.instanceName, actualValue.concat(contactsRaw));\n  }\n\n  public deleteHistoryMessages(instance: InstanceDto) {\n    this.historyMessages.delete(instance.instanceName);\n  }\n\n  public deleteHistoryContacts(instance: InstanceDto) {\n    this.historyContacts.delete(instance.instanceName);\n  }\n\n  public clearAll(instance: InstanceDto) {\n    this.deleteRepositoryMessagesCache(instance);\n    this.deleteHistoryMessages(instance);\n    this.deleteHistoryContacts(instance);\n  }\n\n  public getHistoryMessagesLenght(instance: InstanceDto) {\n    return this.historyMessages.get(instance.instanceName)?.length ?? 0;\n  }\n\n  public async importHistoryContacts(instance: InstanceDto, provider: ChatwootDto) {\n    try {\n      if (this.getHistoryMessagesLenght(instance) > 0) {\n        return;\n      }\n\n      const pgClient = postgresClient.getChatwootConnection();\n\n      let totalContactsImported = 0;\n\n      const contacts = this.historyContacts.get(instance.instanceName) || [];\n      if (contacts.length === 0) {\n        return 0;\n      }\n\n      let contactsChunk: Contact[] = this.sliceIntoChunks(contacts, 3000);\n      while (contactsChunk.length > 0) {\n        const labelSql = `SELECT id FROM labels WHERE title = '${provider.nameInbox}' AND account_id = ${provider.accountId} LIMIT 1`;\n\n        let labelId = (await pgClient.query(labelSql))?.rows[0]?.id;\n\n        if (!labelId) {\n          // creating label in chatwoot db and getting the id\n          const sqlLabel = `INSERT INTO labels (title, color, show_on_sidebar, account_id, created_at, updated_at) VALUES ('${provider.nameInbox}', '#34039B', true, ${provider.accountId}, NOW(), NOW()) RETURNING id`;\n\n          labelId = (await pgClient.query(sqlLabel))?.rows[0]?.id;\n        }\n\n        // inserting contacts in chatwoot db\n        let sqlInsert = `INSERT INTO contacts\n          (name, phone_number, account_id, identifier, created_at, updated_at) VALUES `;\n        const bindInsert = [provider.accountId];\n\n        for (const contact of contactsChunk) {\n          const isGroup = this.isIgnorePhoneNumber(contact.remoteJid);\n\n          const contactName = isGroup ? `${contact.pushName} (GROUP)` : contact.pushName;\n          bindInsert.push(contactName);\n          const bindName = `$${bindInsert.length}`;\n\n          let bindPhoneNumber: string;\n          if (!isGroup) {\n            bindInsert.push(`+${contact.remoteJid.split('@')[0]}`);\n            bindPhoneNumber = `$${bindInsert.length}`;\n          } else {\n            bindPhoneNumber = 'NULL';\n          }\n          bindInsert.push(contact.remoteJid);\n          const bindIdentifier = `$${bindInsert.length}`;\n\n          sqlInsert += `(${bindName}, ${bindPhoneNumber}, $1, ${bindIdentifier}, NOW(), NOW()),`;\n        }\n        if (sqlInsert.slice(-1) === ',') {\n          sqlInsert = sqlInsert.slice(0, -1);\n        }\n        sqlInsert += ` ON CONFLICT (identifier, account_id)\n                       DO UPDATE SET\n                        name = EXCLUDED.name,\n                        phone_number = EXCLUDED.phone_number,\n                        updated_at = NOW()`;\n\n        totalContactsImported += (await pgClient.query(sqlInsert, bindInsert))?.rowCount ?? 0;\n\n        const sqlTags = `SELECT id FROM tags WHERE name = '${provider.nameInbox}' LIMIT 1`;\n\n        const tagData = (await pgClient.query(sqlTags))?.rows[0];\n        let tagId = tagData?.id;\n\n        const sqlTag = `INSERT INTO tags (name, taggings_count) VALUES ('${provider.nameInbox}', ${totalContactsImported}) ON CONFLICT (name) DO UPDATE SET taggings_count = tags.taggings_count + ${totalContactsImported} RETURNING id`;\n\n        tagId = (await pgClient.query(sqlTag))?.rows[0]?.id;\n\n        await pgClient.query(sqlTag);\n\n        let sqlInsertLabel = `INSERT INTO taggings (tag_id, taggable_type, taggable_id, context, created_at) VALUES `;\n\n        contactsChunk.forEach((contact) => {\n          const bindTaggableId = `(SELECT id FROM contacts WHERE identifier = '${contact.remoteJid}' AND account_id = ${provider.accountId})`;\n          sqlInsertLabel += `($1, $2, ${bindTaggableId}, $3, NOW()),`;\n        });\n\n        if (sqlInsertLabel.slice(-1) === ',') {\n          sqlInsertLabel = sqlInsertLabel.slice(0, -1);\n        }\n\n        await pgClient.query(sqlInsertLabel, [tagId, 'Contact', 'labels']);\n\n        contactsChunk = this.sliceIntoChunks(contacts, 3000);\n      }\n\n      this.deleteHistoryContacts(instance);\n\n      return totalContactsImported;\n    } catch (error) {\n      this.logger.error(`Error on import history contacts: ${error.toString()}`);\n    }\n  }\n\n  public async getExistingSourceIds(sourceIds: string[], conversationId?: number): Promise<Set<string>> {\n    try {\n      const existingSourceIdsSet = new Set<string>();\n\n      if (sourceIds.length === 0) {\n        return existingSourceIdsSet;\n      }\n\n      // Ensure all sourceIds are consistently prefixed with 'WAID:' as required by downstream systems and database queries.\n      const formattedSourceIds = sourceIds.map((sourceId) => `WAID:${sourceId.replace('WAID:', '')}`);\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const params = conversationId ? [formattedSourceIds, conversationId] : [formattedSourceIds];\n\n      const query = conversationId\n        ? 'SELECT source_id FROM messages WHERE source_id = ANY($1) AND conversation_id = $2'\n        : 'SELECT source_id FROM messages WHERE source_id = ANY($1)';\n\n      const result = await pgClient.query(query, params);\n      for (const row of result.rows) {\n        existingSourceIdsSet.add(row.source_id);\n      }\n\n      return existingSourceIdsSet;\n    } catch (error) {\n      this.logger.error(`Error on getExistingSourceIds: ${error.toString()}`);\n      return new Set<string>();\n    }\n  }\n\n  public async importHistoryMessages(\n    instance: InstanceDto,\n    chatwootService: ChatwootService,\n    inbox: inbox,\n    provider: ChatwootModel,\n  ) {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const chatwootUser = await this.getChatwootUser(provider);\n      if (!chatwootUser) {\n        throw new Error('User not found to import messages.');\n      }\n\n      let totalMessagesImported = 0;\n\n      let messagesOrdered = this.historyMessages.get(instance.instanceName) || [];\n      if (messagesOrdered.length === 0) {\n        return 0;\n      }\n\n      // ordering messages by number and timestamp asc\n      messagesOrdered.sort((a, b) => {\n        const aKey = a.key as {\n          remoteJid: string;\n        };\n\n        const bKey = b.key as {\n          remoteJid: string;\n        };\n\n        const aMessageTimestamp = a.messageTimestamp as any as number;\n        const bMessageTimestamp = b.messageTimestamp as any as number;\n\n        return parseInt(aKey.remoteJid) - parseInt(bKey.remoteJid) || aMessageTimestamp - bMessageTimestamp;\n      });\n\n      const allMessagesMappedByPhoneNumber = this.createMessagesMapByPhoneNumber(messagesOrdered);\n      // Map structure: +552199999999 => { first message timestamp from number, last message timestamp from number}\n      const phoneNumbersWithTimestamp = new Map<string, firstLastTimestamp>();\n      allMessagesMappedByPhoneNumber.forEach((messages: Message[], phoneNumber: string) => {\n        phoneNumbersWithTimestamp.set(phoneNumber, {\n          first: messages[0]?.messageTimestamp as any as number,\n          last: messages[messages.length - 1]?.messageTimestamp as any as number,\n        });\n      });\n\n      const existingSourceIds = await this.getExistingSourceIds(messagesOrdered.map((message: any) => message.key.id));\n      messagesOrdered = messagesOrdered.filter((message: any) => !existingSourceIds.has(message.key.id));\n      // processing messages in batch\n      const batchSize = 4000;\n      let messagesChunk: Message[] = this.sliceIntoChunks(messagesOrdered, batchSize);\n      while (messagesChunk.length > 0) {\n        // Map structure: +552199999999 => Message[]\n        const messagesByPhoneNumber = this.createMessagesMapByPhoneNumber(messagesChunk);\n\n        if (messagesByPhoneNumber.size > 0) {\n          const fksByNumber = await this.selectOrCreateFksFromChatwoot(\n            provider,\n            inbox,\n            phoneNumbersWithTimestamp,\n            messagesByPhoneNumber,\n          );\n\n          // inserting messages in chatwoot db\n          let sqlInsertMsg = `INSERT INTO messages\n            (content, processed_message_content, account_id, inbox_id, conversation_id, message_type, private, content_type,\n            sender_type, sender_id, source_id, created_at, updated_at) VALUES `;\n          const bindInsertMsg = [provider.accountId, inbox.id];\n\n          messagesByPhoneNumber.forEach((messages: any[], phoneNumber: string) => {\n            const fksChatwoot = fksByNumber.get(phoneNumber);\n\n            messages.forEach((message) => {\n              if (!message.message) {\n                return;\n              }\n\n              if (!fksChatwoot?.conversation_id || !fksChatwoot?.contact_id) {\n                return;\n              }\n\n              const contentMessage = this.getContentMessage(chatwootService, message);\n              if (!contentMessage) {\n                return;\n              }\n\n              bindInsertMsg.push(contentMessage);\n              const bindContent = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(fksChatwoot.conversation_id);\n              const bindConversationId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? '1' : '0');\n              const bindMessageType = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? chatwootUser.user_type : 'Contact');\n              const bindSenderType = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.key.fromMe ? chatwootUser.user_id : fksChatwoot.contact_id);\n              const bindSenderId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push('WAID:' + message.key.id);\n              const bindSourceId = `$${bindInsertMsg.length}`;\n\n              bindInsertMsg.push(message.messageTimestamp as number);\n              const bindmessageTimestamp = `$${bindInsertMsg.length}`;\n\n              sqlInsertMsg += `(${bindContent}, ${bindContent}, $1, $2, ${bindConversationId}, ${bindMessageType}, FALSE, 0,\n                  ${bindSenderType},${bindSenderId},${bindSourceId}, to_timestamp(${bindmessageTimestamp}), to_timestamp(${bindmessageTimestamp})),`;\n            });\n          });\n          if (bindInsertMsg.length > 2) {\n            if (sqlInsertMsg.slice(-1) === ',') {\n              sqlInsertMsg = sqlInsertMsg.slice(0, -1);\n            }\n            totalMessagesImported += (await pgClient.query(sqlInsertMsg, bindInsertMsg))?.rowCount ?? 0;\n          }\n        }\n        messagesChunk = this.sliceIntoChunks(messagesOrdered, batchSize);\n      }\n\n      this.deleteHistoryMessages(instance);\n      this.deleteRepositoryMessagesCache(instance);\n\n      const providerData: ChatwootDto = {\n        ...provider,\n        ignoreJids: Array.isArray(provider.ignoreJids) ? provider.ignoreJids.map((event) => String(event)) : [],\n      };\n\n      this.importHistoryContacts(instance, providerData);\n\n      return totalMessagesImported;\n    } catch (error) {\n      this.logger.error(`Error on import history messages: ${error.toString()}`);\n\n      this.deleteHistoryMessages(instance);\n      this.deleteRepositoryMessagesCache(instance);\n    }\n  }\n\n  public async selectOrCreateFksFromChatwoot(\n    provider: ChatwootModel,\n    inbox: inbox,\n    phoneNumbersWithTimestamp: Map<string, firstLastTimestamp>,\n    messagesByPhoneNumber: Map<string, Message[]>,\n  ): Promise<Map<string, FksChatwoot>> {\n    const pgClient = postgresClient.getChatwootConnection();\n\n    const bindValues = [provider.accountId, inbox.id];\n    const phoneNumberBind = Array.from(messagesByPhoneNumber.keys())\n      .map((phoneNumber) => {\n        const phoneNumberTimestamp = phoneNumbersWithTimestamp.get(phoneNumber);\n\n        if (phoneNumberTimestamp) {\n          bindValues.push(phoneNumber);\n          let bindStr = `($${bindValues.length},`;\n\n          bindValues.push(phoneNumberTimestamp.first);\n          bindStr += `$${bindValues.length},`;\n\n          bindValues.push(phoneNumberTimestamp.last);\n          return `${bindStr}$${bindValues.length})`;\n        }\n      })\n      .join(',');\n\n    // select (or insert when necessary) data from tables contacts, contact_inboxes, conversations from chatwoot db\n    const sqlFromChatwoot = `WITH\n              phone_number AS (\n                SELECT phone_number, created_at::INTEGER, last_activity_at::INTEGER FROM (\n                  VALUES \n                   ${phoneNumberBind}\n                 ) as t (phone_number, created_at, last_activity_at)\n              ),\n\n              only_new_phone_number AS (\n                SELECT * FROM phone_number\n                WHERE phone_number NOT IN (\n                  SELECT phone_number\n                  FROM contacts\n                    JOIN contact_inboxes ci ON ci.contact_id = contacts.id AND ci.inbox_id = $2\n                    JOIN conversations con ON con.contact_inbox_id = ci.id \n                      AND con.account_id = $1\n                      AND con.inbox_id = $2\n                      AND con.contact_id = contacts.id\n                  WHERE contacts.account_id = $1\n                )\n              ),\n\n              new_contact AS (\n                INSERT INTO contacts (name, phone_number, account_id, identifier, created_at, updated_at)\n                SELECT REPLACE(p.phone_number, '+', ''), p.phone_number, $1, CONCAT(REPLACE(p.phone_number, '+', ''),\n                  '@s.whatsapp.net'), to_timestamp(p.created_at), to_timestamp(p.last_activity_at)\n                FROM only_new_phone_number AS p\n                ON CONFLICT(identifier, account_id) DO UPDATE SET updated_at = EXCLUDED.updated_at\n                RETURNING id, phone_number, created_at, updated_at\n              ),\n\n              new_contact_inbox AS (\n                INSERT INTO contact_inboxes (contact_id, inbox_id, source_id, created_at, updated_at)\n                SELECT new_contact.id, $2, gen_random_uuid(), new_contact.created_at, new_contact.updated_at\n                FROM new_contact \n                RETURNING id, contact_id, created_at, updated_at\n              ),\n\n              new_conversation AS (\n                INSERT INTO conversations (account_id, inbox_id, status, contact_id,\n                  contact_inbox_id, uuid, last_activity_at, created_at, updated_at)\n                SELECT $1, $2, 0, new_contact_inbox.contact_id, new_contact_inbox.id, gen_random_uuid(),\n                  new_contact_inbox.updated_at, new_contact_inbox.created_at, new_contact_inbox.updated_at\n                FROM new_contact_inbox\n                RETURNING id, contact_id\n              )\n\n              SELECT new_contact.phone_number, new_conversation.contact_id, new_conversation.id AS conversation_id\n              FROM new_conversation \n              JOIN new_contact ON new_conversation.contact_id = new_contact.id\n\n              UNION\n\n              SELECT p.phone_number, c.id contact_id, con.id conversation_id\n                FROM phone_number p\n              JOIN contacts c ON c.phone_number = p.phone_number\n              JOIN contact_inboxes ci ON ci.contact_id = c.id AND ci.inbox_id = $2\n              JOIN conversations con ON con.contact_inbox_id = ci.id AND con.account_id = $1\n                AND con.inbox_id = $2 AND con.contact_id = c.id`;\n\n    const fksFromChatwoot = await pgClient.query(sqlFromChatwoot, bindValues);\n\n    return new Map(fksFromChatwoot.rows.map((item: FksChatwoot) => [item.phone_number, item]));\n  }\n\n  public async getChatwootUser(provider: ChatwootModel): Promise<ChatwootUser> {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const sqlUser = `SELECT owner_type AS user_type, owner_id AS user_id\n                         FROM access_tokens\n                       WHERE token = $1`;\n\n      return (await pgClient.query(sqlUser, [provider.token]))?.rows[0] || false;\n    } catch (error) {\n      this.logger.error(`Error on getChatwootUser: ${error.toString()}`);\n    }\n  }\n\n  public createMessagesMapByPhoneNumber(messages: Message[]): Map<string, Message[]> {\n    return messages.reduce((acc: Map<string, Message[]>, message: Message) => {\n      const key = message?.key as {\n        remoteJid: string;\n      };\n      if (!this.isIgnorePhoneNumber(key?.remoteJid)) {\n        const phoneNumber = key?.remoteJid?.split('@')[0];\n        if (phoneNumber) {\n          const phoneNumberPlus = `+${phoneNumber}`;\n          const messages = acc.has(phoneNumberPlus) ? acc.get(phoneNumberPlus) : [];\n          messages.push(message);\n          acc.set(phoneNumberPlus, messages);\n        }\n      }\n\n      return acc;\n    }, new Map());\n  }\n\n  public async getContactsOrderByRecentConversations(\n    inbox: inbox,\n    provider: ChatwootModel,\n    limit = 50,\n  ): Promise<{ id: number; phone_number: string; identifier: string }[]> {\n    try {\n      const pgClient = postgresClient.getChatwootConnection();\n\n      const sql = `SELECT contacts.id, contacts.identifier, contacts.phone_number\n                     FROM conversations\n                   JOIN contacts ON contacts.id = conversations.contact_id\n                   WHERE conversations.account_id = $1\n                     AND inbox_id = $2\n                   ORDER BY conversations.last_activity_at DESC\n                   LIMIT $3`;\n\n      return (await pgClient.query(sql, [provider.accountId, inbox.id, limit]))?.rows;\n    } catch (error) {\n      this.logger.error(`Error on get recent conversations: ${error.toString()}`);\n    }\n  }\n\n  public getContentMessage(chatwootService: ChatwootService, msg: IWebMessageInfo) {\n    const contentMessage = chatwootService.getConversationMessage(msg.message);\n    if (contentMessage) {\n      return contentMessage;\n    }\n\n    if (!configService.get<Chatwoot>('CHATWOOT').IMPORT.PLACEHOLDER_MEDIA_MESSAGE) {\n      return '';\n    }\n\n    const types = {\n      documentMessage: msg.message.documentMessage,\n      documentWithCaptionMessage: msg.message.documentWithCaptionMessage?.message?.documentMessage,\n      imageMessage: msg.message.imageMessage,\n      videoMessage: msg.message.videoMessage,\n      audioMessage: msg.message.audioMessage,\n      stickerMessage: msg.message.stickerMessage,\n      templateMessage: msg.message.templateMessage?.hydratedTemplate?.hydratedContentText,\n    };\n\n    const typeKey = Object.keys(types).find((key) => types[key] !== undefined && types[key] !== null);\n    switch (typeKey) {\n      case 'documentMessage': {\n        const doc = msg.message.documentMessage;\n        const fileName = doc?.fileName || 'document';\n        const caption = doc?.caption ? ` ${doc.caption}` : '';\n        return `_<File: ${fileName}${caption}>_`;\n      }\n\n      case 'documentWithCaptionMessage': {\n        const doc = msg.message.documentWithCaptionMessage?.message?.documentMessage;\n        const fileName = doc?.fileName || 'document';\n        const caption = doc?.caption ? ` ${doc.caption}` : '';\n        return `_<File: ${fileName}${caption}>_`;\n      }\n\n      case 'templateMessage': {\n        const template = msg.message.templateMessage?.hydratedTemplate;\n        return (\n          (template?.hydratedTitleText ? `*${template.hydratedTitleText}*\\n` : '') +\n          (template?.hydratedContentText || '')\n        );\n      }\n\n      case 'imageMessage':\n        return '_<Image Message>_';\n\n      case 'videoMessage':\n        return '_<Video Message>_';\n\n      case 'audioMessage':\n        return '_<Audio Message>_';\n\n      case 'stickerMessage':\n        return '_<Sticker Message>_';\n\n      default:\n        return '';\n    }\n  }\n\n  public sliceIntoChunks(arr: any[], chunkSize: number) {\n    return arr.splice(0, chunkSize);\n  }\n\n  public isGroup(remoteJid: string) {\n    return remoteJid.includes('@g.us');\n  }\n\n  public isIgnorePhoneNumber(remoteJid: string) {\n    return this.isGroup(remoteJid) || remoteJid === 'status@broadcast' || remoteJid === '0@s.whatsapp.net';\n  }\n\n  public updateMessageSourceID(messageId: string | number, sourceId: string) {\n    const pgClient = postgresClient.getChatwootConnection();\n\n    const sql = `UPDATE messages SET source_id = $1, status = 0, created_at = NOW(), updated_at = NOW() WHERE id = $2;`;\n\n    return pgClient.query(sql, [`WAID:${sourceId}`, messageId]);\n  }\n}\n\nexport const chatwootImport = new ChatwootImport();\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { Options, Quoted, SendAudioDto, SendMediaDto, SendTextDto } from '@api/dto/sendMessage.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { postgresClient } from '@api/integrations/chatbot/chatwoot/libs/postgres.client';\nimport { chatwootImport } from '@api/integrations/chatbot/chatwoot/utils/chatwoot-import-helper';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { CacheService } from '@api/services/cache.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Events } from '@api/types/wa.types';\nimport { Chatwoot, ConfigService, Database, HttpServer } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport ChatwootClient, {\n  ChatwootAPIConfig,\n  contact,\n  contact_inboxes,\n  conversation,\n  conversation_show,\n  generic_id,\n  inbox,\n} from '@figuro/chatwoot-sdk';\nimport { request as chatwootRequest } from '@figuro/chatwoot-sdk/dist/core/request';\nimport { Chatwoot as ChatwootModel, Contact as ContactModel, Message as MessageModel } from '@prisma/client';\nimport i18next from '@utils/i18n';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\nimport { WAMessageContent, WAMessageKey } from 'baileys';\nimport dayjs from 'dayjs';\nimport FormData from 'form-data';\nimport { Jimp, JimpMime } from 'jimp';\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\nimport Long from 'long';\nimport mimeTypes from 'mime-types';\nimport path from 'path';\nimport { Readable } from 'stream';\n\ninterface ChatwootMessage {\n  messageId?: number;\n  inboxId?: number;\n  conversationId?: number;\n  contactInboxSourceId?: string;\n  isRead?: boolean;\n}\n\nexport class ChatwootService {\n  private readonly logger = new Logger('ChatwootService');\n\n  // Lock polling delay\n  private readonly LOCK_POLLING_DELAY_MS = 300; // Delay between lock status checks\n\n  private provider: any;\n\n  constructor(\n    private readonly waMonitor: WAMonitoringService,\n    private readonly configService: ConfigService,\n    private readonly prismaRepository: PrismaRepository,\n    private readonly cache: CacheService,\n  ) {}\n\n  private pgClient = postgresClient.getChatwootConnection();\n\n  private async getProvider(instance: InstanceDto): Promise<ChatwootModel | null> {\n    const cacheKey = `${instance.instanceName}:getProvider`;\n    if (await this.cache.has(cacheKey)) {\n      const provider = (await this.cache.get(cacheKey)) as ChatwootModel;\n\n      return provider;\n    }\n\n    const provider = await this.waMonitor.waInstances[instance.instanceName]?.findChatwoot();\n\n    if (!provider) {\n      this.logger.warn('provider not found');\n      return null;\n    }\n\n    this.cache.set(cacheKey, provider);\n\n    return provider;\n  }\n\n  private async clientCw(instance: InstanceDto) {\n    const provider = await this.getProvider(instance);\n\n    if (!provider) {\n      this.logger.error('provider not found');\n      return null;\n    }\n\n    this.provider = provider;\n\n    const client = new ChatwootClient({\n      config: this.getClientCwConfig(),\n    });\n\n    return client;\n  }\n\n  public getClientCwConfig(): ChatwootAPIConfig & { nameInbox: string; mergeBrazilContacts: boolean } {\n    return {\n      basePath: this.provider.url,\n      with_credentials: true,\n      credentials: 'include',\n      token: this.provider.token,\n      nameInbox: this.provider.nameInbox,\n      mergeBrazilContacts: this.provider.mergeBrazilContacts,\n    };\n  }\n\n  public getCache() {\n    return this.cache;\n  }\n\n  public async create(instance: InstanceDto, data: ChatwootDto) {\n    await this.waMonitor.waInstances[instance.instanceName].setChatwoot(data);\n\n    if (data.autoCreate) {\n      this.logger.log('Auto create chatwoot instance');\n      const urlServer = this.configService.get<HttpServer>('SERVER').URL;\n\n      await this.initInstanceChatwoot(\n        instance,\n        data.nameInbox ?? instance.instanceName.split('-cwId-')[0],\n        `${urlServer}/chatwoot/webhook/${encodeURIComponent(instance.instanceName)}`,\n        true,\n        data.number,\n        data.organization,\n        data.logo,\n      );\n    }\n    return data;\n  }\n\n  public async find(instance: InstanceDto): Promise<ChatwootDto> {\n    try {\n      return await this.waMonitor.waInstances[instance.instanceName].findChatwoot();\n    } catch {\n      this.logger.error('chatwoot not found');\n      return { enabled: null, url: '' };\n    }\n  }\n\n  public async getContact(instance: InstanceDto, id: number) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    if (!id) {\n      this.logger.warn('id is required');\n      return null;\n    }\n\n    const contact = await client.contact.getContactable({\n      accountId: this.provider.accountId,\n      id,\n    });\n\n    if (!contact) {\n      this.logger.warn('contact not found');\n      return null;\n    }\n\n    return contact;\n  }\n\n  public async initInstanceChatwoot(\n    instance: InstanceDto,\n    inboxName: string,\n    webhookUrl: string,\n    qrcode: boolean,\n    number: string,\n    organization?: string,\n    logo?: string,\n  ) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    const findInbox: any = await client.inboxes.list({\n      accountId: this.provider.accountId,\n    });\n\n    const checkDuplicate = findInbox.payload.map((inbox) => inbox.name).includes(inboxName);\n\n    let inboxId: number;\n\n    this.logger.log('Creating chatwoot inbox');\n    if (!checkDuplicate) {\n      const data = {\n        type: 'api',\n        webhook_url: webhookUrl,\n      };\n\n      const inbox = await client.inboxes.create({\n        accountId: this.provider.accountId,\n        data: {\n          name: inboxName,\n          channel: data as any,\n        },\n      });\n\n      if (!inbox) {\n        this.logger.warn('inbox not found');\n        return null;\n      }\n\n      inboxId = inbox.id;\n    } else {\n      const inbox = findInbox.payload.find((inbox) => inbox.name === inboxName);\n\n      if (!inbox) {\n        this.logger.warn('inbox not found');\n        return null;\n      }\n\n      inboxId = inbox.id;\n    }\n    this.logger.log(`Inbox created - inboxId: ${inboxId}`);\n\n    if (!this.configService.get<Chatwoot>('CHATWOOT').BOT_CONTACT) {\n      this.logger.log('Chatwoot bot contact is disabled');\n\n      return true;\n    }\n\n    this.logger.log('Creating chatwoot bot contact');\n    const contact =\n      (await this.findContact(instance, '123456')) ||\n      ((await this.createContact(\n        instance,\n        '123456',\n        inboxId,\n        false,\n        organization ? organization : 'EvolutionAPI',\n        logo ? logo : 'https://evolution-api.com/files/evolution-api-favicon.png',\n      )) as any);\n\n    if (!contact) {\n      this.logger.warn('contact not found');\n      return null;\n    }\n\n    const contactId = contact.id || contact.payload.contact.id;\n    this.logger.log(`Contact created - contactId: ${contactId}`);\n\n    if (qrcode) {\n      this.logger.log('QR code enabled');\n      const data = {\n        contact_id: contactId.toString(),\n        inbox_id: inboxId.toString(),\n      };\n\n      const conversation = await client.conversations.create({\n        accountId: this.provider.accountId,\n        data,\n      });\n\n      if (!conversation) {\n        this.logger.warn('conversation not found');\n        return null;\n      }\n\n      let contentMsg = 'init';\n\n      if (number) {\n        contentMsg = `init:${number}`;\n      }\n\n      const message = await client.messages.create({\n        accountId: this.provider.accountId,\n        conversationId: conversation.id,\n        data: {\n          content: contentMsg,\n          message_type: 'outgoing',\n        },\n      });\n\n      if (!message) {\n        this.logger.warn('conversation not found');\n        return null;\n      }\n      this.logger.log('Init message sent');\n    }\n\n    return true;\n  }\n\n  public async createContact(\n    instance: InstanceDto,\n    phoneNumber: string,\n    inboxId: number,\n    isGroup: boolean,\n    name?: string,\n    avatar_url?: string,\n    jid?: string,\n  ) {\n    try {\n      const client = await this.clientCw(instance);\n\n      if (!client) {\n        this.logger.warn('client not found');\n        return null;\n      }\n\n      let data: any = {};\n      if (!isGroup) {\n        data = {\n          inbox_id: inboxId,\n          name: name || phoneNumber,\n          identifier: jid,\n          avatar_url: avatar_url,\n        };\n\n        if ((jid && jid.includes('@')) || !jid) {\n          data['phone_number'] = `+${phoneNumber}`;\n        }\n      } else {\n        data = {\n          inbox_id: inboxId,\n          name: name || phoneNumber,\n          identifier: phoneNumber,\n          avatar_url: avatar_url,\n        };\n      }\n\n      const contact = await client.contacts.create({\n        accountId: this.provider.accountId,\n        data,\n      });\n\n      if (!contact) {\n        this.logger.warn('contact not found');\n        return null;\n      }\n\n      const findContact = await this.findContact(instance, phoneNumber);\n\n      const contactId = findContact?.id;\n\n      await this.addLabelToContact(this.provider.nameInbox, contactId);\n\n      return contact;\n    } catch (error) {\n      if ((error.status === 422 || error.response?.status === 422) && jid) {\n        this.logger.warn(`Contact with identifier ${jid} creation failed (422). Checking if it already exists...`);\n        const existingContact = await this.findContactByIdentifier(instance, jid);\n        if (existingContact) {\n          const contactId = existingContact.id;\n          await this.addLabelToContact(this.provider.nameInbox, contactId);\n          return existingContact;\n        }\n      }\n\n      this.logger.error('Error creating contact');\n      console.log(error);\n      return null;\n    }\n  }\n\n  public async updateContact(instance: InstanceDto, id: number, data: any) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    if (!id) {\n      this.logger.warn('id is required');\n      return null;\n    }\n\n    try {\n      const contact = await client.contacts.update({\n        accountId: this.provider.accountId,\n        id,\n        data,\n      });\n\n      return contact;\n    } catch {\n      return null;\n    }\n  }\n\n  public async addLabelToContact(nameInbox: string, contactId: number) {\n    try {\n      const uri = this.configService.get<Chatwoot>('CHATWOOT').IMPORT.DATABASE.CONNECTION.URI;\n\n      if (!uri) return false;\n\n      const sqlTags = `SELECT id, taggings_count FROM tags WHERE name = $1 LIMIT 1`;\n      const tagData = (await this.pgClient.query(sqlTags, [nameInbox]))?.rows[0];\n      let tagId = tagData?.id;\n      const taggingsCount = tagData?.taggings_count || 0;\n\n      const sqlTag = `INSERT INTO tags (name, taggings_count) \n                      VALUES ($1, $2) \n                      ON CONFLICT (name) \n                      DO UPDATE SET taggings_count = tags.taggings_count + 1 \n                      RETURNING id`;\n\n      tagId = (await this.pgClient.query(sqlTag, [nameInbox, taggingsCount + 1]))?.rows[0]?.id;\n\n      const sqlCheckTagging = `SELECT 1 FROM taggings \n                               WHERE tag_id = $1 AND taggable_type = 'Contact' AND taggable_id = $2 AND context = 'labels' LIMIT 1`;\n\n      const taggingExists = (await this.pgClient.query(sqlCheckTagging, [tagId, contactId]))?.rowCount > 0;\n\n      if (!taggingExists) {\n        const sqlInsertLabel = `INSERT INTO taggings (tag_id, taggable_type, taggable_id, context, created_at) \n                                VALUES ($1, 'Contact', $2, 'labels', NOW())`;\n\n        await this.pgClient.query(sqlInsertLabel, [tagId, contactId]);\n      }\n\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  public async findContactByIdentifier(instance: InstanceDto, identifier: string) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    // Direct search by query (q) - most common way to search by identifier/email/phone\n    const contact = (await (client as any).get('contacts/search', {\n      params: {\n        q: identifier,\n        sort: 'name',\n      },\n    })) as any;\n\n    if (contact && contact.data && contact.data.payload && contact.data.payload.length > 0) {\n      return contact.data.payload[0];\n    }\n\n    // Fallback for older API versions or different response structures\n    if (contact && contact.payload && contact.payload.length > 0) {\n      return contact.payload[0];\n    }\n\n    // Try search by attribute\n    const contactByAttr = (await (client as any).post('contacts/filter', {\n      payload: [\n        {\n          attribute_key: 'identifier',\n          filter_operator: 'equal_to',\n          values: [identifier],\n          query_operator: null,\n        },\n      ],\n    })) as any;\n\n    if (contactByAttr && contactByAttr.payload && contactByAttr.payload.length > 0) {\n      return contactByAttr.payload[0];\n    }\n\n    // Check inside data property if using axios interceptors wrapper\n    if (contactByAttr && contactByAttr.data && contactByAttr.data.payload && contactByAttr.data.payload.length > 0) {\n      return contactByAttr.data.payload[0];\n    }\n\n    return null;\n  }\n\n  public async findContact(instance: InstanceDto, phoneNumber: string) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    let query: any;\n    const isGroup = phoneNumber.includes('@g.us');\n\n    if (!isGroup) {\n      query = `+${phoneNumber}`;\n    } else {\n      query = phoneNumber;\n    }\n\n    let contact: any;\n\n    if (isGroup) {\n      contact = await client.contacts.search({\n        accountId: this.provider.accountId,\n        q: query,\n      });\n    } else {\n      contact = await chatwootRequest(this.getClientCwConfig(), {\n        method: 'POST',\n        url: `/api/v1/accounts/${this.provider.accountId}/contacts/filter`,\n        body: {\n          payload: this.getFilterPayload(query),\n        },\n      });\n    }\n\n    if (!contact && contact?.payload?.length === 0) {\n      this.logger.warn('contact not found');\n      return null;\n    }\n\n    if (!isGroup) {\n      return contact.payload.length > 1 ? this.findContactInContactList(contact.payload, query) : contact.payload[0];\n    } else {\n      return contact.payload.find((contact) => contact.identifier === query);\n    }\n  }\n\n  private async mergeContacts(baseId: number, mergeId: number) {\n    try {\n      const contact = await chatwootRequest(this.getClientCwConfig(), {\n        method: 'POST',\n        url: `/api/v1/accounts/${this.provider.accountId}/actions/contact_merge`,\n        body: {\n          base_contact_id: baseId,\n          mergee_contact_id: mergeId,\n        },\n      });\n\n      return contact;\n    } catch {\n      this.logger.error('Error merging contacts');\n      return null;\n    }\n  }\n\n  private async mergeBrazilianContacts(contacts: any[]) {\n    try {\n      const contact = await chatwootRequest(this.getClientCwConfig(), {\n        method: 'POST',\n        url: `/api/v1/accounts/${this.provider.accountId}/actions/contact_merge`,\n        body: {\n          base_contact_id: contacts.find((contact) => contact.phone_number.length === 14)?.id,\n          mergee_contact_id: contacts.find((contact) => contact.phone_number.length === 13)?.id,\n        },\n      });\n\n      return contact;\n    } catch {\n      this.logger.error('Error merging contacts');\n      return null;\n    }\n  }\n\n  private findContactInContactList(contacts: any[], query: string) {\n    const phoneNumbers = this.getNumbers(query);\n    const searchableFields = this.getSearchableFields();\n\n    // eslint-disable-next-line prettier/prettier\n    if (contacts.length === 2 && this.getClientCwConfig().mergeBrazilContacts && query.startsWith('+55')) {\n      const contact = this.mergeBrazilianContacts(contacts);\n      if (contact) {\n        return contact;\n      }\n    }\n\n    const phone = phoneNumbers.reduce(\n      (savedNumber, number) => (number.length > savedNumber.length ? number : savedNumber),\n      '',\n    );\n\n    const contact_with9 = contacts.find((contact) => contact.phone_number === phone);\n    if (contact_with9) {\n      return contact_with9;\n    }\n\n    for (const contact of contacts) {\n      for (const field of searchableFields) {\n        if (contact[field] && phoneNumbers.includes(contact[field])) {\n          return contact;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  private getNumbers(query: string) {\n    const numbers = [];\n    numbers.push(query);\n\n    if (query.startsWith('+55') && query.length === 14) {\n      const withoutNine = query.slice(0, 5) + query.slice(6);\n      numbers.push(withoutNine);\n    } else if (query.startsWith('+55') && query.length === 13) {\n      const withNine = query.slice(0, 5) + '9' + query.slice(5);\n      numbers.push(withNine);\n    }\n\n    return numbers;\n  }\n\n  private getSearchableFields() {\n    return ['phone_number'];\n  }\n\n  private getFilterPayload(query: string) {\n    const filterPayload = [];\n\n    const numbers = this.getNumbers(query);\n    const fieldsToSearch = this.getSearchableFields();\n\n    fieldsToSearch.forEach((field, index1) => {\n      numbers.forEach((number, index2) => {\n        const queryOperator = fieldsToSearch.length - 1 === index1 && numbers.length - 1 === index2 ? null : 'OR';\n        filterPayload.push({\n          attribute_key: field,\n          filter_operator: 'equal_to',\n          values: [number.replace('+', '')],\n          query_operator: queryOperator,\n        });\n      });\n    });\n\n    return filterPayload;\n  }\n\n  public async createConversation(instance: InstanceDto, body: any) {\n    const isLid = body.key.addressingMode === 'lid';\n    const isGroup = body.key.remoteJid.endsWith('@g.us');\n    const phoneNumber = isLid && !isGroup ? body.key.remoteJidAlt : body.key.remoteJid;\n    const { remoteJid } = body.key;\n    const cacheKey = `${instance.instanceName}:createConversation-${remoteJid}`;\n    const lockKey = `${instance.instanceName}:lock:createConversation-${remoteJid}`;\n    const maxWaitTime = 5000; // 5 seconds\n    const client = await this.clientCw(instance);\n    if (!client) return null;\n\n    try {\n      // Processa atualização de contatos já criados @lid\n      if (phoneNumber && remoteJid && !isGroup) {\n        const contact = await this.findContact(instance, phoneNumber.split('@')[0]);\n        if (contact && contact.identifier !== remoteJid) {\n          this.logger.verbose(\n            `Identifier needs update: (contact.identifier: ${contact.identifier}, phoneNumber: ${phoneNumber}, body.key.remoteJidAlt: ${remoteJid}`,\n          );\n          const updateContact = await this.updateContact(instance, contact.id, {\n            identifier: phoneNumber,\n            phone_number: `+${phoneNumber.split('@')[0]}`,\n          });\n\n          if (updateContact === null) {\n            const baseContact = await this.findContact(instance, phoneNumber.split('@')[0]);\n            if (baseContact) {\n              await this.mergeContacts(baseContact.id, contact.id);\n              this.logger.verbose(\n                `Merge contacts: (${baseContact.id}) ${baseContact.phone_number} and (${contact.id}) ${contact.phone_number}`,\n              );\n            }\n          }\n        }\n      }\n      this.logger.verbose(`--- Start createConversation ---`);\n      this.logger.verbose(`Instance: ${JSON.stringify(instance)}`);\n\n      // If it already exists in the cache, return conversationId\n      if (await this.cache.has(cacheKey)) {\n        const conversationId = (await this.cache.get(cacheKey)) as number;\n        this.logger.verbose(`Found conversation to: ${phoneNumber}, conversation ID: ${conversationId}`);\n        let conversationExists: any;\n        try {\n          conversationExists = await client.conversations.get({\n            accountId: this.provider.accountId,\n            conversationId: conversationId,\n          });\n          this.logger.verbose(\n            `Conversation exists: ID: ${conversationExists.id} - Name: ${conversationExists.meta.sender.name} - Identifier: ${conversationExists.meta.sender.identifier}`,\n          );\n        } catch (error) {\n          this.logger.error(`Error getting conversation: ${error}`);\n          conversationExists = false;\n        }\n        if (!conversationExists) {\n          this.logger.verbose('Conversation does not exist, re-calling createConversation');\n          this.cache.delete(cacheKey);\n          return await this.createConversation(instance, body);\n        }\n        return conversationId;\n      }\n\n      // If lock already exists, wait until release or timeout\n      if (await this.cache.has(lockKey)) {\n        this.logger.verbose(`Operação de criação já em andamento para ${remoteJid}, aguardando resultado...`);\n        const start = Date.now();\n        while (await this.cache.has(lockKey)) {\n          if (Date.now() - start > maxWaitTime) {\n            this.logger.warn(`Timeout aguardando lock para ${remoteJid}`);\n            break;\n          }\n          await new Promise((res) => setTimeout(res, this.LOCK_POLLING_DELAY_MS));\n          if (await this.cache.has(cacheKey)) {\n            const conversationId = (await this.cache.get(cacheKey)) as number;\n            this.logger.verbose(`Resolves creation of: ${remoteJid}, conversation ID: ${conversationId}`);\n            return conversationId;\n          }\n        }\n      }\n\n      // Adquire lock\n      await this.cache.set(lockKey, true, 30);\n      this.logger.verbose(`Bloqueio adquirido para: ${lockKey}`);\n\n      try {\n        /*\n        Double check after lock\n        Utilizei uma nova verificação para evitar que outra thread execute entre o terminio do while e o set lock\n        */\n        if (await this.cache.has(cacheKey)) {\n          return (await this.cache.get(cacheKey)) as number;\n        }\n\n        const chatId = isGroup ? remoteJid : phoneNumber.split('@')[0].split(':')[0];\n        let nameContact = !body.key.fromMe ? body.pushName : chatId;\n        const filterInbox = await this.getInbox(instance);\n        if (!filterInbox) return null;\n\n        if (isGroup) {\n          this.logger.verbose(`Processing group conversation`);\n          const group = await this.waMonitor.waInstances[instance.instanceName].client.groupMetadata(chatId);\n          this.logger.verbose(`Group metadata: JID:${group.JID} - Subject:${group?.subject || group?.Name}`);\n\n          const participantJid = isLid && !body.key.fromMe ? body.key.participantAlt : body.key.participant;\n          nameContact = `${group.subject} (GROUP)`;\n\n          const picture_url = await this.waMonitor.waInstances[instance.instanceName].profilePicture(\n            participantJid.split('@')[0],\n          );\n          this.logger.verbose(`Participant profile picture URL: ${JSON.stringify(picture_url)}`);\n\n          const findParticipant = await this.findContact(instance, participantJid.split('@')[0]);\n\n          if (findParticipant) {\n            this.logger.verbose(\n              `Found participant: ID:${findParticipant.id} - Name: ${findParticipant.name} - identifier: ${findParticipant.identifier}`,\n            );\n            if (!findParticipant.name || findParticipant.name === chatId) {\n              await this.updateContact(instance, findParticipant.id, {\n                name: body.pushName,\n                avatar_url: picture_url.profilePictureUrl || null,\n              });\n            }\n          } else {\n            await this.createContact(\n              instance,\n              participantJid.split('@')[0].split(':')[0],\n              filterInbox.id,\n              false,\n              body.pushName,\n              picture_url.profilePictureUrl || null,\n              participantJid,\n            );\n          }\n        }\n\n        const picture_url = await this.waMonitor.waInstances[instance.instanceName].profilePicture(chatId);\n        this.logger.verbose(`Contact profile picture URL: ${JSON.stringify(picture_url)}`);\n\n        this.logger.verbose(`Searching contact for: ${chatId}`);\n        let contact = await this.findContact(instance, chatId);\n\n        if (contact) {\n          this.logger.verbose(`Found contact: ID:${contact.id} - Name:${contact.name}`);\n          if (!body.key.fromMe) {\n            const waProfilePictureFile =\n              picture_url?.profilePictureUrl?.split('#')[0].split('?')[0].split('/').pop() || '';\n            const chatwootProfilePictureFile = contact?.thumbnail?.split('#')[0].split('?')[0].split('/').pop() || '';\n            const pictureNeedsUpdate = waProfilePictureFile !== chatwootProfilePictureFile;\n            const nameNeedsUpdate = !contact.name || contact.name === chatId;\n            this.logger.verbose(`Picture needs update: ${pictureNeedsUpdate}`);\n            this.logger.verbose(`Name needs update: ${nameNeedsUpdate}`);\n            if (pictureNeedsUpdate || nameNeedsUpdate) {\n              contact = await this.updateContact(instance, contact.id, {\n                ...(nameNeedsUpdate && { name: nameContact }),\n                ...(waProfilePictureFile === '' && { avatar: null }),\n                ...(pictureNeedsUpdate && { avatar_url: picture_url?.profilePictureUrl }),\n              });\n            }\n          }\n        } else {\n          contact = await this.createContact(\n            instance,\n            chatId,\n            filterInbox.id,\n            isGroup,\n            nameContact,\n            picture_url.profilePictureUrl || null,\n            phoneNumber,\n          );\n        }\n\n        if (!contact) {\n          this.logger.warn(`Contact not created or found`);\n          return null;\n        }\n\n        const contactId = contact?.payload?.id || contact?.payload?.contact?.id || contact?.id;\n        this.logger.verbose(`Contact ID: ${contactId}`);\n\n        const contactConversations = (await client.contacts.listConversations({\n          accountId: this.provider.accountId,\n          id: contactId,\n        })) as any;\n\n        if (!contactConversations || !contactConversations.payload) {\n          this.logger.error(`No conversations found or payload is undefined`);\n          return null;\n        }\n\n        let inboxConversation = contactConversations.payload.find(\n          (conversation) => conversation.inbox_id == filterInbox.id,\n        );\n        if (inboxConversation) {\n          if (this.provider.reopenConversation) {\n            this.logger.verbose(\n              `Found conversation in reopenConversation mode: ID: ${inboxConversation.id} - Name: ${inboxConversation.meta.sender.name} - Identifier: ${inboxConversation.meta.sender.identifier}`,\n            );\n            if (inboxConversation && this.provider.conversationPending && inboxConversation.status !== 'open') {\n              await client.conversations.toggleStatus({\n                accountId: this.provider.accountId,\n                conversationId: inboxConversation.id,\n                data: {\n                  status: 'pending',\n                },\n              });\n            }\n          } else {\n            inboxConversation = contactConversations.payload.find(\n              (conversation) =>\n                conversation && conversation.status !== 'resolved' && conversation.inbox_id == filterInbox.id,\n            );\n            this.logger.verbose(`Found conversation: ${JSON.stringify(inboxConversation)}`);\n          }\n\n          if (inboxConversation) {\n            this.logger.verbose(`Returning existing conversation ID: ${inboxConversation.id}`);\n            this.cache.set(cacheKey, inboxConversation.id, 1800);\n            return inboxConversation.id;\n          }\n        }\n\n        const data = {\n          contact_id: contactId.toString(),\n          inbox_id: filterInbox.id.toString(),\n        };\n\n        if (this.provider.conversationPending) {\n          data['status'] = 'pending';\n        }\n\n        const conversation = await client.conversations.create({\n          accountId: this.provider.accountId,\n          data,\n        });\n\n        if (!conversation) {\n          this.logger.warn(`Conversation not created or found`);\n          return null;\n        }\n\n        this.logger.verbose(`New conversation created of ${remoteJid} with ID: ${conversation.id}`);\n        this.cache.set(cacheKey, conversation.id, 1800);\n        return conversation.id;\n      } finally {\n        await this.cache.delete(lockKey);\n        this.logger.verbose(`Block released for: ${lockKey}`);\n      }\n    } catch (error) {\n      this.logger.error(`Error in createConversation: ${error}`);\n      return null;\n    }\n  }\n\n  public async getInbox(instance: InstanceDto): Promise<inbox | null> {\n    const cacheKey = `${instance.instanceName}:getInbox`;\n    if (await this.cache.has(cacheKey)) {\n      return (await this.cache.get(cacheKey)) as inbox;\n    }\n\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    const inbox = (await client.inboxes.list({\n      accountId: this.provider.accountId,\n    })) as any;\n\n    if (!inbox) {\n      this.logger.warn('inbox not found');\n      return null;\n    }\n\n    const findByName = inbox.payload.find((inbox) => inbox.name === this.getClientCwConfig().nameInbox);\n\n    if (!findByName) {\n      this.logger.warn('inbox not found');\n      return null;\n    }\n\n    this.cache.set(cacheKey, findByName);\n    return findByName;\n  }\n\n  public async createMessage(\n    instance: InstanceDto,\n    conversationId: number,\n    content: string,\n    messageType: 'incoming' | 'outgoing' | undefined,\n    privateMessage?: boolean,\n    attachments?: {\n      content: unknown;\n      encoding: string;\n      filename: string;\n    }[],\n    messageBody?: any,\n    sourceId?: string,\n    quotedMsg?: MessageModel,\n  ) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    const replyToIds = await this.getReplyToIds(messageBody, instance);\n\n    const sourceReplyId = quotedMsg?.chatwootMessageId || null;\n\n    const message = await client.messages.create({\n      accountId: this.provider.accountId,\n      conversationId: conversationId,\n      data: {\n        content: content,\n        message_type: messageType,\n        attachments: attachments,\n        private: privateMessage || false,\n        source_id: sourceId,\n        content_attributes: {\n          ...replyToIds,\n        },\n        source_reply_id: sourceReplyId ? sourceReplyId.toString() : null,\n      },\n    });\n\n    if (!message) {\n      this.logger.warn('message not found');\n      return null;\n    }\n\n    return message;\n  }\n\n  public async getOpenConversationByContact(\n    instance: InstanceDto,\n    inbox: inbox,\n    contact: generic_id & contact,\n  ): Promise<conversation> {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    const conversations = (await client.contacts.listConversations({\n      accountId: this.provider.accountId,\n      id: contact.id,\n    })) as any;\n\n    return (\n      conversations.payload.find(\n        (conversation) => conversation.inbox_id === inbox.id && conversation.status === 'open',\n      ) || undefined\n    );\n  }\n\n  public async createBotMessage(\n    instance: InstanceDto,\n    content: string,\n    messageType: 'incoming' | 'outgoing' | undefined,\n    attachments?: {\n      content: unknown;\n      encoding: string;\n      filename: string;\n    }[],\n  ) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    const contact = await this.findContact(instance, '123456');\n\n    if (!contact) {\n      this.logger.warn('contact not found');\n      return null;\n    }\n\n    const filterInbox = await this.getInbox(instance);\n\n    if (!filterInbox) {\n      this.logger.warn('inbox not found');\n      return null;\n    }\n\n    const conversation = await this.getOpenConversationByContact(instance, filterInbox, contact);\n\n    if (!conversation) {\n      this.logger.warn('conversation not found');\n      return;\n    }\n\n    const message = await client.messages.create({\n      accountId: this.provider.accountId,\n      conversationId: conversation.id,\n      data: {\n        content: content,\n        message_type: messageType,\n        attachments: attachments,\n      },\n    });\n\n    if (!message) {\n      this.logger.warn('message not found');\n      return null;\n    }\n\n    return message;\n  }\n\n  private async sendData(\n    conversationId: number,\n    fileStream: Readable,\n    fileName: string,\n    messageType: 'incoming' | 'outgoing' | undefined,\n    content?: string,\n    instance?: InstanceDto,\n    messageBody?: any,\n    sourceId?: string,\n    quotedMsg?: MessageModel,\n  ) {\n    if (sourceId && this.isImportHistoryAvailable()) {\n      const messageAlreadySaved = await chatwootImport.getExistingSourceIds([sourceId], conversationId);\n      if (messageAlreadySaved) {\n        if (messageAlreadySaved.size > 0) {\n          this.logger.warn('Message already saved on chatwoot');\n          return null;\n        }\n      }\n    }\n    const data = new FormData();\n\n    if (content) {\n      data.append('content', content);\n    }\n\n    data.append('message_type', messageType);\n\n    data.append('attachments[]', fileStream, { filename: fileName });\n\n    const sourceReplyId = quotedMsg?.chatwootMessageId || null;\n\n    if (messageBody && instance) {\n      const replyToIds = await this.getReplyToIds(messageBody, instance);\n\n      if (replyToIds.in_reply_to || replyToIds.in_reply_to_external_id) {\n        const content = JSON.stringify({\n          ...replyToIds,\n        });\n        data.append('content_attributes', content);\n      }\n    }\n\n    if (sourceReplyId) {\n      data.append('source_reply_id', sourceReplyId.toString());\n    }\n\n    if (sourceId) {\n      data.append('source_id', sourceId);\n    }\n\n    const config = {\n      method: 'post',\n      maxBodyLength: Infinity,\n      url: `${this.provider.url}/api/v1/accounts/${this.provider.accountId}/conversations/${conversationId}/messages`,\n      headers: {\n        api_access_token: this.provider.token,\n        ...data.getHeaders(),\n      },\n      data: data,\n    };\n\n    try {\n      const { data } = await axios.request(config);\n\n      return data;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  public async createBotQr(\n    instance: InstanceDto,\n    content: string,\n    messageType: 'incoming' | 'outgoing' | undefined,\n    fileStream?: Readable,\n    fileName?: string,\n  ) {\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      this.logger.warn('client not found');\n      return null;\n    }\n\n    if (!this.configService.get<Chatwoot>('CHATWOOT').BOT_CONTACT) {\n      this.logger.log('Chatwoot bot contact is disabled');\n\n      return true;\n    }\n\n    const contact = await this.findContact(instance, '123456');\n\n    if (!contact) {\n      this.logger.warn('contact not found');\n      return null;\n    }\n\n    const filterInbox = await this.getInbox(instance);\n\n    if (!filterInbox) {\n      this.logger.warn('inbox not found');\n      return null;\n    }\n\n    const conversation = await this.getOpenConversationByContact(instance, filterInbox, contact);\n\n    if (!conversation) {\n      this.logger.warn('conversation not found');\n      return;\n    }\n\n    const data = new FormData();\n\n    if (content) {\n      data.append('content', content);\n    }\n\n    data.append('message_type', messageType);\n\n    if (fileStream && fileName) {\n      data.append('attachments[]', fileStream, { filename: fileName });\n    }\n\n    const config = {\n      method: 'post',\n      maxBodyLength: Infinity,\n      url: `${this.provider.url}/api/v1/accounts/${this.provider.accountId}/conversations/${conversation.id}/messages`,\n      headers: {\n        api_access_token: this.provider.token,\n        ...data.getHeaders(),\n      },\n      data: data,\n    };\n\n    try {\n      const { data } = await axios.request(config);\n\n      return data;\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  public async sendAttachment(waInstance: any, number: string, media: any, caption?: string, options?: Options) {\n    try {\n      const parsedMedia = path.parse(decodeURIComponent(media));\n      let mimeType = mimeTypes.lookup(parsedMedia?.ext) || '';\n      let fileName = parsedMedia?.name + parsedMedia?.ext;\n\n      if (!mimeType) {\n        const parts = media.split('/');\n        fileName = decodeURIComponent(parts[parts.length - 1]);\n\n        const response = await axios.get(media, {\n          responseType: 'arraybuffer',\n        });\n        mimeType = response.headers['content-type'];\n      }\n\n      let type = 'document';\n\n      switch (mimeType.split('/')[0]) {\n        case 'image':\n          type = 'image';\n          break;\n        case 'video':\n          type = 'video';\n          break;\n        case 'audio':\n          type = 'audio';\n          break;\n        default:\n          type = 'document';\n          break;\n      }\n\n      if (type === 'audio') {\n        const data: SendAudioDto = {\n          number: number,\n          audio: media,\n          delay: Math.floor(Math.random() * (2000 - 500 + 1)) + 500,\n          quoted: options?.quoted,\n        };\n\n        sendTelemetry('/message/sendWhatsAppAudio');\n\n        const messageSent = await waInstance?.audioWhatsapp(data, null, true);\n\n        return messageSent;\n      }\n\n      const documentExtensions = ['.gif', '.svg', '.tiff', '.tif', '.dxf', '.dwg'];\n      if (type === 'image' && parsedMedia && documentExtensions.includes(parsedMedia?.ext)) {\n        type = 'document';\n      }\n\n      const data: SendMediaDto = {\n        number: number,\n        mediatype: type as any,\n        fileName: fileName,\n        media: media,\n        delay: 1200,\n        quoted: options?.quoted,\n      };\n\n      sendTelemetry('/message/sendMedia');\n\n      if (caption) {\n        data.caption = caption;\n      }\n\n      const messageSent = await waInstance?.mediaMessage(data, null, true);\n\n      return messageSent;\n    } catch (error) {\n      this.logger.error(error);\n      throw error; // Re-throw para que o erro seja tratado pelo caller\n    }\n  }\n\n  public async onSendMessageError(instance: InstanceDto, conversation: number, error?: any) {\n    this.logger.verbose(`onSendMessageError ${JSON.stringify(error)}`);\n\n    const client = await this.clientCw(instance);\n\n    if (!client) {\n      return;\n    }\n\n    if (error && error?.status === 400 && error?.message[0]?.exists === false) {\n      client.messages.create({\n        accountId: this.provider.accountId,\n        conversationId: conversation,\n        data: {\n          content: `${i18next.t('cw.message.numbernotinwhatsapp')}`,\n          message_type: 'outgoing',\n          private: true,\n        },\n      });\n\n      return;\n    }\n\n    client.messages.create({\n      accountId: this.provider.accountId,\n      conversationId: conversation,\n      data: {\n        content: i18next.t('cw.message.notsent', {\n          error: error ? `_${error.toString()}_` : '',\n        }),\n        message_type: 'outgoing',\n        private: true,\n      },\n    });\n  }\n\n  public async receiveWebhook(instance: InstanceDto, body: any) {\n    try {\n      await new Promise((resolve) => setTimeout(resolve, 500));\n\n      const client = await this.clientCw(instance);\n\n      if (!client) {\n        this.logger.warn('client not found');\n        return null;\n      }\n\n      if (\n        this.provider.reopenConversation === false &&\n        body.event === 'conversation_status_changed' &&\n        body.status === 'resolved' &&\n        body.meta?.sender?.identifier\n      ) {\n        const keyToDelete = `${instance.instanceName}:createConversation-${body.meta.sender.identifier}`;\n        this.cache.delete(keyToDelete);\n      }\n\n      if (\n        !body?.conversation ||\n        body.private ||\n        (body.event === 'message_updated' && !body.content_attributes?.deleted)\n      ) {\n        return { message: 'bot' };\n      }\n\n      const chatId =\n        body.conversation.meta.sender?.identifier || body.conversation.meta.sender?.phone_number.replace('+', '');\n      // Chatwoot to Whatsapp\n      const messageReceived = body.content\n        ? body.content\n            .replaceAll(/(?<!\\*)\\*((?!\\s)([^\\n*]+?)(?<!\\s))\\*(?!\\*)/g, '_$1_') // Substitui * por _\n            .replaceAll(/\\*{2}((?!\\s)([^\\n*]+?)(?<!\\s))\\*{2}/g, '*$1*') // Substitui ** por *\n            .replaceAll(/~{2}((?!\\s)([^\\n*]+?)(?<!\\s))~{2}/g, '~$1~') // Substitui ~~ por ~\n            .replaceAll(/(?<!`)`((?!\\s)([^`*]+?)(?<!\\s))`(?!`)/g, '```$1```') // Substitui ` por ```\n        : body.content;\n\n      const senderName = body?.conversation?.messages[0]?.sender?.available_name || body?.sender?.name;\n      const waInstance = this.waMonitor.waInstances[instance.instanceName];\n      instance.instanceId = waInstance.instanceId;\n\n      if (body.event === 'message_updated' && body.content_attributes?.deleted) {\n        const message = await this.prismaRepository.message.findFirst({\n          where: {\n            chatwootMessageId: body.id,\n            instanceId: instance.instanceId,\n          },\n        });\n\n        if (message) {\n          const key = message.key as WAMessageKey;\n\n          await waInstance?.client.sendMessage(key.remoteJid, { delete: key });\n\n          await this.prismaRepository.message.deleteMany({\n            where: {\n              instanceId: instance.instanceId,\n              chatwootMessageId: body.id,\n            },\n          });\n        }\n        return { message: 'bot' };\n      }\n\n      const cwBotContact = this.configService.get<Chatwoot>('CHATWOOT').BOT_CONTACT;\n\n      if (chatId === '123456' && body.message_type === 'outgoing') {\n        const command = messageReceived.replace('/', '');\n\n        if (cwBotContact && (command.includes('init') || command.includes('iniciar'))) {\n          const state = waInstance?.connectionStatus?.state;\n\n          if (state !== 'open') {\n            const number = command.split(':')[1];\n            await waInstance.connectToWhatsapp(number);\n          } else {\n            await this.createBotMessage(\n              instance,\n              i18next.t('cw.inbox.alreadyConnected', {\n                inboxName: body.inbox.name,\n              }),\n              'incoming',\n            );\n          }\n        }\n\n        if (command === 'clearcache') {\n          waInstance.clearCacheChatwoot();\n          await this.createBotMessage(\n            instance,\n            i18next.t('cw.inbox.clearCache', {\n              inboxName: body.inbox.name,\n            }),\n            'incoming',\n          );\n        }\n\n        if (command === 'status') {\n          const state = waInstance?.connectionStatus?.state;\n\n          if (!state) {\n            await this.createBotMessage(\n              instance,\n              i18next.t('cw.inbox.notFound', {\n                inboxName: body.inbox.name,\n              }),\n              'incoming',\n            );\n          }\n\n          if (state) {\n            await this.createBotMessage(\n              instance,\n              i18next.t('cw.inbox.status', {\n                inboxName: body.inbox.name,\n                state: state,\n              }),\n              'incoming',\n            );\n          }\n        }\n\n        if (cwBotContact && (command === 'disconnect' || command === 'desconectar')) {\n          const msgLogout = i18next.t('cw.inbox.disconnect', {\n            inboxName: body.inbox.name,\n          });\n\n          await this.createBotMessage(instance, msgLogout, 'incoming');\n\n          await waInstance?.client?.logout('Log out instance: ' + instance.instanceName);\n          await waInstance?.client?.ws?.close();\n        }\n      }\n\n      if (body.message_type === 'outgoing' && body?.conversation?.messages?.length && chatId !== '123456') {\n        if (body?.conversation?.messages[0]?.source_id?.substring(0, 5) === 'WAID:') {\n          return { message: 'bot' };\n        }\n\n        if (!waInstance && body.conversation?.id) {\n          this.onSendMessageError(instance, body.conversation?.id, 'Instance not found');\n          return { message: 'bot' };\n        }\n\n        let formatText: string;\n        if (senderName === null || senderName === undefined) {\n          formatText = messageReceived;\n        } else {\n          const formattedDelimiter = this.provider.signDelimiter\n            ? this.provider.signDelimiter.replaceAll('\\\\n', '\\n')\n            : '\\n';\n          const textToConcat = this.provider.signMsg ? [`*${senderName}:*`] : [];\n          textToConcat.push(messageReceived);\n\n          formatText = textToConcat.join(formattedDelimiter);\n        }\n\n        for (const message of body.conversation.messages) {\n          if (message.attachments && message.attachments.length > 0) {\n            for (const attachment of message.attachments) {\n              if (!messageReceived) {\n                formatText = null;\n              }\n\n              const options: Options = {\n                quoted: await this.getQuotedMessage(body, instance),\n              };\n\n              const messageSent = await this.sendAttachment(\n                waInstance,\n                chatId,\n                attachment.data_url,\n                formatText,\n                options,\n              );\n              if (!messageSent && body.conversation?.id) {\n                this.onSendMessageError(instance, body.conversation?.id);\n              }\n\n              await this.updateChatwootMessageId(\n                {\n                  ...messageSent,\n                },\n                {\n                  messageId: body.id,\n                  inboxId: body.inbox?.id,\n                  conversationId: body.conversation?.id,\n                  contactInboxSourceId: body.conversation?.contact_inbox?.source_id,\n                },\n                instance,\n              );\n            }\n          } else {\n            const data: SendTextDto = {\n              number: chatId,\n              text: formatText,\n              delay: Math.floor(Math.random() * (2000 - 500 + 1)) + 500,\n              quoted: await this.getQuotedMessage(body, instance),\n            };\n\n            sendTelemetry('/message/sendText');\n\n            let messageSent: any;\n            try {\n              messageSent = await waInstance?.textMessage(data, true);\n              if (!messageSent) {\n                throw new Error('Message not sent');\n              }\n\n              if (Long.isLong(messageSent?.messageTimestamp)) {\n                messageSent.messageTimestamp = messageSent.messageTimestamp?.toNumber();\n              }\n\n              await this.updateChatwootMessageId(\n                {\n                  ...messageSent,\n                },\n                {\n                  messageId: body.id,\n                  inboxId: body.inbox?.id,\n                  conversationId: body.conversation?.id,\n                  contactInboxSourceId: body.conversation?.contact_inbox?.source_id,\n                },\n                instance,\n              );\n            } catch (error) {\n              if (!messageSent && body.conversation?.id) {\n                this.onSendMessageError(instance, body.conversation?.id, error);\n              }\n              throw error;\n            }\n          }\n        }\n\n        const chatwootRead = this.configService.get<Chatwoot>('CHATWOOT').MESSAGE_READ;\n        if (chatwootRead) {\n          const lastMessage = await this.prismaRepository.message.findFirst({\n            where: {\n              key: {\n                path: ['fromMe'],\n                equals: false,\n              },\n              instanceId: instance.instanceId,\n            },\n          });\n          if (lastMessage && !lastMessage.chatwootIsRead) {\n            const key = lastMessage.key as WAMessageKey;\n\n            waInstance?.markMessageAsRead({\n              readMessages: [\n                {\n                  id: key.id,\n                  fromMe: key.fromMe,\n                  remoteJid: key.remoteJid,\n                },\n              ],\n            });\n            const updateMessage = {\n              chatwootMessageId: lastMessage.chatwootMessageId,\n              chatwootConversationId: lastMessage.chatwootConversationId,\n              chatwootInboxId: lastMessage.chatwootInboxId,\n              chatwootContactInboxSourceId: lastMessage.chatwootContactInboxSourceId,\n              chatwootIsRead: true,\n            };\n\n            await this.prismaRepository.message.updateMany({\n              where: {\n                instanceId: instance.instanceId,\n                key: {\n                  path: ['id'],\n                  equals: key.id,\n                },\n              },\n              data: updateMessage,\n            });\n          }\n        }\n      }\n\n      if (body.message_type === 'template' && body.event === 'message_created') {\n        const data: SendTextDto = {\n          number: chatId,\n          text: body.content.replace(/\\\\\\r\\n|\\\\\\n|\\n/g, '\\n'),\n          delay: Math.floor(Math.random() * (2000 - 500 + 1)) + 500,\n        };\n\n        sendTelemetry('/message/sendText');\n\n        await waInstance?.textMessage(data);\n      }\n\n      return { message: 'bot' };\n    } catch (error) {\n      this.logger.error(error);\n\n      return { message: 'bot' };\n    }\n  }\n\n  private async updateChatwootMessageId(\n    message: MessageModel,\n    chatwootMessageIds: ChatwootMessage,\n    instance: InstanceDto,\n  ) {\n    const key = message.key as WAMessageKey;\n\n    if (!chatwootMessageIds.messageId || !key?.id) {\n      return;\n    }\n\n    // Use raw SQL to avoid JSON path issues\n    const result = await this.prismaRepository.$executeRaw`\n      UPDATE \"Message\" \n      SET \n        \"chatwootMessageId\" = ${chatwootMessageIds.messageId},\n        \"chatwootConversationId\" = ${chatwootMessageIds.conversationId},\n        \"chatwootInboxId\" = ${chatwootMessageIds.inboxId},\n        \"chatwootContactInboxSourceId\" = ${chatwootMessageIds.contactInboxSourceId},\n        \"chatwootIsRead\" = ${chatwootMessageIds.isRead || false}\n      WHERE \"instanceId\" = ${instance.instanceId} \n      AND \"key\"->>'id' = ${key.id}\n    `;\n\n    this.logger.verbose(`Update result: ${result} rows affected`);\n\n    if (this.isImportHistoryAvailable()) {\n      try {\n        await chatwootImport.updateMessageSourceID(chatwootMessageIds.messageId, key.id);\n      } catch (error) {\n        this.logger.error(`Error updating Chatwoot message source ID: ${error}`);\n      }\n    }\n  }\n\n  private async getMessageByKeyId(instance: InstanceDto, keyId: string): Promise<MessageModel> {\n    // Use raw SQL query to avoid JSON path issues with Prisma\n    const messages = await this.prismaRepository.$queryRaw`\n      SELECT * FROM \"Message\" \n      WHERE \"instanceId\" = ${instance.instanceId} \n      AND \"key\"->>'id' = ${keyId}\n      LIMIT 1\n    `;\n\n    return (messages as MessageModel[])[0] || null;\n  }\n\n  private async getReplyToIds(\n    msg: any,\n    instance: InstanceDto,\n  ): Promise<{ in_reply_to: string; in_reply_to_external_id: string }> {\n    let inReplyTo = null;\n    let inReplyToExternalId = null;\n\n    if (msg) {\n      inReplyToExternalId = msg.message?.extendedTextMessage?.contextInfo?.stanzaId ?? msg.contextInfo?.stanzaId;\n      if (inReplyToExternalId) {\n        const message = await this.getMessageByKeyId(instance, inReplyToExternalId);\n        if (message?.chatwootMessageId) {\n          inReplyTo = message.chatwootMessageId;\n        }\n      }\n    }\n\n    return {\n      in_reply_to: inReplyTo,\n      in_reply_to_external_id: inReplyToExternalId,\n    };\n  }\n\n  private async getQuotedMessage(msg: any, instance: InstanceDto): Promise<Quoted> {\n    if (msg?.content_attributes?.in_reply_to) {\n      const message = await this.prismaRepository.message.findFirst({\n        where: {\n          chatwootMessageId: msg?.content_attributes?.in_reply_to,\n          instanceId: instance.instanceId,\n        },\n      });\n\n      const key = message?.key as WAMessageKey;\n      const messageContent = message?.message as WAMessageContent;\n\n      if (messageContent && key?.id) {\n        return {\n          key: key,\n          message: messageContent,\n        };\n      }\n    }\n\n    return null;\n  }\n\n  private isMediaMessage(message: any) {\n    const media = [\n      'imageMessage',\n      'documentMessage',\n      'documentWithCaptionMessage',\n      'audioMessage',\n      'videoMessage',\n      'stickerMessage',\n      'viewOnceMessageV2',\n    ];\n\n    const messageKeys = Object.keys(message);\n\n    const result = messageKeys.some((key) => media.includes(key));\n\n    return result;\n  }\n\n  private isInteractiveButtonMessage(messageType: string, message: any) {\n    return messageType === 'interactiveMessage' && message.interactiveMessage?.nativeFlowMessage?.buttons?.length > 0;\n  }\n\n  private getAdsMessage(msg: any) {\n    interface AdsMessage {\n      title: string;\n      body: string;\n      thumbnailUrl: string;\n      sourceUrl: string;\n    }\n\n    const adsMessage: AdsMessage | undefined = {\n      title: msg.extendedTextMessage?.contextInfo?.externalAdReply?.title || msg.contextInfo?.externalAdReply?.title,\n      body: msg.extendedTextMessage?.contextInfo?.externalAdReply?.body || msg.contextInfo?.externalAdReply?.body,\n      thumbnailUrl:\n        msg.extendedTextMessage?.contextInfo?.externalAdReply?.thumbnailUrl ||\n        msg.contextInfo?.externalAdReply?.thumbnailUrl,\n      sourceUrl:\n        msg.extendedTextMessage?.contextInfo?.externalAdReply?.sourceUrl || msg.contextInfo?.externalAdReply?.sourceUrl,\n    };\n\n    return adsMessage;\n  }\n\n  private getReactionMessage(msg: any) {\n    interface ReactionMessage {\n      key: {\n        id: string;\n        fromMe: boolean;\n        remoteJid: string;\n        participant?: string;\n      };\n      text: string;\n    }\n    const reactionMessage: ReactionMessage | undefined = msg?.reactionMessage;\n\n    return reactionMessage;\n  }\n\n  private getTypeMessage(msg: any) {\n    const types = {\n      conversation: msg.conversation,\n      imageMessage: msg.imageMessage?.caption,\n      videoMessage: msg.videoMessage?.caption,\n      extendedTextMessage: msg.extendedTextMessage?.text,\n      messageContextInfo: msg.messageContextInfo?.stanzaId,\n      stickerMessage: undefined,\n      documentMessage: msg.documentMessage?.caption,\n      documentWithCaptionMessage: msg.documentWithCaptionMessage?.message?.documentMessage?.caption,\n      audioMessage: msg.audioMessage ? (msg.audioMessage.caption ?? '') : undefined,\n      contactMessage: msg.contactMessage?.vcard,\n      contactsArrayMessage: msg.contactsArrayMessage,\n      locationMessage: msg.locationMessage,\n      liveLocationMessage: msg.liveLocationMessage,\n      listMessage: msg.listMessage,\n      listResponseMessage: msg.listResponseMessage,\n      viewOnceMessageV2:\n        msg?.message?.viewOnceMessageV2?.message?.imageMessage?.url ||\n        msg?.message?.viewOnceMessageV2?.message?.videoMessage?.url ||\n        msg?.message?.viewOnceMessageV2?.message?.audioMessage?.url,\n    };\n\n    return types;\n  }\n\n  private getMessageContent(types: any) {\n    const typeKey = Object.keys(types).find((key) => types[key] !== undefined);\n\n    let result = typeKey ? types[typeKey] : undefined;\n\n    // Remove externalAdReplyBody| in Chatwoot (Already Have)\n    if (result && typeof result === 'string' && result.includes('externalAdReplyBody|')) {\n      result = result.split('externalAdReplyBody|').filter(Boolean).join('');\n    }\n\n    if (typeKey === 'locationMessage' || typeKey === 'liveLocationMessage') {\n      const latitude = result.degreesLatitude;\n      const longitude = result.degreesLongitude;\n\n      const locationName = result?.name;\n      const locationAddress = result?.address;\n\n      const formattedLocation =\n        `*${i18next.t('cw.locationMessage.location')}:*\\n\\n` +\n        `_${i18next.t('cw.locationMessage.latitude')}:_ ${latitude} \\n` +\n        `_${i18next.t('cw.locationMessage.longitude')}:_ ${longitude} \\n` +\n        (locationName ? `_${i18next.t('cw.locationMessage.locationName')}:_ ${locationName}\\n` : '') +\n        (locationAddress ? `_${i18next.t('cw.locationMessage.locationAddress')}:_ ${locationAddress} \\n` : '') +\n        `_${i18next.t('cw.locationMessage.locationUrl')}:_ ` +\n        `https://www.google.com/maps/search/?api=1&query=${latitude},${longitude}`;\n\n      return formattedLocation;\n    }\n\n    if (typeKey === 'contactMessage') {\n      const vCardData = result.split('\\n');\n      const contactInfo = {};\n\n      vCardData.forEach((line) => {\n        const [key, value] = line.split(':');\n        if (key && value) {\n          contactInfo[key] = value;\n        }\n      });\n\n      let formattedContact =\n        `*${i18next.t('cw.contactMessage.contact')}:*\\n\\n` +\n        `_${i18next.t('cw.contactMessage.name')}:_ ${contactInfo['FN']}`;\n\n      let numberCount = 1;\n      Object.keys(contactInfo).forEach((key) => {\n        if (key.startsWith('item') && key.includes('TEL')) {\n          const phoneNumber = contactInfo[key];\n          formattedContact += `\\n_${i18next.t('cw.contactMessage.number')} (${numberCount}):_ ${phoneNumber}`;\n          numberCount++;\n        } else if (key.includes('TEL')) {\n          const phoneNumber = contactInfo[key];\n          formattedContact += `\\n_${i18next.t('cw.contactMessage.number')} (${numberCount}):_ ${phoneNumber}`;\n          numberCount++;\n        }\n      });\n\n      return formattedContact;\n    }\n\n    if (typeKey === 'contactsArrayMessage') {\n      const formattedContacts = result.contacts.map((contact) => {\n        const vCardData = contact.vcard.split('\\n');\n        const contactInfo = {};\n\n        vCardData.forEach((line) => {\n          const [key, value] = line.split(':');\n          if (key && value) {\n            contactInfo[key] = value;\n          }\n        });\n\n        let formattedContact = `*${i18next.t('cw.contactMessage.contact')}:*\\n\\n_${i18next.t(\n          'cw.contactMessage.name',\n        )}:_ ${contact.displayName}`;\n\n        let numberCount = 1;\n        Object.keys(contactInfo).forEach((key) => {\n          if (key.startsWith('item') && key.includes('TEL')) {\n            const phoneNumber = contactInfo[key];\n            formattedContact += `\\n_${i18next.t('cw.contactMessage.number')} (${numberCount}):_ ${phoneNumber}`;\n            numberCount++;\n          } else if (key.includes('TEL')) {\n            const phoneNumber = contactInfo[key];\n            formattedContact += `\\n_${i18next.t('cw.contactMessage.number')} (${numberCount}):_ ${phoneNumber}`;\n            numberCount++;\n          }\n        });\n\n        return formattedContact;\n      });\n\n      const formattedContactsArray = formattedContacts.join('\\n\\n');\n\n      return formattedContactsArray;\n    }\n\n    if (typeKey === 'listMessage') {\n      const listTitle = result?.title || 'Unknown';\n      const listDescription = result?.description || 'Unknown';\n      const listFooter = result?.footerText || 'Unknown';\n\n      let formattedList =\n        '*List Menu:*\\n\\n' +\n        '_Title_: ' +\n        listTitle +\n        '\\n' +\n        '_Description_: ' +\n        listDescription +\n        '\\n' +\n        '_Footer_: ' +\n        listFooter;\n\n      if (result.sections && result.sections.length > 0) {\n        result.sections.forEach((section, sectionIndex) => {\n          formattedList += '\\n\\n*Section ' + (sectionIndex + 1) + ':* ' + section.title || 'Unknown\\n';\n\n          if (section.rows && section.rows.length > 0) {\n            section.rows.forEach((row, rowIndex) => {\n              formattedList += '\\n*Line ' + (rowIndex + 1) + ':*\\n';\n              formattedList += '_▪️ Title:_ ' + (row.title || 'Unknown') + '\\n';\n              formattedList += '_▪️ Description:_ ' + (row.description || 'Unknown') + '\\n';\n              formattedList += '_▪️ ID:_ ' + (row.rowId || 'Unknown') + '\\n';\n            });\n          } else {\n            formattedList += '\\nNo lines found in this section.\\n';\n          }\n        });\n      } else {\n        formattedList += '\\nNo sections found.\\n';\n      }\n\n      return formattedList;\n    }\n\n    if (typeKey === 'listResponseMessage') {\n      const responseTitle = result?.title || 'Unknown';\n      const responseDescription = result?.description || 'Unknown';\n      const responseRowId = result?.singleSelectReply?.selectedRowId || 'Unknown';\n\n      const formattedResponseList =\n        '*List Response:*\\n\\n' +\n        '_Title_: ' +\n        responseTitle +\n        '\\n' +\n        '_Description_: ' +\n        responseDescription +\n        '\\n' +\n        '_ID_: ' +\n        responseRowId;\n      return formattedResponseList;\n    }\n\n    return result;\n  }\n\n  public getConversationMessage(msg: any) {\n    const types = this.getTypeMessage(msg);\n\n    const messageContent = this.getMessageContent(types);\n\n    return messageContent;\n  }\n\n  public async eventWhatsapp(event: string, instance: InstanceDto, body: any) {\n    try {\n      const waInstance = this.waMonitor.waInstances[instance.instanceName];\n\n      if (!waInstance) {\n        this.logger.warn('wa instance not found');\n        return null;\n      }\n\n      const client = await this.clientCw(instance);\n\n      if (!client) {\n        this.logger.warn('client not found');\n        return null;\n      }\n\n      if (this.provider?.ignoreJids && this.provider?.ignoreJids.length > 0) {\n        const ignoreJids: any = this.provider?.ignoreJids;\n\n        let ignoreGroups = false;\n        let ignoreContacts = false;\n\n        if (ignoreJids.includes('@g.us')) {\n          ignoreGroups = true;\n        }\n\n        if (ignoreJids.includes('@s.whatsapp.net')) {\n          ignoreContacts = true;\n        }\n\n        if (ignoreGroups && body?.key?.remoteJid.endsWith('@g.us')) {\n          this.logger.warn('Ignoring message from group: ' + body?.key?.remoteJid);\n          return;\n        }\n\n        if (ignoreContacts && body?.key?.remoteJid.endsWith('@s.whatsapp.net')) {\n          this.logger.warn('Ignoring message from contact: ' + body?.key?.remoteJid);\n          return;\n        }\n\n        if (ignoreJids.includes(body?.key?.remoteJid)) {\n          this.logger.warn('Ignoring message from jid: ' + body?.key?.remoteJid);\n          return;\n        }\n      }\n\n      if (event === 'messages.upsert' || event === 'send.message') {\n        this.logger.info(`[${event}] New message received - Instance: ${JSON.stringify(body, null, 2)}`);\n        if (body.key.remoteJid === 'status@broadcast') {\n          return;\n        }\n\n        if (body.message?.ephemeralMessage?.message) {\n          body.message = {\n            ...body.message?.ephemeralMessage?.message,\n          };\n        }\n\n        const originalMessage = await this.getConversationMessage(body.message);\n        const bodyMessage = originalMessage\n          ? originalMessage\n              .replaceAll(/\\*((?!\\s)([^\\n*]+?)(?<!\\s))\\*/g, '**$1**')\n              .replaceAll(/_((?!\\s)([^\\n_]+?)(?<!\\s))_/g, '*$1*')\n              .replaceAll(/~((?!\\s)([^\\n~]+?)(?<!\\s))~/g, '~~$1~~')\n          : originalMessage;\n\n        if (bodyMessage && bodyMessage.includes('/survey/responses/') && bodyMessage.includes('http')) {\n          return;\n        }\n\n        const quotedId = body.contextInfo?.stanzaId || body.message?.contextInfo?.stanzaId;\n\n        let quotedMsg = null;\n\n        if (quotedId)\n          quotedMsg = await this.prismaRepository.message.findFirst({\n            where: {\n              key: {\n                path: ['id'],\n                equals: quotedId,\n              },\n              chatwootMessageId: {\n                not: null,\n              },\n            },\n          });\n\n        const isMedia = this.isMediaMessage(body.message);\n\n        const adsMessage = this.getAdsMessage(body);\n\n        const reactionMessage = this.getReactionMessage(body.message);\n        const isInteractiveButtonMessage = this.isInteractiveButtonMessage(body.messageType, body.message);\n\n        if (!bodyMessage && !isMedia && !reactionMessage && !isInteractiveButtonMessage) {\n          this.logger.warn('no body message found');\n          return;\n        }\n\n        const getConversation = await this.createConversation(instance, body);\n\n        if (!getConversation) {\n          this.logger.warn('conversation not found');\n          return;\n        }\n\n        const messageType = body.key.fromMe ? 'outgoing' : 'incoming';\n\n        if (isMedia) {\n          const downloadBase64 = await waInstance?.getBase64FromMediaMessage({\n            message: {\n              ...body,\n            },\n          });\n\n          let nameFile: string;\n          const messageBody = body?.message[body?.messageType];\n          const originalFilename =\n            messageBody?.fileName || messageBody?.filename || messageBody?.message?.documentMessage?.fileName;\n          if (originalFilename) {\n            const parsedFile = path.parse(originalFilename);\n            if (parsedFile.name && parsedFile.ext) {\n              nameFile = `${parsedFile.name}-${Math.floor(Math.random() * (99 - 10 + 1) + 10)}${parsedFile.ext}`;\n            }\n          }\n\n          if (!nameFile) {\n            nameFile = `${Math.random().toString(36).substring(7)}.${mimeTypes.extension(downloadBase64.mimetype) || ''}`;\n          }\n\n          const fileData = Buffer.from(downloadBase64.base64, 'base64');\n\n          const fileStream = new Readable();\n          fileStream._read = () => {};\n          fileStream.push(fileData);\n          fileStream.push(null);\n\n          if (body.key.remoteJid.includes('@g.us')) {\n            const participantName = body.pushName;\n            const rawPhoneNumber =\n              body.key.addressingMode === 'lid' && !body.key.fromMe && body.key.participantAlt\n                ? body.key.participantAlt.split('@')[0].split(':')[0]\n                : body.key.participant.split('@')[0].split(':')[0];\n            const formattedPhoneNumber = parsePhoneNumberFromString(`+${rawPhoneNumber}`).formatInternational();\n\n            let content: string;\n\n            if (!body.key.fromMe) {\n              content = bodyMessage\n                ? `**${formattedPhoneNumber} - ${participantName}:**\\n\\n${bodyMessage}`\n                : `**${formattedPhoneNumber} - ${participantName}:**`;\n            } else {\n              content = bodyMessage || '';\n            }\n\n            const send = await this.sendData(\n              getConversation,\n              fileStream,\n              nameFile,\n              messageType,\n              content,\n              instance,\n              body,\n              'WAID:' + body.key.id,\n              quotedMsg,\n            );\n\n            if (!send) {\n              this.logger.warn('message not sent');\n              return;\n            }\n\n            return send;\n          } else {\n            const send = await this.sendData(\n              getConversation,\n              fileStream,\n              nameFile,\n              messageType,\n              bodyMessage,\n              instance,\n              body,\n              'WAID:' + body.key.id,\n              quotedMsg,\n            );\n\n            if (!send) {\n              this.logger.warn('message not sent');\n              return;\n            }\n\n            return send;\n          }\n        }\n\n        if (reactionMessage) {\n          if (reactionMessage.text) {\n            const send = await this.createMessage(\n              instance,\n              getConversation,\n              reactionMessage.text,\n              messageType,\n              false,\n              [],\n              {\n                message: { extendedTextMessage: { contextInfo: { stanzaId: reactionMessage.key.id } } },\n              },\n              'WAID:' + body.key.id,\n              quotedMsg,\n            );\n            if (!send) {\n              this.logger.warn('message not sent');\n              return;\n            }\n          }\n\n          return;\n        }\n\n        if (isInteractiveButtonMessage) {\n          const buttons = body.message.interactiveMessage.nativeFlowMessage.buttons;\n          this.logger.info('is Interactive Button Message: ' + JSON.stringify(buttons));\n\n          for (const button of buttons) {\n            const buttonParams = JSON.parse(button.buttonParamsJson);\n            const paymentSettings = buttonParams.payment_settings;\n\n            if (button.name === 'payment_info' && paymentSettings[0].type === 'pix_static_code') {\n              const pixSettings = paymentSettings[0].pix_static_code;\n              const pixKeyType = (() => {\n                switch (pixSettings.key_type) {\n                  case 'EVP':\n                    return 'Chave Aleatória';\n                  case 'EMAIL':\n                    return 'E-mail';\n                  case 'PHONE':\n                    return 'Telefone';\n                  default:\n                    return pixSettings.key_type;\n                }\n              })();\n              const pixKey = pixSettings.key_type === 'PHONE' ? pixSettings.key.replace('+55', '') : pixSettings.key;\n              const content = `*${pixSettings.merchant_name}*\\nChave PIX: ${pixKey} (${pixKeyType})`;\n\n              const send = await this.createMessage(\n                instance,\n                getConversation,\n                content,\n                messageType,\n                false,\n                [],\n                body,\n                'WAID:' + body.key.id,\n                quotedMsg,\n              );\n              if (!send) this.logger.warn('message not sent');\n            } else {\n              this.logger.warn('Interactive Button Message not mapped');\n            }\n          }\n          return;\n        }\n\n        const isAdsMessage = (adsMessage && adsMessage.title) || adsMessage.body || adsMessage.thumbnailUrl;\n        if (isAdsMessage) {\n          const imgBuffer = await axios.get(adsMessage.thumbnailUrl, { responseType: 'arraybuffer' });\n\n          const extension = mimeTypes.extension(imgBuffer.headers['content-type']);\n          const mimeType = extension && mimeTypes.lookup(extension);\n\n          if (!mimeType) {\n            this.logger.warn('mimetype of Ads message not found');\n            return;\n          }\n\n          const random = Math.random().toString(36).substring(7);\n          const nameFile = `${random}.${mimeTypes.extension(mimeType)}`;\n          const fileData = Buffer.from(imgBuffer.data, 'binary');\n\n          const img = await Jimp.read(fileData);\n          await img.cover({\n            w: 320,\n            h: 180,\n          });\n          const processedBuffer = await img.getBuffer(JimpMime.png);\n\n          const fileStream = new Readable();\n          fileStream._read = () => {}; // _read is required but you can noop it\n          fileStream.push(processedBuffer);\n          fileStream.push(null);\n\n          const truncStr = (str: string, len: number) => {\n            if (!str) return '';\n\n            return str.length > len ? str.substring(0, len) + '...' : str;\n          };\n\n          const title = truncStr(adsMessage.title, 40);\n          const description = truncStr(adsMessage?.body, 75);\n\n          const send = await this.sendData(\n            getConversation,\n            fileStream,\n            nameFile,\n            messageType,\n            `${bodyMessage}\\n\\n\\n**${title}**\\n${description}\\n${adsMessage.sourceUrl}`,\n            instance,\n            body,\n            'WAID:' + body.key.id,\n          );\n\n          if (!send) {\n            this.logger.warn('message not sent');\n            return;\n          }\n\n          return send;\n        }\n\n        if (body.key.remoteJid.includes('@g.us')) {\n          const participantName = body.pushName;\n          const rawPhoneNumber =\n            body.key.addressingMode === 'lid' && !body.key.fromMe && body.key.participantAlt\n              ? body.key.participantAlt.split('@')[0].split(':')[0]\n              : body.key.participant.split('@')[0].split(':')[0];\n          const formattedPhoneNumber = parsePhoneNumberFromString(`+${rawPhoneNumber}`).formatInternational();\n\n          let content: string;\n\n          if (!body.key.fromMe) {\n            content = `**${formattedPhoneNumber} - ${participantName}:**\\n\\n${bodyMessage}`;\n          } else {\n            content = `${bodyMessage}`;\n          }\n\n          const send = await this.createMessage(\n            instance,\n            getConversation,\n            content,\n            messageType,\n            false,\n            [],\n            body,\n            'WAID:' + body.key.id,\n            quotedMsg,\n          );\n\n          if (!send) {\n            this.logger.warn('message not sent');\n            return;\n          }\n\n          return send;\n        } else {\n          const send = await this.createMessage(\n            instance,\n            getConversation,\n            bodyMessage,\n            messageType,\n            false,\n            [],\n            body,\n            'WAID:' + body.key.id,\n            quotedMsg,\n          );\n\n          if (!send) {\n            this.logger.warn('message not sent');\n            return;\n          }\n\n          return send;\n        }\n      }\n\n      if (event === Events.MESSAGES_DELETE) {\n        const chatwootDelete = this.configService.get<Chatwoot>('CHATWOOT').MESSAGE_DELETE;\n\n        if (chatwootDelete === true) {\n          if (!body?.key?.id) {\n            this.logger.warn('message id not found');\n            return;\n          }\n\n          const message = await this.getMessageByKeyId(instance, body.key.id);\n\n          if (message?.chatwootMessageId && message?.chatwootConversationId) {\n            await this.prismaRepository.message.deleteMany({\n              where: {\n                key: {\n                  path: ['id'],\n                  equals: body.key.id,\n                },\n                instanceId: instance.instanceId,\n              },\n            });\n\n            return await client.messages.delete({\n              accountId: this.provider.accountId,\n              conversationId: message.chatwootConversationId,\n              messageId: message.chatwootMessageId,\n            });\n          }\n        }\n      }\n\n      if (event === 'messages.edit' || event === 'send.message.update') {\n        const editedMessageContentRaw =\n          body?.editedMessage?.conversation ??\n          body?.editedMessage?.extendedTextMessage?.text ??\n          body?.editedMessage?.imageMessage?.caption ??\n          body?.editedMessage?.videoMessage?.caption ??\n          body?.editedMessage?.documentMessage?.caption ??\n          (typeof body?.text === 'string' ? body.text : undefined);\n\n        const editedMessageContent = (editedMessageContentRaw ?? '').trim();\n\n        if (!editedMessageContent) {\n          this.logger.info('[CW.EDIT] Conteúdo vazio — ignorando (DELETE tratará se for revoke).');\n          return;\n        }\n\n        const message = await this.getMessageByKeyId(instance, body?.key?.id);\n\n        if (!message) {\n          this.logger.warn('Message not found for edit event');\n          return;\n        }\n\n        const key = message.key as WAMessageKey;\n\n        const messageType = key?.fromMe ? 'outgoing' : 'incoming';\n\n        if (message && message.chatwootConversationId && message.chatwootMessageId) {\n          // Criar nova mensagem com formato: \"Mensagem editada:\\n\\nteste1\"\n          const editedText = `\\n\\n\\`${i18next.t('cw.message.edited')}:\\`\\n\\n${editedMessageContent}`;\n\n          const send = await this.createMessage(\n            instance,\n            message.chatwootConversationId,\n            editedText,\n            messageType,\n            false,\n            [],\n            {\n              message: { extendedTextMessage: { contextInfo: { stanzaId: key.id } } },\n            },\n            'WAID:' + body.key.id,\n            null,\n          );\n          if (!send) {\n            this.logger.warn('edited message not sent');\n            return;\n          }\n        }\n        return;\n      }\n\n      if (event === 'messages.read') {\n        if (!body?.key?.id || !body?.key?.remoteJid) {\n          this.logger.warn('message id not found');\n          return;\n        }\n\n        const message = await this.getMessageByKeyId(instance, body.key.id);\n        const conversationId = message?.chatwootConversationId;\n        const contactInboxSourceId = message?.chatwootContactInboxSourceId;\n\n        if (conversationId) {\n          let sourceId = contactInboxSourceId;\n          const inbox = (await this.getInbox(instance)) as inbox & {\n            inbox_identifier?: string;\n          };\n\n          if (!sourceId && inbox) {\n            const conversation = (await client.conversations.get({\n              accountId: this.provider.accountId,\n              conversationId: conversationId,\n            })) as conversation_show & {\n              last_non_activity_message: { conversation: { contact_inbox: contact_inboxes } };\n            };\n            sourceId = conversation.last_non_activity_message?.conversation?.contact_inbox?.source_id;\n          }\n\n          if (sourceId && inbox?.inbox_identifier) {\n            const url =\n              `/public/api/v1/inboxes/${inbox.inbox_identifier}/contacts/${sourceId}` +\n              `/conversations/${conversationId}/update_last_seen`;\n            await chatwootRequest(this.getClientCwConfig(), {\n              method: 'POST',\n              url: url,\n            });\n          }\n        }\n        return;\n      }\n\n      if (event === 'status.instance') {\n        const data = body;\n        const inbox = await this.getInbox(instance);\n\n        if (!inbox) {\n          this.logger.warn('inbox not found');\n          return;\n        }\n\n        const msgStatus = i18next.t('cw.inbox.status', {\n          inboxName: inbox.name,\n          state: data.status,\n        });\n\n        await this.createBotMessage(instance, msgStatus, 'incoming');\n      }\n\n      if (event === 'connection.update' && body.status === 'open') {\n        const waInstance = this.waMonitor.waInstances[instance.instanceName];\n        if (!waInstance) return;\n\n        const now = Date.now();\n        const timeSinceLastNotification = now - (waInstance.lastConnectionNotification || 0);\n\n        // Se a conexão foi estabelecida via QR code, notifica imediatamente.\n        if (waInstance.qrCode && waInstance.qrCode.count > 0) {\n          const msgConnection = i18next.t('cw.inbox.connected');\n          await this.createBotMessage(instance, msgConnection, 'incoming');\n          waInstance.qrCode.count = 0;\n          waInstance.lastConnectionNotification = now;\n          chatwootImport.clearAll(instance);\n        }\n        // Se não foi via QR code, verifica o throttling.\n        else if (timeSinceLastNotification >= 30000) {\n          const msgConnection = i18next.t('cw.inbox.connected');\n          await this.createBotMessage(instance, msgConnection, 'incoming');\n          waInstance.lastConnectionNotification = now;\n        } else {\n          this.logger.warn(\n            `Connection notification skipped for ${instance.instanceName} - too frequent (${timeSinceLastNotification}ms since last)`,\n          );\n        }\n      }\n\n      if (event === 'qrcode.updated') {\n        if (body.statusCode === 500) {\n          const erroQRcode = `🚨 ${i18next.t('qrlimitreached')}`;\n          return await this.createBotMessage(instance, erroQRcode, 'incoming');\n        } else {\n          const fileData = Buffer.from(body?.qrcode.base64.replace('data:image/png;base64,', ''), 'base64');\n\n          const fileStream = new Readable();\n          fileStream._read = () => {};\n          fileStream.push(fileData);\n          fileStream.push(null);\n\n          await this.createBotQr(\n            instance,\n            i18next.t('qrgeneratedsuccesfully'),\n            'incoming',\n            fileStream,\n            `${instance.instanceName}.png`,\n          );\n\n          let msgQrCode = `⚡️${i18next.t('qrgeneratedsuccesfully')}\\n\\n${i18next.t('scanqr')}`;\n\n          if (body?.qrcode?.pairingCode) {\n            msgQrCode =\n              msgQrCode +\n              `\\n\\n*Pairing Code:* ${body.qrcode.pairingCode.substring(0, 4)}-${body.qrcode.pairingCode.substring(\n                4,\n                8,\n              )}`;\n          }\n\n          await this.createBotMessage(instance, msgQrCode, 'incoming');\n        }\n      }\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  public normalizeJidIdentifier(remoteJid: string) {\n    if (!remoteJid) {\n      return '';\n    }\n    if (remoteJid.includes('@lid')) {\n      return remoteJid;\n    }\n    return remoteJid.replace(/:\\d+/, '').split('@')[0];\n  }\n\n  public startImportHistoryMessages(instance: InstanceDto) {\n    if (!this.isImportHistoryAvailable()) {\n      return;\n    }\n\n    this.createBotMessage(instance, i18next.t('cw.import.startImport'), 'incoming');\n  }\n\n  public isImportHistoryAvailable() {\n    const uri = this.configService.get<Chatwoot>('CHATWOOT').IMPORT.DATABASE.CONNECTION.URI;\n\n    return uri && uri !== 'postgres://user:password@hostname:port/dbname';\n  }\n\n  public addHistoryMessages(instance: InstanceDto, messagesRaw: MessageModel[]) {\n    if (!this.isImportHistoryAvailable()) {\n      return;\n    }\n\n    chatwootImport.addHistoryMessages(instance, messagesRaw);\n  }\n\n  public addHistoryContacts(instance: InstanceDto, contactsRaw: ContactModel[]) {\n    if (!this.isImportHistoryAvailable()) {\n      return;\n    }\n\n    return chatwootImport.addHistoryContacts(instance, contactsRaw);\n  }\n\n  public async importHistoryMessages(instance: InstanceDto) {\n    if (!this.isImportHistoryAvailable()) {\n      return;\n    }\n\n    this.createBotMessage(instance, i18next.t('cw.import.importingMessages'), 'incoming');\n\n    const totalMessagesImported = await chatwootImport.importHistoryMessages(\n      instance,\n      this,\n      await this.getInbox(instance),\n      this.provider,\n    );\n    this.updateContactAvatarInRecentConversations(instance);\n\n    const msg = Number.isInteger(totalMessagesImported)\n      ? i18next.t('cw.import.messagesImported', { totalMessagesImported })\n      : i18next.t('cw.import.messagesException');\n\n    this.createBotMessage(instance, msg, 'incoming');\n\n    return totalMessagesImported;\n  }\n\n  public async updateContactAvatarInRecentConversations(instance: InstanceDto, limitContacts = 100) {\n    try {\n      if (!this.isImportHistoryAvailable()) {\n        return;\n      }\n\n      const client = await this.clientCw(instance);\n      if (!client) {\n        this.logger.warn('client not found');\n        return null;\n      }\n\n      const inbox = await this.getInbox(instance);\n      if (!inbox) {\n        this.logger.warn('inbox not found');\n        return null;\n      }\n\n      const recentContacts = await chatwootImport.getContactsOrderByRecentConversations(\n        inbox,\n        this.provider,\n        limitContacts,\n      );\n\n      const contactIdentifiers = recentContacts\n        .map((contact) => contact.identifier)\n        .filter((identifier) => identifier !== null);\n\n      const contactsWithProfilePicture = (\n        await this.prismaRepository.contact.findMany({\n          where: {\n            instanceId: instance.instanceId,\n            id: {\n              in: contactIdentifiers,\n            },\n            profilePicUrl: {\n              not: null,\n            },\n          },\n        })\n      ).reduce((acc: Map<string, ContactModel>, contact: ContactModel) => acc.set(contact.id, contact), new Map());\n\n      recentContacts.forEach(async (contact) => {\n        if (contactsWithProfilePicture.has(contact.identifier)) {\n          client.contacts.update({\n            accountId: this.provider.accountId,\n            id: contact.id,\n            data: {\n              avatar_url: contactsWithProfilePicture.get(contact.identifier).profilePictureUrl || null,\n            },\n          });\n        }\n      });\n    } catch (error) {\n      this.logger.error(`Error on update avatar in recent conversations: ${error.toString()}`);\n    }\n  }\n\n  public async syncLostMessages(\n    instance: InstanceDto,\n    chatwootConfig: ChatwootDto,\n    prepareMessage: (message: any) => any,\n  ) {\n    try {\n      if (!this.isImportHistoryAvailable()) {\n        return;\n      }\n      if (!this.configService.get<Database>('DATABASE').SAVE_DATA.MESSAGE_UPDATE) {\n        return;\n      }\n\n      const inbox = await this.getInbox(instance);\n\n      const sqlMessages = `select * from messages m\n      where account_id = ${chatwootConfig.accountId}\n      and inbox_id = ${inbox.id}\n      and created_at >= now() - interval '6h'\n      order by created_at desc`;\n\n      const messagesData = (await this.pgClient.query(sqlMessages))?.rows;\n      const ids: string[] = messagesData\n        .filter((message) => !!message.source_id)\n        .map((message) => message.source_id.replace('WAID:', ''));\n\n      const savedMessages = await this.prismaRepository.message.findMany({\n        where: {\n          Instance: { name: instance.instanceName },\n          messageTimestamp: { gte: Number(dayjs().subtract(6, 'hours').unix()) },\n          AND: ids.map((id) => ({ key: { path: ['id'], not: id } })),\n        },\n      });\n\n      const filteredMessages = savedMessages.filter(\n        (msg: any) => !chatwootImport.isIgnorePhoneNumber(msg.key?.remoteJid),\n      );\n      const messagesRaw: any[] = [];\n      for (const m of filteredMessages) {\n        if (!m.message || !m.key || !m.messageTimestamp) {\n          continue;\n        }\n\n        if (Long.isLong(m?.messageTimestamp)) {\n          m.messageTimestamp = m.messageTimestamp?.toNumber();\n        }\n\n        messagesRaw.push(prepareMessage(m as any));\n      }\n\n      this.addHistoryMessages(\n        instance,\n        messagesRaw.filter((msg) => !chatwootImport.isIgnorePhoneNumber(msg.key?.remoteJid)),\n      );\n\n      await chatwootImport.importHistoryMessages(instance, this, inbox, this.provider);\n      const waInstance = this.waMonitor.waInstances[instance.instanceName];\n      waInstance.clearCacheChatwoot();\n    } catch {\n      return;\n    }\n  }\n}\n","import { ConfigService, Language } from '@config/env.config';\nimport fs from 'fs';\nimport i18next from 'i18next';\nimport path from 'path';\n\nconst languages = ['en', 'pt-BR', 'es'];\nconst translationsPath = path.join(__dirname, 'translations');\nconst configService: ConfigService = new ConfigService();\n\nconst resources: any = {};\n\nlanguages.forEach((language) => {\n  const languagePath = path.join(translationsPath, `${language}.json`);\n  if (fs.existsSync(languagePath)) {\n    const translationContent = fs.readFileSync(languagePath, 'utf8');\n    resources[language] = {\n      translation: JSON.parse(translationContent),\n    };\n  }\n});\n\ni18next.init({\n  resources,\n  fallbackLng: 'en',\n  lng: configService.get<Language>('LANGUAGE'),\n  debug: false,\n\n  interpolation: {\n    escapeValue: false,\n  },\n});\nexport default i18next;\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService, HttpServer } from '@config/env.config';\nimport { Dify, DifySetting, IntegrationSession } from '@prisma/client';\nimport axios from 'axios';\nimport { isURL } from 'class-validator';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class DifyService extends BaseChatbotService<Dify, DifySetting> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    configService: ConfigService,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'DifyService', configService);\n    this.openaiService = openaiService;\n  }\n\n  /**\n   * Return the bot type for Dify\n   */\n  protected getBotType(): string {\n    return 'dify';\n  }\n\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: DifySetting,\n    dify: Dify,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    try {\n      let endpoint: string = dify.apiUrl;\n\n      if (!endpoint) {\n        this.logger.error('No Dify endpoint defined');\n        return;\n      }\n\n      // Handle audio messages - transcribe using OpenAI Whisper\n      let processedContent = content;\n      if (this.isAudioMessage(content) && msg) {\n        try {\n          this.logger.debug(`[Dify] Downloading audio for Whisper transcription`);\n          const transcription = await this.openaiService.speechToText(msg, instance);\n          if (transcription) {\n            processedContent = `[audio] ${transcription}`;\n          }\n        } catch (err) {\n          this.logger.error(`[Dify] Failed to transcribe audio: ${err}`);\n        }\n      }\n\n      if (dify.botType === 'chatBot') {\n        endpoint += '/chat-messages';\n        const payload: any = {\n          inputs: {\n            remoteJid: remoteJid,\n            pushName: pushName,\n            instanceName: instance.instanceName,\n            serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n            apiKey: instance.token,\n          },\n          query: processedContent,\n          response_mode: 'blocking',\n          conversation_id: session.sessionId === remoteJid ? undefined : session.sessionId,\n          user: remoteJid,\n        };\n\n        // Handle image messages\n        if (this.isImageMessage(content)) {\n          const media = content.split('|');\n\n          if (msg.message.mediaUrl || msg.message.base64) {\n            let mediaBase64 = msg.message.base64 || null;\n\n            if (msg.message.mediaUrl && isURL(msg.message.mediaUrl)) {\n              const result = await axios.get(msg.message.mediaUrl, { responseType: 'arraybuffer' });\n              mediaBase64 = Buffer.from(result.data).toString('base64');\n            }\n\n            if (mediaBase64) {\n              payload.files = [\n                {\n                  type: 'image',\n                  transfer_method: 'remote_url',\n                  url: mediaBase64,\n                },\n              ];\n            }\n          } else {\n            payload.files = [\n              {\n                type: 'image',\n                transfer_method: 'remote_url',\n                url: media[1].split('?')[0],\n              },\n            ];\n          }\n          payload.query = media[2] || content;\n        }\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n          await instance.client.presenceSubscribe(remoteJid);\n          await instance.client.sendPresenceUpdate('composing', remoteJid);\n        }\n\n        const response = await axios.post(endpoint, payload, {\n          headers: {\n            Authorization: `Bearer ${dify.apiKey}`,\n          },\n        });\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS)\n          await instance.client.sendPresenceUpdate('paused', remoteJid);\n\n        const message = response?.data?.answer;\n        const conversationId = response?.data?.conversation_id;\n\n        if (message) {\n          await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n        }\n\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'opened',\n            awaitUser: true,\n            sessionId: session.sessionId === remoteJid ? conversationId : session.sessionId,\n          },\n        });\n      }\n\n      if (dify.botType === 'textGenerator') {\n        endpoint += '/completion-messages';\n        const payload: any = {\n          inputs: {\n            query: processedContent,\n            pushName: pushName,\n            remoteJid: remoteJid,\n            instanceName: instance.instanceName,\n            serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n            apiKey: instance.token,\n          },\n          response_mode: 'blocking',\n          conversation_id: session.sessionId === remoteJid ? undefined : session.sessionId,\n          user: remoteJid,\n        };\n\n        // Handle image messages\n        if (this.isImageMessage(content)) {\n          const media = content.split('|');\n\n          if (msg.message.mediaUrl || msg.message.base64) {\n            let mediaBase64 = msg.message.base64 || null;\n\n            if (msg.message.mediaUrl && isURL(msg.message.mediaUrl)) {\n              const result = await axios.get(msg.message.mediaUrl, { responseType: 'arraybuffer' });\n              mediaBase64 = Buffer.from(result.data).toString('base64');\n            }\n\n            if (mediaBase64) {\n              payload.files = [\n                {\n                  type: 'image',\n                  transfer_method: 'remote_url',\n                  url: mediaBase64,\n                },\n              ];\n            }\n          } else {\n            payload.files = [\n              {\n                type: 'image',\n                transfer_method: 'remote_url',\n                url: media[1].split('?')[0],\n              },\n            ];\n            payload.inputs.query = media[2] || content;\n          }\n        }\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n          await instance.client.presenceSubscribe(remoteJid);\n          await instance.client.sendPresenceUpdate('composing', remoteJid);\n        }\n\n        const response = await axios.post(endpoint, payload, {\n          headers: {\n            Authorization: `Bearer ${dify.apiKey}`,\n          },\n        });\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS)\n          await instance.client.sendPresenceUpdate('paused', remoteJid);\n\n        const message = response?.data?.answer;\n        const conversationId = response?.data?.conversation_id;\n\n        if (message) {\n          await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n        }\n\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'opened',\n            awaitUser: true,\n            sessionId: session.sessionId === remoteJid ? conversationId : session.sessionId,\n          },\n        });\n      }\n\n      if (dify.botType === 'agent') {\n        endpoint += '/chat-messages';\n        const payload: any = {\n          inputs: {\n            remoteJid: remoteJid,\n            pushName: pushName,\n            instanceName: instance.instanceName,\n            serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n            apiKey: instance.token,\n          },\n          query: processedContent,\n          response_mode: 'streaming',\n          conversation_id: session.sessionId === remoteJid ? undefined : session.sessionId,\n          user: remoteJid,\n        };\n\n        // Handle image messages\n        if (this.isImageMessage(content)) {\n          const media = content.split('|');\n\n          if (msg.message.mediaUrl || msg.message.base64) {\n            payload.files = [\n              {\n                type: 'image',\n                transfer_method: 'remote_url',\n                url: msg.message.mediaUrl || msg.message.base64,\n              },\n            ];\n          } else {\n            payload.files = [\n              {\n                type: 'image',\n                transfer_method: 'remote_url',\n                url: media[1].split('?')[0],\n              },\n            ];\n            payload.query = media[2] || content;\n          }\n        }\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n          await instance.client.presenceSubscribe(remoteJid);\n          await instance.client.sendPresenceUpdate('composing', remoteJid);\n        }\n\n        const response = await axios.post(endpoint, payload, {\n          headers: {\n            Authorization: `Bearer ${dify.apiKey}`,\n          },\n        });\n\n        let conversationId;\n        let answer = '';\n\n        const data = response.data.replaceAll('data: ', '');\n        const events = data.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const eventString of events) {\n          if (eventString.trim().startsWith('{')) {\n            const event = JSON.parse(eventString);\n\n            if (event?.event === 'agent_message') {\n              console.log('event:', event);\n              conversationId = conversationId ?? event?.conversation_id;\n              answer += event?.answer;\n            }\n          }\n        }\n\n        if (instance.integration === Integration.WHATSAPP_BAILEYS)\n          await instance.client.sendPresenceUpdate('paused', remoteJid);\n\n        if (answer) {\n          await this.sendMessageWhatsApp(instance, remoteJid, answer, settings, true);\n        }\n\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'opened',\n            awaitUser: true,\n            sessionId: session.sessionId === remoteJid ? conversationId : session.sessionId,\n          },\n        });\n      }\n    } catch (error) {\n      this.logger.error(error.response?.data || error);\n      return;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { IntegrationSession } from '@prisma/client';\n\n/**\n * Base class for all chatbot service implementations\n * Contains common methods shared across different chatbot integrations\n */\nexport abstract class BaseChatbotService<BotType = any, SettingsType = any> {\n  protected readonly logger: Logger;\n  protected readonly waMonitor: WAMonitoringService;\n  protected readonly prismaRepository: PrismaRepository;\n  protected readonly configService?: ConfigService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    loggerName: string,\n    configService?: ConfigService,\n  ) {\n    this.waMonitor = waMonitor;\n    this.prismaRepository = prismaRepository;\n    this.logger = new Logger(loggerName);\n    this.configService = configService;\n  }\n\n  /**\n   * Check if a message contains an image\n   */\n  protected isImageMessage(content: string): boolean {\n    return content.includes('imageMessage');\n  }\n\n  /**\n   * Check if a message contains audio\n   */\n  protected isAudioMessage(content: string): boolean {\n    return content.includes('audioMessage');\n  }\n\n  /**\n   * Check if a string is valid JSON\n   */\n  protected isJSON(str: string): boolean {\n    try {\n      JSON.parse(str);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Determine the media type from a URL based on its extension\n   */\n  protected getMediaType(url: string): string | null {\n    const extension = url.split('.').pop()?.toLowerCase();\n    const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];\n    const audioExtensions = ['mp3', 'wav', 'aac', 'ogg'];\n    const videoExtensions = ['mp4', 'avi', 'mkv', 'mov'];\n    const documentExtensions = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'];\n\n    if (imageExtensions.includes(extension || '')) return 'image';\n    if (audioExtensions.includes(extension || '')) return 'audio';\n    if (videoExtensions.includes(extension || '')) return 'video';\n    if (documentExtensions.includes(extension || '')) return 'document';\n    return null;\n  }\n\n  /**\n   * Create a new chatbot session\n   */\n  public async createNewSession(instance: InstanceDto | any, data: any, type: string) {\n    try {\n      // Extract pushName safely - if data.pushName is an object with a pushName property, use that\n      const pushNameValue =\n        typeof data.pushName === 'object' && data.pushName?.pushName\n          ? data.pushName.pushName\n          : typeof data.pushName === 'string'\n            ? data.pushName\n            : null;\n\n      // Extract remoteJid safely\n      const remoteJidValue =\n        typeof data.remoteJid === 'object' && data.remoteJid?.remoteJid ? data.remoteJid.remoteJid : data.remoteJid;\n\n      const session = await this.prismaRepository.integrationSession.create({\n        data: {\n          remoteJid: remoteJidValue,\n          pushName: pushNameValue,\n          sessionId: remoteJidValue,\n          status: 'opened',\n          awaitUser: false,\n          botId: data.botId,\n          instanceId: instance.instanceId,\n          type: type,\n        },\n      });\n\n      return { session };\n    } catch (error) {\n      this.logger.error(error);\n      return;\n    }\n  }\n\n  /**\n   * Standard implementation for processing incoming messages\n   * This handles the common workflow across all chatbot types:\n   * 1. Check for existing session or create new one\n   * 2. Handle message based on session state\n   */\n  public async process(\n    instance: any,\n    remoteJid: string,\n    bot: BotType,\n    session: IntegrationSession,\n    settings: SettingsType,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ): Promise<void> {\n    try {\n      // For new sessions or sessions awaiting initialization\n      if (!session) {\n        await this.initNewSession(instance, remoteJid, bot, settings, session, content, pushName, msg);\n        return;\n      }\n\n      // If session is paused, ignore the message\n      if (session.status === 'paused') {\n        return;\n      }\n\n      // For existing sessions, keywords might indicate the conversation should end\n      const keywordFinish = (settings as any)?.keywordFinish || '';\n      const normalizedContent = content.toLowerCase().trim();\n      if (keywordFinish.length > 0 && normalizedContent === keywordFinish.toLowerCase()) {\n        // Update session to closed and return\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'closed',\n          },\n        });\n        return;\n      }\n\n      // Forward the message to the chatbot API\n      await this.sendMessageToBot(instance, session, settings, bot, remoteJid, pushName || '', content, msg);\n\n      // Update session to indicate we're waiting for user response\n      await this.prismaRepository.integrationSession.update({\n        where: {\n          id: session.id,\n        },\n        data: {\n          status: 'opened',\n          awaitUser: true,\n        },\n      });\n    } catch (error) {\n      this.logger.error(`Error in process: ${error}`);\n      return;\n    }\n  }\n\n  /**\n   * Standard implementation for sending messages to WhatsApp\n   * This handles common patterns like markdown links and formatting\n   */\n  protected async sendMessageWhatsApp(\n    instance: any,\n    remoteJid: string,\n    message: string,\n    settings: SettingsType,\n    linkPreview: boolean = true,\n  ): Promise<void> {\n    if (!message) return;\n\n    const linkRegex = /!?\\[(.*?)\\]\\((.*?)\\)/g;\n    let textBuffer = '';\n    let lastIndex = 0;\n    let match: RegExpExecArray | null;\n\n    const splitMessages = (settings as any)?.splitMessages ?? false;\n\n    while ((match = linkRegex.exec(message)) !== null) {\n      const [fullMatch, altText, url] = match;\n      const mediaType = this.getMediaType(url);\n      const beforeText = message.slice(lastIndex, match.index);\n\n      if (beforeText) {\n        textBuffer += beforeText;\n      }\n\n      if (mediaType) {\n        // Send accumulated text before sending media\n        if (textBuffer.trim()) {\n          await this.sendFormattedText(instance, remoteJid, textBuffer.trim(), settings, splitMessages, linkPreview);\n          textBuffer = '';\n        }\n\n        // Handle sending the media\n        try {\n          if (mediaType === 'audio') {\n            await instance.audioWhatsapp({\n              number: remoteJid.includes('@lid') ? remoteJid : remoteJid.split('@')[0],\n              delay: (settings as any)?.delayMessage || 1000,\n              audio: url,\n              caption: altText,\n            });\n          } else {\n            await instance.mediaMessage(\n              {\n                number: remoteJid.includes('@lid') ? remoteJid : remoteJid.split('@')[0],\n                delay: (settings as any)?.delayMessage || 1000,\n                mediatype: mediaType,\n                media: url,\n                caption: altText,\n                fileName: mediaType === 'document' ? altText || 'document' : undefined,\n              },\n              null,\n              false,\n            );\n          }\n        } catch (error) {\n          this.logger.error(`Error sending media: ${error}`);\n          // If media fails, at least send the alt text and URL\n          textBuffer += `${altText}: ${url}`;\n        }\n      } else {\n        // It's a regular link, keep it in the text\n        textBuffer += fullMatch;\n      }\n\n      lastIndex = linkRegex.lastIndex;\n    }\n\n    // Add any remaining text after the last match\n    if (lastIndex < message.length) {\n      const remainingText = message.slice(lastIndex);\n      if (remainingText.trim()) {\n        textBuffer += remainingText;\n      }\n    }\n\n    // Send any remaining text\n    if (textBuffer.trim()) {\n      await this.sendFormattedText(instance, remoteJid, textBuffer.trim(), settings, splitMessages, linkPreview);\n    }\n  }\n\n  /**\n   * Split message by double line breaks and return array of message parts\n   */\n  private splitMessageByDoubleLineBreaks(message: string): string[] {\n    return message.split('\\n\\n').filter((part) => part.trim().length > 0);\n  }\n\n  /**\n   * Send a single message with proper typing indicators and delays\n   */\n  private async sendSingleMessage(\n    instance: any,\n    remoteJid: string,\n    message: string,\n    settings: any,\n    linkPreview: boolean = true,\n  ): Promise<void> {\n    const timePerChar = settings?.timePerChar ?? 0;\n    const minDelay = 1000;\n    const maxDelay = 20000;\n    const delay = Math.min(Math.max(message.length * timePerChar, minDelay), maxDelay);\n\n    this.logger.debug(`[BaseChatbot] Sending single message with linkPreview: ${linkPreview}`);\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.presenceSubscribe(remoteJid);\n      await instance.client.sendPresenceUpdate('composing', remoteJid);\n    }\n\n    await new Promise<void>((resolve) => {\n      setTimeout(async () => {\n        await instance.textMessage(\n          {\n            number: remoteJid.includes('@lid') ? remoteJid : remoteJid.split('@')[0],\n            delay: settings?.delayMessage || 1000,\n            text: message,\n            linkPreview,\n          },\n          false,\n        );\n        resolve();\n      }, delay);\n    });\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.sendPresenceUpdate('paused', remoteJid);\n    }\n  }\n\n  /**\n   * Helper method to send formatted text with proper typing indicators and delays\n   */\n  private async sendFormattedText(\n    instance: any,\n    remoteJid: string,\n    text: string,\n    settings: any,\n    splitMessages: boolean,\n    linkPreview: boolean = true,\n  ): Promise<void> {\n    if (splitMessages) {\n      const messageParts = this.splitMessageByDoubleLineBreaks(text);\n\n      this.logger.debug(`[BaseChatbot] Splitting message into ${messageParts.length} parts`);\n\n      for (let index = 0; index < messageParts.length; index++) {\n        const message = messageParts[index];\n\n        this.logger.debug(`[BaseChatbot] Sending message part ${index + 1}/${messageParts.length}`);\n        await this.sendSingleMessage(instance, remoteJid, message, settings, linkPreview);\n      }\n\n      this.logger.debug(`[BaseChatbot] All message parts sent successfully`);\n    } else {\n      this.logger.debug(`[BaseChatbot] Sending single message`);\n      await this.sendSingleMessage(instance, remoteJid, text, settings, linkPreview);\n    }\n  }\n\n  /**\n   * Standard implementation for initializing a new session\n   * This method should be overridden if a subclass needs specific initialization\n   */\n  protected async initNewSession(\n    instance: any,\n    remoteJid: string,\n    bot: BotType,\n    settings: SettingsType,\n    session: IntegrationSession,\n    content: string,\n    pushName?: string | any,\n    msg?: any,\n  ): Promise<void> {\n    // Create a session if none exists\n    if (!session) {\n      // Extract pushName properly - if it's an object with pushName property, use that\n      const pushNameValue =\n        typeof pushName === 'object' && pushName?.pushName\n          ? pushName.pushName\n          : typeof pushName === 'string'\n            ? pushName\n            : null;\n\n      const sessionResult = await this.createNewSession(\n        {\n          instanceName: instance.instanceName,\n          instanceId: instance.instanceId,\n        },\n        {\n          remoteJid,\n          pushName: pushNameValue,\n          botId: (bot as any).id,\n        },\n        this.getBotType(),\n      );\n\n      if (!sessionResult || !sessionResult.session) {\n        this.logger.error('Failed to create new session');\n        return;\n      }\n\n      session = sessionResult.session;\n    }\n\n    // Update session status to opened\n    await this.prismaRepository.integrationSession.update({\n      where: {\n        id: session.id,\n      },\n      data: {\n        status: 'opened',\n        awaitUser: false,\n      },\n    });\n\n    // Forward the message to the chatbot\n    await this.sendMessageToBot(instance, session, settings, bot, remoteJid, pushName || '', content, msg);\n  }\n\n  /**\n   * Get the bot type identifier (e.g., 'dify', 'n8n', 'evoai')\n   * This should match the type field used in the IntegrationSession\n   */\n  protected abstract getBotType(): string;\n\n  /**\n   * Send a message to the chatbot API\n   * This is specific to each chatbot integration\n   */\n  protected abstract sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: SettingsType,\n    bot: BotType,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void>;\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService, Language, Openai as OpenaiConfig } from '@config/env.config';\nimport { IntegrationSession, OpenaiBot, OpenaiSetting } from '@prisma/client';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\nimport { downloadMediaMessage } from 'baileys';\nimport { isURL } from 'class-validator';\nimport FormData from 'form-data';\nimport OpenAI from 'openai';\nimport P from 'pino';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\n\n/**\n * OpenAI service that extends the common BaseChatbotService\n * Handles both Assistant API and ChatCompletion API\n */\nexport class OpenaiService extends BaseChatbotService<OpenaiBot, OpenaiSetting> {\n  protected client: OpenAI;\n\n  constructor(waMonitor: WAMonitoringService, prismaRepository: PrismaRepository, configService: ConfigService) {\n    super(waMonitor, prismaRepository, 'OpenaiService', configService);\n  }\n\n  /**\n   * Return the bot type for OpenAI\n   */\n  protected getBotType(): string {\n    return 'openai';\n  }\n\n  /**\n   * Initialize the OpenAI client with the provided API key\n   */\n  protected initClient(apiKey: string) {\n    this.client = new OpenAI({ apiKey });\n    return this.client;\n  }\n\n  /**\n   * Process a message based on the bot type (assistant or chat completion)\n   */\n  public async process(\n    instance: any,\n    remoteJid: string,\n    openaiBot: OpenaiBot,\n    session: IntegrationSession,\n    settings: OpenaiSetting,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ): Promise<void> {\n    try {\n      this.logger.log(`Starting process for remoteJid: ${remoteJid}, bot type: ${openaiBot.botType}`);\n\n      // Handle audio message transcription\n      if (content.startsWith('audioMessage|') && msg) {\n        this.logger.log('Detected audio message, attempting to transcribe');\n\n        // Get OpenAI credentials for transcription\n        const creds = await this.prismaRepository.openaiCreds.findUnique({\n          where: { id: openaiBot.openaiCredsId },\n        });\n\n        if (!creds) {\n          this.logger.error(`OpenAI credentials not found. CredsId: ${openaiBot.openaiCredsId}`);\n          return;\n        }\n\n        // Initialize OpenAI client for transcription\n        this.initClient(creds.apiKey);\n\n        // Transcribe the audio\n        const transcription = await this.speechToText(msg, instance);\n\n        if (transcription) {\n          this.logger.log(`Audio transcribed: ${transcription}`);\n          // Replace the audio message identifier with the transcription\n          content = transcription;\n        } else {\n          this.logger.error('Failed to transcribe audio');\n          await this.sendMessageWhatsApp(\n            instance,\n            remoteJid,\n            \"Sorry, I couldn't transcribe your audio message. Could you please type your message instead?\",\n            settings,\n            true,\n          );\n          return;\n        }\n      } else {\n        // Get the OpenAI credentials\n        const creds = await this.prismaRepository.openaiCreds.findUnique({\n          where: { id: openaiBot.openaiCredsId },\n        });\n\n        if (!creds) {\n          this.logger.error(`OpenAI credentials not found. CredsId: ${openaiBot.openaiCredsId}`);\n          return;\n        }\n\n        // Initialize OpenAI client\n        this.initClient(creds.apiKey);\n      }\n\n      // Handle keyword finish\n      const keywordFinish = settings?.keywordFinish || '';\n      const normalizedContent = content.toLowerCase().trim();\n      if (keywordFinish.length > 0 && normalizedContent === keywordFinish.toLowerCase()) {\n        if (settings?.keepOpen) {\n          await this.prismaRepository.integrationSession.update({\n            where: {\n              id: session.id,\n            },\n            data: {\n              status: 'closed',\n            },\n          });\n        } else {\n          await this.prismaRepository.integrationSession.delete({\n            where: {\n              id: session.id,\n            },\n          });\n        }\n\n        await sendTelemetry('/openai/session/finish');\n        return;\n      }\n\n      // If session is new or doesn't exist\n      if (!session) {\n        const data = {\n          remoteJid,\n          pushName,\n          botId: openaiBot.id,\n        };\n\n        const createSession = await this.createNewSession(\n          { instanceName: instance.instanceName, instanceId: instance.instanceId },\n          data,\n          this.getBotType(),\n        );\n\n        await this.initNewSession(\n          instance,\n          remoteJid,\n          openaiBot,\n          settings,\n          createSession.session,\n          content,\n          pushName,\n          msg,\n        );\n\n        await sendTelemetry('/openai/session/start');\n        return;\n      }\n\n      // If session exists but is paused\n      if (session.status === 'paused') {\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'opened',\n            awaitUser: true,\n          },\n        });\n\n        return;\n      }\n\n      // Process with the appropriate API based on bot type\n      await this.sendMessageToBot(instance, session, settings, openaiBot, remoteJid, pushName || '', content, msg);\n    } catch (error) {\n      this.logger.error(`Error in process: ${error.message || JSON.stringify(error)}`);\n      return;\n    }\n  }\n\n  /**\n   * Send message to OpenAI - this handles both Assistant API and ChatCompletion API\n   */\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: OpenaiSetting,\n    openaiBot: OpenaiBot,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    this.logger.log(`Sending message to bot for remoteJid: ${remoteJid}, bot type: ${openaiBot.botType}`);\n\n    if (!this.client) {\n      this.logger.log('Client not initialized, initializing now');\n      const creds = await this.prismaRepository.openaiCreds.findUnique({\n        where: { id: openaiBot.openaiCredsId },\n      });\n\n      if (!creds) {\n        this.logger.error(`OpenAI credentials not found in sendMessageToBot. CredsId: ${openaiBot.openaiCredsId}`);\n        return;\n      }\n\n      this.initClient(creds.apiKey);\n    }\n\n    try {\n      let message: string;\n\n      // Handle different bot types\n      if (openaiBot.botType === 'assistant') {\n        this.logger.log('Processing with Assistant API');\n        message = await this.processAssistantMessage(\n          instance,\n          session,\n          openaiBot,\n          remoteJid,\n          pushName,\n          false, // Not fromMe\n          content,\n          msg,\n        );\n      } else {\n        this.logger.log('Processing with ChatCompletion API');\n        message = await this.processChatCompletionMessage(instance, openaiBot, remoteJid, content, msg);\n      }\n\n      this.logger.log(`Got response from OpenAI: ${message?.substring(0, 50)}${message?.length > 50 ? '...' : ''}`);\n\n      // Send the response\n      if (message) {\n        this.logger.log('Sending message to WhatsApp');\n        await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n      } else {\n        this.logger.error('No message to send to WhatsApp');\n      }\n\n      // Update session status\n      await this.prismaRepository.integrationSession.update({\n        where: {\n          id: session.id,\n        },\n        data: {\n          status: 'opened',\n          awaitUser: true,\n        },\n      });\n    } catch (error) {\n      this.logger.error(`Error in sendMessageToBot: ${error.message || JSON.stringify(error)}`);\n      if (error.response) {\n        this.logger.error(`API Response data: ${JSON.stringify(error.response.data || {})}`);\n      }\n      return;\n    }\n  }\n\n  /**\n   * Process message using the OpenAI Assistant API\n   */\n  private async processAssistantMessage(\n    instance: any,\n    session: IntegrationSession,\n    openaiBot: OpenaiBot,\n    remoteJid: string,\n    pushName: string,\n    fromMe: boolean,\n    content: string,\n    msg?: any,\n  ): Promise<string> {\n    const messageData: any = {\n      role: fromMe ? 'assistant' : 'user',\n      content: [{ type: 'text', text: content }],\n    };\n\n    // Handle image messages\n    if (this.isImageMessage(content)) {\n      const media = content.split('|');\n\n      if (msg.message.mediaUrl || msg.message.base64) {\n        let mediaBase64 = msg.message.base64 || null;\n\n        if (msg.message.mediaUrl && isURL(msg.message.mediaUrl)) {\n          const result = await axios.get(msg.message.mediaUrl, { responseType: 'arraybuffer' });\n          mediaBase64 = Buffer.from(result.data).toString('base64');\n        }\n\n        if (mediaBase64) {\n          messageData.content = [\n            { type: 'text', text: media[2] || content },\n            { type: 'image_url', image_url: { url: mediaBase64 } },\n          ];\n        }\n      } else {\n        const url = media[1].split('?')[0];\n\n        messageData.content = [\n          { type: 'text', text: media[2] || content },\n          {\n            type: 'image_url',\n            image_url: {\n              url: url,\n            },\n          },\n        ];\n      }\n    }\n\n    // Get thread ID from session or create new thread\n    let threadId = session.sessionId;\n\n    // Create a new thread if one doesn't exist or invalid format\n    if (!threadId || threadId === remoteJid) {\n      const newThread = await this.client.beta.threads.create();\n      threadId = newThread.id;\n\n      // Save the new thread ID to the session\n      await this.prismaRepository.integrationSession.update({\n        where: {\n          id: session.id,\n        },\n        data: {\n          sessionId: threadId,\n        },\n      });\n      this.logger.log(`Created new thread ID: ${threadId} for session: ${session.id}`);\n    }\n\n    // Add message to thread\n    await this.client.beta.threads.messages.create(threadId, messageData);\n\n    if (fromMe) {\n      sendTelemetry('/message/sendText');\n      return '';\n    }\n\n    // Run the assistant\n    const runAssistant = await this.client.beta.threads.runs.create(threadId, {\n      assistant_id: openaiBot.assistantId,\n    });\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.presenceSubscribe(remoteJid);\n      await instance.client.sendPresenceUpdate('composing', remoteJid);\n    }\n\n    // Wait for the assistant to complete\n    const response = await this.getAIResponse(threadId, runAssistant.id, openaiBot.functionUrl, remoteJid, pushName);\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.sendPresenceUpdate('paused', remoteJid);\n    }\n\n    // Extract the response text safely with type checking\n    let responseText = \"I couldn't generate a proper response. Please try again.\";\n    try {\n      const messages = response?.data || [];\n      if (messages.length > 0) {\n        const messageContent = messages[0]?.content || [];\n        if (messageContent.length > 0) {\n          const textContent = messageContent[0];\n          if (textContent && 'text' in textContent && textContent.text && 'value' in textContent.text) {\n            responseText = textContent.text.value;\n          }\n        }\n      }\n    } catch (error) {\n      this.logger.error(`Error extracting response text: ${error}`);\n    }\n\n    // Update session with the thread ID to ensure continuity\n    await this.prismaRepository.integrationSession.update({\n      where: {\n        id: session.id,\n      },\n      data: {\n        status: 'opened',\n        awaitUser: true,\n        sessionId: threadId, // Ensure thread ID is saved consistently\n      },\n    });\n\n    // Return fallback message if unable to extract text\n    return responseText;\n  }\n\n  /**\n   * Process message using the OpenAI ChatCompletion API\n   */\n  private async processChatCompletionMessage(\n    instance: any,\n    openaiBot: OpenaiBot,\n    remoteJid: string,\n    content: string,\n    msg?: any,\n  ): Promise<string> {\n    this.logger.log('Starting processChatCompletionMessage');\n\n    // Check if client is initialized\n    if (!this.client) {\n      this.logger.log('Client not initialized in processChatCompletionMessage, initializing now');\n      const creds = await this.prismaRepository.openaiCreds.findUnique({\n        where: { id: openaiBot.openaiCredsId },\n      });\n\n      if (!creds) {\n        this.logger.error(`OpenAI credentials not found. CredsId: ${openaiBot.openaiCredsId}`);\n        return 'Error: OpenAI credentials not found';\n      }\n\n      this.initClient(creds.apiKey);\n    }\n\n    // Check if model is defined\n    if (!openaiBot.model) {\n      this.logger.error('OpenAI model not defined');\n      return 'Error: OpenAI model not configured';\n    }\n\n    this.logger.log(`Using model: ${openaiBot.model}, max tokens: ${openaiBot.maxTokens || 500}`);\n\n    // Get existing conversation history from the session\n    const session = await this.prismaRepository.integrationSession.findFirst({\n      where: {\n        remoteJid,\n        botId: openaiBot.id,\n        status: 'opened',\n      },\n    });\n\n    let conversationHistory = [];\n\n    if (session && session.context) {\n      try {\n        const sessionData =\n          typeof session.context === 'string' ? JSON.parse(session.context as string) : session.context;\n\n        conversationHistory = sessionData.history || [];\n        this.logger.log(`Retrieved conversation history from session, ${conversationHistory.length} messages`);\n      } catch (error) {\n        this.logger.error(`Error parsing session context: ${error.message}`);\n        // Continue with empty history if we can't parse the session data\n        conversationHistory = [];\n      }\n    }\n\n    // Log bot data\n    this.logger.log(`Bot data - systemMessages: ${JSON.stringify(openaiBot.systemMessages || [])}`);\n    this.logger.log(`Bot data - assistantMessages: ${JSON.stringify(openaiBot.assistantMessages || [])}`);\n    this.logger.log(`Bot data - userMessages: ${JSON.stringify(openaiBot.userMessages || [])}`);\n\n    // Prepare system messages\n    const systemMessages: any = openaiBot.systemMessages || [];\n    const messagesSystem: any[] = systemMessages.map((message) => {\n      return {\n        role: 'system',\n        content: message,\n      };\n    });\n\n    // Prepare assistant messages\n    const assistantMessages: any = openaiBot.assistantMessages || [];\n    const messagesAssistant: any[] = assistantMessages.map((message) => {\n      return {\n        role: 'assistant',\n        content: message,\n      };\n    });\n\n    // Prepare user messages\n    const userMessages: any = openaiBot.userMessages || [];\n    const messagesUser: any[] = userMessages.map((message) => {\n      return {\n        role: 'user',\n        content: message,\n      };\n    });\n\n    // Prepare current message\n    const messageData: any = {\n      role: 'user',\n      content: [{ type: 'text', text: content }],\n    };\n\n    // Handle image messages\n    if (this.isImageMessage(content)) {\n      this.logger.log('Found image message');\n      const media = content.split('|');\n\n      if (msg.message.mediaUrl || msg.message.base64) {\n        messageData.content = [\n          { type: 'text', text: media[2] || content },\n          { type: 'image_url', image_url: { url: msg.message.base64 || msg.message.mediaUrl } },\n        ];\n      } else {\n        const url = media[1].split('?')[0];\n\n        messageData.content = [\n          { type: 'text', text: media[2] || content },\n          {\n            type: 'image_url',\n            image_url: {\n              url: url,\n            },\n          },\n        ];\n      }\n    }\n\n    // Combine all messages: system messages, pre-defined messages, conversation history, and current message\n    const messages: any[] = [\n      ...messagesSystem,\n      ...messagesAssistant,\n      ...messagesUser,\n      ...conversationHistory,\n      messageData,\n    ];\n\n    this.logger.log(`Final messages payload: ${JSON.stringify(messages)}`);\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      this.logger.log('Setting typing indicator');\n      await instance.client.presenceSubscribe(remoteJid);\n      await instance.client.sendPresenceUpdate('composing', remoteJid);\n    }\n\n    // Send the request to OpenAI\n    try {\n      this.logger.log('Sending request to OpenAI API');\n      const completions = await this.client.chat.completions.create({\n        model: openaiBot.model,\n        messages: messages,\n        max_tokens: openaiBot.maxTokens || 500, // Add default if maxTokens is missing\n      });\n\n      if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n        await instance.client.sendPresenceUpdate('paused', remoteJid);\n      }\n\n      const responseContent = completions.choices[0].message.content;\n      this.logger.log(`Received response from OpenAI: ${JSON.stringify(completions.choices[0])}`);\n\n      // Add the current exchange to the conversation history and update the session\n      conversationHistory.push(messageData);\n      conversationHistory.push({\n        role: 'assistant',\n        content: responseContent,\n      });\n\n      // Limit history length to avoid token limits (keep last 10 messages)\n      if (conversationHistory.length > 10) {\n        conversationHistory = conversationHistory.slice(conversationHistory.length - 10);\n      }\n\n      // Save the updated conversation history to the session\n      if (session) {\n        await this.prismaRepository.integrationSession.update({\n          where: { id: session.id },\n          data: {\n            context: JSON.stringify({\n              history: conversationHistory,\n            }),\n          },\n        });\n        this.logger.log(`Updated session with conversation history, now ${conversationHistory.length} messages`);\n      }\n\n      return responseContent;\n    } catch (error) {\n      this.logger.error(`Error calling OpenAI: ${error.message || JSON.stringify(error)}`);\n      if (error.response) {\n        this.logger.error(`API Response status: ${error.response.status}`);\n        this.logger.error(`API Response data: ${JSON.stringify(error.response.data || {})}`);\n      }\n      return `Sorry, there was an error: ${error.message || 'Unknown error'}`;\n    }\n  }\n\n  /**\n   * Wait for and retrieve the AI response\n   */\n  private async getAIResponse(\n    threadId: string,\n    runId: string,\n    functionUrl: string | null,\n    remoteJid: string,\n    pushName: string,\n  ) {\n    let status = await this.client.beta.threads.runs.retrieve(threadId, runId);\n\n    let maxRetries = 60; // 1 minute with 1s intervals\n    const checkInterval = 1000; // 1 second\n\n    while (\n      status.status !== 'completed' &&\n      status.status !== 'failed' &&\n      status.status !== 'cancelled' &&\n      status.status !== 'expired' &&\n      maxRetries > 0\n    ) {\n      await new Promise((resolve) => setTimeout(resolve, checkInterval));\n      status = await this.client.beta.threads.runs.retrieve(threadId, runId);\n\n      // Handle tool calls\n      if (status.status === 'requires_action' && status.required_action?.type === 'submit_tool_outputs') {\n        const toolCalls = status.required_action.submit_tool_outputs.tool_calls;\n        const toolOutputs = [];\n\n        for (const toolCall of toolCalls) {\n          if (functionUrl) {\n            try {\n              const payloadData = JSON.parse(toolCall.function.arguments);\n\n              // Add context\n              payloadData.remoteJid = remoteJid;\n              payloadData.pushName = pushName;\n\n              const response = await axios.post(functionUrl, {\n                functionName: toolCall.function.name,\n                functionArguments: payloadData,\n              });\n\n              toolOutputs.push({\n                tool_call_id: toolCall.id,\n                output: JSON.stringify(response.data),\n              });\n            } catch (error) {\n              this.logger.error(`Error calling function: ${error}`);\n              toolOutputs.push({\n                tool_call_id: toolCall.id,\n                output: JSON.stringify({ error: 'Function call failed' }),\n              });\n            }\n          } else {\n            toolOutputs.push({\n              tool_call_id: toolCall.id,\n              output: JSON.stringify({ error: 'No function URL configured' }),\n            });\n          }\n        }\n\n        await this.client.beta.threads.runs.submitToolOutputs(threadId, runId, {\n          tool_outputs: toolOutputs,\n        });\n      }\n\n      maxRetries--;\n    }\n\n    if (status.status === 'completed') {\n      const messages = await this.client.beta.threads.messages.list(threadId);\n      return messages;\n    } else {\n      this.logger.error(`Assistant run failed with status: ${status.status}`);\n      return { data: [{ content: [{ text: { value: 'Failed to get a response from the assistant.' } }] }] };\n    }\n  }\n\n  protected isImageMessage(content: string): boolean {\n    return content.includes('imageMessage');\n  }\n\n  /**\n   * Implementation of speech-to-text transcription for audio messages\n   */\n  public async speechToText(msg: any, instance: any): Promise<string | null> {\n    const settings = await this.prismaRepository.openaiSetting.findFirst({\n      where: {\n        instanceId: instance.instanceId,\n      },\n    });\n\n    if (!settings) {\n      this.logger.error(`OpenAI settings not found. InstanceId: ${instance.instanceId}`);\n      return null;\n    }\n\n    const creds = await this.prismaRepository.openaiCreds.findUnique({\n      where: { id: settings.openaiCredsId },\n    });\n\n    if (!creds) {\n      this.logger.error(`OpenAI credentials not found. CredsId: ${settings.openaiCredsId}`);\n      return null;\n    }\n\n    let audio: Buffer;\n\n    if (msg.message.mediaUrl) {\n      audio = await axios.get(msg.message.mediaUrl, { responseType: 'arraybuffer' }).then((response) => {\n        return Buffer.from(response.data, 'binary');\n      });\n    } else if (msg.message.base64) {\n      audio = Buffer.from(msg.message.base64, 'base64');\n    } else {\n      // Fallback for raw WhatsApp audio messages that need downloadMediaMessage\n      audio = await downloadMediaMessage(\n        { key: msg.key, message: msg?.message },\n        'buffer',\n        {},\n        {\n          logger: P({ level: 'error' }) as any,\n          reuploadRequest: instance,\n        },\n      );\n    }\n\n    const lang = this.configService.get<Language>('LANGUAGE').includes('pt')\n      ? 'pt'\n      : this.configService.get<Language>('LANGUAGE');\n\n    const formData = new FormData();\n    formData.append('file', audio, 'audio.ogg');\n    formData.append('model', 'whisper-1');\n    formData.append('language', lang);\n\n    const apiKey = creds?.apiKey || this.configService.get<OpenaiConfig>('OPENAI').API_KEY_GLOBAL;\n\n    const response = await axios.post('https://api.openai.com/v1/audio/transcriptions', formData, {\n      headers: {\n        'Content-Type': 'multipart/form-data',\n        Authorization: `Bearer ${apiKey}`,\n      },\n    });\n\n    return response?.data?.text;\n  }\n}\n","import { configService, S3 } from '@config/env.config';\n\nconst getTypeMessage = (msg: any) => {\n  let mediaId: string;\n\n  if (\n    configService.get<S3>('S3').ENABLE &&\n    (configService.get<S3>('S3').SAVE_VIDEO ||\n      (msg?.message?.videoMessage === undefined &&\n        msg?.message?.viewOnceMessageV2?.message?.videoMessage === undefined))\n  )\n    mediaId = msg.message?.mediaUrl;\n  else mediaId = msg.key?.id;\n\n  const types = {\n    conversation: msg?.message?.conversation,\n    extendedTextMessage: msg?.message?.extendedTextMessage?.text,\n    contactMessage: msg?.message?.contactMessage?.displayName,\n    locationMessage: msg?.message?.locationMessage?.degreesLatitude.toString(),\n    viewOnceMessageV2:\n      msg?.message?.viewOnceMessageV2?.message?.imageMessage?.url ||\n      msg?.message?.viewOnceMessageV2?.message?.videoMessage?.url ||\n      msg?.message?.viewOnceMessageV2?.message?.audioMessage?.url,\n    listResponseMessage: msg?.message?.listResponseMessage?.title || msg?.listResponseMessage?.title,\n    responseRowId: msg?.message?.listResponseMessage?.singleSelectReply?.selectedRowId,\n    templateButtonReplyMessage:\n      msg?.message?.templateButtonReplyMessage?.selectedId || msg?.message?.buttonsResponseMessage?.selectedButtonId,\n    // Medias\n    audioMessage: msg?.message?.speechToText\n      ? msg?.message?.speechToText\n      : msg?.message?.audioMessage\n        ? `audioMessage|${mediaId}`\n        : undefined,\n    imageMessage: msg?.message?.imageMessage\n      ? `imageMessage|${mediaId}${msg?.message?.imageMessage?.caption ? `|${msg?.message?.imageMessage?.caption}` : ''}`\n      : undefined,\n    videoMessage: msg?.message?.videoMessage\n      ? `videoMessage|${mediaId}${msg?.message?.videoMessage?.caption ? `|${msg?.message?.videoMessage?.caption}` : ''}`\n      : undefined,\n    documentMessage: msg?.message?.documentMessage\n      ? `documentMessage|${mediaId}${\n          msg?.message?.documentMessage?.caption ? `|${msg?.message?.documentMessage?.caption}` : ''\n        }`\n      : undefined,\n    documentWithCaptionMessage: msg?.message?.documentWithCaptionMessage?.message?.documentMessage\n      ? `documentWithCaptionMessage|${mediaId}${\n          msg?.message?.documentWithCaptionMessage?.message?.documentMessage?.caption\n            ? `|${msg?.message?.documentWithCaptionMessage?.message?.documentMessage?.caption}`\n            : ''\n        }`\n      : undefined,\n    externalAdReplyBody: msg?.contextInfo?.externalAdReply?.body\n      ? `externalAdReplyBody|${msg.contextInfo.externalAdReply.body}`\n      : undefined,\n  };\n\n  const messageType = Object.keys(types).find((key) => types[key] !== undefined) || 'unknown';\n\n  return { ...types, messageType };\n};\n\nconst getMessageContent = (types: any) => {\n  const typeKey = Object.keys(types).find((key) => key !== 'externalAdReplyBody' && types[key] !== undefined);\n\n  let result = typeKey ? types[typeKey] : undefined;\n\n  if (types.externalAdReplyBody) {\n    result = result ? `${result}\\n${types.externalAdReplyBody}` : types.externalAdReplyBody;\n  }\n\n  return result;\n};\n\nexport const getConversationMessage = (msg: any) => {\n  const types = getTypeMessage(msg);\n\n  const messageContent = getMessageContent(types);\n\n  return messageContent;\n};\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Events } from '@api/types/wa.types';\nimport { Auth, ConfigService, HttpServer, Typebot } from '@config/env.config';\nimport { Instance, IntegrationSession, Message, Typebot as TypebotModel } from '@prisma/client';\nimport { getConversationMessage } from '@utils/getConversationMessage';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class TypebotService extends BaseChatbotService<TypebotModel, any> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    configService: ConfigService,\n    prismaRepository: PrismaRepository,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'TypebotService', configService);\n    this.openaiService = openaiService;\n  }\n\n  /**\n   * Get the bot type identifier\n   */\n  protected getBotType(): string {\n    return 'typebot';\n  }\n\n  /**\n   * Base class wrapper - calls the original processTypebot method\n   */\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: any,\n    bot: TypebotModel,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    // Map the base class call to the original processTypebot method\n    await this.processTypebot(\n      instance,\n      remoteJid,\n      msg,\n      session,\n      bot,\n      bot.url,\n      settings.expire,\n      bot.typebot,\n      settings.keywordFinish,\n      settings.delayMessage,\n      settings.unknownMessage,\n      settings.listeningFromMe,\n      settings.stopBotFromMe,\n      settings.keepOpen,\n      content,\n    );\n  }\n\n  /**\n   * Simplified wrapper for controller compatibility\n   */\n  public async processTypebotSimple(\n    instance: any,\n    remoteJid: string,\n    bot: TypebotModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ): Promise<void> {\n    return this.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n\n  /**\n   * Create a new TypeBot session with prefilled variables\n   */\n  public async createNewSession(instance: Instance, data: any) {\n    if (data.remoteJid === 'status@broadcast') return;\n    const id = Math.floor(Math.random() * 10000000000).toString();\n\n    try {\n      const version = this.configService.get<Typebot>('TYPEBOT').API_VERSION;\n      let url: string;\n      let reqData: {};\n      if (version === 'latest') {\n        url = `${data.url}/api/v1/typebots/${data.typebot}/startChat`;\n\n        reqData = {\n          prefilledVariables: {\n            ...data.prefilledVariables,\n            remoteJid: data.remoteJid,\n            pushName: data.pushName || data.prefilledVariables?.pushName || '',\n            instanceName: instance.name,\n            serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n            apiKey: this.configService.get<Auth>('AUTHENTICATION').API_KEY.KEY,\n            ownerJid: instance.number,\n          },\n        };\n      } else {\n        url = `${data.url}/api/v1/sendMessage`;\n\n        reqData = {\n          startParams: {\n            publicId: data.typebot,\n            prefilledVariables: {\n              ...data.prefilledVariables,\n              remoteJid: data.remoteJid,\n              pushName: data.pushName || data.prefilledVariables?.pushName || '',\n              instanceName: instance.name,\n              serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n              apiKey: this.configService.get<Auth>('AUTHENTICATION').API_KEY.KEY,\n              ownerJid: instance.number,\n            },\n          },\n        };\n      }\n      const request = await axios.post(url, reqData);\n\n      let session = null;\n      if (request?.data?.sessionId) {\n        session = await this.prismaRepository.integrationSession.create({\n          data: {\n            remoteJid: data.remoteJid,\n            pushName: data.pushName || '',\n            sessionId: `${id}-${request.data.sessionId}`,\n            status: 'opened',\n            parameters: {\n              ...data.prefilledVariables,\n              remoteJid: data.remoteJid,\n              pushName: data.pushName || '',\n              instanceName: instance.name,\n              serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n              apiKey: this.configService.get<Auth>('AUTHENTICATION').API_KEY.KEY,\n              ownerJid: instance.number,\n            },\n            awaitUser: false,\n            botId: data.botId,\n            type: 'typebot',\n            Instance: {\n              connect: {\n                id: instance.id,\n              },\n            },\n          },\n        });\n      }\n\n      const typebotData = {\n        remoteJid: data.remoteJid,\n        status: 'opened',\n        session,\n      };\n      this.waMonitor.waInstances[instance.name].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n\n      return { ...request.data, session };\n    } catch (error) {\n      this.logger.error(error);\n      return;\n    }\n  }\n\n  /**\n   * Send WhatsApp message with complex TypeBot formatting\n   */\n  public async sendWAMessage(\n    instanceDb: Instance,\n    session: IntegrationSession,\n    settings: {\n      expire: number;\n      keywordFinish: string;\n      delayMessage: number;\n      unknownMessage: string;\n      listeningFromMe: boolean;\n      stopBotFromMe: boolean;\n      keepOpen: boolean;\n    },\n    remoteJid: string,\n    messages: any,\n    input: any,\n    clientSideActions: any,\n  ) {\n    const waInstance = this.waMonitor.waInstances[instanceDb.name];\n    await this.processMessages(\n      waInstance,\n      session,\n      settings,\n      messages,\n      input,\n      clientSideActions,\n      this.applyFormatting.bind(this),\n      this.prismaRepository,\n    ).catch((err) => {\n      console.error('Erro ao processar mensagens:', err);\n    });\n  }\n\n  /**\n   * Apply rich text formatting for TypeBot messages\n   */\n  private applyFormatting(element: any): string {\n    let text = '';\n\n    if (element.text) {\n      text += element.text;\n    }\n\n    if (element.children && element.type !== 'a') {\n      for (const child of element.children) {\n        text += this.applyFormatting(child);\n      }\n    }\n\n    if (element.type === 'p' && element.type !== 'inline-variable') {\n      text = text.trim() + '\\n';\n    }\n\n    if (element.type === 'inline-variable') {\n      text = text.trim();\n    }\n\n    if (element.type === 'ol') {\n      text =\n        '\\n' +\n        text\n          .split('\\n')\n          .map((line, index) => (line ? `${index + 1}. ${line}` : ''))\n          .join('\\n');\n    }\n\n    if (element.type === 'li') {\n      text = text\n        .split('\\n')\n        .map((line) => (line ? `  ${line}` : ''))\n        .join('\\n');\n    }\n\n    let formats = '';\n\n    if (element.bold) {\n      formats += '*';\n    }\n\n    if (element.italic) {\n      formats += '_';\n    }\n\n    if (element.underline) {\n      formats += '~';\n    }\n\n    let formattedText = `${formats}${text}${formats.split('').reverse().join('')}`;\n\n    if (element.url) {\n      formattedText = element.children[0]?.text ? `[${formattedText}]\\n(${element.url})` : `${element.url}`;\n    }\n\n    return formattedText;\n  }\n\n  /**\n   * Process TypeBot messages with full feature support\n   */\n  private async processMessages(\n    instance: any,\n    session: IntegrationSession,\n    settings: {\n      expire: number;\n      keywordFinish: string;\n      delayMessage: number;\n      unknownMessage: string;\n      listeningFromMe: boolean;\n      stopBotFromMe: boolean;\n      keepOpen: boolean;\n    },\n    messages: any,\n    input: any,\n    clientSideActions: any,\n    applyFormatting: any,\n    prismaRepository: PrismaRepository,\n  ) {\n    // Helper function to find wait time\n    const findItemAndGetSecondsToWait = (array: any[], targetId: string) => {\n      if (!array) return null;\n\n      for (const item of array) {\n        if (item.lastBubbleBlockId === targetId) {\n          return item.wait?.secondsToWaitFor;\n        }\n      }\n      return null;\n    };\n\n    for (const message of messages) {\n      if (message.type === 'text') {\n        let formattedText = '';\n\n        for (const richText of message.content.richText) {\n          for (const element of richText.children) {\n            formattedText += applyFormatting(element);\n          }\n          formattedText += '\\n';\n        }\n\n        formattedText = formattedText.replace(/\\*\\*/g, '').replace(/__/, '').replace(/~~/, '').replace(/\\n$/, '');\n\n        formattedText = formattedText.replace(/\\n$/, '');\n\n        if (formattedText.includes('[list]')) {\n          await this.processListMessage(instance, formattedText, session.remoteJid);\n        } else if (formattedText.includes('[buttons]')) {\n          await this.processButtonMessage(instance, formattedText, session.remoteJid);\n        } else {\n          await this.sendMessageWhatsApp(instance, session.remoteJid, formattedText, settings, true);\n        }\n\n        sendTelemetry('/message/sendText');\n      }\n\n      if (message.type === 'image') {\n        await instance.mediaMessage(\n          {\n            number: session.remoteJid,\n            delay: settings?.delayMessage || 1000,\n            mediatype: 'image',\n            media: message.content.url,\n          },\n          null,\n          false,\n        );\n\n        sendTelemetry('/message/sendMedia');\n      }\n\n      if (message.type === 'video') {\n        await instance.mediaMessage(\n          {\n            number: session.remoteJid,\n            delay: settings?.delayMessage || 1000,\n            mediatype: 'video',\n            media: message.content.url,\n          },\n          null,\n          false,\n        );\n\n        sendTelemetry('/message/sendMedia');\n      }\n\n      if (message.type === 'audio') {\n        await instance.audioWhatsapp(\n          {\n            number: session.remoteJid,\n            delay: settings?.delayMessage || 1000,\n            encoding: true,\n            audio: message.content.url,\n          },\n          false,\n        );\n\n        sendTelemetry('/message/sendWhatsAppAudio');\n      }\n\n      const wait = findItemAndGetSecondsToWait(clientSideActions, message.id);\n\n      if (wait) {\n        await new Promise((resolve) => setTimeout(resolve, wait * 1000));\n      }\n    }\n\n    // Process input choices\n    if (input) {\n      if (input.type === 'choice input') {\n        let formattedText = '';\n\n        const items = input.items;\n\n        for (const item of items) {\n          formattedText += `▶️ ${item.content}\\n`;\n        }\n\n        formattedText = formattedText.replace(/\\n$/, '');\n\n        if (formattedText.includes('[list]')) {\n          await this.processListMessage(instance, formattedText, session.remoteJid);\n        } else if (formattedText.includes('[buttons]')) {\n          await this.processButtonMessage(instance, formattedText, session.remoteJid);\n        } else {\n          await this.sendMessageWhatsApp(instance, session.remoteJid, formattedText, settings, true);\n        }\n\n        sendTelemetry('/message/sendText');\n      }\n\n      await prismaRepository.integrationSession.update({\n        where: {\n          id: session.id,\n        },\n        data: {\n          awaitUser: true,\n        },\n      });\n    } else {\n      let statusChange = 'closed';\n      if (!settings?.keepOpen) {\n        await prismaRepository.integrationSession.deleteMany({\n          where: {\n            id: session.id,\n          },\n        });\n        statusChange = 'delete';\n      } else {\n        await prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'closed',\n          },\n        });\n      }\n\n      const typebotData = {\n        remoteJid: session.remoteJid,\n        status: statusChange,\n        session,\n      };\n      instance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n    }\n  }\n\n  /**\n   * Process list messages for WhatsApp\n   */\n  private async processListMessage(instance: any, formattedText: string, remoteJid: string) {\n    const listJson = {\n      number: remoteJid,\n      title: '',\n      description: '',\n      buttonText: '',\n      footerText: '',\n      sections: [],\n    };\n\n    const titleMatch = formattedText.match(/\\[title\\]([\\s\\S]*?)(?=\\[description\\])/);\n    const descriptionMatch = formattedText.match(/\\[description\\]([\\s\\S]*?)(?=\\[buttonText\\])/);\n    const buttonTextMatch = formattedText.match(/\\[buttonText\\]([\\s\\S]*?)(?=\\[footerText\\])/);\n    const footerTextMatch = formattedText.match(/\\[footerText\\]([\\s\\S]*?)(?=\\[menu\\])/);\n\n    if (titleMatch) listJson.title = titleMatch[1].trim();\n    if (descriptionMatch) listJson.description = descriptionMatch[1].trim();\n    if (buttonTextMatch) listJson.buttonText = buttonTextMatch[1].trim();\n    if (footerTextMatch) listJson.footerText = footerTextMatch[1].trim();\n\n    const menuContent = formattedText.match(/\\[menu\\]([\\s\\S]*?)\\[\\/menu\\]/)?.[1];\n    if (menuContent) {\n      const sections = menuContent.match(/\\[section\\]([\\s\\S]*?)(?=\\[section\\]|\\[\\/section\\]|\\[\\/menu\\])/g);\n      if (sections) {\n        sections.forEach((section) => {\n          const sectionTitle = section.match(/title: (.*?)(?:\\n|$)/)?.[1]?.trim();\n          const rows = section.match(/\\[row\\]([\\s\\S]*?)(?=\\[row\\]|\\[\\/row\\]|\\[\\/section\\]|\\[\\/menu\\])/g);\n\n          const sectionData = {\n            title: sectionTitle,\n            rows:\n              rows?.map((row) => ({\n                title: row.match(/title: (.*?)(?:\\n|$)/)?.[1]?.trim(),\n                description: row.match(/description: (.*?)(?:\\n|$)/)?.[1]?.trim(),\n                rowId: row.match(/rowId: (.*?)(?:\\n|$)/)?.[1]?.trim(),\n              })) || [],\n          };\n\n          listJson.sections.push(sectionData);\n        });\n      }\n    }\n\n    await instance.listMessage(listJson);\n  }\n\n  /**\n   * Process button messages for WhatsApp\n   */\n  private async processButtonMessage(instance: any, formattedText: string, remoteJid: string) {\n    const buttonJson = {\n      number: remoteJid,\n      thumbnailUrl: undefined,\n      title: '',\n      description: '',\n      footer: '',\n      buttons: [],\n    };\n\n    const thumbnailUrlMatch = formattedText.match(/\\[thumbnailUrl\\]([\\s\\S]*?)(?=\\[title\\])/);\n    const titleMatch = formattedText.match(/\\[title\\]([\\s\\S]*?)(?=\\[description\\])/);\n    const descriptionMatch = formattedText.match(/\\[description\\]([\\s\\S]*?)(?=\\[footer\\])/);\n    const footerMatch = formattedText.match(/\\[footer\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url))/);\n\n    if (titleMatch) buttonJson.title = titleMatch[1].trim();\n    if (thumbnailUrlMatch) buttonJson.thumbnailUrl = thumbnailUrlMatch[1].trim();\n    if (descriptionMatch) buttonJson.description = descriptionMatch[1].trim();\n    if (footerMatch) buttonJson.footer = footerMatch[1].trim();\n\n    const buttonTypes = {\n      reply: /\\[reply\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url)|$)/g,\n      pix: /\\[pix\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url)|$)/g,\n      copy: /\\[copy\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url)|$)/g,\n      call: /\\[call\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url)|$)/g,\n      url: /\\[url\\]([\\s\\S]*?)(?=\\[(?:reply|pix|copy|call|url)|$)/g,\n    };\n\n    for (const [type, pattern] of Object.entries(buttonTypes)) {\n      let match;\n      while ((match = pattern.exec(formattedText)) !== null) {\n        const content = match[1].trim();\n        const button: any = { type };\n\n        switch (type) {\n          case 'pix':\n            button.currency = content.match(/currency: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.name = content.match(/name: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.keyType = content.match(/keyType: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.key = content.match(/key: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            break;\n\n          case 'reply':\n            button.displayText = content.match(/displayText: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.id = content.match(/id: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            break;\n\n          case 'copy':\n            button.displayText = content.match(/displayText: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.copyCode = content.match(/copyCode: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            break;\n\n          case 'call':\n            button.displayText = content.match(/displayText: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.phoneNumber = content.match(/phone: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            break;\n\n          case 'url':\n            button.displayText = content.match(/displayText: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            button.url = content.match(/url: (.*?)(?:\\n|$)/)?.[1]?.trim();\n            break;\n        }\n\n        if (Object.keys(button).length > 1) {\n          buttonJson.buttons.push(button);\n        }\n      }\n    }\n\n    await instance.buttonMessage(buttonJson);\n  }\n\n  /**\n   * Original TypeBot processing method with full functionality\n   */\n  public async processTypebot(\n    waInstance: any,\n    remoteJid: string,\n    msg: Message,\n    session: IntegrationSession,\n    findTypebot: TypebotModel,\n    url: string,\n    expire: number,\n    typebot: string,\n    keywordFinish: string,\n    delayMessage: number,\n    unknownMessage: string,\n    listeningFromMe: boolean,\n    stopBotFromMe: boolean,\n    keepOpen: boolean,\n    content: string,\n    prefilledVariables?: any,\n  ) {\n    // Get the database instance record\n    const instance = await this.prismaRepository.instance.findFirst({\n      where: {\n        name: waInstance.instanceName,\n      },\n    });\n\n    if (!instance) {\n      this.logger.error('Instance not found in database');\n      return;\n    }\n    // Handle session expiration\n    if (session && expire && expire > 0) {\n      const now = Date.now();\n      const sessionUpdatedAt = new Date(session.updatedAt).getTime();\n      const diff = now - sessionUpdatedAt;\n      const diffInMinutes = Math.floor(diff / 1000 / 60);\n\n      if (diffInMinutes > expire) {\n        if (keepOpen) {\n          await this.prismaRepository.integrationSession.update({\n            where: {\n              id: session.id,\n            },\n            data: {\n              status: 'closed',\n            },\n          });\n        } else {\n          await this.prismaRepository.integrationSession.deleteMany({\n            where: {\n              botId: findTypebot.id,\n              remoteJid: remoteJid,\n            },\n          });\n        }\n\n        const data = await this.createNewSession(instance, {\n          enabled: findTypebot?.enabled,\n          url: url,\n          typebot: typebot,\n          expire: expire,\n          keywordFinish: keywordFinish,\n          delayMessage: delayMessage,\n          unknownMessage: unknownMessage,\n          listeningFromMe: listeningFromMe,\n          remoteJid: remoteJid,\n          pushName: msg.pushName,\n          botId: findTypebot.id,\n          prefilledVariables: prefilledVariables,\n        });\n\n        if (data?.session) {\n          session = data.session;\n        }\n\n        if (!data?.messages || data.messages.length === 0) {\n          const content = getConversationMessage(msg.message);\n\n          if (!content) {\n            if (unknownMessage) {\n              await this.sendMessageWhatsApp(\n                waInstance,\n                remoteJid,\n                unknownMessage,\n                {\n                  delayMessage,\n                  expire,\n                  keywordFinish,\n                  listeningFromMe,\n                  stopBotFromMe,\n                  keepOpen,\n                  unknownMessage,\n                },\n                true,\n              );\n              sendTelemetry('/message/sendText');\n            }\n            return;\n          }\n\n          if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) {\n            let statusChange = 'closed';\n            if (keepOpen) {\n              await this.prismaRepository.integrationSession.update({\n                where: {\n                  id: session.id,\n                },\n                data: {\n                  status: 'closed',\n                },\n              });\n            } else {\n              statusChange = 'delete';\n              await this.prismaRepository.integrationSession.deleteMany({\n                where: {\n                  botId: findTypebot.id,\n                  remoteJid: remoteJid,\n                },\n              });\n            }\n\n            const typebotData = {\n              remoteJid: remoteJid,\n              status: statusChange,\n              session,\n            };\n            waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n\n            return;\n          }\n\n          try {\n            const version = this.configService.get<Typebot>('TYPEBOT').API_VERSION;\n            let urlTypebot: string;\n            let reqData: {};\n            if (version === 'latest') {\n              urlTypebot = `${url}/api/v1/sessions/${data?.sessionId}/continueChat`;\n              reqData = {\n                message: content,\n              };\n            } else {\n              urlTypebot = `${url}/api/v1/sendMessage`;\n              reqData = {\n                message: content,\n                sessionId: data?.sessionId,\n              };\n            }\n\n            const request = await axios.post(urlTypebot, reqData);\n\n            await this.sendWAMessage(\n              instance,\n              session,\n              {\n                expire: expire,\n                keywordFinish: keywordFinish,\n                delayMessage: delayMessage,\n                unknownMessage: unknownMessage,\n                listeningFromMe: listeningFromMe,\n                stopBotFromMe: stopBotFromMe,\n                keepOpen: keepOpen,\n              },\n              remoteJid,\n              request?.data?.messages,\n              request?.data?.input,\n              request?.data?.clientSideActions,\n            );\n          } catch (error) {\n            this.logger.error(error);\n            return;\n          }\n        }\n\n        if (data?.messages && data.messages.length > 0) {\n          await this.sendWAMessage(\n            instance,\n            session,\n            {\n              expire: expire,\n              keywordFinish: keywordFinish,\n              delayMessage: delayMessage,\n              unknownMessage: unknownMessage,\n              listeningFromMe: listeningFromMe,\n              stopBotFromMe: stopBotFromMe,\n              keepOpen: keepOpen,\n            },\n            remoteJid,\n            data.messages,\n            data.input,\n            data.clientSideActions,\n          );\n        }\n\n        return;\n      }\n    }\n\n    if (session && session.status !== 'opened') {\n      return;\n    }\n\n    // Handle new sessions\n    if (!session) {\n      const data = await this.createNewSession(instance, {\n        enabled: findTypebot?.enabled,\n        url: url,\n        typebot: typebot,\n        expire: expire,\n        keywordFinish: keywordFinish,\n        delayMessage: delayMessage,\n        unknownMessage: unknownMessage,\n        listeningFromMe: listeningFromMe,\n        remoteJid: remoteJid,\n        pushName: msg?.pushName,\n        botId: findTypebot.id,\n        prefilledVariables: prefilledVariables,\n      });\n\n      if (data?.session) {\n        session = data.session;\n      }\n\n      if (data?.messages && data.messages.length > 0) {\n        await this.sendWAMessage(\n          instance,\n          session,\n          {\n            expire: expire,\n            keywordFinish: keywordFinish,\n            delayMessage: delayMessage,\n            unknownMessage: unknownMessage,\n            listeningFromMe: listeningFromMe,\n            stopBotFromMe: stopBotFromMe,\n            keepOpen: keepOpen,\n          },\n          remoteJid,\n          data.messages,\n          data.input,\n          data.clientSideActions,\n        );\n      }\n\n      if (!data?.messages || data.messages.length === 0) {\n        if (!content) {\n          if (unknownMessage) {\n            await this.sendMessageWhatsApp(\n              waInstance,\n              remoteJid,\n              unknownMessage,\n              {\n                delayMessage,\n                expire,\n                keywordFinish,\n                listeningFromMe,\n                stopBotFromMe,\n                keepOpen,\n                unknownMessage,\n              },\n              true,\n            );\n            sendTelemetry('/message/sendText');\n          }\n          return;\n        }\n\n        if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) {\n          let statusChange = 'closed';\n          if (keepOpen) {\n            await this.prismaRepository.integrationSession.update({\n              where: {\n                id: session.id,\n              },\n              data: {\n                status: 'closed',\n              },\n            });\n          } else {\n            statusChange = 'delete';\n            await this.prismaRepository.integrationSession.deleteMany({\n              where: {\n                botId: findTypebot.id,\n                remoteJid: remoteJid,\n              },\n            });\n          }\n\n          const typebotData = {\n            remoteJid: remoteJid,\n            status: statusChange,\n            session,\n          };\n          waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n\n          return;\n        }\n\n        let request: any;\n        try {\n          const version = this.configService.get<Typebot>('TYPEBOT').API_VERSION;\n          let urlTypebot: string;\n          let reqData: {};\n          if (version === 'latest') {\n            urlTypebot = `${url}/api/v1/sessions/${data?.sessionId}/continueChat`;\n            reqData = {\n              message: content,\n            };\n          } else {\n            urlTypebot = `${url}/api/v1/sendMessage`;\n            reqData = {\n              message: content,\n              sessionId: data?.sessionId,\n            };\n          }\n          request = await axios.post(urlTypebot, reqData);\n\n          await this.sendWAMessage(\n            instance,\n            session,\n            {\n              expire: expire,\n              keywordFinish: keywordFinish,\n              delayMessage: delayMessage,\n              unknownMessage: unknownMessage,\n              listeningFromMe: listeningFromMe,\n              stopBotFromMe: stopBotFromMe,\n              keepOpen: keepOpen,\n            },\n            remoteJid,\n            request?.data?.messages,\n            request?.data?.input,\n            request?.data?.clientSideActions,\n          );\n        } catch (error) {\n          this.logger.error(error);\n          return;\n        }\n      }\n      return;\n    }\n\n    // Update existing session\n    await this.prismaRepository.integrationSession.update({\n      where: {\n        id: session.id,\n      },\n      data: {\n        status: 'opened',\n        awaitUser: false,\n      },\n    });\n\n    if (!content) {\n      if (unknownMessage) {\n        await this.sendMessageWhatsApp(\n          waInstance,\n          remoteJid,\n          unknownMessage,\n          {\n            delayMessage,\n            expire,\n            keywordFinish,\n            listeningFromMe,\n            stopBotFromMe,\n            keepOpen,\n            unknownMessage,\n          },\n          true,\n        );\n        sendTelemetry('/message/sendText');\n      }\n      return;\n    }\n\n    if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) {\n      let statusChange = 'closed';\n      if (keepOpen) {\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'closed',\n          },\n        });\n      } else {\n        statusChange = 'delete';\n        await this.prismaRepository.integrationSession.deleteMany({\n          where: {\n            botId: findTypebot.id,\n            remoteJid: remoteJid,\n          },\n        });\n      }\n\n      const typebotData = {\n        remoteJid: remoteJid,\n        status: statusChange,\n        session,\n      };\n\n      waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n\n      return;\n    }\n\n    // Continue existing chat\n    const version = this.configService.get<Typebot>('TYPEBOT').API_VERSION;\n    let urlTypebot: string;\n    let reqData: { message: string; sessionId?: string };\n    if (version === 'latest') {\n      urlTypebot = `${url}/api/v1/sessions/${session.sessionId.split('-')[1]}/continueChat`;\n      reqData = {\n        message: content,\n      };\n    } else {\n      urlTypebot = `${url}/api/v1/sendMessage`;\n      reqData = {\n        message: content,\n        sessionId: session.sessionId.split('-')[1],\n      };\n    }\n\n    // Handle audio transcription if OpenAI service is available\n    if (this.isAudioMessage(content) && msg) {\n      try {\n        this.logger.debug(`[TypeBot] Downloading audio for Whisper transcription`);\n        const transcription = await this.openaiService.speechToText(msg, instance);\n        if (transcription) {\n          reqData.message = `[audio] ${transcription}`;\n        }\n      } catch (err) {\n        this.logger.error(`[TypeBot] Failed to transcribe audio: ${err}`);\n      }\n    }\n\n    const request = await axios.post(urlTypebot, reqData);\n\n    await this.sendWAMessage(\n      instance,\n      session,\n      {\n        expire: expire,\n        keywordFinish: keywordFinish,\n        delayMessage: delayMessage,\n        unknownMessage: unknownMessage,\n        listeningFromMe: listeningFromMe,\n        stopBotFromMe: stopBotFromMe,\n        keepOpen: keepOpen,\n      },\n      remoteJid,\n      request?.data?.messages,\n      request?.data?.input,\n      request?.data?.clientSideActions,\n    );\n\n    return;\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ProxyDto } from '@api/dto/proxy.dto';\nimport { SettingsDto } from '@api/dto/settings.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { ChatwootService } from '@api/integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { DifyService } from '@api/integrations/chatbot/dify/services/dify.service';\nimport { OpenaiService } from '@api/integrations/chatbot/openai/services/openai.service';\nimport { TypebotService } from '@api/integrations/chatbot/typebot/services/typebot.service';\nimport { PrismaRepository, Query } from '@api/repository/repository.service';\nimport { eventManager, waMonitor } from '@api/server.module';\nimport { Events, wa } from '@api/types/wa.types';\nimport { Auth, Chatwoot, ConfigService, HttpServer, Proxy } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { NotFoundException } from '@exceptions';\nimport { Contact, Message, Prisma } from '@prisma/client';\nimport { createJid } from '@utils/createJid';\nimport { WASocket } from 'baileys';\nimport { isArray } from 'class-validator';\nimport EventEmitter2 from 'eventemitter2';\nimport { v4 } from 'uuid';\n\nimport { CacheService } from './cache.service';\n\nexport class ChannelStartupService {\n  constructor(\n    public readonly configService: ConfigService,\n    public readonly eventEmitter: EventEmitter2,\n    public readonly prismaRepository: PrismaRepository,\n    public readonly chatwootCache: CacheService,\n  ) {}\n\n  public readonly logger = new Logger('ChannelStartupService');\n\n  public client: WASocket;\n  public readonly instance: wa.Instance = {};\n  public readonly localChatwoot: wa.LocalChatwoot = {};\n  public readonly localProxy: wa.LocalProxy = {};\n  public readonly localSettings: wa.LocalSettings = {};\n  public readonly localWebhook: wa.LocalWebHook = {};\n\n  public chatwootService = new ChatwootService(\n    waMonitor,\n    this.configService,\n    this.prismaRepository,\n    this.chatwootCache,\n  );\n\n  public openaiService = new OpenaiService(waMonitor, this.prismaRepository, this.configService);\n\n  public typebotService = new TypebotService(waMonitor, this.configService, this.prismaRepository, this.openaiService);\n\n  public difyService = new DifyService(waMonitor, this.prismaRepository, this.configService, this.openaiService);\n\n  public setInstance(instance: InstanceDto) {\n    this.logger.setInstance(instance.instanceName);\n\n    this.instance.name = instance.instanceName;\n    this.instance.id = instance.instanceId;\n    this.instance.integration = instance.integration;\n    this.instance.number = instance.number;\n    this.instance.token = instance.token;\n    this.instance.businessId = instance.businessId;\n    this.instance.ownerJid = instance.ownerJid;\n\n    if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n      this.chatwootService.eventWhatsapp(\n        Events.STATUS_INSTANCE,\n        { instanceName: this.instance.name },\n        {\n          instance: this.instance.name,\n          status: 'created',\n        },\n      );\n    }\n  }\n\n  public set instanceName(name: string) {\n    this.logger.setInstance(name);\n\n    if (!name) {\n      this.instance.name = v4();\n      return;\n    }\n    this.instance.name = name;\n  }\n\n  public get instanceName() {\n    return this.instance.name;\n  }\n\n  public set instanceId(id: string) {\n    if (!id) {\n      this.instance.id = v4();\n      return;\n    }\n    this.instance.id = id;\n  }\n\n  public get instanceId() {\n    return this.instance.id;\n  }\n\n  public set integration(integration: string) {\n    this.instance.integration = integration;\n  }\n\n  public get integration() {\n    return this.instance.integration;\n  }\n\n  public set number(number: string) {\n    this.instance.number = number;\n  }\n\n  public get number() {\n    return this.instance.number;\n  }\n\n  public set token(token: string) {\n    this.instance.token = token;\n  }\n\n  public get token() {\n    return this.instance.token;\n  }\n\n  public get wuid() {\n    return this.instance.wuid;\n  }\n\n  public async loadWebhook() {\n    const data = await this.prismaRepository.webhook.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    this.localWebhook.enabled = data?.enabled;\n    this.localWebhook.webhookBase64 = data?.webhookBase64;\n  }\n\n  public async loadSettings() {\n    const data = await this.prismaRepository.setting.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    this.localSettings.rejectCall = data?.rejectCall;\n    this.localSettings.msgCall = data?.msgCall;\n    this.localSettings.groupsIgnore = data?.groupsIgnore;\n    this.localSettings.alwaysOnline = data?.alwaysOnline;\n    this.localSettings.readMessages = data?.readMessages;\n    this.localSettings.readStatus = data?.readStatus;\n    this.localSettings.syncFullHistory = data?.syncFullHistory;\n    this.localSettings.wavoipToken = data?.wavoipToken;\n  }\n\n  public async setSettings(data: SettingsDto) {\n    await this.prismaRepository.setting.upsert({\n      where: {\n        instanceId: this.instanceId,\n      },\n      update: {\n        rejectCall: data.rejectCall,\n        msgCall: data.msgCall,\n        groupsIgnore: data.groupsIgnore,\n        alwaysOnline: data.alwaysOnline,\n        readMessages: data.readMessages,\n        readStatus: data.readStatus,\n        syncFullHistory: data.syncFullHistory,\n        wavoipToken: data.wavoipToken,\n      },\n      create: {\n        rejectCall: data.rejectCall,\n        msgCall: data.msgCall,\n        groupsIgnore: data.groupsIgnore,\n        alwaysOnline: data.alwaysOnline,\n        readMessages: data.readMessages,\n        readStatus: data.readStatus,\n        syncFullHistory: data.syncFullHistory,\n        wavoipToken: data.wavoipToken,\n        instanceId: this.instanceId,\n      },\n    });\n\n    this.localSettings.rejectCall = data?.rejectCall;\n    this.localSettings.msgCall = data?.msgCall;\n    this.localSettings.groupsIgnore = data?.groupsIgnore;\n    this.localSettings.alwaysOnline = data?.alwaysOnline;\n    this.localSettings.readMessages = data?.readMessages;\n    this.localSettings.readStatus = data?.readStatus;\n    this.localSettings.syncFullHistory = data?.syncFullHistory;\n    this.localSettings.wavoipToken = data?.wavoipToken;\n\n    if (this.localSettings.wavoipToken && this.localSettings.wavoipToken.length > 0) {\n      this.client.ws.close();\n      this.client.ws.connect();\n    }\n  }\n\n  public async findSettings() {\n    const data = await this.prismaRepository.setting.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (!data) {\n      return null;\n    }\n\n    return {\n      rejectCall: data.rejectCall,\n      msgCall: data.msgCall,\n      groupsIgnore: data.groupsIgnore,\n      alwaysOnline: data.alwaysOnline,\n      readMessages: data.readMessages,\n      readStatus: data.readStatus,\n      syncFullHistory: data.syncFullHistory,\n      wavoipToken: data.wavoipToken,\n    };\n  }\n\n  public async loadChatwoot() {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n      return;\n    }\n\n    const data = await this.prismaRepository.chatwoot.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    this.localChatwoot.enabled = data?.enabled;\n    this.localChatwoot.accountId = data?.accountId;\n    this.localChatwoot.token = data?.token;\n    this.localChatwoot.url = data?.url;\n    this.localChatwoot.nameInbox = data?.nameInbox;\n    this.localChatwoot.signMsg = data?.signMsg;\n    this.localChatwoot.signDelimiter = data?.signDelimiter;\n    this.localChatwoot.number = data?.number;\n    this.localChatwoot.reopenConversation = data?.reopenConversation;\n    this.localChatwoot.conversationPending = data?.conversationPending;\n    this.localChatwoot.mergeBrazilContacts = data?.mergeBrazilContacts;\n    this.localChatwoot.importContacts = data?.importContacts;\n    this.localChatwoot.importMessages = data?.importMessages;\n    this.localChatwoot.daysLimitImportMessages = data?.daysLimitImportMessages;\n  }\n\n  public async setChatwoot(data: ChatwootDto) {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n      return;\n    }\n\n    const chatwoot = await this.prismaRepository.chatwoot.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (chatwoot) {\n      await this.prismaRepository.chatwoot.update({\n        where: {\n          instanceId: this.instanceId,\n        },\n        data: {\n          enabled: data?.enabled,\n          accountId: data.accountId,\n          token: data.token,\n          url: data.url,\n          nameInbox: data.nameInbox,\n          signMsg: data.signMsg,\n          signDelimiter: data.signMsg ? data.signDelimiter : null,\n          number: data.number,\n          reopenConversation: data.reopenConversation,\n          conversationPending: data.conversationPending,\n          mergeBrazilContacts: data.mergeBrazilContacts,\n          importContacts: data.importContacts,\n          importMessages: data.importMessages,\n          daysLimitImportMessages: data.daysLimitImportMessages,\n          organization: data.organization,\n          logo: data.logo,\n          ignoreJids: data.ignoreJids,\n        },\n      });\n\n      Object.assign(this.localChatwoot, { ...data, signDelimiter: data.signMsg ? data.signDelimiter : null });\n\n      this.clearCacheChatwoot();\n      return;\n    }\n\n    await this.prismaRepository.chatwoot.create({\n      data: {\n        enabled: data?.enabled,\n        accountId: data.accountId,\n        token: data.token,\n        url: data.url,\n        nameInbox: data.nameInbox,\n        signMsg: data.signMsg,\n        number: data.number,\n        reopenConversation: data.reopenConversation,\n        conversationPending: data.conversationPending,\n        mergeBrazilContacts: data.mergeBrazilContacts,\n        importContacts: data.importContacts,\n        importMessages: data.importMessages,\n        daysLimitImportMessages: data.daysLimitImportMessages,\n        organization: data.organization,\n        logo: data.logo,\n        ignoreJids: data.ignoreJids,\n        instanceId: this.instanceId,\n      },\n    });\n\n    Object.assign(this.localChatwoot, { ...data, signDelimiter: data.signMsg ? data.signDelimiter : null });\n\n    this.clearCacheChatwoot();\n  }\n\n  public async findChatwoot(): Promise<ChatwootDto | null> {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n      return null;\n    }\n\n    const data = await this.prismaRepository.chatwoot.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (!data) {\n      return null;\n    }\n\n    const ignoreJidsArray = Array.isArray(data.ignoreJids) ? data.ignoreJids.map((event) => String(event)) : [];\n\n    return {\n      enabled: data?.enabled,\n      accountId: data.accountId,\n      token: data.token,\n      url: data.url,\n      nameInbox: data.nameInbox,\n      signMsg: data.signMsg,\n      signDelimiter: data.signDelimiter || null,\n      reopenConversation: data.reopenConversation,\n      conversationPending: data.conversationPending,\n      mergeBrazilContacts: data.mergeBrazilContacts,\n      importContacts: data.importContacts,\n      importMessages: data.importMessages,\n      daysLimitImportMessages: data.daysLimitImportMessages,\n      organization: data.organization,\n      logo: data.logo,\n      ignoreJids: ignoreJidsArray,\n    };\n  }\n\n  public clearCacheChatwoot() {\n    if (this.localChatwoot?.enabled) {\n      this.chatwootService.getCache()?.deleteAll(this.instanceName);\n    }\n  }\n\n  public async loadProxy() {\n    this.localProxy.enabled = false;\n\n    const proxyConfig = this.configService.get<Proxy>('PROXY');\n    if (proxyConfig.HOST) {\n      this.localProxy.enabled = true;\n      this.localProxy.host = proxyConfig.HOST;\n      this.localProxy.port = proxyConfig.PORT || '80';\n      this.localProxy.protocol = proxyConfig.PROTOCOL || 'http';\n      this.localProxy.username = proxyConfig.USERNAME;\n      this.localProxy.password = proxyConfig.PASSWORD;\n    }\n\n    const data = await this.prismaRepository.proxy.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (data?.enabled) {\n      this.localProxy.enabled = true;\n      this.localProxy.host = data?.host;\n      this.localProxy.port = data?.port;\n      this.localProxy.protocol = data?.protocol;\n      this.localProxy.username = data?.username;\n      this.localProxy.password = data?.password;\n    }\n  }\n\n  public async setProxy(data: ProxyDto) {\n    await this.prismaRepository.proxy.upsert({\n      where: {\n        instanceId: this.instanceId,\n      },\n      update: {\n        enabled: data?.enabled,\n        host: data.host,\n        port: data.port,\n        protocol: data.protocol,\n        username: data.username,\n        password: data.password,\n      },\n      create: {\n        enabled: data?.enabled,\n        host: data.host,\n        port: data.port,\n        protocol: data.protocol,\n        username: data.username,\n        password: data.password,\n        instanceId: this.instanceId,\n      },\n    });\n\n    Object.assign(this.localProxy, data);\n  }\n\n  public async findProxy() {\n    const data = await this.prismaRepository.proxy.findUnique({\n      where: {\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (!data) {\n      throw new NotFoundException('Proxy not found');\n    }\n\n    return data;\n  }\n\n  public async sendDataWebhook<T extends object = any>(\n    event: Events,\n    data: T,\n    local = true,\n    integration?: string[],\n    extra?: Record<string, any>,\n  ) {\n    const serverUrl = this.configService.get<HttpServer>('SERVER').URL;\n    const tzoffset = new Date().getTimezoneOffset() * 60000; //offset in milliseconds\n    const localISOTime = new Date(Date.now() - tzoffset).toISOString();\n    const now = localISOTime;\n\n    const expose = this.configService.get<Auth>('AUTHENTICATION').EXPOSE_IN_FETCH_INSTANCES;\n\n    const instanceApikey = this.token || 'Apikey not found';\n\n    await eventManager.emit({\n      instanceName: this.instance.name,\n      origin: ChannelStartupService.name,\n      event,\n      data,\n      serverUrl,\n      dateTime: now,\n      sender: this.wuid,\n      apiKey: expose && instanceApikey ? instanceApikey : null,\n      local,\n      integration,\n      extra,\n    });\n  }\n\n  // Check if the number is MX or AR\n  public formatMXOrARNumber(jid: string): string {\n    const countryCode = jid.substring(0, 2);\n\n    if (Number(countryCode) === 52 || Number(countryCode) === 54) {\n      if (jid.length === 13) {\n        const number = countryCode + jid.substring(3);\n        return number;\n      }\n\n      return jid;\n    }\n    return jid;\n  }\n\n  // Check if the number is br\n  public formatBRNumber(jid: string) {\n    const regexp = new RegExp(/^(\\d{2})(\\d{2})\\d{1}(\\d{8})$/);\n    if (regexp.test(jid)) {\n      const match = regexp.exec(jid);\n      if (match && match[1] === '55') {\n        const joker = Number.parseInt(match[3][0]);\n        const ddd = Number.parseInt(match[2]);\n        if (joker < 7 || ddd < 31) {\n          return match[0];\n        }\n        return match[1] + match[2] + match[3];\n      }\n      return jid;\n    } else {\n      return jid;\n    }\n  }\n\n  public async fetchContacts(query: Query<Contact>) {\n    const where: any = {\n      instanceId: this.instanceId,\n    };\n\n    if (query?.where?.remoteJid) {\n      const remoteJid = query.where.remoteJid.includes('@') ? query.where.remoteJid : createJid(query.where.remoteJid);\n      where['remoteJid'] = remoteJid;\n    }\n\n    if (query?.where?.id) {\n      where['id'] = query.where.id;\n    }\n\n    if (query?.where?.pushName) {\n      where['pushName'] = query.where.pushName;\n    }\n\n    const contactFindManyArgs: Prisma.ContactFindManyArgs = {\n      where,\n    };\n\n    if (query.offset) contactFindManyArgs.take = query.offset;\n    if (query.page) {\n      const validPage = Math.max(query.page as number, 1);\n      contactFindManyArgs.skip = query.offset * (validPage - 1);\n    }\n\n    const contacts = await this.prismaRepository.contact.findMany(contactFindManyArgs);\n\n    return contacts.map((contact) => {\n      const remoteJid = contact.remoteJid;\n      const isGroup = remoteJid.endsWith('@g.us');\n      const isSaved = !!contact.pushName || !!contact.profilePicUrl;\n      const type = isGroup ? 'group' : isSaved ? 'contact' : 'group_member';\n      return {\n        ...contact,\n        isGroup,\n        isSaved,\n        type,\n      };\n    });\n  }\n\n  public cleanMessageData(message: any) {\n    if (!message) return message;\n    const cleanedMessage = { ...message };\n\n    if (cleanedMessage.message) {\n      const { mediaUrl } = cleanedMessage.message;\n      delete cleanedMessage.message.base64;\n\n      // Limpa imageMessage\n      if (cleanedMessage.message.imageMessage) {\n        cleanedMessage.message.imageMessage = {\n          caption: cleanedMessage.message.imageMessage.caption,\n        };\n      }\n\n      // Limpa videoMessage\n      if (cleanedMessage.message.videoMessage) {\n        cleanedMessage.message.videoMessage = {\n          caption: cleanedMessage.message.videoMessage.caption,\n        };\n      }\n\n      // Limpa audioMessage\n      if (cleanedMessage.message.audioMessage) {\n        cleanedMessage.message.audioMessage = {\n          seconds: cleanedMessage.message.audioMessage.seconds,\n        };\n      }\n\n      // Limpa stickerMessage\n      if (cleanedMessage.message.stickerMessage) {\n        cleanedMessage.message.stickerMessage = {};\n      }\n\n      // Limpa documentMessage\n      if (cleanedMessage.message.documentMessage) {\n        cleanedMessage.message.documentMessage = {\n          caption: cleanedMessage.message.documentMessage.caption,\n          name: cleanedMessage.message.documentMessage.name,\n        };\n      }\n\n      // Limpa documentWithCaptionMessage\n      if (cleanedMessage.message.documentWithCaptionMessage) {\n        cleanedMessage.message.documentWithCaptionMessage = {\n          caption: cleanedMessage.message.documentWithCaptionMessage.caption,\n          name: cleanedMessage.message.documentWithCaptionMessage.name,\n        };\n      }\n\n      if (mediaUrl) cleanedMessage.message.mediaUrl = mediaUrl;\n    }\n\n    return cleanedMessage;\n  }\n\n  public async fetchMessages(query: Query<Message>) {\n    const keyFilters = query?.where?.key as {\n      id?: string;\n      fromMe?: boolean;\n      remoteJid?: string;\n      participants?: string;\n    };\n\n    const timestampFilter = {};\n    if (query?.where?.messageTimestamp) {\n      if (query.where.messageTimestamp['gte'] && query.where.messageTimestamp['lte']) {\n        timestampFilter['messageTimestamp'] = {\n          gte: Math.floor(new Date(query.where.messageTimestamp['gte']).getTime() / 1000),\n          lte: Math.floor(new Date(query.where.messageTimestamp['lte']).getTime() / 1000),\n        };\n      }\n    }\n\n    const count = await this.prismaRepository.message.count({\n      where: {\n        instanceId: this.instanceId,\n        id: query?.where?.id,\n        source: query?.where?.source,\n        messageType: query?.where?.messageType,\n        ...timestampFilter,\n        AND: [\n          keyFilters?.id ? { key: { path: ['id'], equals: keyFilters?.id } } : {},\n          keyFilters?.fromMe ? { key: { path: ['fromMe'], equals: keyFilters?.fromMe } } : {},\n          keyFilters?.remoteJid ? { key: { path: ['remoteJid'], equals: keyFilters?.remoteJid } } : {},\n          keyFilters?.participants ? { key: { path: ['participants'], equals: keyFilters?.participants } } : {},\n        ],\n      },\n    });\n\n    if (!query?.offset) {\n      query.offset = 50;\n    }\n\n    if (!query?.page) {\n      query.page = 1;\n    }\n\n    const messages = await this.prismaRepository.message.findMany({\n      where: {\n        instanceId: this.instanceId,\n        id: query?.where?.id,\n        source: query?.where?.source,\n        messageType: query?.where?.messageType,\n        ...timestampFilter,\n        AND: [\n          keyFilters?.id ? { key: { path: ['id'], equals: keyFilters?.id } } : {},\n          keyFilters?.fromMe ? { key: { path: ['fromMe'], equals: keyFilters?.fromMe } } : {},\n          keyFilters?.remoteJid ? { key: { path: ['remoteJid'], equals: keyFilters?.remoteJid } } : {},\n          keyFilters?.participants ? { key: { path: ['participants'], equals: keyFilters?.participants } } : {},\n        ],\n      },\n      orderBy: {\n        messageTimestamp: 'desc',\n      },\n      skip: query.offset * (query?.page === 1 ? 0 : (query?.page as number) - 1),\n      take: query.offset,\n      select: {\n        id: true,\n        key: true,\n        pushName: true,\n        messageType: true,\n        message: true,\n        messageTimestamp: true,\n        instanceId: true,\n        source: true,\n        contextInfo: true,\n        MessageUpdate: {\n          select: {\n            status: true,\n          },\n        },\n      },\n    });\n\n    return {\n      messages: {\n        total: count,\n        pages: Math.ceil(count / query.offset),\n        currentPage: query.page,\n        records: messages,\n      },\n    };\n  }\n\n  public async fetchStatusMessage(query: any) {\n    if (!query?.offset) {\n      query.offset = 50;\n    }\n\n    if (!query?.page) {\n      query.page = 1;\n    }\n\n    return await this.prismaRepository.messageUpdate.findMany({\n      where: {\n        instanceId: this.instanceId,\n        remoteJid: query.where?.remoteJid,\n        keyId: query.where?.id,\n      },\n      skip: query.offset * (query?.page === 1 ? 0 : (query?.page as number) - 1),\n      take: query.offset,\n    });\n  }\n\n  public async findChatByRemoteJid(remoteJid: string) {\n    if (!remoteJid) return null;\n    return await this.prismaRepository.chat.findFirst({\n      where: {\n        instanceId: this.instanceId,\n        remoteJid: remoteJid,\n      },\n    });\n  }\n\n  public async fetchChats(query: any) {\n    const remoteJid = query?.where?.remoteJid\n      ? query?.where?.remoteJid.includes('@')\n        ? query.where?.remoteJid\n        : createJid(query.where?.remoteJid)\n      : null;\n\n    const where = {\n      instanceId: this.instanceId,\n    };\n\n    if (remoteJid) {\n      where['remoteJid'] = remoteJid;\n    }\n\n    const timestampFilter =\n      query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte\n        ? Prisma.sql`\n        AND \"Message\".\"messageTimestamp\" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}\n        AND \"Message\".\"messageTimestamp\" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}`\n        : Prisma.sql``;\n\n    const limit = query?.take ? Prisma.sql`LIMIT ${query.take}` : Prisma.sql``;\n    const offset = query?.skip ? Prisma.sql`OFFSET ${query.skip}` : Prisma.sql``;\n\n    const results = await this.prismaRepository.$queryRaw`\n      WITH rankedMessages AS (\n        SELECT DISTINCT ON (\"Message\".\"key\"->>'remoteJid') \n          \"Contact\".\"id\" as \"contactId\",\n          \"Message\".\"key\"->>'remoteJid' as \"remoteJid\",\n          CASE \n            WHEN \"Message\".\"key\"->>'remoteJid' LIKE '%@g.us' THEN COALESCE(\"Chat\".\"name\", \"Contact\".\"pushName\")\n            ELSE COALESCE(\"Contact\".\"pushName\", \"Message\".\"pushName\")\n          END as \"pushName\",\n          \"Contact\".\"profilePicUrl\",\n          COALESCE(\n            to_timestamp(\"Message\".\"messageTimestamp\"::double precision), \n            \"Contact\".\"updatedAt\"\n          ) as \"updatedAt\",\n          \"Chat\".\"name\" as \"pushName\",\n          \"Chat\".\"createdAt\" as \"windowStart\",\n          \"Chat\".\"createdAt\" + INTERVAL '24 hours' as \"windowExpires\",\n          \"Chat\".\"unreadMessages\" as \"unreadMessages\",\n          CASE WHEN \"Chat\".\"createdAt\" + INTERVAL '24 hours' > NOW() THEN true ELSE false END as \"windowActive\",\n          \"Message\".\"id\" AS \"lastMessageId\",\n          \"Message\".\"key\" AS \"lastMessage_key\",\n          CASE\n            WHEN \"Message\".\"key\"->>'fromMe' = 'true' THEN 'Você'\n            ELSE \"Message\".\"pushName\"\n          END AS \"lastMessagePushName\",\n          \"Message\".\"participant\" AS \"lastMessageParticipant\",\n          \"Message\".\"messageType\" AS \"lastMessageMessageType\",\n          \"Message\".\"message\" AS \"lastMessageMessage\",\n          \"Message\".\"contextInfo\" AS \"lastMessageContextInfo\",\n          \"Message\".\"source\" AS \"lastMessageSource\",\n          \"Message\".\"messageTimestamp\" AS \"lastMessageMessageTimestamp\",\n          \"Message\".\"instanceId\" AS \"lastMessageInstanceId\",\n          \"Message\".\"sessionId\" AS \"lastMessageSessionId\",\n          \"Message\".\"status\" AS \"lastMessageStatus\"\n        FROM \"Message\"\n        LEFT JOIN \"Contact\" ON \"Contact\".\"remoteJid\" = \"Message\".\"key\"->>'remoteJid' AND \"Contact\".\"instanceId\" = \"Message\".\"instanceId\"\n        LEFT JOIN \"Chat\" ON \"Chat\".\"remoteJid\" = \"Message\".\"key\"->>'remoteJid' AND \"Chat\".\"instanceId\" = \"Message\".\"instanceId\"\n        WHERE \"Message\".\"instanceId\" = ${this.instanceId}\n        ${remoteJid ? Prisma.sql`AND \"Message\".\"key\"->>'remoteJid' = ${remoteJid}` : Prisma.sql``}\n        ${timestampFilter}\n        ORDER BY \"Message\".\"key\"->>'remoteJid', \"Message\".\"messageTimestamp\" DESC\n      )\n      SELECT * FROM rankedMessages \n      ORDER BY \"updatedAt\" DESC NULLS LAST\n      ${limit}\n      ${offset};\n    `;\n\n    if (results && isArray(results) && results.length > 0) {\n      const mappedResults = results.map((contact) => {\n        const lastMessage = contact.lastMessageId\n          ? {\n              id: contact.lastMessageId,\n              key: contact.lastMessage_key,\n              pushName: contact.lastMessagePushName,\n              participant: contact.lastMessageParticipant,\n              messageType: contact.lastMessageMessageType,\n              message: contact.lastMessageMessage,\n              contextInfo: contact.lastMessageContextInfo,\n              source: contact.lastMessageSource,\n              messageTimestamp: contact.lastMessageMessageTimestamp,\n              instanceId: contact.lastMessageInstanceId,\n              sessionId: contact.lastMessageSessionId,\n              status: contact.lastMessageStatus,\n            }\n          : undefined;\n\n        return {\n          id: contact.contactId || null,\n          remoteJid: contact.remoteJid,\n          pushName: contact.pushName,\n          profilePicUrl: contact.profilePicUrl,\n          updatedAt: contact.updatedAt,\n          windowStart: contact.windowStart,\n          windowExpires: contact.windowExpires,\n          windowActive: contact.windowActive,\n          lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined,\n          unreadCount: contact.unreadMessages,\n          isSaved: !!contact.contactId,\n        };\n      });\n\n      return mappedResults;\n    }\n\n    return [];\n  }\n\n  public hasValidMediaContent(message: any): boolean {\n    if (!message?.message) return false;\n\n    const msg = message.message;\n\n    // Se só tem messageContextInfo, não é mídia válida\n    if (Object.keys(msg).length === 1 && Object.prototype.hasOwnProperty.call(msg, 'messageContextInfo')) {\n      return false;\n    }\n\n    // Verifica se tem pelo menos um tipo de mídia válido\n    const mediaTypes = [\n      'imageMessage',\n      'videoMessage',\n      'stickerMessage',\n      'documentMessage',\n      'documentWithCaptionMessage',\n      'ptvMessage',\n      'audioMessage',\n    ];\n\n    return mediaTypes.some((type) => msg[type] && Object.keys(msg[type]).length > 0);\n  }\n}\n","// Check if the number is MX or AR\nfunction formatMXOrARNumber(jid: string): string {\n  const countryCode = jid.substring(0, 2);\n\n  if (Number(countryCode) === 52 || Number(countryCode) === 54) {\n    if (jid.length === 13) {\n      const number = countryCode + jid.substring(3);\n      return number;\n    }\n\n    return jid;\n  }\n  return jid;\n}\n\n// Check if the number is br\nfunction formatBRNumber(jid: string) {\n  const regexp = new RegExp(/^(\\d{2})(\\d{2})\\d{1}(\\d{8})$/);\n  if (regexp.test(jid)) {\n    const match = regexp.exec(jid);\n    if (match && match[1] === '55') {\n      const joker = Number.parseInt(match[3][0]);\n      const ddd = Number.parseInt(match[2]);\n      if (joker < 7 || ddd < 31) {\n        return match[0];\n      }\n      return match[1] + match[2] + match[3];\n    }\n    return jid;\n  } else {\n    return jid;\n  }\n}\n\nexport function createJid(number: string): string {\n  number = number.replace(/:\\d+/, '');\n\n  if (number.includes('@g.us') || number.includes('@s.whatsapp.net') || number.includes('@lid')) {\n    return number;\n  }\n\n  if (number.includes('@broadcast')) {\n    return number;\n  }\n\n  number = number\n    ?.replace(/\\s/g, '')\n    .replace(/\\+/g, '')\n    .replace(/\\(/g, '')\n    .replace(/\\)/g, '')\n    .split(':')[0]\n    .split('@')[0];\n\n  if (number.includes('-') && number.length >= 24) {\n    number = number.replace(/[^\\d-]/g, '');\n    return `${number}@g.us`;\n  }\n\n  number = number.replace(/\\D/g, '');\n\n  if (number.length >= 18) {\n    number = number.replace(/[^\\d-]/g, '');\n    return `${number}@g.us`;\n  }\n\n  number = formatMXOrARNumber(number);\n\n  number = formatBRNumber(number);\n\n  return `${number}@s.whatsapp.net`;\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport {\n  MediaMessage,\n  Options,\n  SendAudioDto,\n  SendButtonsDto,\n  SendMediaDto,\n  SendTextDto,\n} from '@api/dto/sendMessage.dto';\nimport * as s3Service from '@api/integrations/storage/s3/libs/minio.server';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { chatbotController } from '@api/server.module';\nimport { CacheService } from '@api/services/cache.service';\nimport { ChannelStartupService } from '@api/services/channel.service';\nimport { Events, wa } from '@api/types/wa.types';\nimport { AudioConverter, Chatwoot, ConfigService, Openai, S3 } from '@config/env.config';\nimport { BadRequestException, InternalServerErrorException } from '@exceptions';\nimport { createJid } from '@utils/createJid';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\nimport { isBase64, isURL } from 'class-validator';\nimport EventEmitter2 from 'eventemitter2';\nimport FormData from 'form-data';\nimport mimeTypes from 'mime-types';\nimport { join } from 'path';\nimport { v4 } from 'uuid';\n\nexport class EvolutionStartupService extends ChannelStartupService {\n  constructor(\n    public readonly configService: ConfigService,\n    public readonly eventEmitter: EventEmitter2,\n    public readonly prismaRepository: PrismaRepository,\n    public readonly cache: CacheService,\n    public readonly chatwootCache: CacheService,\n  ) {\n    super(configService, eventEmitter, prismaRepository, chatwootCache);\n\n    this.client = null;\n  }\n\n  public client: any;\n\n  public stateConnection: wa.StateConnection = { state: 'open' };\n\n  public phoneNumber: string;\n  public mobile: boolean;\n\n  public get connectionStatus() {\n    return this.stateConnection;\n  }\n\n  public async closeClient() {\n    this.stateConnection = { state: 'close' };\n  }\n\n  public get qrCode(): wa.QrCode {\n    return {\n      pairingCode: this.instance.qrcode?.pairingCode,\n      code: this.instance.qrcode?.code,\n      base64: this.instance.qrcode?.base64,\n      count: this.instance.qrcode?.count,\n    };\n  }\n\n  public async logoutInstance() {\n    await this.closeClient();\n  }\n\n  public setInstance(instance: InstanceDto) {\n    this.logger.setInstance(instance.instanceId);\n\n    this.instance.name = instance.instanceName;\n    this.instance.id = instance.instanceId;\n    this.instance.integration = instance.integration;\n    this.instance.number = instance.number;\n    this.instance.token = instance.token;\n    this.instance.businessId = instance.businessId;\n\n    if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n      this.chatwootService.eventWhatsapp(\n        Events.STATUS_INSTANCE,\n        {\n          instanceName: this.instance.name,\n          instanceId: this.instance.id,\n          integration: instance.integration,\n        },\n        {\n          instance: this.instance.name,\n          status: 'created',\n        },\n      );\n    }\n  }\n\n  public async profilePicture(number: string) {\n    const jid = createJid(number);\n\n    return {\n      wuid: jid,\n      profilePictureUrl: null,\n    };\n  }\n\n  public async getProfileName() {\n    return null;\n  }\n\n  public async profilePictureUrl() {\n    return null;\n  }\n\n  public async getProfileStatus() {\n    return null;\n  }\n\n  public async connectToWhatsapp(data?: any): Promise<any> {\n    if (!data) {\n      this.loadChatwoot();\n      return;\n    }\n\n    try {\n      this.eventHandler(data);\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString());\n    }\n  }\n\n  protected async eventHandler(received: any) {\n    try {\n      let messageRaw: any;\n\n      if (received.message) {\n        const key = {\n          id: received.key.id || v4(),\n          remoteJid: received.key.remoteJid,\n          fromMe: received.key.fromMe,\n          profilePicUrl: received.profilePicUrl,\n        };\n        messageRaw = {\n          key,\n          pushName: received.pushName,\n          message: received.message,\n          messageType: received.messageType,\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n\n        const isAudio = received?.message?.audioMessage;\n\n        if (this.configService.get<Openai>('OPENAI').ENABLED && isAudio) {\n          const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({\n            where: {\n              instanceId: this.instanceId,\n            },\n            include: {\n              OpenaiCreds: true,\n            },\n          });\n\n          if (\n            openAiDefaultSettings &&\n            openAiDefaultSettings.openaiCredsId &&\n            openAiDefaultSettings.speechToText &&\n            received?.message?.audioMessage\n          ) {\n            messageRaw.message.speechToText = `[audio] ${await this.openaiService.speechToText(received, this)}`;\n          }\n        }\n\n        this.logger.log(messageRaw);\n\n        sendTelemetry(`received.message.${messageRaw.messageType ?? 'unknown'}`);\n\n        this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);\n\n        await chatbotController.emit({\n          instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n          remoteJid: messageRaw.key.remoteJid,\n          msg: messageRaw,\n          pushName: messageRaw.pushName,\n        });\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n          const chatwootSentMessage = await this.chatwootService.eventWhatsapp(\n            Events.MESSAGES_UPSERT,\n            { instanceName: this.instance.name, instanceId: this.instanceId },\n            messageRaw,\n          );\n\n          if (chatwootSentMessage?.id) {\n            messageRaw.chatwootMessageId = chatwootSentMessage.id;\n            messageRaw.chatwootInboxId = chatwootSentMessage.id;\n            messageRaw.chatwootConversationId = chatwootSentMessage.id;\n          }\n        }\n\n        await this.prismaRepository.message.create({\n          data: messageRaw,\n        });\n\n        await this.updateContact({\n          remoteJid: messageRaw.key.remoteJid,\n          pushName: messageRaw.pushName,\n          profilePicUrl: received.profilePicUrl,\n        });\n      }\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  private async updateContact(data: { remoteJid: string; pushName?: string; profilePicUrl?: string }) {\n    const contactRaw: any = {\n      remoteJid: data.remoteJid,\n      pushName: data?.pushName,\n      instanceId: this.instanceId,\n      profilePicUrl: data?.profilePicUrl,\n    };\n\n    const existingContact = await this.prismaRepository.contact.findFirst({\n      where: {\n        remoteJid: data.remoteJid,\n        instanceId: this.instanceId,\n      },\n    });\n\n    if (existingContact) {\n      await this.prismaRepository.contact.updateMany({\n        where: {\n          remoteJid: data.remoteJid,\n          instanceId: this.instanceId,\n        },\n        data: contactRaw,\n      });\n    } else {\n      await this.prismaRepository.contact.create({\n        data: contactRaw,\n      });\n    }\n\n    this.sendDataWebhook(Events.CONTACTS_UPSERT, contactRaw);\n\n    if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n      await this.chatwootService.eventWhatsapp(\n        Events.CONTACTS_UPDATE,\n        {\n          instanceName: this.instance.name,\n          instanceId: this.instanceId,\n          integration: this.instance.integration,\n        },\n        contactRaw,\n      );\n    }\n\n    const chat = await this.prismaRepository.chat.findFirst({\n      where: { instanceId: this.instanceId, remoteJid: data.remoteJid },\n    });\n\n    if (chat) {\n      const chatRaw: any = {\n        remoteJid: data.remoteJid,\n        instanceId: this.instanceId,\n      };\n\n      this.sendDataWebhook(Events.CHATS_UPDATE, chatRaw);\n\n      await this.prismaRepository.chat.updateMany({\n        where: { remoteJid: chat.remoteJid },\n        data: chatRaw,\n      });\n    }\n\n    const chatRaw: any = {\n      remoteJid: data.remoteJid,\n      instanceId: this.instanceId,\n    };\n\n    this.sendDataWebhook(Events.CHATS_UPSERT, chatRaw);\n\n    await this.prismaRepository.chat.create({\n      data: chatRaw,\n    });\n  }\n\n  protected async sendMessageWithTyping(\n    number: string,\n    message: any,\n    options?: Options,\n    file?: any,\n    isIntegration = false,\n  ) {\n    try {\n      let quoted: any;\n      let webhookUrl: any;\n\n      if (options?.quoted) {\n        const m = options?.quoted;\n\n        const msg = m?.key;\n\n        if (!msg) {\n          throw 'Message not found';\n        }\n\n        quoted = msg;\n      }\n\n      if (options.delay) {\n        await new Promise((resolve) => setTimeout(resolve, options.delay));\n      }\n\n      if (options?.webhookUrl) {\n        webhookUrl = options.webhookUrl;\n      }\n\n      let audioFile;\n\n      const messageId = v4();\n\n      let messageRaw: any;\n\n      if (message?.mediaType === 'image') {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            base64: isBase64(message.media) ? message.media : null,\n            mediaUrl: isURL(message.media) ? message.media : null,\n            quoted,\n          },\n          messageType: 'imageMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      } else if (message?.mediaType === 'video') {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            base64: isBase64(message.media) ? message.media : null,\n            mediaUrl: isURL(message.media) ? message.media : null,\n            quoted,\n          },\n          messageType: 'videoMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      } else if (message?.mediaType === 'audio') {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            base64: isBase64(message.media) ? message.media : null,\n            mediaUrl: isURL(message.media) ? message.media : null,\n            quoted,\n          },\n          messageType: 'audioMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n\n        const buffer = Buffer.from(message.media, 'base64');\n        audioFile = {\n          buffer,\n          mimetype: 'audio/mp4',\n          originalname: `${messageId}.mp4`,\n        };\n      } else if (message?.mediaType === 'document') {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            base64: isBase64(message.media) ? message.media : null,\n            mediaUrl: isURL(message.media) ? message.media : null,\n            quoted,\n          },\n          messageType: 'documentMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      } else if (message.buttonMessage) {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            ...message.buttonMessage,\n            buttons: message.buttonMessage.buttons,\n            footer: message.buttonMessage.footer,\n            body: message.buttonMessage.body,\n            quoted,\n          },\n          messageType: 'buttonMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      } else if (message.listMessage) {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            ...message.listMessage,\n            quoted,\n          },\n          messageType: 'listMessage',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      } else {\n        messageRaw = {\n          key: { fromMe: true, id: messageId, remoteJid: number },\n          message: {\n            ...message,\n            quoted,\n          },\n          messageType: 'conversation',\n          messageTimestamp: Math.round(new Date().getTime() / 1000),\n          webhookUrl,\n          source: 'unknown',\n          instanceId: this.instanceId,\n        };\n      }\n\n      if (messageRaw.message.contextInfo) {\n        messageRaw.contextInfo = {\n          ...messageRaw.message.contextInfo,\n        };\n      }\n\n      if (messageRaw.contextInfo?.stanzaId) {\n        const key: any = {\n          id: messageRaw.contextInfo.stanzaId,\n        };\n\n        const findMessage = await this.prismaRepository.message.findFirst({\n          where: {\n            instanceId: this.instanceId,\n            key,\n          },\n        });\n\n        if (findMessage) {\n          messageRaw.contextInfo.quotedMessage = findMessage.message;\n        }\n      }\n\n      const { base64 } = messageRaw.message;\n      delete messageRaw.message.base64;\n\n      if (base64 || file || audioFile) {\n        if (this.configService.get<S3>('S3').ENABLE) {\n          try {\n            // Verificação adicional para garantir que há conteúdo de mídia real\n            const hasRealMedia = this.hasValidMediaContent(messageRaw);\n\n            if (!hasRealMedia) {\n              this.logger.warn('Message detected as media but contains no valid media content');\n            } else {\n              const fileBuffer = audioFile?.buffer || file?.buffer;\n              const buffer = base64 ? Buffer.from(base64, 'base64') : fileBuffer;\n\n              let mediaType: string;\n              let mimetype = audioFile?.mimetype || file.mimetype;\n\n              if (messageRaw.messageType === 'documentMessage') {\n                mediaType = 'document';\n                mimetype = !mimetype ? 'application/pdf' : mimetype;\n              } else if (messageRaw.messageType === 'imageMessage') {\n                mediaType = 'image';\n                mimetype = !mimetype ? 'image/png' : mimetype;\n              } else if (messageRaw.messageType === 'audioMessage') {\n                mediaType = 'audio';\n                mimetype = !mimetype ? 'audio/mp4' : mimetype;\n              } else if (messageRaw.messageType === 'videoMessage') {\n                mediaType = 'video';\n                mimetype = !mimetype ? 'video/mp4' : mimetype;\n              }\n\n              const fileName = `${messageRaw.key.id}.${mimetype.split('/')[1]}`;\n\n              const size = buffer.byteLength;\n\n              const fullName = join(`${this.instance.id}`, messageRaw.key.remoteJid, mediaType, fileName);\n\n              await s3Service.uploadFile(fullName, buffer, size, {\n                'Content-Type': mimetype,\n              });\n\n              const mediaUrl = await s3Service.getObjectUrl(fullName);\n\n              messageRaw.message.mediaUrl = mediaUrl;\n            }\n          } catch (error) {\n            this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);\n          }\n        }\n      }\n\n      this.logger.log(messageRaw);\n\n      this.sendDataWebhook(Events.SEND_MESSAGE, messageRaw);\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && !isIntegration) {\n        this.chatwootService.eventWhatsapp(\n          Events.SEND_MESSAGE,\n          { instanceName: this.instance.name, instanceId: this.instanceId },\n          messageRaw,\n        );\n      }\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && isIntegration)\n        await chatbotController.emit({\n          instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n          remoteJid: messageRaw.key.remoteJid,\n          msg: messageRaw,\n          pushName: messageRaw.pushName,\n        });\n\n      await this.prismaRepository.message.create({\n        data: messageRaw,\n      });\n\n      return messageRaw;\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  public async textMessage(data: SendTextDto, isIntegration = false) {\n    const res = await this.sendMessageWithTyping(\n      data.number,\n      {\n        conversation: data.text,\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      null,\n      isIntegration,\n    );\n    return res;\n  }\n\n  protected async prepareMediaMessage(mediaMessage: MediaMessage) {\n    try {\n      if (mediaMessage.mediatype === 'document' && !mediaMessage.fileName) {\n        const regex = new RegExp(/.*\\/(.+?)\\./);\n        const arrayMatch = regex.exec(mediaMessage.media);\n        mediaMessage.fileName = arrayMatch[1];\n      }\n\n      if (mediaMessage.mediatype === 'image' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'image.png';\n      }\n\n      if (mediaMessage.mediatype === 'video' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'video.mp4';\n      }\n\n      let mimetype: string | false;\n\n      const prepareMedia: any = {\n        caption: mediaMessage?.caption,\n        fileName: mediaMessage.fileName,\n        mediaType: mediaMessage.mediatype,\n        media: mediaMessage.media,\n        gifPlayback: false,\n      };\n\n      if (isURL(mediaMessage.media)) {\n        mimetype = mimeTypes.lookup(mediaMessage.media);\n      } else {\n        mimetype = mimeTypes.lookup(mediaMessage.fileName);\n      }\n\n      prepareMedia.mimetype = mimetype;\n\n      return prepareMedia;\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString() || error);\n    }\n  }\n\n  public async mediaMessage(data: SendMediaDto, file?: any, isIntegration = false) {\n    const mediaData: SendMediaDto = { ...data };\n\n    if (file) mediaData.media = file.buffer.toString('base64');\n\n    const message = await this.prepareMediaMessage(mediaData);\n\n    const mediaSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      file,\n      isIntegration,\n    );\n\n    return mediaSent;\n  }\n\n  public async processAudio(audio: string, number: string, file: any) {\n    number = number.replace(/\\D/g, '');\n    const hash = `${number}-${new Date().getTime()}`;\n\n    const audioConverterConfig = this.configService.get<AudioConverter>('AUDIO_CONVERTER');\n    if (audioConverterConfig.API_URL) {\n      try {\n        this.logger.verbose('Using audio converter API');\n        const formData = new FormData();\n\n        if (file) {\n          formData.append('file', file.buffer, {\n            filename: file.originalname,\n            contentType: file.mimetype,\n          });\n        } else if (isURL(audio)) {\n          formData.append('url', audio);\n        } else {\n          formData.append('base64', audio);\n        }\n\n        formData.append('format', 'mp4');\n\n        const response = await axios.post(audioConverterConfig.API_URL, formData, {\n          headers: {\n            ...formData.getHeaders(),\n            apikey: audioConverterConfig.API_KEY,\n          },\n        });\n\n        if (!response?.data?.audio) {\n          throw new InternalServerErrorException('Failed to convert audio');\n        }\n\n        const prepareMedia: any = {\n          fileName: `${hash}.mp4`,\n          mediaType: 'audio',\n          media: response?.data?.audio,\n          mimetype: 'audio/mpeg',\n        };\n\n        return prepareMedia;\n      } catch (error) {\n        this.logger.error(error?.response?.data || error);\n        throw new InternalServerErrorException(error?.response?.data?.message || error?.toString() || error);\n      }\n    } else {\n      let mimetype: string;\n\n      const prepareMedia: any = {\n        fileName: `${hash}.mp3`,\n        mediaType: 'audio',\n        media: audio,\n        mimetype: 'audio/mpeg',\n      };\n\n      if (isURL(audio)) {\n        mimetype = mimeTypes.lookup(audio).toString();\n      } else {\n        mimetype = mimeTypes.lookup(prepareMedia.fileName).toString();\n      }\n\n      prepareMedia.mimetype = mimetype;\n\n      return prepareMedia;\n    }\n  }\n\n  public async audioWhatsapp(data: SendAudioDto, file?: any, isIntegration = false) {\n    const mediaData: SendAudioDto = { ...data };\n\n    if (file?.buffer) {\n      mediaData.audio = file.buffer.toString('base64');\n    } else {\n      console.error('El archivo o buffer no est� definido correctamente.');\n      throw new Error('File or buffer is undefined.');\n    }\n\n    const message = await this.processAudio(mediaData.audio, data.number, file);\n\n    const audioSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      file,\n      isIntegration,\n    );\n\n    return audioSent;\n  }\n\n  public async buttonMessage(data: SendButtonsDto, isIntegration = false) {\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        buttonMessage: {\n          title: data.title,\n          description: data.description,\n          footer: data.footer,\n          buttons: data.buttons,\n        },\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      null,\n      isIntegration,\n    );\n  }\n  public async locationMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async listMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async templateMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async contactMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async reactionMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async getBase64FromMediaMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async deleteMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async mediaSticker() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async pollMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async statusMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async reloadConnection() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async whatsappNumber() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async markMessageAsRead() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async archiveChat() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async markChatUnread() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fetchProfile() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async offerCall() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async sendPresence() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async setPresence() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fetchPrivacySettings() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updatePrivacySettings() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fetchBusinessProfile() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateProfileName() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateProfileStatus() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateProfilePicture() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async removeProfilePicture() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async blockUser() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateMessage() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async createGroup() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateGroupPicture() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateGroupSubject() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateGroupDescription() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async findGroup() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fetchAllGroups() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async inviteCode() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async inviteInfo() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async sendInvite() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async acceptInviteCode() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async revokeInviteCode() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async findParticipants() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateGParticipant() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async updateGSetting() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async toggleEphemeral() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async leaveGroup() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fetchLabels() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async handleLabel() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async receiveMobileCode() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n  public async fakeCall() {\n    throw new BadRequestException('Method not available on Evolution Channel');\n  }\n}\n","import { wa } from '@api/types/wa.types';\n\nexport const status: Record<number, wa.StatusMessage> = {\n  0: 'ERROR',\n  1: 'PENDING',\n  2: 'SERVER_ACK',\n  3: 'DELIVERY_ACK',\n  4: 'READ',\n  5: 'PLAYED',\n};\n","import { NumberBusiness } from '@api/dto/chat.dto';\nimport {\n  ContactMessage,\n  MediaMessage,\n  Options,\n  SendAudioDto,\n  SendButtonsDto,\n  SendContactDto,\n  SendListDto,\n  SendLocationDto,\n  SendMediaDto,\n  SendReactionDto,\n  SendTemplateDto,\n  SendTextDto,\n} from '@api/dto/sendMessage.dto';\nimport * as s3Service from '@api/integrations/storage/s3/libs/minio.server';\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { chatbotController } from '@api/server.module';\nimport { CacheService } from '@api/services/cache.service';\nimport { ChannelStartupService } from '@api/services/channel.service';\nimport { Events, wa } from '@api/types/wa.types';\nimport { AudioConverter, Chatwoot, ConfigService, Database, Openai, S3, WaBusiness } from '@config/env.config';\nimport { BadRequestException, InternalServerErrorException } from '@exceptions';\nimport { createJid } from '@utils/createJid';\nimport { status } from '@utils/renderStatus';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\nimport { arrayUnique, isURL } from 'class-validator';\nimport EventEmitter2 from 'eventemitter2';\nimport FormData from 'form-data';\nimport mimeTypes from 'mime-types';\nimport { join } from 'path';\n\nexport class BusinessStartupService extends ChannelStartupService {\n  constructor(\n    public readonly configService: ConfigService,\n    public readonly eventEmitter: EventEmitter2,\n    public readonly prismaRepository: PrismaRepository,\n    public readonly cache: CacheService,\n    public readonly chatwootCache: CacheService,\n    public readonly baileysCache: CacheService,\n    private readonly providerFiles: ProviderFiles,\n  ) {\n    super(configService, eventEmitter, prismaRepository, chatwootCache);\n  }\n\n  public stateConnection: wa.StateConnection = { state: 'open' };\n\n  public phoneNumber: string;\n  public mobile: boolean;\n\n  public get connectionStatus() {\n    return this.stateConnection;\n  }\n\n  public async closeClient() {\n    this.stateConnection = { state: 'close' };\n  }\n\n  public get qrCode(): wa.QrCode {\n    return {\n      pairingCode: this.instance.qrcode?.pairingCode,\n      code: this.instance.qrcode?.code,\n      base64: this.instance.qrcode?.base64,\n      count: this.instance.qrcode?.count,\n    };\n  }\n\n  public async logoutInstance() {\n    await this.closeClient();\n  }\n\n  private isMediaMessage(message: any) {\n    return message.document || message.image || message.audio || message.video;\n  }\n\n  private async post(message: any, params: string) {\n    try {\n      let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n      const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n      urlServer = `${urlServer}/${version}/${this.number}/${params}`;\n      const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` };\n      const result = await axios.post(urlServer, message, { headers });\n      return result.data;\n    } catch (e) {\n      return e.response?.data?.error;\n    }\n  }\n\n  public async profilePicture(number: string) {\n    const jid = createJid(number);\n\n    return {\n      wuid: jid,\n      profilePictureUrl: null,\n    };\n  }\n\n  public async getProfileName() {\n    return null;\n  }\n\n  public async profilePictureUrl() {\n    return null;\n  }\n\n  public async getProfileStatus() {\n    return null;\n  }\n\n  public async setWhatsappBusinessProfile(data: NumberBusiness): Promise<any> {\n    const content = {\n      messaging_product: 'whatsapp',\n      about: data.about,\n      address: data.address,\n      description: data.description,\n      vertical: data.vertical,\n      email: data.email,\n      websites: data.websites,\n      profile_picture_handle: data.profilehandle,\n    };\n    return await this.post(content, 'whatsapp_business_profile');\n  }\n\n  public async connectToWhatsapp(data?: any): Promise<any> {\n    if (!data) return;\n\n    const content = data.entry[0].changes[0].value;\n\n    try {\n      this.loadChatwoot();\n\n      this.eventHandler(content);\n\n      this.phoneNumber = createJid(content.messages ? content.messages[0].from : content.statuses[0]?.recipient_id);\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString());\n    }\n  }\n\n  private async downloadMediaMessage(message: any) {\n    try {\n      const id = message[message.type].id;\n      let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n      const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n      urlServer = `${urlServer}/${version}/${id}`;\n      const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` };\n\n      // Primeiro, obtenha a URL do arquivo\n      let result = await axios.get(urlServer, { headers });\n\n      // Depois, baixe o arquivo usando a URL retornada\n      result = await axios.get(result.data.url, {\n        headers: { Authorization: `Bearer ${this.token}` }, // Use apenas o token de autorização para download\n        responseType: 'arraybuffer',\n      });\n\n      return result.data;\n    } catch (e) {\n      this.logger.error(`Error downloading media: ${e}`);\n      throw e;\n    }\n  }\n\n  private messageMediaJson(received: any) {\n    const message = received.messages[0];\n    let content: any = message.type + 'Message';\n    content = { [content]: message[message.type] };\n    if (message.context) {\n      content = { ...content, contextInfo: { stanzaId: message.context.id } };\n    }\n    return content;\n  }\n\n  private messageAudioJson(received: any) {\n    const message = received.messages[0];\n    let content: any = {\n      audioMessage: {\n        ...message.audio,\n        ptt: message.audio.voice || false, // Define se é mensagem de voz\n      },\n    };\n    if (message.context) {\n      content = { ...content, contextInfo: { stanzaId: message.context.id } };\n    }\n    return content;\n  }\n\n  private messageInteractiveJson(received: any) {\n    const message = received.messages[0];\n    let content: any = { conversation: message.interactive[message.interactive.type].title };\n    message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;\n    return content;\n  }\n\n  private messageButtonJson(received: any) {\n    const message = received.messages[0];\n    let content: any = { conversation: received.messages[0].button?.text };\n    message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;\n    return content;\n  }\n\n  private messageReactionJson(received: any) {\n    const message = received.messages[0];\n    let content: any = {\n      reactionMessage: {\n        key: {\n          id: message.reaction.message_id,\n        },\n        text: message.reaction.emoji,\n      },\n    };\n    message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;\n    return content;\n  }\n\n  private messageTextJson(received: any) {\n    // Verificar que received y received.messages existen\n    if (!received || !received.messages || received.messages.length === 0) {\n      this.logger.error('Error: received object or messages array is undefined or empty');\n      return null;\n    }\n\n    const message = received.messages[0];\n    let content: any;\n\n    // Verificar si es un mensaje de tipo sticker, location u otro tipo que no tiene text\n    if (!message.text) {\n      // Si no hay texto, manejamos diferente según el tipo de mensaje\n      if (message.type === 'sticker') {\n        content = { stickerMessage: {} };\n      } else if (message.type === 'location') {\n        content = {\n          locationMessage: {\n            degreesLatitude: message.location?.latitude,\n            degreesLongitude: message.location?.longitude,\n            name: message.location?.name,\n            address: message.location?.address,\n          },\n        };\n      } else {\n        // Para otros tipos de mensajes sin texto, creamos un contenido genérico\n        this.logger.log(`Mensaje de tipo ${message.type} sin campo text`);\n        content = { [message.type + 'Message']: message[message.type] || {} };\n      }\n\n      // Añadir contexto si existe\n      if (message.context) {\n        content = { ...content, contextInfo: { stanzaId: message.context.id } };\n      }\n\n      return content;\n    }\n\n    // Si el mensaje tiene texto, procesamos normalmente\n    if (!received.metadata || !received.metadata.phone_number_id) {\n      this.logger.error('Error: metadata or phone_number_id is undefined');\n      return null;\n    }\n\n    if (message.from === received.metadata.phone_number_id) {\n      content = {\n        extendedTextMessage: { text: message.text.body },\n      };\n      if (message.context) {\n        content = { ...content, contextInfo: { stanzaId: message.context.id } };\n      }\n    } else {\n      content = { conversation: message.text.body };\n      if (message.context) {\n        content = { ...content, contextInfo: { stanzaId: message.context.id } };\n      }\n    }\n\n    return content;\n  }\n\n  private messageLocationJson(received: any) {\n    const message = received.messages[0];\n    let content: any = {\n      locationMessage: {\n        degreesLatitude: message.location.latitude,\n        degreesLongitude: message.location.longitude,\n        name: message.location?.name,\n        address: message.location?.address,\n      },\n    };\n    message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;\n    return content;\n  }\n\n  private messageContactsJson(received: any) {\n    const message = received.messages[0];\n    let content: any = {};\n\n    const vcard = (contact: any) => {\n      let result =\n        'BEGIN:VCARD\\n' +\n        'VERSION:3.0\\n' +\n        `N:${contact.name.formatted_name}\\n` +\n        `FN:${contact.name.formatted_name}\\n`;\n\n      if (contact.org) {\n        result += `ORG:${contact.org.company};\\n`;\n      }\n\n      if (contact.emails) {\n        result += `EMAIL:${contact.emails[0].email}\\n`;\n      }\n\n      if (contact.urls) {\n        result += `URL:${contact.urls[0].url}\\n`;\n      }\n\n      if (!contact.phones[0]?.wa_id) {\n        contact.phones[0].wa_id = createJid(contact.phones[0].phone);\n      }\n\n      result +=\n        `item1.TEL;waid=${contact.phones[0]?.wa_id}:${contact.phones[0].phone}\\n` +\n        'item1.X-ABLabel:Celular\\n' +\n        'END:VCARD';\n\n      return result;\n    };\n\n    if (message.contacts.length === 1) {\n      content.contactMessage = {\n        displayName: message.contacts[0].name.formatted_name,\n        vcard: vcard(message.contacts[0]),\n      };\n    } else {\n      content.contactsArrayMessage = {\n        displayName: `${message.length} contacts`,\n        contacts: message.map((contact) => {\n          return {\n            displayName: contact.name.formatted_name,\n            vcard: vcard(contact),\n          };\n        }),\n      };\n    }\n    message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;\n    return content;\n  }\n\n  private renderMessageType(type: string) {\n    let messageType: string;\n\n    switch (type) {\n      case 'text':\n        messageType = 'conversation';\n        break;\n      case 'image':\n        messageType = 'imageMessage';\n        break;\n      case 'video':\n        messageType = 'videoMessage';\n        break;\n      case 'audio':\n        messageType = 'audioMessage';\n        break;\n      case 'document':\n        messageType = 'documentMessage';\n        break;\n      case 'template':\n        messageType = 'conversation';\n        break;\n      case 'location':\n        messageType = 'locationMessage';\n        break;\n      case 'sticker':\n        messageType = 'stickerMessage';\n        break;\n      default:\n        messageType = 'conversation';\n        break;\n    }\n\n    return messageType;\n  }\n\n  protected async messageHandle(received: any, database: Database, settings: any) {\n    try {\n      let messageRaw: any;\n      let pushName: any;\n\n      if (received.contacts) pushName = received.contacts[0].profile.name;\n\n      if (received.messages) {\n        const message = received.messages[0]; // Añadir esta línea para definir message\n\n        const key = {\n          id: message.id,\n          remoteJid: this.phoneNumber,\n          fromMe: message.from === received.metadata.phone_number_id,\n        };\n\n        if (message.type === 'sticker') {\n          this.logger.log('Procesando mensaje de tipo sticker');\n          messageRaw = {\n            key,\n            pushName,\n            message: {\n              stickerMessage: message.sticker || {},\n            },\n            messageType: 'stickerMessage',\n            messageTimestamp: parseInt(message.timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        } else if (this.isMediaMessage(message)) {\n          const messageContent =\n            message.type === 'audio' ? this.messageAudioJson(received) : this.messageMediaJson(received);\n\n          messageRaw = {\n            key,\n            pushName,\n            message: messageContent,\n            contextInfo: messageContent?.contextInfo,\n            messageType: this.renderMessageType(received.messages[0].type),\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n\n          if (this.configService.get<S3>('S3').ENABLE) {\n            try {\n              const message: any = received;\n\n              // Verificação adicional para garantir que há conteúdo de mídia real\n              const hasRealMedia = this.hasValidMediaContent(messageRaw);\n\n              if (!hasRealMedia) {\n                this.logger.warn('Message detected as media but contains no valid media content');\n              } else {\n                const id = message.messages[0][message.messages[0].type].id;\n                let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n                const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n                urlServer = `${urlServer}/${version}/${id}`;\n                const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` };\n                const result = await axios.get(urlServer, { headers });\n\n                const buffer = await axios.get(result.data.url, {\n                  headers: { Authorization: `Bearer ${this.token}` }, // Use apenas o token de autorização para download\n                  responseType: 'arraybuffer',\n                });\n\n                let mediaType;\n\n                if (message.messages[0].document) {\n                  mediaType = 'document';\n                } else if (message.messages[0].image) {\n                  mediaType = 'image';\n                } else if (message.messages[0].audio) {\n                  mediaType = 'audio';\n                } else {\n                  mediaType = 'video';\n                }\n\n                if (mediaType == 'video' && !this.configService.get<S3>('S3').SAVE_VIDEO) {\n                  this.logger?.info?.('Video upload attempted but is disabled by configuration.');\n                  return {\n                    success: false,\n                    message:\n                      'Video upload is currently disabled. Please contact support if you need this feature enabled.',\n                  };\n                }\n\n                const mimetype = result.data?.mime_type || result.headers['content-type'];\n\n                const contentDisposition = result.headers['content-disposition'];\n                let fileName = `${message.messages[0].id}.${mimetype.split('/')[1]}`;\n                if (contentDisposition) {\n                  const match = contentDisposition.match(/filename=\"(.+?)\"/);\n                  if (match) {\n                    fileName = match[1];\n                  }\n                }\n\n                // Para áudio, garantir extensão correta baseada no mimetype\n                if (mediaType === 'audio') {\n                  if (mimetype.includes('ogg')) {\n                    fileName = `${message.messages[0].id}.ogg`;\n                  } else if (mimetype.includes('mp3')) {\n                    fileName = `${message.messages[0].id}.mp3`;\n                  } else if (mimetype.includes('m4a')) {\n                    fileName = `${message.messages[0].id}.m4a`;\n                  }\n                }\n\n                const size = result.headers['content-length'] || buffer.data.byteLength;\n\n                const fullName = join(`${this.instance.id}`, key.remoteJid, mediaType, fileName);\n\n                await s3Service.uploadFile(fullName, buffer.data, size, {\n                  'Content-Type': mimetype,\n                });\n\n                const createdMessage = await this.prismaRepository.message.create({\n                  data: messageRaw,\n                });\n\n                await this.prismaRepository.media.create({\n                  data: {\n                    messageId: createdMessage.id,\n                    instanceId: this.instanceId,\n                    type: mediaType,\n                    fileName: fullName,\n                    mimetype,\n                  },\n                });\n\n                const mediaUrl = await s3Service.getObjectUrl(fullName);\n\n                messageRaw.message.mediaUrl = mediaUrl;\n                if (this.localWebhook.enabled && this.localWebhook.webhookBase64) {\n                  messageRaw.message.base64 = buffer.data.toString('base64');\n                }\n\n                // Processar OpenAI speech-to-text para áudio após o mediaUrl estar disponível\n                if (this.configService.get<Openai>('OPENAI').ENABLED && mediaType === 'audio') {\n                  const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({\n                    where: {\n                      instanceId: this.instanceId,\n                    },\n                    include: {\n                      OpenaiCreds: true,\n                    },\n                  });\n\n                  if (\n                    openAiDefaultSettings &&\n                    openAiDefaultSettings.openaiCredsId &&\n                    openAiDefaultSettings.speechToText\n                  ) {\n                    try {\n                      messageRaw.message.speechToText = `[audio] ${await this.openaiService.speechToText(\n                        openAiDefaultSettings.OpenaiCreds,\n                        {\n                          message: {\n                            mediaUrl: messageRaw.message.mediaUrl,\n                            ...messageRaw,\n                          },\n                        },\n                      )}`;\n                    } catch (speechError) {\n                      this.logger.error(`Error processing speech-to-text: ${speechError}`);\n                    }\n                  }\n                }\n              }\n            } catch (error) {\n              this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);\n            }\n          } else {\n            if (this.localWebhook.enabled && this.localWebhook.webhookBase64) {\n              const buffer = await this.downloadMediaMessage(received?.messages[0]);\n              messageRaw.message.base64 = buffer.toString('base64');\n            }\n\n            // Processar OpenAI speech-to-text para áudio mesmo sem S3\n            if (this.configService.get<Openai>('OPENAI').ENABLED && message.type === 'audio') {\n              let openAiBase64 = messageRaw.message.base64;\n              if (!openAiBase64) {\n                const buffer = await this.downloadMediaMessage(received?.messages[0]);\n                openAiBase64 = buffer.toString('base64');\n              }\n\n              const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({\n                where: {\n                  instanceId: this.instanceId,\n                },\n                include: {\n                  OpenaiCreds: true,\n                },\n              });\n\n              if (openAiDefaultSettings && openAiDefaultSettings.openaiCredsId && openAiDefaultSettings.speechToText) {\n                try {\n                  messageRaw.message.speechToText = `[audio] ${await this.openaiService.speechToText(\n                    openAiDefaultSettings.OpenaiCreds,\n                    {\n                      message: {\n                        base64: openAiBase64,\n                        ...messageRaw,\n                      },\n                    },\n                  )}`;\n                } catch (speechError) {\n                  this.logger.error(`Error processing speech-to-text: ${speechError}`);\n                }\n              }\n            }\n          }\n        } else if (received?.messages[0].interactive) {\n          messageRaw = {\n            key,\n            pushName,\n            message: {\n              ...this.messageInteractiveJson(received),\n            },\n            contextInfo: this.messageInteractiveJson(received)?.contextInfo,\n            messageType: 'interactiveMessage',\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        } else if (received?.messages[0].button) {\n          messageRaw = {\n            key,\n            pushName,\n            message: {\n              ...this.messageButtonJson(received),\n            },\n            contextInfo: this.messageButtonJson(received)?.contextInfo,\n            messageType: 'buttonMessage',\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        } else if (received?.messages[0].reaction) {\n          messageRaw = {\n            key,\n            pushName,\n            message: {\n              ...this.messageReactionJson(received),\n            },\n            contextInfo: this.messageReactionJson(received)?.contextInfo,\n            messageType: 'reactionMessage',\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        } else if (received?.messages[0].contacts) {\n          messageRaw = {\n            key,\n            pushName,\n            message: {\n              ...this.messageContactsJson(received),\n            },\n            contextInfo: this.messageContactsJson(received)?.contextInfo,\n            messageType: 'contactMessage',\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        } else {\n          messageRaw = {\n            key,\n            pushName,\n            message: this.messageTextJson(received),\n            contextInfo: this.messageTextJson(received)?.contextInfo,\n            messageType: this.renderMessageType(received.messages[0].type),\n            messageTimestamp: parseInt(received.messages[0].timestamp) as number,\n            source: 'unknown',\n            instanceId: this.instanceId,\n          };\n        }\n\n        if (this.localSettings.readMessages) {\n          // await this.client.readMessages([received.key]);\n        }\n\n        this.logger.log(messageRaw);\n\n        sendTelemetry(`received.message.${messageRaw.messageType ?? 'unknown'}`);\n\n        this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);\n\n        await chatbotController.emit({\n          instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n          remoteJid: messageRaw.key.remoteJid,\n          msg: messageRaw,\n          pushName: messageRaw.pushName,\n        });\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n          const chatwootSentMessage = await this.chatwootService.eventWhatsapp(\n            Events.MESSAGES_UPSERT,\n            { instanceName: this.instance.name, instanceId: this.instanceId },\n            messageRaw,\n          );\n\n          if (chatwootSentMessage?.id) {\n            messageRaw.chatwootMessageId = chatwootSentMessage.id;\n            messageRaw.chatwootInboxId = chatwootSentMessage.id;\n            messageRaw.chatwootConversationId = chatwootSentMessage.id;\n          }\n        }\n\n        if (!this.isMediaMessage(message) && message.type !== 'sticker') {\n          await this.prismaRepository.message.create({\n            data: messageRaw,\n          });\n        }\n\n        const contact = await this.prismaRepository.contact.findFirst({\n          where: { instanceId: this.instanceId, remoteJid: key.remoteJid },\n        });\n\n        const contactRaw: any = {\n          remoteJid: received.contacts[0].profile.phone,\n          pushName,\n          // profilePicUrl: '',\n          instanceId: this.instanceId,\n        };\n\n        if (contactRaw.remoteJid === 'status@broadcast') {\n          return;\n        }\n\n        if (contact) {\n          const contactRaw: any = {\n            remoteJid: received.contacts[0].profile.phone,\n            pushName,\n            // profilePicUrl: '',\n            instanceId: this.instanceId,\n          };\n\n          this.sendDataWebhook(Events.CONTACTS_UPDATE, contactRaw);\n\n          if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n            await this.chatwootService.eventWhatsapp(\n              Events.CONTACTS_UPDATE,\n              { instanceName: this.instance.name, instanceId: this.instanceId },\n              contactRaw,\n            );\n          }\n\n          await this.prismaRepository.contact.updateMany({\n            where: { remoteJid: contact.remoteJid },\n            data: contactRaw,\n          });\n          return;\n        }\n\n        this.sendDataWebhook(Events.CONTACTS_UPSERT, contactRaw);\n\n        this.prismaRepository.contact.create({\n          data: contactRaw,\n        });\n      }\n      if (received.statuses) {\n        for await (const item of received.statuses) {\n          const key = {\n            id: item.id,\n            remoteJid: this.phoneNumber,\n            fromMe: this.phoneNumber === received.metadata.phone_number_id,\n          };\n          if (settings?.groups_ignore && key.remoteJid.includes('@g.us')) {\n            return;\n          }\n          if (key.remoteJid !== 'status@broadcast' && !key?.remoteJid?.match(/(:\\d+)/)) {\n            const findMessage = await this.prismaRepository.message.findFirst({\n              where: {\n                instanceId: this.instanceId,\n                key: {\n                  path: ['id'],\n                  equals: key.id,\n                },\n              },\n            });\n\n            if (!findMessage) {\n              return;\n            }\n\n            if (item.message === null && item.status === undefined) {\n              this.sendDataWebhook(Events.MESSAGES_DELETE, key);\n\n              const message: any = {\n                messageId: findMessage.id,\n                keyId: key.id,\n                remoteJid: key.remoteJid,\n                fromMe: key.fromMe,\n                participant: key?.remoteJid,\n                status: 'DELETED',\n                instanceId: this.instanceId,\n              };\n\n              await this.prismaRepository.messageUpdate.create({\n                data: message,\n              });\n\n              if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n                this.chatwootService.eventWhatsapp(\n                  Events.MESSAGES_DELETE,\n                  { instanceName: this.instance.name, instanceId: this.instanceId },\n                  { key: key },\n                );\n              }\n\n              return;\n            }\n\n            const message: any = {\n              messageId: findMessage.id,\n              keyId: key.id,\n              remoteJid: key.remoteJid,\n              fromMe: key.fromMe,\n              participant: key?.remoteJid,\n              status: item.status.toUpperCase(),\n              instanceId: this.instanceId,\n            };\n\n            this.sendDataWebhook(Events.MESSAGES_UPDATE, message);\n\n            await this.prismaRepository.messageUpdate.create({\n              data: message,\n            });\n\n            if (findMessage.webhookUrl) {\n              await axios.post(findMessage.webhookUrl, message);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  private convertMessageToRaw(message: any, content: any) {\n    let convertMessage: any;\n\n    if (message?.conversation) {\n      if (content?.context?.message_id) {\n        convertMessage = {\n          ...message,\n          contextInfo: { stanzaId: content.context.message_id },\n        };\n        return convertMessage;\n      }\n      convertMessage = message;\n      return convertMessage;\n    }\n\n    if (message?.mediaType === 'image') {\n      if (content?.context?.message_id) {\n        convertMessage = {\n          imageMessage: message,\n          contextInfo: { stanzaId: content.context.message_id },\n        };\n        return convertMessage;\n      }\n      return {\n        imageMessage: message,\n      };\n    }\n\n    if (message?.mediaType === 'video') {\n      if (content?.context?.message_id) {\n        convertMessage = {\n          videoMessage: message,\n          contextInfo: { stanzaId: content.context.message_id },\n        };\n        return convertMessage;\n      }\n      return {\n        videoMessage: message,\n      };\n    }\n\n    if (message?.mediaType === 'audio') {\n      if (content?.context?.message_id) {\n        convertMessage = {\n          audioMessage: message,\n          contextInfo: { stanzaId: content.context.message_id },\n        };\n        return convertMessage;\n      }\n      return {\n        audioMessage: message,\n      };\n    }\n\n    if (message?.mediaType === 'document') {\n      if (content?.context?.message_id) {\n        convertMessage = {\n          documentMessage: message,\n          contextInfo: { stanzaId: content.context.message_id },\n        };\n        return convertMessage;\n      }\n      return {\n        documentMessage: message,\n      };\n    }\n\n    return message;\n  }\n\n  protected async eventHandler(content: any) {\n    try {\n      // Registro para depuración\n      this.logger.log('Contenido recibido en eventHandler:');\n      this.logger.log(JSON.stringify(content, null, 2));\n\n      const database = this.configService.get<Database>('DATABASE');\n      const settings = await this.findSettings();\n\n      // Si hay mensajes, verificar primero el tipo\n      if (content.messages && content.messages.length > 0) {\n        const message = content.messages[0];\n        this.logger.log(`Tipo de mensaje recibido: ${message.type}`);\n\n        // Verificamos el tipo de mensaje antes de procesarlo\n        if (\n          message.type === 'text' ||\n          message.type === 'image' ||\n          message.type === 'video' ||\n          message.type === 'audio' ||\n          message.type === 'document' ||\n          message.type === 'sticker' ||\n          message.type === 'location' ||\n          message.type === 'contacts' ||\n          message.type === 'interactive' ||\n          message.type === 'button' ||\n          message.type === 'reaction'\n        ) {\n          // Procesar el mensaje normalmente\n          this.messageHandle(content, database, settings);\n        } else {\n          this.logger.warn(`Tipo de mensaje no reconocido: ${message.type}`);\n        }\n      } else if (content.statuses) {\n        // Procesar actualizaciones de estado\n        this.messageHandle(content, database, settings);\n      } else {\n        this.logger.warn('No se encontraron mensajes ni estados en el contenido recibido');\n      }\n    } catch (error) {\n      this.logger.error('Error en eventHandler:');\n      this.logger.error(error);\n    }\n  }\n\n  protected async sendMessageWithTyping(number: string, message: any, options?: Options, isIntegration = false) {\n    try {\n      let quoted: any;\n      let webhookUrl: any;\n      if (options?.quoted) {\n        const m = options?.quoted;\n\n        const msg = m?.key;\n\n        if (!msg) {\n          throw 'Message not found';\n        }\n\n        quoted = msg;\n      }\n      if (options?.webhookUrl) {\n        webhookUrl = options.webhookUrl;\n      }\n\n      let content: any;\n      const messageSent = await (async () => {\n        if (message['reactionMessage']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: 'reaction',\n            to: number.replace(/\\D/g, ''),\n            reaction: {\n              message_id: message['reactionMessage']['key']['id'],\n              emoji: message['reactionMessage']['text'],\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          return await this.post(content, 'messages');\n        }\n        if (message['locationMessage']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: 'location',\n            to: number.replace(/\\D/g, ''),\n            location: {\n              longitude: message['locationMessage']['degreesLongitude'],\n              latitude: message['locationMessage']['degreesLatitude'],\n              name: message['locationMessage']['name'],\n              address: message['locationMessage']['address'],\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          return await this.post(content, 'messages');\n        }\n        if (message['contacts']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: 'contacts',\n            to: number.replace(/\\D/g, ''),\n            contacts: message['contacts'],\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          message = message['message'];\n          return await this.post(content, 'messages');\n        }\n        if (message['conversation']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: 'text',\n            to: number.replace(/\\D/g, ''),\n            text: {\n              body: message['conversation'],\n              preview_url: Boolean(options?.linkPreview),\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          return await this.post(content, 'messages');\n        }\n        if (message['media']) {\n          const isImage = message['mimetype']?.startsWith('image/');\n\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: message['mediaType'],\n            to: number.replace(/\\D/g, ''),\n            [message['mediaType']]: {\n              [message['type']]: message['id'],\n              ...(message['mediaType'] !== 'audio' &&\n                message['mediaType'] !== 'video' &&\n                message['fileName'] &&\n                !isImage && { filename: message['fileName'] }),\n              ...(message['mediaType'] !== 'audio' && message['caption'] && { caption: message['caption'] }),\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          return await this.post(content, 'messages');\n        }\n        if (message['audio']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            type: 'audio',\n            to: number.replace(/\\D/g, ''),\n            audio: {\n              [message['type']]: message['id'],\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          return await this.post(content, 'messages');\n        }\n        if (message['buttons']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            to: number.replace(/\\D/g, ''),\n            type: 'interactive',\n            interactive: {\n              type: 'button',\n              body: {\n                text: message['text'] || 'Select',\n              },\n              action: {\n                buttons: message['buttons'],\n              },\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          let formattedText = '';\n          for (const item of message['buttons']) {\n            formattedText += `▶️ ${item.reply?.title}\\n`;\n          }\n          message = { conversation: `${message['text'] || 'Select'}\\n` + formattedText };\n          return await this.post(content, 'messages');\n        }\n        if (message['listMessage']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            to: number.replace(/\\D/g, ''),\n            type: 'interactive',\n            interactive: {\n              type: 'list',\n              header: {\n                type: 'text',\n                text: message['listMessage']['title'],\n              },\n              body: {\n                text: message['listMessage']['description'],\n              },\n              footer: {\n                text: message['listMessage']['footerText'],\n              },\n              action: {\n                button: message['listMessage']['buttonText'],\n                sections: message['listMessage']['sections'],\n              },\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          let formattedText = '';\n          for (const section of message['listMessage']['sections']) {\n            formattedText += `${section?.title}\\n`;\n            for (const row of section.rows) {\n              formattedText += `${row?.title}\\n`;\n            }\n          }\n          message = { conversation: `${message['listMessage']['title']}\\n` + formattedText };\n          return await this.post(content, 'messages');\n        }\n        if (message['template']) {\n          content = {\n            messaging_product: 'whatsapp',\n            recipient_type: 'individual',\n            to: number.replace(/\\D/g, ''),\n            type: 'template',\n            template: {\n              name: message['template']['name'],\n              language: {\n                code: message['template']['language'] || 'en_US',\n              },\n              components: message['template']['components'],\n            },\n          };\n          quoted ? (content.context = { message_id: quoted.id }) : content;\n          message = { conversation: `▶️${message['template']['name']}◀️` };\n          return await this.post(content, 'messages');\n        }\n      })();\n\n      if (messageSent?.error_data || messageSent.message) {\n        this.logger.error(messageSent);\n        return messageSent;\n      }\n\n      const messageRaw: any = {\n        key: { fromMe: true, id: messageSent?.messages[0]?.id, remoteJid: createJid(number) },\n        message: this.convertMessageToRaw(message, content),\n        messageType: this.renderMessageType(content.type),\n        messageTimestamp: (messageSent?.messages[0]?.timestamp as number) || Math.round(new Date().getTime() / 1000),\n        instanceId: this.instanceId,\n        webhookUrl,\n        status: status[1],\n        source: 'unknown',\n      };\n\n      this.logger.log(messageRaw);\n\n      this.sendDataWebhook(Events.SEND_MESSAGE, messageRaw);\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && !isIntegration) {\n        this.chatwootService.eventWhatsapp(\n          Events.SEND_MESSAGE,\n          { instanceName: this.instance.name, instanceId: this.instanceId },\n          messageRaw,\n        );\n      }\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && isIntegration)\n        await chatbotController.emit({\n          instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n          remoteJid: messageRaw.key.remoteJid,\n          msg: messageRaw,\n          pushName: messageRaw.pushName,\n        });\n\n      await this.prismaRepository.message.create({\n        data: messageRaw,\n      });\n\n      return messageRaw;\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  // Send Message Controller\n  public async textMessage(data: SendTextDto, isIntegration = false) {\n    const res = await this.sendMessageWithTyping(\n      data.number,\n      {\n        conversation: data.text,\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n    return res;\n  }\n\n  private async getIdMedia(mediaMessage: any, isFile = false) {\n    try {\n      const formData = new FormData();\n\n      if (isFile === false) {\n        if (isURL(mediaMessage.media)) {\n          const response = await axios.get(mediaMessage.media, { responseType: 'arraybuffer' });\n          const buffer = Buffer.from(response.data, 'base64');\n          formData.append('file', buffer, {\n            filename: mediaMessage.fileName || 'media',\n            contentType: mediaMessage.mimetype,\n          });\n        } else {\n          const buffer = Buffer.from(mediaMessage.media, 'base64');\n          formData.append('file', buffer, {\n            filename: mediaMessage.fileName || 'media',\n            contentType: mediaMessage.mimetype,\n          });\n        }\n      } else {\n        formData.append('file', mediaMessage.media.buffer, {\n          filename: mediaMessage.media.originalname,\n          contentType: mediaMessage.media.mimetype,\n        });\n      }\n\n      const mimetype = mediaMessage.mimetype || mediaMessage.media.mimetype;\n\n      formData.append('typeFile', mimetype);\n      formData.append('messaging_product', 'whatsapp');\n\n      const token = this.token;\n\n      const headers = { Authorization: `Bearer ${token}` };\n      const url = `${this.configService.get<WaBusiness>('WA_BUSINESS').URL}/${\n        this.configService.get<WaBusiness>('WA_BUSINESS').VERSION\n      }/${this.number}/media`;\n\n      const res = await axios.post(url, formData, { headers });\n      return res.data.id;\n    } catch (error) {\n      this.logger.error(error.response.data);\n      throw new InternalServerErrorException(error?.toString() || error);\n    }\n  }\n\n  protected async prepareMediaMessage(mediaMessage: MediaMessage) {\n    try {\n      if (mediaMessage.mediatype === 'document' && !mediaMessage.fileName) {\n        const regex = new RegExp(/.*\\/(.+?)\\./);\n        const arrayMatch = regex.exec(mediaMessage.media);\n        mediaMessage.fileName = arrayMatch[1];\n      }\n\n      if (mediaMessage.mediatype === 'image' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'image.png';\n      }\n\n      if (mediaMessage.mediatype === 'video' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'video.mp4';\n      }\n\n      let mimetype: string | false;\n\n      const prepareMedia: any = {\n        caption: mediaMessage?.caption,\n        fileName: mediaMessage.fileName,\n        mediaType: mediaMessage.mediatype,\n        media: mediaMessage.media,\n        gifPlayback: false,\n      };\n\n      if (isURL(mediaMessage.media)) {\n        mimetype = mimeTypes.lookup(mediaMessage.media);\n        prepareMedia.id = mediaMessage.media;\n        prepareMedia.type = 'link';\n      } else {\n        mimetype = mimeTypes.lookup(mediaMessage.fileName);\n        const id = await this.getIdMedia(prepareMedia);\n        prepareMedia.id = id;\n        prepareMedia.type = 'id';\n      }\n\n      prepareMedia.mimetype = mimetype;\n\n      return prepareMedia;\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString() || error);\n    }\n  }\n\n  public async mediaMessage(data: SendMediaDto, file?: any, isIntegration = false) {\n    const mediaData: SendMediaDto = { ...data };\n\n    if (file) mediaData.media = file.buffer.toString('base64');\n\n    const message = await this.prepareMediaMessage(mediaData);\n\n    const mediaSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n\n    return mediaSent;\n  }\n\n  public async processAudio(audio: string, number: string, file: any) {\n    number = number.replace(/\\D/g, '');\n    const hash = `${number}-${new Date().getTime()}`;\n\n    const audioConverterConfig = this.configService.get<AudioConverter>('AUDIO_CONVERTER');\n    if (audioConverterConfig.API_URL) {\n      this.logger.verbose('Using audio converter API');\n      const formData = new FormData();\n\n      if (file) {\n        formData.append('file', file.buffer, {\n          filename: file.originalname,\n          contentType: file.mimetype,\n        });\n      } else if (isURL(audio)) {\n        formData.append('url', audio);\n      } else {\n        formData.append('base64', audio);\n      }\n\n      formData.append('format', 'mp3');\n\n      const response = await axios.post(audioConverterConfig.API_URL, formData, {\n        headers: {\n          ...formData.getHeaders(),\n          apikey: audioConverterConfig.API_KEY,\n        },\n      });\n\n      const audioConverter = response?.data?.audio || response?.data?.url;\n\n      if (!audioConverter) {\n        throw new InternalServerErrorException('Failed to convert audio');\n      }\n\n      const prepareMedia: any = {\n        fileName: `${hash}.mp3`,\n        mediaType: 'audio',\n        media: audioConverter,\n        mimetype: 'audio/mpeg',\n      };\n\n      const id = await this.getIdMedia(prepareMedia);\n      prepareMedia.id = id;\n      prepareMedia.type = 'id';\n\n      this.logger.verbose('Audio converted');\n      return prepareMedia;\n    } else {\n      let mimetype: string | false;\n\n      const prepareMedia: any = {\n        fileName: `${hash}.mp3`,\n        mediaType: 'audio',\n        media: audio,\n      };\n\n      if (isURL(audio)) {\n        mimetype = mimeTypes.lookup(audio);\n        prepareMedia.id = audio;\n        prepareMedia.type = 'link';\n      } else if (audio && !file) {\n        mimetype = mimeTypes.lookup(prepareMedia.fileName);\n        const id = await this.getIdMedia(prepareMedia);\n        prepareMedia.id = id;\n        prepareMedia.type = 'id';\n      } else if (file) {\n        prepareMedia.media = file;\n        const id = await this.getIdMedia(prepareMedia, true);\n        prepareMedia.id = id;\n        prepareMedia.type = 'id';\n        mimetype = file.mimetype;\n      }\n\n      prepareMedia.mimetype = mimetype;\n\n      return prepareMedia;\n    }\n  }\n\n  public async audioWhatsapp(data: SendAudioDto, file?: any, isIntegration = false) {\n    const message = await this.processAudio(data.audio, data.number, file);\n\n    const audioSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n\n    return audioSent;\n  }\n\n  public async buttonMessage(data: SendButtonsDto) {\n    const embeddedMedia: any = {};\n\n    const btnItems = {\n      text: data.buttons.map((btn) => btn.displayText),\n      ids: data.buttons.map((btn) => btn.id),\n    };\n\n    if (!arrayUnique(btnItems.text) || !arrayUnique(btnItems.ids)) {\n      throw new BadRequestException('Button texts cannot be repeated', 'Button IDs cannot be repeated.');\n    }\n\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        text: !embeddedMedia?.mediaKey ? data.title : undefined,\n        buttons: data.buttons.map((button) => {\n          return {\n            type: 'reply',\n            reply: {\n              title: button.displayText,\n              id: button.id,\n            },\n          };\n        }),\n        [embeddedMedia?.mediaKey]: embeddedMedia?.message,\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  public async locationMessage(data: SendLocationDto) {\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        locationMessage: {\n          degreesLatitude: data.latitude,\n          degreesLongitude: data.longitude,\n          name: data?.name,\n          address: data?.address,\n        },\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  public async listMessage(data: SendListDto) {\n    const sectionsItems = {\n      title: data.sections.map((list) => list.title),\n    };\n\n    if (!arrayUnique(sectionsItems.title)) {\n      throw new BadRequestException('Section tiles cannot be repeated');\n    }\n\n    const sendData: any = {\n      listMessage: {\n        title: data.title,\n        description: data.description,\n        footerText: data?.footerText,\n        buttonText: data?.buttonText,\n        sections: data.sections.map((section) => {\n          return {\n            title: section.title,\n            rows: section.rows.map((row) => {\n              return {\n                title: row.title,\n                description: row.description.substring(0, 72),\n                id: row.rowId,\n              };\n            }),\n          };\n        }),\n      },\n    };\n\n    return await this.sendMessageWithTyping(data.number, sendData, {\n      delay: data?.delay,\n      presence: 'composing',\n      quoted: data?.quoted,\n      linkPreview: data?.linkPreview,\n      mentionsEveryOne: data?.mentionsEveryOne,\n      mentioned: data?.mentioned,\n    });\n  }\n\n  public async templateMessage(data: SendTemplateDto, isIntegration = false) {\n    const res = await this.sendMessageWithTyping(\n      data.number,\n      {\n        template: {\n          name: data.name,\n          language: data.language,\n          components: data.components,\n        },\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n        webhookUrl: data?.webhookUrl,\n      },\n      isIntegration,\n    );\n    return res;\n  }\n\n  public async contactMessage(data: SendContactDto) {\n    const message: any = {};\n\n    const vcard = (contact: ContactMessage) => {\n      let result = 'BEGIN:VCARD\\n' + 'VERSION:3.0\\n' + `N:${contact.fullName}\\n` + `FN:${contact.fullName}\\n`;\n\n      if (contact.organization) {\n        result += `ORG:${contact.organization};\\n`;\n      }\n\n      if (contact.email) {\n        result += `EMAIL:${contact.email}\\n`;\n      }\n\n      if (contact.url) {\n        result += `URL:${contact.url}\\n`;\n      }\n\n      if (!contact.wuid) {\n        contact.wuid = createJid(contact.phoneNumber);\n      }\n\n      result += `item1.TEL;waid=${contact.wuid}:${contact.phoneNumber}\\n` + 'item1.X-ABLabel:Celular\\n' + 'END:VCARD';\n\n      return result;\n    };\n\n    if (data.contact.length === 1) {\n      message.contact = {\n        displayName: data.contact[0].fullName,\n        vcard: vcard(data.contact[0]),\n      };\n    } else {\n      message.contactsArrayMessage = {\n        displayName: `${data.contact.length} contacts`,\n        contacts: data.contact.map((contact) => {\n          return {\n            displayName: contact.fullName,\n            vcard: vcard(contact),\n          };\n        }),\n      };\n    }\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        contacts: data.contact.map((contact) => {\n          return {\n            name: { formatted_name: contact.fullName, first_name: contact.fullName },\n            phones: [{ phone: contact.phoneNumber }],\n            urls: [{ url: contact.url }],\n            emails: [{ email: contact.email }],\n            org: { company: contact.organization },\n          };\n        }),\n        message,\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  public async reactionMessage(data: SendReactionDto) {\n    return await this.sendMessageWithTyping(data.key.remoteJid, {\n      reactionMessage: {\n        key: data.key,\n        text: data.reaction,\n      },\n    });\n  }\n\n  public async getBase64FromMediaMessage(data: any) {\n    try {\n      const msg = data.message;\n      const messageType = msg.messageType.includes('Message') ? msg.messageType : msg.messageType + 'Message';\n      const mediaMessage = msg.message[messageType];\n\n      if (!msg.message?.base64) {\n        const buffer = await this.downloadMediaMessage({ type: messageType, ...msg.message });\n        msg.message.base64 = buffer.toString('base64');\n      }\n\n      return {\n        mediaType: msg.messageType,\n        fileName: mediaMessage?.fileName || mediaMessage?.filename,\n        caption: mediaMessage?.caption,\n        size: {\n          fileLength: mediaMessage?.fileLength,\n          height: mediaMessage?.fileLength,\n          width: mediaMessage?.width,\n        },\n        mimetype: mediaMessage?.mime_type,\n        base64: msg.message.base64,\n      };\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  public async deleteMessage() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n\n  // methods not available on WhatsApp Business API\n  public async mediaSticker() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async pollMessage() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async statusMessage() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async reloadConnection() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async whatsappNumber() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async markMessageAsRead() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async archiveChat() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async markChatUnread() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fetchProfile() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async offerCall() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async sendPresence() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async setPresence() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fetchPrivacySettings() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updatePrivacySettings() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fetchBusinessProfile() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateProfileName() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateProfileStatus() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateProfilePicture() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async removeProfilePicture() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async blockUser() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateMessage() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async createGroup() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateGroupPicture() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateGroupSubject() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateGroupDescription() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async findGroup() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fetchAllGroups() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async inviteCode() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async inviteInfo() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async sendInvite() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async acceptInviteCode() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async revokeInviteCode() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async findParticipants() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateGParticipant() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async updateGSetting() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async toggleEphemeral() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async leaveGroup() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fetchLabels() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async handleLabel() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async receiveMobileCode() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n  public async fakeCall() {\n    throw new BadRequestException('Method not available on WhatsApp Business API');\n  }\n}\n","import { ICache } from '@api/abstract/abstract.cache';\nimport { Logger } from '@config/logger.config';\nimport { BufferJSON } from 'baileys';\n\nexport class CacheService {\n  private readonly logger = new Logger('CacheService');\n\n  constructor(private readonly cache: ICache) {\n    if (cache) {\n      this.logger.verbose(`cacheservice created using cache engine: ${cache.constructor?.name}`);\n    } else {\n      this.logger.verbose(`cacheservice disabled`);\n    }\n  }\n\n  async get(key: string): Promise<any> {\n    if (!this.cache) {\n      return;\n    }\n    return this.cache.get(key);\n  }\n\n  public async hGet(key: string, field: string) {\n    if (!this.cache) {\n      return null;\n    }\n    try {\n      const data = await this.cache.hGet(key, field);\n\n      if (data) {\n        return JSON.parse(data, BufferJSON.reviver);\n      }\n\n      return null;\n    } catch (error) {\n      this.logger.error(error);\n      return null;\n    }\n  }\n\n  async set(key: string, value: any, ttl?: number) {\n    if (!this.cache) {\n      return;\n    }\n    this.cache.set(key, value, ttl);\n  }\n\n  public async hSet(key: string, field: string, value: any) {\n    if (!this.cache) {\n      return;\n    }\n    try {\n      const json = JSON.stringify(value, BufferJSON.replacer);\n\n      await this.cache.hSet(key, field, json);\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  async has(key: string) {\n    if (!this.cache) {\n      return;\n    }\n    return this.cache.has(key);\n  }\n\n  async delete(key: string) {\n    if (!this.cache) {\n      return;\n    }\n    return this.cache.delete(key);\n  }\n\n  async hDelete(key: string, field: string) {\n    if (!this.cache) {\n      return false;\n    }\n    try {\n      await this.cache.hDelete(key, field);\n      return true;\n    } catch (error) {\n      this.logger.error(error);\n      return false;\n    }\n  }\n\n  async deleteAll(appendCriteria?: string) {\n    if (!this.cache) {\n      return;\n    }\n    return this.cache.deleteAll(appendCriteria);\n  }\n\n  async keys(appendCriteria?: string) {\n    if (!this.cache) {\n      return;\n    }\n    return this.cache.keys(appendCriteria);\n  }\n}\n","import { getCollectionsDto } from '@api/dto/business.dto';\nimport { OfferCallDto } from '@api/dto/call.dto';\nimport {\n  ArchiveChatDto,\n  BlockUserDto,\n  DeleteMessage,\n  getBase64FromMediaMessageDto,\n  LastMessage,\n  MarkChatUnreadDto,\n  NumberBusiness,\n  OnWhatsAppDto,\n  PrivacySettingDto,\n  ReadMessageDto,\n  SendPresenceDto,\n  UpdateMessageDto,\n  WhatsAppNumberDto,\n} from '@api/dto/chat.dto';\nimport {\n  AcceptGroupInvite,\n  CreateGroupDto,\n  GetParticipant,\n  GroupDescriptionDto,\n  GroupInvite,\n  GroupJid,\n  GroupPictureDto,\n  GroupSendInvite,\n  GroupSubjectDto,\n  GroupToggleEphemeralDto,\n  GroupUpdateParticipantDto,\n  GroupUpdateSettingDto,\n} from '@api/dto/group.dto';\nimport { InstanceDto, SetPresenceDto } from '@api/dto/instance.dto';\nimport { HandleLabelDto, LabelDto } from '@api/dto/label.dto';\nimport {\n  Button,\n  ContactMessage,\n  KeyType,\n  MediaMessage,\n  Options,\n  SendAudioDto,\n  SendButtonsDto,\n  SendContactDto,\n  SendListDto,\n  SendLocationDto,\n  SendMediaDto,\n  SendPollDto,\n  SendPtvDto,\n  SendReactionDto,\n  SendStatusDto,\n  SendStickerDto,\n  SendTextDto,\n  StatusMessage,\n  TypeButton,\n} from '@api/dto/sendMessage.dto';\nimport { chatwootImport } from '@api/integrations/chatbot/chatwoot/utils/chatwoot-import-helper';\nimport * as s3Service from '@api/integrations/storage/s3/libs/minio.server';\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { PrismaRepository, Query } from '@api/repository/repository.service';\nimport { chatbotController, waMonitor } from '@api/server.module';\nimport { CacheService } from '@api/services/cache.service';\nimport { ChannelStartupService } from '@api/services/channel.service';\nimport { Events, MessageSubtype, TypeMediaMessage, wa } from '@api/types/wa.types';\nimport { CacheEngine } from '@cache/cacheengine';\nimport {\n  AudioConverter,\n  CacheConf,\n  Chatwoot,\n  ConfigService,\n  configService,\n  ConfigSessionPhone,\n  Database,\n  Log,\n  Openai,\n  ProviderSession,\n  QrCode,\n  S3,\n} from '@config/env.config';\nimport { BadRequestException, InternalServerErrorException, NotFoundException } from '@exceptions';\nimport ffmpegPath from '@ffmpeg-installer/ffmpeg';\nimport { Boom } from '@hapi/boom';\nimport { createId as cuid } from '@paralleldrive/cuid2';\nimport { Instance, Message } from '@prisma/client';\nimport { createJid } from '@utils/createJid';\nimport { fetchLatestWaWebVersion } from '@utils/fetchLatestWaWebVersion';\nimport { makeProxyAgent, makeProxyAgentUndici } from '@utils/makeProxyAgent';\nimport { getOnWhatsappCache, saveOnWhatsappCache } from '@utils/onWhatsappCache';\nimport { status } from '@utils/renderStatus';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport useMultiFileAuthStatePrisma from '@utils/use-multi-file-auth-state-prisma';\nimport { AuthStateProvider } from '@utils/use-multi-file-auth-state-provider-files';\nimport { useMultiFileAuthStateRedisDb } from '@utils/use-multi-file-auth-state-redis-db';\nimport axios from 'axios';\nimport makeWASocket, {\n  AnyMessageContent,\n  BufferedEventData,\n  BufferJSON,\n  CacheStore,\n  CatalogCollection,\n  Chat,\n  ConnectionState,\n  Contact,\n  decryptPollVote,\n  delay,\n  DisconnectReason,\n  downloadContentFromMessage,\n  downloadMediaMessage,\n  generateWAMessageFromContent,\n  getAggregateVotesInPollMessage,\n  GetCatalogOptions,\n  getContentType,\n  getDevice,\n  GroupMetadata,\n  isJidBroadcast,\n  isJidGroup,\n  isJidNewsletter,\n  isPnUser,\n  jidNormalizedUser,\n  makeCacheableSignalKeyStore,\n  MessageUpsertType,\n  MessageUserReceiptUpdate,\n  MiscMessageGenerationOptions,\n  ParticipantAction,\n  prepareWAMessageMedia,\n  Product,\n  proto,\n  UserFacingSocketConfig,\n  WABrowserDescription,\n  WAMediaUpload,\n  WAMessage,\n  WAMessageKey,\n  WAPresence,\n  WASocket,\n} from 'baileys';\nimport { Label } from 'baileys/lib/Types/Label';\nimport { LabelAssociation } from 'baileys/lib/Types/LabelAssociation';\nimport { spawn } from 'child_process';\nimport { isArray, isBase64, isURL } from 'class-validator';\nimport { createHash } from 'crypto';\nimport EventEmitter2 from 'eventemitter2';\nimport ffmpeg from 'fluent-ffmpeg';\nimport FormData from 'form-data';\nimport Long from 'long';\nimport mimeTypes from 'mime-types';\nimport NodeCache from 'node-cache';\nimport cron from 'node-cron';\nimport { release } from 'os';\nimport { join } from 'path';\nimport P from 'pino';\nimport qrcode, { QRCodeToDataURLOptions } from 'qrcode';\nimport qrcodeTerminal from 'qrcode-terminal';\nimport sharp from 'sharp';\nimport { PassThrough, Readable } from 'stream';\nimport { v4 } from 'uuid';\n\nimport { BaileysMessageProcessor } from './baileysMessage.processor';\nimport { useVoiceCallsBaileys } from './voiceCalls/useVoiceCallsBaileys';\n\nexport interface ExtendedIMessageKey extends proto.IMessageKey {\n  remoteJidAlt?: string;\n  participantAlt?: string;\n  server_id?: string;\n  isViewOnce?: boolean;\n}\n\nconst groupMetadataCache = new CacheService(new CacheEngine(configService, 'groups').getEngine());\n\n// Adicione a função getVideoDuration no início do arquivo\nasync function getVideoDuration(input: Buffer | string | Readable): Promise<number> {\n  const MediaInfoFactory = (await import('mediainfo.js')).default;\n  const mediainfo = await MediaInfoFactory({ format: 'JSON' });\n\n  let fileSize: number;\n  let readChunk: (size: number, offset: number) => Promise<Buffer>;\n\n  if (Buffer.isBuffer(input)) {\n    fileSize = input.length;\n    readChunk = async (size: number, offset: number): Promise<Buffer> => {\n      return input.slice(offset, offset + size);\n    };\n  } else if (typeof input === 'string') {\n    const fs = await import('fs');\n    const stat = await fs.promises.stat(input);\n    fileSize = stat.size;\n    const fd = await fs.promises.open(input, 'r');\n\n    readChunk = async (size: number, offset: number): Promise<Buffer> => {\n      const buffer = Buffer.alloc(size);\n      await fd.read(buffer, 0, size, offset);\n      return buffer;\n    };\n\n    try {\n      const result = await mediainfo.analyzeData(() => fileSize, readChunk);\n      const jsonResult = JSON.parse(result);\n\n      const generalTrack = jsonResult.media.track.find((t: any) => t['@type'] === 'General');\n      const duration = generalTrack.Duration;\n\n      return Math.round(parseFloat(duration));\n    } finally {\n      await fd.close();\n    }\n  } else if (input instanceof Readable) {\n    const chunks: Buffer[] = [];\n    for await (const chunk of input) {\n      chunks.push(chunk);\n    }\n    const data = Buffer.concat(chunks);\n    fileSize = data.length;\n\n    readChunk = async (size: number, offset: number): Promise<Buffer> => {\n      return data.slice(offset, offset + size);\n    };\n  } else {\n    throw new Error('Tipo de entrada não suportado');\n  }\n\n  const result = await mediainfo.analyzeData(() => fileSize, readChunk);\n  const jsonResult = JSON.parse(result);\n\n  const generalTrack = jsonResult.media.track.find((t: any) => t['@type'] === 'General');\n  const duration = generalTrack.Duration;\n\n  return Math.round(parseFloat(duration));\n}\n\nexport class BaileysStartupService extends ChannelStartupService {\n  private messageProcessor = new BaileysMessageProcessor();\n\n  constructor(\n    public readonly configService: ConfigService,\n    public readonly eventEmitter: EventEmitter2,\n    public readonly prismaRepository: PrismaRepository,\n    public readonly cache: CacheService,\n    public readonly chatwootCache: CacheService,\n    public readonly baileysCache: CacheService,\n    private readonly providerFiles: ProviderFiles,\n  ) {\n    super(configService, eventEmitter, prismaRepository, chatwootCache);\n    this.instance.qrcode = { count: 0 };\n    this.messageProcessor.mount({\n      onMessageReceive: this.messageHandle['messages.upsert'].bind(this), // Bind the method to the current context\n    });\n\n    this.authStateProvider = new AuthStateProvider(this.providerFiles);\n  }\n\n  private authStateProvider: AuthStateProvider;\n  private readonly msgRetryCounterCache: CacheStore = new NodeCache();\n  private readonly userDevicesCache: CacheStore = new NodeCache({ stdTTL: 300000, useClones: false });\n  private endSession = false;\n  private logBaileys = this.configService.get<Log>('LOG').BAILEYS;\n  private eventProcessingQueue: Promise<void> = Promise.resolve();\n\n  // Cache TTL constants (in seconds)\n  private readonly MESSAGE_CACHE_TTL_SECONDS = 5 * 60; // 5 minutes - avoid duplicate message processing\n  private readonly UPDATE_CACHE_TTL_SECONDS = 30 * 60; // 30 minutes - avoid duplicate status updates\n\n  public stateConnection: wa.StateConnection = { state: 'close' };\n\n  public phoneNumber: string;\n\n  public get connectionStatus() {\n    return this.stateConnection;\n  }\n\n  public async logoutInstance() {\n    this.messageProcessor.onDestroy();\n    await this.client?.logout('Log out instance: ' + this.instanceName);\n\n    this.client?.ws?.close();\n\n    const db = this.configService.get<Database>('DATABASE');\n    const cache = this.configService.get<CacheConf>('CACHE');\n    const provider = this.configService.get<ProviderSession>('PROVIDER');\n\n    if (provider?.ENABLED) {\n      const authState = await this.authStateProvider.authStateProvider(this.instance.id);\n\n      await authState.removeCreds();\n    }\n\n    if (cache?.REDIS.ENABLED && cache?.REDIS.SAVE_INSTANCES) {\n      const authState = await useMultiFileAuthStateRedisDb(this.instance.id, this.cache);\n\n      await authState.removeCreds();\n    }\n\n    if (db.SAVE_DATA.INSTANCE) {\n      const authState = await useMultiFileAuthStatePrisma(this.instance.id, this.cache);\n\n      await authState.removeCreds();\n    }\n\n    const sessionExists = await this.prismaRepository.session.findFirst({ where: { sessionId: this.instanceId } });\n    if (sessionExists) {\n      await this.prismaRepository.session.delete({ where: { sessionId: this.instanceId } });\n    }\n  }\n\n  public async getProfileName() {\n    let profileName = this.client.user?.name ?? this.client.user?.verifiedName;\n    if (!profileName) {\n      const data = await this.prismaRepository.session.findUnique({ where: { sessionId: this.instanceId } });\n\n      if (data) {\n        const creds = JSON.parse(JSON.stringify(data.creds), BufferJSON.reviver);\n        profileName = creds.me?.name || creds.me?.verifiedName;\n      }\n    }\n\n    return profileName;\n  }\n\n  public async getProfileStatus() {\n    const status = await this.client.fetchStatus(this.instance.wuid);\n\n    return status[0]?.status;\n  }\n\n  public get profilePictureUrl() {\n    return this.instance.profilePictureUrl;\n  }\n\n  public get qrCode(): wa.QrCode {\n    return {\n      pairingCode: this.instance.qrcode?.pairingCode,\n      code: this.instance.qrcode?.code,\n      base64: this.instance.qrcode?.base64,\n      count: this.instance.qrcode?.count,\n    };\n  }\n\n  private async connectionUpdate({ qr, connection, lastDisconnect }: Partial<ConnectionState>) {\n    if (qr) {\n      if (this.instance.qrcode.count === this.configService.get<QrCode>('QRCODE').LIMIT) {\n        this.sendDataWebhook(Events.QRCODE_UPDATED, {\n          message: 'QR code limit reached, please login again',\n          statusCode: DisconnectReason.badSession,\n        });\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n          this.chatwootService.eventWhatsapp(\n            Events.QRCODE_UPDATED,\n            { instanceName: this.instance.name, instanceId: this.instanceId },\n            { message: 'QR code limit reached, please login again', statusCode: DisconnectReason.badSession },\n          );\n        }\n\n        this.sendDataWebhook(Events.CONNECTION_UPDATE, {\n          instance: this.instance.name,\n          state: 'refused',\n          statusReason: DisconnectReason.connectionClosed,\n          wuid: this.instance.wuid,\n          profileName: await this.getProfileName(),\n          profilePictureUrl: this.instance.profilePictureUrl,\n        });\n\n        this.endSession = true;\n\n        return this.eventEmitter.emit('no.connection', this.instance.name);\n      }\n\n      this.instance.qrcode.count++;\n\n      const color = this.configService.get<QrCode>('QRCODE').COLOR;\n\n      const optsQrcode: QRCodeToDataURLOptions = {\n        margin: 3,\n        scale: 4,\n        errorCorrectionLevel: 'H',\n        color: { light: '#ffffff', dark: color },\n      };\n\n      if (this.phoneNumber) {\n        await delay(1000);\n        this.instance.qrcode.pairingCode = await this.client.requestPairingCode(this.phoneNumber);\n      } else {\n        this.instance.qrcode.pairingCode = null;\n      }\n\n      qrcode.toDataURL(qr, optsQrcode, (error, base64) => {\n        if (error) {\n          this.logger.error('Qrcode generate failed:' + error.toString());\n          return;\n        }\n\n        this.instance.qrcode.base64 = base64;\n        this.instance.qrcode.code = qr;\n\n        this.sendDataWebhook(Events.QRCODE_UPDATED, {\n          qrcode: { instance: this.instance.name, pairingCode: this.instance.qrcode.pairingCode, code: qr, base64 },\n        });\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n          this.chatwootService.eventWhatsapp(\n            Events.QRCODE_UPDATED,\n            { instanceName: this.instance.name, instanceId: this.instanceId },\n            {\n              qrcode: { instance: this.instance.name, pairingCode: this.instance.qrcode.pairingCode, code: qr, base64 },\n            },\n          );\n        }\n      });\n\n      qrcodeTerminal.generate(qr, { small: true }, (qrcode) =>\n        this.logger.log(\n          `\\n{ instance: ${this.instance.name} pairingCode: ${this.instance.qrcode.pairingCode}, qrcodeCount: ${this.instance.qrcode.count} }\\n` +\n            qrcode,\n        ),\n      );\n\n      await this.prismaRepository.instance.update({\n        where: { id: this.instanceId },\n        data: { connectionStatus: 'connecting' },\n      });\n    }\n\n    if (connection) {\n      this.stateConnection = {\n        state: connection,\n        statusReason: (lastDisconnect?.error as Boom)?.output?.statusCode ?? 200,\n      };\n    }\n\n    if (connection === 'close') {\n      const statusCode = (lastDisconnect?.error as Boom)?.output?.statusCode;\n      const codesToNotReconnect = [DisconnectReason.loggedOut, DisconnectReason.forbidden, 402, 406];\n      const shouldReconnect = !codesToNotReconnect.includes(statusCode);\n      if (shouldReconnect) {\n        await this.connectToWhatsapp(this.phoneNumber);\n      } else {\n        this.sendDataWebhook(Events.STATUS_INSTANCE, {\n          instance: this.instance.name,\n          status: 'closed',\n          disconnectionAt: new Date(),\n          disconnectionReasonCode: statusCode,\n          disconnectionObject: JSON.stringify(lastDisconnect),\n        });\n\n        await this.prismaRepository.instance.update({\n          where: { id: this.instanceId },\n          data: {\n            connectionStatus: 'close',\n            disconnectionAt: new Date(),\n            disconnectionReasonCode: statusCode,\n            disconnectionObject: JSON.stringify(lastDisconnect),\n          },\n        });\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n          this.chatwootService.eventWhatsapp(\n            Events.STATUS_INSTANCE,\n            { instanceName: this.instance.name, instanceId: this.instanceId },\n            { instance: this.instance.name, status: 'closed' },\n          );\n        }\n\n        this.eventEmitter.emit('logout.instance', this.instance.name, 'inner');\n        this.client?.ws?.close();\n        this.client.end(new Error('Close connection'));\n\n        this.sendDataWebhook(Events.CONNECTION_UPDATE, { instance: this.instance.name, ...this.stateConnection });\n      }\n    }\n\n    if (connection === 'open') {\n      this.instance.wuid = this.client.user.id.replace(/:\\d+/, '');\n      try {\n        const profilePic = await this.profilePicture(this.instance.wuid);\n        this.instance.profilePictureUrl = profilePic.profilePictureUrl;\n      } catch {\n        this.instance.profilePictureUrl = null;\n      }\n      const formattedWuid = this.instance.wuid.split('@')[0].padEnd(30, ' ');\n      const formattedName = this.instance.name;\n      this.logger.info(\n        `\n        ┌──────────────────────────────┐\n        │    CONNECTED TO WHATSAPP     │\n        └──────────────────────────────┘`.replace(/^ +/gm, '  '),\n      );\n      this.logger.info(\n        `\n        wuid: ${formattedWuid}\n        name: ${formattedName}\n      `,\n      );\n\n      await this.prismaRepository.instance.update({\n        where: { id: this.instanceId },\n        data: {\n          ownerJid: this.instance.wuid,\n          profileName: (await this.getProfileName()) as string,\n          profilePicUrl: this.instance.profilePictureUrl,\n          connectionStatus: 'open',\n        },\n      });\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n        this.chatwootService.eventWhatsapp(\n          Events.CONNECTION_UPDATE,\n          { instanceName: this.instance.name, instanceId: this.instanceId },\n          { instance: this.instance.name, status: 'open' },\n        );\n        this.syncChatwootLostMessages();\n      }\n\n      this.sendDataWebhook(Events.CONNECTION_UPDATE, {\n        instance: this.instance.name,\n        wuid: this.instance.wuid,\n        profileName: await this.getProfileName(),\n        profilePictureUrl: this.instance.profilePictureUrl,\n        ...this.stateConnection,\n      });\n    }\n\n    if (connection === 'connecting') {\n      this.sendDataWebhook(Events.CONNECTION_UPDATE, { instance: this.instance.name, ...this.stateConnection });\n    }\n  }\n\n  private async getMessage(key: proto.IMessageKey, full = false) {\n    try {\n      // Use raw SQL to avoid JSON path issues\n      const webMessageInfo = (await this.prismaRepository.$queryRaw`\n        SELECT * FROM \"Message\"\n        WHERE \"instanceId\" = ${this.instanceId}\n        AND \"key\"->>'id' = ${key.id}\n      `) as proto.IWebMessageInfo[];\n\n      if (full) {\n        return webMessageInfo[0];\n      }\n      if (webMessageInfo[0].message?.pollCreationMessage) {\n        const messageSecretBase64 = webMessageInfo[0].message?.messageContextInfo?.messageSecret;\n\n        if (typeof messageSecretBase64 === 'string') {\n          const messageSecret = Buffer.from(messageSecretBase64, 'base64');\n\n          const msg = {\n            messageContextInfo: { messageSecret },\n            pollCreationMessage: webMessageInfo[0].message?.pollCreationMessage,\n          };\n\n          return msg;\n        }\n      }\n\n      return webMessageInfo[0].message;\n    } catch {\n      return { conversation: '' };\n    }\n  }\n\n  private async defineAuthState() {\n    const db = this.configService.get<Database>('DATABASE');\n    const cache = this.configService.get<CacheConf>('CACHE');\n\n    const provider = this.configService.get<ProviderSession>('PROVIDER');\n\n    if (provider?.ENABLED) {\n      return await this.authStateProvider.authStateProvider(this.instance.id);\n    }\n\n    if (cache?.REDIS.ENABLED && cache?.REDIS.SAVE_INSTANCES) {\n      this.logger.info('Redis enabled');\n      return await useMultiFileAuthStateRedisDb(this.instance.id, this.cache);\n    }\n\n    if (db.SAVE_DATA.INSTANCE) {\n      return await useMultiFileAuthStatePrisma(this.instance.id, this.cache);\n    }\n  }\n\n  private async createClient(number?: string): Promise<WASocket> {\n    this.instance.authState = await this.defineAuthState();\n\n    const session = this.configService.get<ConfigSessionPhone>('CONFIG_SESSION_PHONE');\n\n    let browserOptions = {};\n\n    if (number || this.phoneNumber) {\n      this.phoneNumber = number;\n\n      this.logger.info(`Phone number: ${number}`);\n    } else {\n      const browser: WABrowserDescription = [session.CLIENT, session.NAME, release()];\n      browserOptions = { browser };\n\n      this.logger.info(`Browser: ${browser}`);\n    }\n\n    const baileysVersion = await fetchLatestWaWebVersion({});\n    const version = baileysVersion.version;\n    const log = `Baileys version: ${version.join('.')}`;\n\n    this.logger.info(log);\n\n    this.logger.info(`Group Ignore: ${this.localSettings.groupsIgnore}`);\n\n    let options;\n\n    if (this.localProxy?.enabled) {\n      this.logger.info('Proxy enabled: ' + this.localProxy?.host);\n\n      if (this.localProxy?.host?.includes('proxyscrape')) {\n        try {\n          const response = await axios.get(this.localProxy?.host);\n          const text = response.data;\n          const proxyUrls = text.split('\\r\\n');\n          const rand = Math.floor(Math.random() * Math.floor(proxyUrls.length));\n          const proxyUrl = 'http://' + proxyUrls[rand];\n          options = { agent: makeProxyAgent(proxyUrl), fetchAgent: makeProxyAgentUndici(proxyUrl) };\n        } catch {\n          this.localProxy.enabled = false;\n        }\n      } else {\n        options = {\n          agent: makeProxyAgent({\n            host: this.localProxy.host,\n            port: this.localProxy.port,\n            protocol: this.localProxy.protocol,\n            username: this.localProxy.username,\n            password: this.localProxy.password,\n          }),\n          fetchAgent: makeProxyAgentUndici({\n            host: this.localProxy.host,\n            port: this.localProxy.port,\n            protocol: this.localProxy.protocol,\n            username: this.localProxy.username,\n            password: this.localProxy.password,\n          }),\n        };\n      }\n    }\n\n    const socketConfig: UserFacingSocketConfig = {\n      ...options,\n      version,\n      logger: P({ level: this.logBaileys }),\n      printQRInTerminal: false,\n      auth: {\n        creds: this.instance.authState.state.creds,\n        keys: makeCacheableSignalKeyStore(this.instance.authState.state.keys, P({ level: 'error' }) as any),\n      },\n      msgRetryCounterCache: this.msgRetryCounterCache,\n      generateHighQualityLinkPreview: true,\n      getMessage: async (key) => (await this.getMessage(key)) as Promise<proto.IMessage>,\n      ...browserOptions,\n      markOnlineOnConnect: this.localSettings.alwaysOnline,\n      retryRequestDelayMs: 350,\n      maxMsgRetryCount: 4,\n      fireInitQueries: true,\n      connectTimeoutMs: 30_000,\n      keepAliveIntervalMs: 30_000,\n      qrTimeout: 45_000,\n      emitOwnEvents: false,\n      shouldIgnoreJid: (jid) => {\n        if (this.localSettings.syncFullHistory && isJidGroup(jid)) {\n          return false;\n        }\n\n        const isGroupJid = this.localSettings.groupsIgnore && isJidGroup(jid);\n        const isBroadcast = !this.localSettings.readStatus && isJidBroadcast(jid);\n        const isNewsletter = isJidNewsletter(jid);\n\n        return isGroupJid || isBroadcast || isNewsletter;\n      },\n      syncFullHistory: this.localSettings.syncFullHistory,\n      shouldSyncHistoryMessage: (msg: proto.Message.IHistorySyncNotification) => {\n        return this.historySyncNotification(msg);\n      },\n      cachedGroupMetadata: this.getGroupMetadataCache,\n      userDevicesCache: this.userDevicesCache,\n      transactionOpts: { maxCommitRetries: 10, delayBetweenTriesMs: 3000 },\n      patchMessageBeforeSending(message) {\n        if (\n          message.deviceSentMessage?.message?.listMessage?.listType === proto.Message.ListMessage.ListType.PRODUCT_LIST\n        ) {\n          message = JSON.parse(JSON.stringify(message));\n\n          message.deviceSentMessage.message.listMessage.listType = proto.Message.ListMessage.ListType.SINGLE_SELECT;\n        }\n\n        if (message.listMessage?.listType == proto.Message.ListMessage.ListType.PRODUCT_LIST) {\n          message = JSON.parse(JSON.stringify(message));\n\n          message.listMessage.listType = proto.Message.ListMessage.ListType.SINGLE_SELECT;\n        }\n\n        return message;\n      },\n    };\n\n    this.endSession = false;\n\n    this.client = makeWASocket(socketConfig);\n\n    if (this.localSettings.wavoipToken && this.localSettings.wavoipToken.length > 0) {\n      useVoiceCallsBaileys(this.localSettings.wavoipToken, this.client, this.connectionStatus.state as any, true);\n    }\n\n    this.eventHandler();\n\n    this.client.ws.on('CB:call', (packet) => {\n      console.log('CB:call', packet);\n      const payload = { event: 'CB:call', packet: packet };\n      this.sendDataWebhook(Events.CALL, payload, true, ['websocket']);\n    });\n\n    this.client.ws.on('CB:ack,class:call', (packet) => {\n      console.log('CB:ack,class:call', packet);\n      const payload = { event: 'CB:ack,class:call', packet: packet };\n      this.sendDataWebhook(Events.CALL, payload, true, ['websocket']);\n    });\n\n    this.phoneNumber = number;\n\n    return this.client;\n  }\n\n  public async connectToWhatsapp(number?: string): Promise<WASocket> {\n    try {\n      this.loadChatwoot();\n      this.loadSettings();\n      this.loadWebhook();\n      this.loadProxy();\n\n      // Remontar o messageProcessor para garantir que está funcionando após reconexão\n      this.messageProcessor.mount({\n        onMessageReceive: this.messageHandle['messages.upsert'].bind(this),\n      });\n\n      return await this.createClient(number);\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString());\n    }\n  }\n\n  public async reloadConnection(): Promise<WASocket> {\n    try {\n      return await this.createClient(this.phoneNumber);\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString());\n    }\n  }\n\n  private readonly chatHandle = {\n    'chats.upsert': async (chats: Chat[]) => {\n      const existingChatIds = await this.prismaRepository.chat.findMany({\n        where: { instanceId: this.instanceId },\n        select: { remoteJid: true },\n      });\n\n      const existingChatIdSet = new Set(existingChatIds.map((chat) => chat.remoteJid));\n\n      const chatsToInsert = chats\n        .filter((chat) => !existingChatIdSet?.has(chat.id))\n        .map((chat) => ({\n          remoteJid: chat.id,\n          instanceId: this.instanceId,\n          name: chat.name,\n          unreadMessages: chat.unreadCount !== undefined ? chat.unreadCount : 0,\n        }));\n\n      this.sendDataWebhook(Events.CHATS_UPSERT, chatsToInsert);\n\n      if (chatsToInsert.length > 0) {\n        if (this.configService.get<Database>('DATABASE').SAVE_DATA.CHATS)\n          await this.prismaRepository.chat.createMany({ data: chatsToInsert, skipDuplicates: true });\n      }\n    },\n\n    'chats.update': async (\n      chats: Partial<\n        proto.IConversation & { lastMessageRecvTimestamp?: number } & {\n          conditional: (bufferedData: BufferedEventData) => boolean;\n        }\n      >[],\n    ) => {\n      const chatsRaw = chats.map((chat) => {\n        return { remoteJid: chat.id, instanceId: this.instanceId };\n      });\n\n      this.sendDataWebhook(Events.CHATS_UPDATE, chatsRaw);\n\n      for (const chat of chats) {\n        await this.prismaRepository.chat.updateMany({\n          where: { instanceId: this.instanceId, remoteJid: chat.id, name: chat.name },\n          data: { remoteJid: chat.id },\n        });\n      }\n    },\n\n    'chats.delete': async (chats: string[]) => {\n      chats.forEach(\n        async (chat) =>\n          await this.prismaRepository.chat.deleteMany({ where: { instanceId: this.instanceId, remoteJid: chat } }),\n      );\n\n      this.sendDataWebhook(Events.CHATS_DELETE, [...chats]);\n    },\n  };\n\n  private readonly contactHandle = {\n    'contacts.upsert': async (contacts: Contact[]) => {\n      try {\n        const contactsRaw: any = contacts.map((contact) => ({\n          remoteJid: contact.id,\n          pushName: contact?.name || contact?.verifiedName || contact.id.split('@')[0],\n          profilePicUrl: null,\n          instanceId: this.instanceId,\n        }));\n\n        if (contactsRaw.length > 0) {\n          this.sendDataWebhook(Events.CONTACTS_UPSERT, contactsRaw);\n\n          if (this.configService.get<Database>('DATABASE').SAVE_DATA.CONTACTS)\n            await this.prismaRepository.contact.createMany({ data: contactsRaw, skipDuplicates: true });\n\n          const usersContacts = contactsRaw.filter((c) => c.remoteJid.includes('@s.whatsapp'));\n          if (usersContacts) {\n            await saveOnWhatsappCache(usersContacts.map((c) => ({ remoteJid: c.remoteJid })));\n          }\n        }\n\n        if (\n          this.configService.get<Chatwoot>('CHATWOOT').ENABLED &&\n          this.localChatwoot?.enabled &&\n          this.localChatwoot.importContacts &&\n          contactsRaw.length\n        ) {\n          this.chatwootService.addHistoryContacts(\n            { instanceName: this.instance.name, instanceId: this.instance.id },\n            contactsRaw,\n          );\n          chatwootImport.importHistoryContacts(\n            { instanceName: this.instance.name, instanceId: this.instance.id },\n            this.localChatwoot,\n          );\n        }\n\n        const updatedContacts = await Promise.all(\n          contacts.map(async (contact) => ({\n            remoteJid: contact.id,\n            pushName: contact?.name || contact?.verifiedName || contact.id.split('@')[0],\n            profilePicUrl: (await this.profilePicture(contact.id)).profilePictureUrl,\n            instanceId: this.instanceId,\n          })),\n        );\n\n        if (updatedContacts.length > 0) {\n          const usersContacts = updatedContacts.filter((c) => c.remoteJid.includes('@s.whatsapp'));\n          if (usersContacts) {\n            await saveOnWhatsappCache(usersContacts.map((c) => ({ remoteJid: c.remoteJid })));\n          }\n\n          this.sendDataWebhook(Events.CONTACTS_UPDATE, updatedContacts);\n          await Promise.all(\n            updatedContacts.map(async (contact) => {\n              if (this.configService.get<Database>('DATABASE').SAVE_DATA.CONTACTS) {\n                await this.prismaRepository.contact.updateMany({\n                  where: { remoteJid: contact.remoteJid, instanceId: this.instanceId },\n                  data: { profilePicUrl: contact.profilePicUrl },\n                });\n              }\n\n              if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n                const instance = { instanceName: this.instance.name, instanceId: this.instance.id };\n\n                const findParticipant = await this.chatwootService.findContact(\n                  instance,\n                  contact.remoteJid.split('@')[0],\n                );\n\n                if (!findParticipant) {\n                  return;\n                }\n\n                this.chatwootService.updateContact(instance, findParticipant.id, {\n                  name: contact.pushName,\n                  avatar_url: contact.profilePicUrl,\n                });\n              }\n            }),\n          );\n        }\n      } catch (error) {\n        console.error(error);\n        this.logger.error(`Error: ${error.message}`);\n      }\n    },\n\n    'contacts.update': async (contacts: Partial<Contact>[]) => {\n      const contactsRaw: { remoteJid: string; pushName?: string; profilePicUrl?: string; instanceId: string }[] = [];\n      for await (const contact of contacts) {\n        this.logger.debug(`Updating contact: ${JSON.stringify(contact, null, 2)}`);\n        contactsRaw.push({\n          remoteJid: contact.id,\n          pushName: contact?.name ?? contact?.verifiedName,\n          profilePicUrl: (await this.profilePicture(contact.id)).profilePictureUrl,\n          instanceId: this.instanceId,\n        });\n      }\n\n      this.sendDataWebhook(Events.CONTACTS_UPDATE, contactsRaw);\n\n      if (this.configService.get<Database>('DATABASE').SAVE_DATA.CONTACTS) {\n        const updateTransactions = contactsRaw.map((contact) =>\n          this.prismaRepository.contact.upsert({\n            where: { remoteJid_instanceId: { remoteJid: contact.remoteJid, instanceId: contact.instanceId } },\n            create: contact,\n            update: contact,\n          }),\n        );\n        await this.prismaRepository.$transaction(updateTransactions);\n      }\n\n      //const usersContacts = contactsRaw.filter((c) => c.remoteJid.includes('@s.whatsapp'));\n    },\n  };\n\n  private readonly messageHandle = {\n    'messaging-history.set': async ({\n      messages,\n      chats,\n      contacts,\n      isLatest,\n      progress,\n      syncType,\n    }: {\n      chats: Chat[];\n      contacts: Contact[];\n      messages: WAMessage[];\n      isLatest?: boolean;\n      progress?: number;\n      syncType?: proto.HistorySync.HistorySyncType;\n    }) => {\n      try {\n        if (syncType === proto.HistorySync.HistorySyncType.ON_DEMAND) {\n          console.log('received on-demand history sync, messages=', messages);\n        }\n        console.log(\n          `recv ${chats.length} chats, ${contacts.length} contacts, ${messages.length} msgs (is latest: ${isLatest}, progress: ${progress}%), type: ${syncType}`,\n        );\n\n        const instance: InstanceDto = { instanceName: this.instance.name };\n\n        let timestampLimitToImport = null;\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n          const daysLimitToImport = this.localChatwoot?.enabled ? this.localChatwoot.daysLimitImportMessages : 1000;\n\n          const date = new Date();\n          timestampLimitToImport = new Date(date.setDate(date.getDate() - daysLimitToImport)).getTime() / 1000;\n\n          const maxBatchTimestamp = Math.max(...messages.map((message) => message.messageTimestamp as number));\n\n          const processBatch = maxBatchTimestamp >= timestampLimitToImport;\n\n          if (!processBatch) {\n            return;\n          }\n        }\n\n        const contactsMap = new Map();\n\n        for (const contact of contacts) {\n          if (contact.id && (contact.notify || contact.name)) {\n            contactsMap.set(contact.id, { name: contact.name ?? contact.notify, jid: contact.id });\n          }\n        }\n\n        const chatsRaw: { remoteJid: string; instanceId: string; name?: string }[] = [];\n        const chatsRepository = new Set(\n          (await this.prismaRepository.chat.findMany({ where: { instanceId: this.instanceId } })).map(\n            (chat) => chat.remoteJid,\n          ),\n        );\n\n        for (const chat of chats) {\n          if (chatsRepository?.has(chat.id)) {\n            continue;\n          }\n\n          chatsRaw.push({ remoteJid: chat.id, instanceId: this.instanceId, name: chat.name });\n        }\n\n        this.sendDataWebhook(Events.CHATS_SET, chatsRaw);\n\n        if (this.configService.get<Database>('DATABASE').SAVE_DATA.HISTORIC) {\n          await this.prismaRepository.chat.createMany({ data: chatsRaw, skipDuplicates: true });\n        }\n\n        const messagesRaw: any[] = [];\n\n        const messagesRepository: Set<string> = new Set(\n          chatwootImport.getRepositoryMessagesCache(instance) ??\n            (\n              await this.prismaRepository.message.findMany({\n                select: { key: true },\n                where: { instanceId: this.instanceId },\n              })\n            ).map((message) => {\n              const key = message.key as { id: string };\n\n              return key.id;\n            }),\n        );\n\n        if (chatwootImport.getRepositoryMessagesCache(instance) === null) {\n          chatwootImport.setRepositoryMessagesCache(instance, messagesRepository);\n        }\n\n        for (const m of messages) {\n          if (!m.message || !m.key || !m.messageTimestamp) {\n            continue;\n          }\n\n          if (Long.isLong(m?.messageTimestamp)) {\n            m.messageTimestamp = m.messageTimestamp?.toNumber();\n          }\n\n          if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n            if (m.messageTimestamp <= timestampLimitToImport) {\n              continue;\n            }\n          }\n\n          if (messagesRepository?.has(m.key.id)) {\n            continue;\n          }\n\n          if (!m.pushName && !m.key.fromMe) {\n            const participantJid = m.participant || m.key.participant || m.key.remoteJid;\n            if (participantJid && contactsMap.has(participantJid)) {\n              m.pushName = contactsMap.get(participantJid).name;\n            } else if (participantJid) {\n              m.pushName = participantJid.split('@')[0];\n            }\n          }\n\n          messagesRaw.push(this.prepareMessage(m));\n        }\n\n        this.sendDataWebhook(Events.MESSAGES_SET, [...messagesRaw], true, undefined, {\n          isLatest,\n          progress,\n        });\n\n        if (this.configService.get<Database>('DATABASE').SAVE_DATA.HISTORIC) {\n          await this.prismaRepository.message.createMany({ data: messagesRaw, skipDuplicates: true });\n        }\n\n        if (\n          this.configService.get<Chatwoot>('CHATWOOT').ENABLED &&\n          this.localChatwoot?.enabled &&\n          this.localChatwoot.importMessages &&\n          messagesRaw.length > 0\n        ) {\n          this.chatwootService.addHistoryMessages(\n            instance,\n            messagesRaw.filter((msg) => !chatwootImport.isIgnorePhoneNumber(msg.key?.remoteJid)),\n          );\n        }\n\n        await this.contactHandle['contacts.upsert'](\n          contacts.filter((c) => !!c.notify || !!c.name).map((c) => ({ id: c.id, name: c.name ?? c.notify })),\n        );\n\n        contacts = undefined;\n        messages = undefined;\n        chats = undefined;\n      } catch (error) {\n        this.logger.error(error);\n      }\n    },\n\n    'messages.upsert': async (\n      { messages, type, requestId }: { messages: WAMessage[]; type: MessageUpsertType; requestId?: string },\n      settings: any,\n    ) => {\n      try {\n        for (const received of messages) {\n          if (\n            received?.messageStubParameters?.some?.((param) =>\n              [\n                'No matching sessions found for message',\n                'Bad MAC',\n                'failed to decrypt message',\n                'SessionError',\n                'Invalid PreKey ID',\n                'No session record',\n                'No session found to decrypt message',\n                'Message absent from node',\n              ].some((err) => param?.includes?.(err)),\n            )\n          ) {\n            this.logger.warn(`Message ignored with messageStubParameters: ${JSON.stringify(received, null, 2)}`);\n            continue;\n          }\n          if (received.message?.conversation || received.message?.extendedTextMessage?.text) {\n            const text = received.message?.conversation || received.message?.extendedTextMessage?.text;\n\n            if (text == 'requestPlaceholder' && !requestId) {\n              const messageId = await this.client.requestPlaceholderResend(received.key);\n\n              console.log('requested placeholder resync, id=', messageId);\n            } else if (requestId) {\n              console.log('Message received from phone, id=', requestId, received);\n            }\n\n            if (text == 'onDemandHistSync') {\n              const messageId = await this.client.fetchMessageHistory(50, received.key, received.messageTimestamp!);\n              console.log('requested on-demand sync, id=', messageId);\n            }\n          }\n\n          const editedMessage =\n            received?.message?.protocolMessage || received?.message?.editedMessage?.message?.protocolMessage;\n\n          if (editedMessage) {\n            if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled)\n              this.chatwootService.eventWhatsapp(\n                'messages.edit',\n                { instanceName: this.instance.name, instanceId: this.instance.id },\n                editedMessage,\n              );\n\n            await this.sendDataWebhook(Events.MESSAGES_EDITED, editedMessage);\n\n            if (received.key?.id && editedMessage.key?.id) {\n              await this.baileysCache.set(`protocol_${received.key.id}`, editedMessage.key.id, 60 * 60 * 24);\n            }\n\n            const oldMessage = await this.getMessage(editedMessage.key, true);\n            if ((oldMessage as any)?.id) {\n              const editedMessageTimestamp = Long.isLong(received?.messageTimestamp)\n                ? Math.floor(received?.messageTimestamp.toNumber())\n                : Math.floor(received?.messageTimestamp as number);\n\n              await this.prismaRepository.message.update({\n                where: { id: (oldMessage as any).id },\n                data: {\n                  message: editedMessage.editedMessage as any,\n                  messageTimestamp: editedMessageTimestamp,\n                  status: 'EDITED',\n                },\n              });\n              await this.prismaRepository.messageUpdate.create({\n                data: {\n                  fromMe: editedMessage.key.fromMe,\n                  keyId: editedMessage.key.id,\n                  remoteJid: editedMessage.key.remoteJid,\n                  status: 'EDITED',\n                  instanceId: this.instanceId,\n                  messageId: (oldMessage as any).id,\n                },\n              });\n            }\n          }\n\n          if ((type !== 'notify' && type !== 'append') || editedMessage || !received?.message) {\n            continue;\n          }\n\n          if (Long.isLong(received.messageTimestamp)) {\n            received.messageTimestamp = received.messageTimestamp?.toNumber();\n          }\n\n          if (settings?.groupsIgnore && received.key.remoteJid.includes('@g.us')) {\n            continue;\n          }\n\n          const existingChat = await this.prismaRepository.chat.findFirst({\n            where: { instanceId: this.instanceId, remoteJid: received.key.remoteJid },\n            select: { id: true, name: true },\n          });\n\n          if (\n            existingChat &&\n            received.pushName &&\n            existingChat.name !== received.pushName &&\n            received.pushName.trim().length > 0 &&\n            !received.key.fromMe &&\n            !received.key.remoteJid.includes('@g.us')\n          ) {\n            this.sendDataWebhook(Events.CHATS_UPSERT, [{ ...existingChat, name: received.pushName }]);\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.CHATS) {\n              try {\n                await this.prismaRepository.chat.update({\n                  where: { id: existingChat.id },\n                  data: { name: received.pushName },\n                });\n              } catch {\n                console.log(`Chat insert record ignored: ${received.key.remoteJid} - ${this.instanceId}`);\n              }\n            }\n          }\n\n          const messageRaw = this.prepareMessage(received);\n\n          if (messageRaw.messageType === 'pollUpdateMessage') {\n            const pollCreationKey = messageRaw.message.pollUpdateMessage.pollCreationMessageKey;\n            const pollMessage = (await this.getMessage(pollCreationKey, true)) as proto.IWebMessageInfo;\n            const pollMessageSecret = (await this.getMessage(pollCreationKey)) as any;\n\n            if (pollMessage) {\n              const pollOptions =\n                (pollMessage.message as any).pollCreationMessage?.options ||\n                (pollMessage.message as any).pollCreationMessageV3?.options ||\n                [];\n              const pollVote = messageRaw.message.pollUpdateMessage.vote;\n\n              const voterJid = received.key.fromMe\n                ? this.instance.wuid\n                : received.key.participant || received.key.remoteJid;\n\n              let pollEncKey = pollMessageSecret?.messageContextInfo?.messageSecret;\n\n              let successfulVoterJid = voterJid;\n\n              if (typeof pollEncKey === 'string') {\n                pollEncKey = Buffer.from(pollEncKey, 'base64');\n              } else if (pollEncKey?.type === 'Buffer' && Array.isArray(pollEncKey.data)) {\n                pollEncKey = Buffer.from(pollEncKey.data);\n              }\n\n              if (Buffer.isBuffer(pollEncKey) && pollEncKey.length === 44) {\n                pollEncKey = Buffer.from(pollEncKey.toString('utf8'), 'base64');\n              }\n\n              if (pollVote.encPayload && pollEncKey) {\n                const creatorCandidates = [\n                  this.instance.wuid,\n                  this.client.user?.lid,\n                  pollMessage.key.participant,\n                  (pollMessage.key as any).participantAlt,\n                  pollMessage.key.remoteJid,\n                ];\n\n                const key = received.key as any;\n                const voterCandidates = [\n                  this.instance.wuid,\n                  this.client.user?.lid,\n                  key.participant,\n                  key.participantAlt,\n                  key.remoteJidAlt,\n                  key.remoteJid,\n                ];\n\n                const uniqueCreators = [\n                  ...new Set(creatorCandidates.filter(Boolean).map((id) => jidNormalizedUser(id))),\n                ];\n                const uniqueVoters = [...new Set(voterCandidates.filter(Boolean).map((id) => jidNormalizedUser(id)))];\n\n                let decryptedVote;\n\n                for (const creator of uniqueCreators) {\n                  for (const voter of uniqueVoters) {\n                    try {\n                      decryptedVote = decryptPollVote(pollVote, {\n                        pollCreatorJid: creator,\n                        pollMsgId: pollMessage.key.id,\n                        pollEncKey,\n                        voterJid: voter,\n                      } as any);\n                      if (decryptedVote) {\n                        successfulVoterJid = voter;\n                        break;\n                      }\n                    } catch {\n                      // Continue trying\n                    }\n                  }\n                  if (decryptedVote) break;\n                }\n\n                if (decryptedVote) {\n                  Object.assign(pollVote, decryptedVote);\n                }\n              }\n\n              const selectedOptions = pollVote?.selectedOptions || [];\n\n              const selectedOptionNames = pollOptions\n                .filter((option) => {\n                  const hash = createHash('sha256').update(option.optionName).digest();\n                  return selectedOptions.some((selected) => Buffer.compare(selected, hash) === 0);\n                })\n                .map((option) => option.optionName);\n\n              messageRaw.message.pollUpdateMessage.vote.selectedOptions = selectedOptionNames;\n\n              const pollUpdates = pollOptions.map((option) => ({\n                name: option.optionName,\n                voters: selectedOptionNames.includes(option.optionName) ? [successfulVoterJid] : [],\n              }));\n\n              messageRaw.pollUpdates = pollUpdates;\n            }\n          }\n\n          const isMedia =\n            received?.message?.imageMessage ||\n            received?.message?.videoMessage ||\n            received?.message?.stickerMessage ||\n            received?.message?.documentMessage ||\n            received?.message?.documentWithCaptionMessage ||\n            received?.message?.ptvMessage ||\n            received?.message?.audioMessage;\n\n          const isVideo = received?.message?.videoMessage;\n\n          if (this.localSettings.readMessages && received.key.id !== 'status@broadcast') {\n            await this.client.readMessages([received.key]);\n          }\n\n          if (this.localSettings.readStatus && received.key.id === 'status@broadcast') {\n            await this.client.readMessages([received.key]);\n          }\n\n          if (\n            this.configService.get<Chatwoot>('CHATWOOT').ENABLED &&\n            this.localChatwoot?.enabled &&\n            !received.key.id.includes('@broadcast')\n          ) {\n            const chatwootSentMessage = await this.chatwootService.eventWhatsapp(\n              Events.MESSAGES_UPSERT,\n              { instanceName: this.instance.name, instanceId: this.instanceId },\n              messageRaw,\n            );\n\n            if (chatwootSentMessage?.id) {\n              messageRaw.chatwootMessageId = chatwootSentMessage.id;\n              messageRaw.chatwootInboxId = chatwootSentMessage.inbox_id;\n              messageRaw.chatwootConversationId = chatwootSentMessage.conversation_id;\n            }\n          }\n\n          if (this.configService.get<Openai>('OPENAI').ENABLED && received?.message?.audioMessage) {\n            const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({\n              where: { instanceId: this.instanceId },\n              include: { OpenaiCreds: true },\n            });\n\n            if (openAiDefaultSettings && openAiDefaultSettings.openaiCredsId && openAiDefaultSettings.speechToText) {\n              messageRaw.message.speechToText = `[audio] ${await this.openaiService.speechToText(received, this)}`;\n            }\n          }\n\n          if (this.configService.get<Database>('DATABASE').SAVE_DATA.NEW_MESSAGE) {\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { pollUpdates, ...messageData } = messageRaw;\n            const msg = await this.prismaRepository.message.create({ data: messageData });\n\n            const { remoteJid } = received.key;\n            const timestamp = msg.messageTimestamp;\n            const fromMe = received.key.fromMe.toString();\n            const messageKey = `${remoteJid}_${timestamp}_${fromMe}`;\n\n            const cachedTimestamp = await this.baileysCache.get(messageKey);\n\n            if (!cachedTimestamp) {\n              if (!received.key.fromMe) {\n                if (msg.status === status[3]) {\n                  this.logger.log(`Update not read messages ${remoteJid}`);\n                  await this.updateChatUnreadMessages(remoteJid);\n                } else if (msg.status === status[4]) {\n                  this.logger.log(`Update readed messages ${remoteJid} - ${timestamp}`);\n                  await this.updateMessagesReadedByTimestamp(remoteJid, timestamp);\n                }\n              } else {\n                // is send message by me\n                this.logger.log(`Update readed messages ${remoteJid} - ${timestamp}`);\n                await this.updateMessagesReadedByTimestamp(remoteJid, timestamp);\n              }\n\n              await this.baileysCache.set(messageKey, true, this.MESSAGE_CACHE_TTL_SECONDS);\n            } else {\n              this.logger.info(`Update readed messages duplicated ignored [avoid deadlock]: ${messageKey}`);\n            }\n\n            if (isMedia) {\n              if (this.configService.get<S3>('S3').ENABLE) {\n                try {\n                  if (isVideo && !this.configService.get<S3>('S3').SAVE_VIDEO) {\n                    this.logger.warn('Video upload is disabled. Skipping video upload.');\n                    // Skip video upload by returning early from this block\n                    return;\n                  }\n\n                  const message: any = received;\n\n                  // Verificação adicional para garantir que há conteúdo de mídia real\n                  const hasRealMedia = this.hasValidMediaContent(message);\n\n                  if (!hasRealMedia) {\n                    this.logger.warn('Message detected as media but contains no valid media content');\n                  } else {\n                    const media = await this.getBase64FromMediaMessage({ message }, true);\n\n                    if (!media) {\n                      this.logger.verbose('No valid media to upload (messageContextInfo only), skipping MinIO');\n                      return;\n                    }\n\n                    const { buffer, mediaType, fileName, size } = media;\n                    const mimetype = mimeTypes.lookup(fileName).toString();\n                    const fullName = join(\n                      `${this.instance.id}`,\n                      received.key.remoteJid,\n                      mediaType,\n                      `${Date.now()}_${fileName}`,\n                    );\n                    await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });\n\n                    await this.prismaRepository.media.create({\n                      data: {\n                        messageId: msg.id,\n                        instanceId: this.instanceId,\n                        type: mediaType,\n                        fileName: fullName,\n                        mimetype,\n                      },\n                    });\n\n                    const mediaUrl = await s3Service.getObjectUrl(fullName);\n\n                    messageRaw.message.mediaUrl = mediaUrl;\n\n                    await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });\n                  }\n                } catch (error) {\n                  this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);\n                }\n              }\n            }\n          }\n\n          if (this.localWebhook.enabled) {\n            if (isMedia && this.localWebhook.webhookBase64) {\n              try {\n                const buffer = await downloadMediaMessage(\n                  { key: received.key, message: received?.message },\n                  'buffer',\n                  {},\n                  { logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },\n                );\n\n                if (buffer) {\n                  messageRaw.message.base64 = buffer.toString('base64');\n                } else {\n                  // retry to download media\n                  const buffer = await downloadMediaMessage(\n                    { key: received.key, message: received?.message },\n                    'buffer',\n                    {},\n                    { logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },\n                  );\n\n                  if (buffer) {\n                    messageRaw.message.base64 = buffer.toString('base64');\n                  }\n                }\n              } catch (error) {\n                this.logger.error(['Error converting media to base64', error?.message]);\n              }\n            }\n          }\n\n          this.logger.verbose(messageRaw);\n\n          sendTelemetry(`received.message.${messageRaw.messageType ?? 'unknown'}`);\n          if (messageRaw.key.remoteJid?.includes('@lid') && messageRaw.key.remoteJidAlt) {\n            messageRaw.key.remoteJid = messageRaw.key.remoteJidAlt;\n          }\n          console.log(messageRaw);\n\n          this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);\n\n          await chatbotController.emit({\n            instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n            remoteJid: messageRaw.key.remoteJid,\n            msg: messageRaw,\n            pushName: messageRaw.pushName,\n          });\n\n          const contact = await this.prismaRepository.contact.findFirst({\n            where: { remoteJid: received.key.remoteJid, instanceId: this.instanceId },\n          });\n\n          const contactRaw: {\n            remoteJid: string;\n            pushName: string;\n            profilePicUrl?: string;\n            instanceId: string;\n          } = {\n            remoteJid: received.key.remoteJid,\n            pushName: received.key.fromMe ? '' : received.key.fromMe == null ? '' : received.pushName,\n            profilePicUrl: (await this.profilePicture(received.key.remoteJid)).profilePictureUrl,\n            instanceId: this.instanceId,\n          };\n\n          if (contactRaw.remoteJid === 'status@broadcast') {\n            continue;\n          }\n\n          if (contactRaw.remoteJid.includes('@s.whatsapp') || contactRaw.remoteJid.includes('@lid')) {\n            await saveOnWhatsappCache([\n              {\n                remoteJid:\n                  messageRaw.key.addressingMode === 'lid' ? messageRaw.key.remoteJidAlt : messageRaw.key.remoteJid,\n                remoteJidAlt: messageRaw.key.remoteJidAlt,\n                lid: messageRaw.key.addressingMode === 'lid' ? 'lid' : null,\n              },\n            ]);\n          }\n\n          if (contact) {\n            this.sendDataWebhook(Events.CONTACTS_UPDATE, contactRaw);\n\n            if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n              await this.chatwootService.eventWhatsapp(\n                Events.CONTACTS_UPDATE,\n                { instanceName: this.instance.name, instanceId: this.instanceId },\n                contactRaw,\n              );\n            }\n\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.CONTACTS)\n              await this.prismaRepository.contact.upsert({\n                where: { remoteJid_instanceId: { remoteJid: contactRaw.remoteJid, instanceId: contactRaw.instanceId } },\n                create: contactRaw,\n                update: contactRaw,\n              });\n\n            continue;\n          }\n\n          this.sendDataWebhook(Events.CONTACTS_UPSERT, contactRaw);\n\n          if (this.configService.get<Database>('DATABASE').SAVE_DATA.CONTACTS)\n            await this.prismaRepository.contact.upsert({\n              where: { remoteJid_instanceId: { remoteJid: contactRaw.remoteJid, instanceId: contactRaw.instanceId } },\n              update: contactRaw,\n              create: contactRaw,\n            });\n        }\n      } catch (error) {\n        this.logger.error(error);\n      }\n    },\n\n    'messages.update': async (args: { update: Partial<WAMessage>; key: WAMessageKey }[], settings: any) => {\n      this.logger.verbose(`Update messages ${JSON.stringify(args, undefined, 2)}`);\n\n      const readChatToUpdate: Record<string, true> = {}; // {remoteJid: true}\n\n      for await (const { key, update } of args) {\n        if (settings?.groupsIgnore && key.remoteJid?.includes('@g.us')) {\n          continue;\n        }\n\n        const updateKey = `${this.instance.id}_${key.id}_${update.status}`;\n\n        const cached = await this.baileysCache.get(updateKey);\n\n        const secondsSinceEpoch = Math.floor(Date.now() / 1000);\n        console.log('CACHE:', { cached, updateKey, messageTimestamp: update.messageTimestamp, secondsSinceEpoch });\n\n        if (\n          (update.messageTimestamp && update.messageTimestamp === cached) ||\n          (!update.messageTimestamp && secondsSinceEpoch === cached)\n        ) {\n          this.logger.info(`Update Message duplicated ignored [avoid deadlock]: ${updateKey}`);\n          continue;\n        }\n\n        if (update.messageTimestamp) {\n          await this.baileysCache.set(updateKey, update.messageTimestamp, 30 * 60);\n        } else {\n          await this.baileysCache.set(updateKey, secondsSinceEpoch, 30 * 60);\n        }\n\n        if (status[update.status] === 'READ' && key.fromMe) {\n          if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n            this.chatwootService.eventWhatsapp(\n              'messages.read',\n              { instanceName: this.instance.name, instanceId: this.instanceId },\n              { key: key },\n            );\n          }\n        }\n\n        if (key.remoteJid !== 'status@broadcast' && key.id !== undefined) {\n          let pollUpdates: any;\n\n          if (update.pollUpdates) {\n            const pollCreation = await this.getMessage(key);\n\n            if (pollCreation) {\n              pollUpdates = getAggregateVotesInPollMessage({\n                message: pollCreation as proto.IMessage,\n                pollUpdates: update.pollUpdates,\n              });\n            }\n          }\n\n          const message: any = {\n            keyId: key.id,\n            remoteJid: key?.remoteJid,\n            fromMe: key.fromMe,\n            participant: key?.participant,\n            status: status[update.status] ?? 'SERVER_ACK',\n            pollUpdates,\n            instanceId: this.instanceId,\n          };\n\n          if (update.message) {\n            message.message = update.message;\n          }\n\n          let findMessage: any;\n          const configDatabaseData = this.configService.get<Database>('DATABASE').SAVE_DATA;\n          if (configDatabaseData.HISTORIC || configDatabaseData.NEW_MESSAGE) {\n            // Use raw SQL to avoid JSON path issues\n            const protocolMapKey = `protocol_${key.id}`;\n            const originalMessageId = (await this.baileysCache.get(protocolMapKey)) as string;\n\n            if (originalMessageId) {\n              message.keyId = originalMessageId;\n            }\n\n            const searchId = originalMessageId || key.id;\n\n            const messages = (await this.prismaRepository.$queryRaw`\n              SELECT * FROM \"Message\"\n              WHERE \"instanceId\" = ${this.instanceId}\n              AND \"key\"->>'id' = ${searchId}\n              LIMIT 1\n            `) as any[];\n            findMessage = messages[0] || null;\n\n            if (!findMessage?.id) {\n              this.logger.warn(`Original message not found for update. Skipping. Key: ${JSON.stringify(key)}`);\n              continue;\n            }\n            message.messageId = findMessage.id;\n          }\n\n          if (update.message === null && update.status === undefined) {\n            this.sendDataWebhook(Events.MESSAGES_DELETE, { ...key, status: 'DELETED' });\n\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.MESSAGE_UPDATE)\n              await this.prismaRepository.messageUpdate.create({ data: message });\n\n            if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n              this.chatwootService.eventWhatsapp(\n                Events.MESSAGES_DELETE,\n                { instanceName: this.instance.name, instanceId: this.instanceId },\n                { key: key },\n              );\n            }\n\n            continue;\n          }\n\n          if (findMessage && update.status !== undefined && status[update.status] !== findMessage.status) {\n            if (!key.fromMe && key.remoteJid) {\n              readChatToUpdate[key.remoteJid] = true;\n\n              const { remoteJid } = key;\n              const timestamp = findMessage.messageTimestamp;\n              const fromMe = key.fromMe.toString();\n              const messageKey = `${remoteJid}_${timestamp}_${fromMe}`;\n\n              const cachedTimestamp = await this.baileysCache.get(messageKey);\n\n              if (!cachedTimestamp) {\n                if (status[update.status] === status[4]) {\n                  this.logger.log(`Update as read in message.update ${remoteJid} - ${timestamp}`);\n                  await this.updateMessagesReadedByTimestamp(remoteJid, timestamp);\n                  await this.baileysCache.set(messageKey, true, this.MESSAGE_CACHE_TTL_SECONDS);\n                }\n\n                await this.prismaRepository.message.update({\n                  where: { id: findMessage.id },\n                  data: { status: status[update.status] },\n                });\n              } else {\n                this.logger.info(\n                  `Update readed messages duplicated ignored in message.update [avoid deadlock]: ${messageKey}`,\n                );\n              }\n            }\n          }\n\n          this.sendDataWebhook(Events.MESSAGES_UPDATE, message);\n\n          if (this.configService.get<Database>('DATABASE').SAVE_DATA.MESSAGE_UPDATE) {\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { message: _msg, ...messageData } = message;\n            await this.prismaRepository.messageUpdate.create({ data: messageData });\n          }\n\n          const existingChat = await this.prismaRepository.chat.findFirst({\n            where: { instanceId: this.instanceId, remoteJid: message.remoteJid },\n          });\n\n          if (existingChat) {\n            const chatToInsert = { remoteJid: message.remoteJid, instanceId: this.instanceId, unreadMessages: 0 };\n\n            this.sendDataWebhook(Events.CHATS_UPSERT, [chatToInsert]);\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.CHATS) {\n              try {\n                await this.prismaRepository.chat.update({ where: { id: existingChat.id }, data: chatToInsert });\n              } catch {\n                console.log(`Chat insert record ignored: ${chatToInsert.remoteJid} - ${chatToInsert.instanceId}`);\n              }\n            }\n          }\n        }\n      }\n\n      await Promise.all(Object.keys(readChatToUpdate).map((remoteJid) => this.updateChatUnreadMessages(remoteJid)));\n    },\n  };\n\n  private readonly groupHandler = {\n    'groups.upsert': (groupMetadata: GroupMetadata[]) => {\n      this.sendDataWebhook(Events.GROUPS_UPSERT, groupMetadata);\n    },\n\n    'groups.update': (groupMetadataUpdate: Partial<GroupMetadata>[]) => {\n      this.sendDataWebhook(Events.GROUPS_UPDATE, groupMetadataUpdate);\n\n      groupMetadataUpdate.forEach((group) => {\n        if (isJidGroup(group.id)) {\n          this.updateGroupMetadataCache(group.id);\n        }\n      });\n    },\n\n    'group-participants.update': async (participantsUpdate: {\n      id: string;\n      participants: string[];\n      action: ParticipantAction;\n    }) => {\n      // ENHANCEMENT: Adds participantsData field while maintaining backward compatibility\n      // MAINTAINS: participants: string[] (original JID strings)\n      // ADDS: participantsData: { jid: string, phoneNumber: string, name?: string, imgUrl?: string }[]\n      // This enables LID to phoneNumber conversion without breaking existing webhook consumers\n\n      // Helper to normalize participantId as phone number\n      const normalizePhoneNumber = (id: string | null | undefined): string => {\n        // Remove @lid, @s.whatsapp.net suffixes and extract just the number part\n        return String(id || '').split('@')[0];\n      };\n\n      try {\n        // Usa o mesmo método que o endpoint /group/participants\n        const groupParticipants = await this.findParticipants({ groupJid: participantsUpdate.id });\n\n        // Validação para garantir que temos dados válidos\n        if (!groupParticipants?.participants || !Array.isArray(groupParticipants.participants)) {\n          throw new Error('Invalid participant data received from findParticipants');\n        }\n\n        // Filtra apenas os participantes que estão no evento\n        const resolvedParticipants = participantsUpdate.participants.map((participantId) => {\n          const participantData = groupParticipants.participants.find((p) => p.id === participantId);\n\n          let phoneNumber: string;\n          if (participantData?.phoneNumber) {\n            phoneNumber = participantData.phoneNumber;\n          } else {\n            phoneNumber = normalizePhoneNumber(participantId);\n          }\n\n          return {\n            jid: participantId,\n            phoneNumber,\n            name: participantData?.name,\n            imgUrl: participantData?.imgUrl,\n          };\n        });\n\n        // Mantém formato original + adiciona dados resolvidos\n        const enhancedParticipantsUpdate = {\n          ...participantsUpdate,\n          participants: participantsUpdate.participants, // Mantém array original de strings\n          // Adiciona dados resolvidos em campo separado\n          participantsData: resolvedParticipants,\n        };\n\n        this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, enhancedParticipantsUpdate);\n      } catch (error) {\n        this.logger.error(\n          `Failed to resolve participant data for GROUP_PARTICIPANTS_UPDATE webhook: ${error.message} | Group: ${participantsUpdate.id} | Participants: ${participantsUpdate.participants.length}`,\n        );\n        // Fallback - envia sem conversão\n        this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, participantsUpdate);\n      }\n\n      this.updateGroupMetadataCache(participantsUpdate.id);\n    },\n  };\n\n  private readonly labelHandle = {\n    [Events.LABELS_EDIT]: async (label: Label) => {\n      this.sendDataWebhook(Events.LABELS_EDIT, { ...label, instance: this.instance.name });\n\n      const labelsRepository = await this.prismaRepository.label.findMany({ where: { instanceId: this.instanceId } });\n\n      const savedLabel = labelsRepository.find((l) => l.labelId === label.id);\n      if (label.deleted && savedLabel) {\n        await this.prismaRepository.label.delete({\n          where: { labelId_instanceId: { instanceId: this.instanceId, labelId: label.id } },\n        });\n        this.sendDataWebhook(Events.LABELS_EDIT, { ...label, instance: this.instance.name });\n        return;\n      }\n\n      const labelName = label.name.replace(/[^\\x20-\\x7E]/g, '');\n      if (!savedLabel || savedLabel.color !== `${label.color}` || savedLabel.name !== labelName) {\n        if (this.configService.get<Database>('DATABASE').SAVE_DATA.LABELS) {\n          const labelData = {\n            color: `${label.color}`,\n            name: labelName,\n            labelId: label.id,\n            predefinedId: label.predefinedId,\n            instanceId: this.instanceId,\n          };\n          await this.prismaRepository.label.upsert({\n            where: { labelId_instanceId: { instanceId: labelData.instanceId, labelId: labelData.labelId } },\n            update: labelData,\n            create: labelData,\n          });\n        }\n      }\n    },\n\n    [Events.LABELS_ASSOCIATION]: async (\n      data: { association: LabelAssociation; type: 'remove' | 'add' },\n      database: Database,\n    ) => {\n      this.logger.info(\n        `labels association - ${data?.association?.chatId} (${data.type}-${data?.association?.type}): ${data?.association?.labelId}`,\n      );\n      if (database.SAVE_DATA.CHATS) {\n        const instanceId = this.instanceId;\n        const chatId = data.association.chatId;\n        const labelId = data.association.labelId;\n\n        if (data.type === 'add') {\n          await this.addLabel(labelId, instanceId, chatId);\n        } else if (data.type === 'remove') {\n          await this.removeLabel(labelId, instanceId, chatId);\n        }\n      }\n\n      this.sendDataWebhook(Events.LABELS_ASSOCIATION, {\n        instance: this.instance.name,\n        type: data.type,\n        chatId: data.association.chatId,\n        labelId: data.association.labelId,\n      });\n    },\n  };\n\n  private eventHandler() {\n    this.client.ev.process(async (events) => {\n      this.eventProcessingQueue = this.eventProcessingQueue.then(async () => {\n        try {\n          if (!this.endSession) {\n            const database = this.configService.get<Database>('DATABASE');\n            const settings = await this.findSettings();\n\n            if (events.call) {\n              const call = events.call[0];\n\n              if (settings?.rejectCall && call.status == 'offer') {\n                this.client.rejectCall(call.id, call.from);\n              }\n\n              if (settings?.msgCall?.trim().length > 0 && call.status == 'offer') {\n                if (call.from.endsWith('@lid')) {\n                  call.from = await this.client.signalRepository.lidMapping.getPNForLID(call.from as string);\n                }\n                const msg = await this.client.sendMessage(call.from, { text: settings.msgCall });\n\n                this.client.ev.emit('messages.upsert', { messages: [msg], type: 'notify' });\n              }\n\n              this.sendDataWebhook(Events.CALL, call);\n            }\n\n            if (events['connection.update']) {\n              this.connectionUpdate(events['connection.update']);\n            }\n\n            if (events['creds.update']) {\n              this.instance.authState.saveCreds();\n            }\n\n            if (events['messaging-history.set']) {\n              const payload = events['messaging-history.set'];\n              await this.messageHandle['messaging-history.set'](payload);\n            }\n\n            if (events['messages.upsert']) {\n              const payload = events['messages.upsert'];\n\n              // this.messageProcessor.processMessage(payload, settings);\n              await this.messageHandle['messages.upsert'](payload, settings);\n            }\n\n            if (events['messages.update']) {\n              const payload = events['messages.update'];\n              await this.messageHandle['messages.update'](payload, settings);\n            }\n\n            if (events['message-receipt.update']) {\n              const payload = events['message-receipt.update'] as MessageUserReceiptUpdate[];\n              const remotesJidMap: Record<string, number> = {};\n\n              for (const event of payload) {\n                if (typeof event.key.remoteJid === 'string' && typeof event.receipt.readTimestamp === 'number') {\n                  remotesJidMap[event.key.remoteJid] = event.receipt.readTimestamp;\n                }\n              }\n\n              await Promise.all(\n                Object.keys(remotesJidMap).map(async (remoteJid) =>\n                  this.updateMessagesReadedByTimestamp(remoteJid, remotesJidMap[remoteJid]),\n                ),\n              );\n            }\n\n            if (events['presence.update']) {\n              const payload = events['presence.update'];\n\n              if (settings?.groupsIgnore && payload.id.includes('@g.us')) {\n                return;\n              }\n\n              this.sendDataWebhook(Events.PRESENCE_UPDATE, payload);\n            }\n\n            if (!settings?.groupsIgnore) {\n              if (events['groups.upsert']) {\n                const payload = events['groups.upsert'];\n                this.groupHandler['groups.upsert'](payload);\n              }\n\n              if (events['groups.update']) {\n                const payload = events['groups.update'];\n                this.groupHandler['groups.update'](payload);\n              }\n\n              if (events['group-participants.update']) {\n                const payload = events['group-participants.update'] as any;\n                this.groupHandler['group-participants.update'](payload);\n              }\n            }\n\n            if (events['chats.upsert']) {\n              const payload = events['chats.upsert'];\n              this.chatHandle['chats.upsert'](payload);\n            }\n\n            if (events['chats.update']) {\n              const payload = events['chats.update'];\n              this.chatHandle['chats.update'](payload);\n            }\n\n            if (events['chats.delete']) {\n              const payload = events['chats.delete'];\n              this.chatHandle['chats.delete'](payload);\n            }\n\n            if (events['contacts.upsert']) {\n              const payload = events['contacts.upsert'];\n              this.contactHandle['contacts.upsert'](payload);\n            }\n\n            if (events['contacts.update']) {\n              const payload = events['contacts.update'];\n              this.contactHandle['contacts.update'](payload);\n            }\n\n            if (events[Events.LABELS_ASSOCIATION]) {\n              const payload = events[Events.LABELS_ASSOCIATION];\n              this.labelHandle[Events.LABELS_ASSOCIATION](payload, database);\n              return;\n            }\n\n            if (events[Events.LABELS_EDIT]) {\n              const payload = events[Events.LABELS_EDIT];\n              this.labelHandle[Events.LABELS_EDIT](payload);\n              return;\n            }\n          }\n        } catch (error) {\n          this.logger.error(error);\n        }\n      });\n    });\n  }\n\n  private historySyncNotification(msg: proto.Message.IHistorySyncNotification) {\n    const instance: InstanceDto = { instanceName: this.instance.name };\n\n    if (\n      this.configService.get<Chatwoot>('CHATWOOT').ENABLED &&\n      this.localChatwoot?.enabled &&\n      this.localChatwoot.importMessages &&\n      this.isSyncNotificationFromUsedSyncType(msg)\n    ) {\n      if (msg.chunkOrder === 1) {\n        this.chatwootService.startImportHistoryMessages(instance);\n      }\n\n      if (msg.progress === 100) {\n        setTimeout(() => {\n          this.chatwootService.importHistoryMessages(instance);\n        }, 10000);\n      }\n    }\n\n    return true;\n  }\n\n  private isSyncNotificationFromUsedSyncType(msg: proto.Message.IHistorySyncNotification) {\n    return (\n      (this.localSettings.syncFullHistory && msg?.syncType === 2) ||\n      (!this.localSettings.syncFullHistory && msg?.syncType === 3)\n    );\n  }\n\n  public async profilePicture(number: string) {\n    const jid = createJid(number);\n\n    try {\n      const profilePictureUrl = await this.client.profilePictureUrl(jid, 'image');\n\n      return { wuid: jid, profilePictureUrl };\n    } catch {\n      return { wuid: jid, profilePictureUrl: null };\n    }\n  }\n\n  public async getStatus(number: string) {\n    const jid = createJid(number);\n\n    try {\n      return { wuid: jid, status: (await this.client.fetchStatus(jid))[0]?.status };\n    } catch {\n      return { wuid: jid, status: null };\n    }\n  }\n\n  public async fetchProfile(instanceName: string, number?: string) {\n    const jid = number ? createJid(number) : this.client?.user?.id;\n\n    const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n\n    if (!onWhatsapp.exists) {\n      throw new BadRequestException(onWhatsapp);\n    }\n\n    try {\n      if (number) {\n        const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n        const picture = await this.profilePicture(info?.jid);\n        const status = await this.getStatus(info?.jid);\n        const business = await this.fetchBusinessProfile(info?.jid);\n\n        return {\n          wuid: info?.jid || jid,\n          name: info?.name,\n          numberExists: info?.exists,\n          picture: picture?.profilePictureUrl,\n          status: status?.status,\n          isBusiness: business.isBusiness,\n          email: business?.email,\n          description: business?.description,\n          website: business?.website?.shift(),\n        };\n      } else {\n        const instanceNames = instanceName ? [instanceName] : null;\n        const info: Instance = await waMonitor.instanceInfo(instanceNames);\n        const business = await this.fetchBusinessProfile(jid);\n\n        return {\n          wuid: jid,\n          name: info?.profileName,\n          numberExists: true,\n          picture: info?.profilePicUrl,\n          status: info?.connectionStatus,\n          isBusiness: business.isBusiness,\n          email: business?.email,\n          description: business?.description,\n          website: business?.website?.shift(),\n        };\n      }\n    } catch {\n      return { wuid: jid, name: null, picture: null, status: null, os: null, isBusiness: false };\n    }\n  }\n\n  public async offerCall({ number, isVideo, callDuration }: OfferCallDto) {\n    const jid = createJid(number);\n\n    try {\n      // const call = await this.client.offerCall(jid, isVideo);\n      // setTimeout(() => this.client.terminateCall(call.id, call.to), callDuration * 1000);\n\n      // return call;\n      return { id: '123', jid, isVideo, callDuration };\n    } catch (error) {\n      return error;\n    }\n  }\n\n  private async sendMessage(\n    sender: string,\n    message: any,\n    mentions: any,\n    linkPreview: any,\n    quoted: any,\n    messageId?: string,\n    ephemeralExpiration?: number,\n    contextInfo?: any,\n    // participants?: GroupParticipant[],\n  ) {\n    sender = sender.toLowerCase();\n\n    const option: any = { quoted };\n\n    if (isJidGroup(sender)) {\n      option.useCachedGroupMetadata = true;\n      // if (participants)\n      //   option.cachedGroupMetadata = async () => {\n      //     return { participants: participants as GroupParticipant[] };\n      //   };\n    }\n\n    if (ephemeralExpiration) option.ephemeralExpiration = ephemeralExpiration;\n\n    // NOTE: NÃO DEVEMOS GERAR O messageId AQUI, SOMENTE SE VIER INFORMADO POR PARAMETRO. A GERAÇÃO ANTERIOR IMPEDE O WZAP DE IDENTIFICAR A SOURCE.\n    if (messageId) option.messageId = messageId;\n\n    if (message['viewOnceMessage']) {\n      const m = generateWAMessageFromContent(sender, message, {\n        timestamp: new Date(),\n        userJid: this.instance.wuid,\n        messageId,\n        quoted,\n      });\n      const id = await this.client.relayMessage(sender, message, { messageId });\n      m.key = { id: id, remoteJid: sender, participant: isPnUser(sender) ? sender : undefined, fromMe: true };\n      for (const [key, value] of Object.entries(m)) {\n        if (!value || (isArray(value) && value.length) === 0) {\n          delete m[key];\n        }\n      }\n      return m;\n    }\n\n    if (\n      !message['audio'] &&\n      !message['poll'] &&\n      !message['sticker'] &&\n      !message['conversation'] &&\n      sender !== 'status@broadcast'\n    ) {\n      if (message['reactionMessage']) {\n        return await this.client.sendMessage(\n          sender,\n          {\n            react: { text: message['reactionMessage']['text'], key: message['reactionMessage']['key'] },\n          } as unknown as AnyMessageContent,\n          option as unknown as MiscMessageGenerationOptions,\n        );\n      }\n    }\n\n    if (contextInfo) {\n      message['contextInfo'] = contextInfo;\n    }\n\n    if (message['conversation']) {\n      return await this.client.sendMessage(\n        sender,\n        {\n          text: message['conversation'],\n          mentions,\n          linkPreview: linkPreview,\n          contextInfo: message['contextInfo'],\n        } as unknown as AnyMessageContent,\n        option as unknown as MiscMessageGenerationOptions,\n      );\n    }\n\n    if (!message['audio'] && !message['poll'] && !message['sticker'] && sender != 'status@broadcast') {\n      return await this.client.sendMessage(\n        sender,\n        {\n          forward: { key: { remoteJid: this.instance.wuid, fromMe: true }, message },\n          mentions,\n          contextInfo: message['contextInfo'],\n        },\n        option as unknown as MiscMessageGenerationOptions,\n      );\n    }\n\n    if (sender === 'status@broadcast') {\n      let jidList;\n      if (message['status'].option.allContacts) {\n        const contacts = await this.prismaRepository.contact.findMany({\n          where: { instanceId: this.instanceId, remoteJid: { not: { endsWith: '@g.us' } } },\n        });\n\n        jidList = contacts.map((contact) => contact.remoteJid);\n      } else {\n        jidList = message['status'].option.statusJidList;\n      }\n\n      const batchSize = 10;\n\n      const batches = Array.from({ length: Math.ceil(jidList.length / batchSize) }, (_, i) =>\n        jidList.slice(i * batchSize, i * batchSize + batchSize),\n      );\n\n      let msgId: string | null = null;\n\n      let firstMessage: WAMessage;\n\n      const firstBatch = batches.shift();\n\n      if (firstBatch) {\n        firstMessage = await this.client.sendMessage(\n          sender,\n          message['status'].content as unknown as AnyMessageContent,\n          {\n            backgroundColor: message['status'].option.backgroundColor,\n            font: message['status'].option.font,\n            statusJidList: firstBatch,\n          } as unknown as MiscMessageGenerationOptions,\n        );\n\n        msgId = firstMessage.key.id;\n      }\n\n      if (batches.length === 0) return firstMessage;\n\n      await Promise.allSettled(\n        batches.map(async (batch) => {\n          const messageSent = await this.client.sendMessage(\n            sender,\n            message['status'].content as unknown as AnyMessageContent,\n            {\n              backgroundColor: message['status'].option.backgroundColor,\n              font: message['status'].option.font,\n              statusJidList: batch,\n              messageId: msgId,\n            } as unknown as MiscMessageGenerationOptions,\n          );\n\n          return messageSent;\n        }),\n      );\n\n      return firstMessage;\n    }\n\n    return await this.client.sendMessage(\n      sender,\n      message as unknown as AnyMessageContent,\n      option as unknown as MiscMessageGenerationOptions,\n    );\n  }\n\n  private async sendMessageWithTyping<T = proto.IMessage>(\n    number: string,\n    message: T,\n    options?: Options,\n    isIntegration = false,\n  ) {\n    const isWA = (await this.whatsappNumber({ numbers: [number] }))?.shift();\n\n    if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) {\n      throw new BadRequestException(isWA);\n    }\n\n    const sender = isWA.jid.toLowerCase();\n\n    this.logger.verbose(`Sending message to ${sender}`);\n\n    try {\n      if (options?.delay) {\n        this.logger.verbose(`Typing for ${options.delay}ms to ${sender}`);\n        if (options.delay > 20000) {\n          let remainingDelay = options.delay;\n          while (remainingDelay > 20000) {\n            await this.client.presenceSubscribe(sender);\n\n            await this.client.sendPresenceUpdate((options.presence as WAPresence) ?? 'composing', sender);\n\n            await delay(20000);\n\n            await this.client.sendPresenceUpdate('paused', sender);\n\n            remainingDelay -= 20000;\n          }\n          if (remainingDelay > 0) {\n            await this.client.presenceSubscribe(sender);\n\n            await this.client.sendPresenceUpdate((options.presence as WAPresence) ?? 'composing', sender);\n\n            await delay(remainingDelay);\n\n            await this.client.sendPresenceUpdate('paused', sender);\n          }\n        } else {\n          await this.client.presenceSubscribe(sender);\n\n          await this.client.sendPresenceUpdate((options.presence as WAPresence) ?? 'composing', sender);\n\n          await delay(options.delay);\n\n          await this.client.sendPresenceUpdate('paused', sender);\n        }\n      }\n\n      const linkPreview = options?.linkPreview != false ? undefined : false;\n\n      let quoted: WAMessage;\n\n      if (options?.quoted) {\n        const m = options?.quoted;\n\n        const msg = m?.message ? m : ((await this.getMessage(m.key, true)) as WAMessage);\n\n        if (msg) {\n          quoted = msg;\n        }\n      }\n\n      let messageSent: WAMessage;\n\n      let mentions: string[];\n      let contextInfo: any;\n\n      if (isJidGroup(sender)) {\n        let group;\n        try {\n          const cache = this.configService.get<CacheConf>('CACHE');\n          if (!cache.REDIS.ENABLED && !cache.LOCAL.ENABLED) group = await this.findGroup({ groupJid: sender }, 'inner');\n          else group = await this.getGroupMetadataCache(sender);\n          // group = await this.findGroup({ groupJid: sender }, 'inner');\n        } catch {\n          throw new NotFoundException('Group not found');\n        }\n\n        if (!group) {\n          throw new NotFoundException('Group not found');\n        }\n\n        if (options?.mentionsEveryOne) {\n          mentions = group.participants.map((participant) => participant.id);\n        } else if (options?.mentioned?.length) {\n          mentions = options.mentioned.map((mention) => {\n            const jid = createJid(mention);\n            if (isJidGroup(jid)) {\n              return null;\n            }\n            return jid;\n          });\n        }\n\n        messageSent = await this.sendMessage(\n          sender,\n          message,\n          mentions,\n          linkPreview,\n          quoted,\n          null,\n          group?.ephemeralDuration,\n          // group?.participants,\n        );\n      } else {\n        contextInfo = {\n          mentionedJid: [],\n          groupMentions: [],\n          //expiration: 7776000,\n          ephemeralSettingTimestamp: {\n            low: Math.floor(Date.now() / 1000) - 172800,\n            high: 0,\n            unsigned: false,\n          },\n          disappearingMode: { initiator: 0 },\n        };\n        messageSent = await this.sendMessage(\n          sender,\n          message,\n          mentions,\n          linkPreview,\n          quoted,\n          null,\n          undefined,\n          contextInfo,\n        );\n      }\n\n      if (Long.isLong(messageSent?.messageTimestamp)) {\n        messageSent.messageTimestamp = messageSent.messageTimestamp?.toNumber();\n      }\n\n      const messageRaw = this.prepareMessage(messageSent);\n\n      const isMedia =\n        messageSent?.message?.imageMessage ||\n        messageSent?.message?.videoMessage ||\n        messageSent?.message?.stickerMessage ||\n        messageSent?.message?.ptvMessage ||\n        messageSent?.message?.documentMessage ||\n        messageSent?.message?.documentWithCaptionMessage ||\n        messageSent?.message?.ptvMessage ||\n        messageSent?.message?.audioMessage;\n\n      const isVideo = messageSent?.message?.videoMessage;\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && !isIntegration) {\n        this.chatwootService.eventWhatsapp(\n          Events.SEND_MESSAGE,\n          { instanceName: this.instance.name, instanceId: this.instanceId },\n          messageRaw,\n        );\n      }\n\n      if (this.configService.get<Openai>('OPENAI').ENABLED && messageRaw?.message?.audioMessage) {\n        const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({\n          where: { instanceId: this.instanceId },\n          include: { OpenaiCreds: true },\n        });\n\n        if (openAiDefaultSettings && openAiDefaultSettings.openaiCredsId && openAiDefaultSettings.speechToText) {\n          messageRaw.message.speechToText = `[audio] ${await this.openaiService.speechToText(messageRaw, this)}`;\n        }\n      }\n\n      if (this.configService.get<Database>('DATABASE').SAVE_DATA.NEW_MESSAGE) {\n        const msg = await this.prismaRepository.message.create({ data: messageRaw });\n\n        if (isMedia && this.configService.get<S3>('S3').ENABLE) {\n          try {\n            if (isVideo && !this.configService.get<S3>('S3').SAVE_VIDEO) {\n              throw new Error('Video upload is disabled.');\n            }\n\n            const message: any = messageRaw;\n\n            // Verificação adicional para garantir que há conteúdo de mídia real\n            const hasRealMedia = this.hasValidMediaContent(message);\n\n            if (!hasRealMedia) {\n              this.logger.warn('Message detected as media but contains no valid media content');\n            } else {\n              const media = await this.getBase64FromMediaMessage({ message }, true);\n\n              if (!media) {\n                this.logger.verbose('No valid media to upload (messageContextInfo only), skipping MinIO');\n                return;\n              }\n\n              const { buffer, mediaType, fileName, size } = media;\n\n              const mimetype = mimeTypes.lookup(fileName).toString();\n\n              const fullName = join(\n                `${this.instance.id}`,\n                messageRaw.key.remoteJid,\n                `${messageRaw.key.id}`,\n                mediaType,\n                fileName,\n              );\n\n              await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });\n\n              await this.prismaRepository.media.create({\n                data: { messageId: msg.id, instanceId: this.instanceId, type: mediaType, fileName: fullName, mimetype },\n              });\n\n              const mediaUrl = await s3Service.getObjectUrl(fullName);\n\n              messageRaw.message.mediaUrl = mediaUrl;\n\n              await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });\n            }\n          } catch (error) {\n            this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);\n          }\n        }\n      }\n\n      if (this.localWebhook.enabled) {\n        if (isMedia && this.localWebhook.webhookBase64) {\n          try {\n            const buffer = await downloadMediaMessage(\n              { key: messageRaw.key, message: messageRaw?.message },\n              'buffer',\n              {},\n              { logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },\n            );\n\n            if (buffer) {\n              messageRaw.message.base64 = buffer.toString('base64');\n            } else {\n              // retry to download media\n              const buffer = await downloadMediaMessage(\n                { key: messageRaw.key, message: messageRaw?.message },\n                'buffer',\n                {},\n                { logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },\n              );\n\n              if (buffer) {\n                messageRaw.message.base64 = buffer.toString('base64');\n              }\n            }\n          } catch (error) {\n            this.logger.error(['Error converting media to base64', error?.message]);\n          }\n        }\n      }\n\n      this.logger.verbose(messageSent);\n\n      this.sendDataWebhook(Events.SEND_MESSAGE, messageRaw);\n\n      if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled && isIntegration) {\n        await chatbotController.emit({\n          instance: { instanceName: this.instance.name, instanceId: this.instanceId },\n          remoteJid: messageRaw.key.remoteJid,\n          msg: messageRaw,\n          pushName: messageRaw.pushName,\n          isIntegration,\n        });\n      }\n\n      return messageRaw;\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  // Instance Controller\n  public async sendPresence(data: SendPresenceDto) {\n    try {\n      const { number } = data;\n\n      const isWA = (await this.whatsappNumber({ numbers: [number] }))?.shift();\n\n      if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) {\n        throw new BadRequestException(isWA);\n      }\n\n      const sender = isWA.jid;\n\n      if (data?.delay && data?.delay > 20000) {\n        let remainingDelay = data?.delay;\n        while (remainingDelay > 20000) {\n          await this.client.presenceSubscribe(sender);\n\n          await this.client.sendPresenceUpdate((data?.presence as WAPresence) ?? 'composing', sender);\n\n          await delay(20000);\n\n          await this.client.sendPresenceUpdate('paused', sender);\n\n          remainingDelay -= 20000;\n        }\n        if (remainingDelay > 0) {\n          await this.client.presenceSubscribe(sender);\n\n          await this.client.sendPresenceUpdate((data?.presence as WAPresence) ?? 'composing', sender);\n\n          await delay(remainingDelay);\n\n          await this.client.sendPresenceUpdate('paused', sender);\n        }\n      } else {\n        await this.client.presenceSubscribe(sender);\n\n        await this.client.sendPresenceUpdate((data?.presence as WAPresence) ?? 'composing', sender);\n\n        await delay(data?.delay);\n\n        await this.client.sendPresenceUpdate('paused', sender);\n      }\n\n      return { presence: data.presence };\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  // Presence Controller\n  public async setPresence(data: SetPresenceDto) {\n    try {\n      await this.client.sendPresenceUpdate(data.presence);\n\n      return { presence: data.presence };\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  // Send Message Controller\n  public async textMessage(data: SendTextDto, isIntegration = false) {\n    const text = data.text;\n\n    if (!text || text.trim().length === 0) {\n      throw new BadRequestException('Text is required');\n    }\n\n    return await this.sendMessageWithTyping(\n      data.number,\n      { conversation: data.text },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n  }\n\n  public async pollMessage(data: SendPollDto) {\n    return await this.sendMessageWithTyping(\n      data.number,\n      { poll: { name: data.name, selectableCount: data.selectableCount, values: data.values } },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        linkPreview: data?.linkPreview,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  private async formatStatusMessage(status: StatusMessage) {\n    if (!status.type) {\n      throw new BadRequestException('Type is required');\n    }\n\n    if (!status.content) {\n      throw new BadRequestException('Content is required');\n    }\n\n    if (status.allContacts) {\n      const contacts = await this.prismaRepository.contact.findMany({ where: { instanceId: this.instanceId } });\n\n      if (!contacts.length) {\n        throw new BadRequestException('Contacts not found');\n      }\n\n      status.statusJidList = contacts.filter((contact) => contact.pushName).map((contact) => contact.remoteJid);\n    }\n\n    if (!status.statusJidList?.length && !status.allContacts) {\n      throw new BadRequestException('StatusJidList is required');\n    }\n\n    if (status.type === 'text') {\n      if (!status.backgroundColor) {\n        throw new BadRequestException('Background color is required');\n      }\n\n      if (!status.font) {\n        throw new BadRequestException('Font is required');\n      }\n\n      return {\n        content: { text: status.content },\n        option: { backgroundColor: status.backgroundColor, font: status.font, statusJidList: status.statusJidList },\n      };\n    }\n    if (status.type === 'image') {\n      return {\n        content: { image: { url: status.content }, caption: status.caption },\n        option: { statusJidList: status.statusJidList },\n      };\n    }\n\n    if (status.type === 'video') {\n      return {\n        content: { video: { url: status.content }, caption: status.caption },\n        option: { statusJidList: status.statusJidList },\n      };\n    }\n\n    if (status.type === 'audio') {\n      const convert = await this.processAudioMp4(status.content);\n      if (Buffer.isBuffer(convert)) {\n        const result = {\n          content: { audio: convert, ptt: true, mimetype: 'audio/ogg; codecs=opus' },\n          option: { statusJidList: status.statusJidList },\n        };\n\n        return result;\n      } else {\n        throw new InternalServerErrorException(convert);\n      }\n    }\n\n    throw new BadRequestException('Type not found');\n  }\n\n  public async statusMessage(data: SendStatusDto, file?: any) {\n    const mediaData: SendStatusDto = { ...data };\n\n    if (file) mediaData.content = file.buffer.toString('base64');\n\n    const status = await this.formatStatusMessage(mediaData);\n\n    const statusSent = await this.sendMessageWithTyping('status@broadcast', { status });\n\n    return statusSent;\n  }\n\n  private async prepareMediaMessage(mediaMessage: MediaMessage) {\n    try {\n      const type = mediaMessage.mediatype === 'ptv' ? 'video' : mediaMessage.mediatype;\n\n      let mediaInput: any;\n      if (mediaMessage.mediatype === 'image') {\n        let imageBuffer: Buffer;\n        if (isURL(mediaMessage.media)) {\n          let config: any = { responseType: 'arraybuffer' };\n\n          if (this.localProxy?.enabled) {\n            config = {\n              ...config,\n              httpsAgent: makeProxyAgent({\n                host: this.localProxy.host,\n                port: this.localProxy.port,\n                protocol: this.localProxy.protocol,\n                username: this.localProxy.username,\n                password: this.localProxy.password,\n              }),\n            };\n          }\n\n          const response = await axios.get(mediaMessage.media, config);\n          imageBuffer = Buffer.from(response.data, 'binary');\n        } else {\n          imageBuffer = Buffer.from(mediaMessage.media, 'base64');\n        }\n\n        mediaInput = await sharp(imageBuffer).jpeg().toBuffer();\n        mediaMessage.fileName ??= 'image.jpg';\n        mediaMessage.mimetype = 'image/jpeg';\n      } else {\n        mediaInput = isURL(mediaMessage.media)\n          ? { url: mediaMessage.media }\n          : Buffer.from(mediaMessage.media, 'base64');\n      }\n\n      const prepareMedia = await prepareWAMessageMedia(\n        {\n          [type]: mediaInput,\n        } as any,\n        { upload: this.client.waUploadToServer },\n      );\n\n      const mediaType = mediaMessage.mediatype + 'Message';\n\n      if (mediaMessage.mediatype === 'document' && !mediaMessage.fileName) {\n        const regex = new RegExp(/.*\\/(.+?)\\./);\n        const arrayMatch = regex.exec(mediaMessage.media);\n        mediaMessage.fileName = arrayMatch[1];\n      }\n\n      if (mediaMessage.mediatype === 'image' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'image.jpg';\n      }\n\n      if (mediaMessage.mediatype === 'video' && !mediaMessage.fileName) {\n        mediaMessage.fileName = 'video.mp4';\n      }\n\n      let mimetype: string | false;\n\n      if (mediaMessage.mimetype) {\n        mimetype = mediaMessage.mimetype;\n      } else {\n        mimetype = mimeTypes.lookup(mediaMessage.fileName);\n\n        if (!mimetype && isURL(mediaMessage.media)) {\n          let config: any = { responseType: 'arraybuffer' };\n\n          if (this.localProxy?.enabled) {\n            config = {\n              ...config,\n              httpsAgent: makeProxyAgent({\n                host: this.localProxy.host,\n                port: this.localProxy.port,\n                protocol: this.localProxy.protocol,\n                username: this.localProxy.username,\n                password: this.localProxy.password,\n              }),\n            };\n          }\n\n          const response = await axios.get(mediaMessage.media, config);\n\n          mimetype = response.headers['content-type'];\n        }\n      }\n\n      if (mediaMessage.mediatype === 'ptv') {\n        prepareMedia[mediaType] = prepareMedia[type + 'Message'];\n        mimetype = 'video/mp4';\n\n        if (!prepareMedia[mediaType]) {\n          throw new Error('Failed to prepare video message');\n        }\n\n        try {\n          let mediaInput;\n          if (isURL(mediaMessage.media)) {\n            mediaInput = mediaMessage.media;\n          } else {\n            const mediaBuffer = Buffer.from(mediaMessage.media, 'base64');\n            if (!mediaBuffer || mediaBuffer.length === 0) {\n              throw new Error('Invalid media buffer');\n            }\n            mediaInput = mediaBuffer;\n          }\n\n          const duration = await getVideoDuration(mediaInput);\n          if (!duration || duration <= 0) {\n            throw new Error('Invalid media duration');\n          }\n\n          this.logger.verbose(`Video duration: ${duration} seconds`);\n          prepareMedia[mediaType].seconds = duration;\n        } catch (error) {\n          this.logger.error('Error getting video duration:');\n          this.logger.error(error);\n          throw new Error(`Failed to get video duration: ${error.message}`);\n        }\n      }\n\n      if (mediaMessage?.fileName) {\n        mimetype = mimeTypes.lookup(mediaMessage.fileName).toString();\n        if (mimetype === 'application/mp4') {\n          mimetype = 'video/mp4';\n        }\n      }\n\n      prepareMedia[mediaType].caption = mediaMessage?.caption;\n      prepareMedia[mediaType].mimetype = mimetype;\n      prepareMedia[mediaType].fileName = mediaMessage.fileName;\n\n      if (mediaMessage.mediatype === 'video') {\n        prepareMedia[mediaType].gifPlayback = false;\n      }\n\n      return generateWAMessageFromContent(\n        '',\n        { [mediaType]: { ...prepareMedia[mediaType] } },\n        { userJid: this.instance.wuid },\n      );\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException(error?.toString() || error);\n    }\n  }\n\n  private async convertToWebP(image: string): Promise<Buffer> {\n    try {\n      let imageBuffer: Buffer;\n\n      if (isBase64(image)) {\n        const base64Data = image.replace(/^data:image\\/(jpeg|png|gif);base64,/, '');\n        imageBuffer = Buffer.from(base64Data, 'base64');\n      } else {\n        const timestamp = new Date().getTime();\n        const parsedURL = new URL(image);\n        parsedURL.searchParams.set('timestamp', timestamp.toString());\n        const url = parsedURL.toString();\n\n        let config: any = { responseType: 'arraybuffer' };\n\n        if (this.localProxy?.enabled) {\n          config = {\n            ...config,\n            httpsAgent: makeProxyAgent({\n              host: this.localProxy.host,\n              port: this.localProxy.port,\n              protocol: this.localProxy.protocol,\n              username: this.localProxy.username,\n              password: this.localProxy.password,\n            }),\n          };\n        }\n\n        const response = await axios.get(url, config);\n        imageBuffer = Buffer.from(response.data, 'binary');\n      }\n\n      const isAnimated = this.isAnimated(image, imageBuffer);\n\n      if (isAnimated) {\n        return await sharp(imageBuffer, { animated: true }).webp({ quality: 80 }).toBuffer();\n      } else {\n        return await sharp(imageBuffer).webp().toBuffer();\n      }\n    } catch (error) {\n      console.error('Erro ao converter a imagem para WebP:', error);\n      throw error;\n    }\n  }\n\n  private isAnimatedWebp(buffer: Buffer): boolean {\n    if (buffer.length < 12) return false;\n\n    return buffer.indexOf(Buffer.from('ANIM')) !== -1;\n  }\n\n  private isAnimated(image: string, buffer: Buffer): boolean {\n    const lowerCaseImage = image.toLowerCase();\n\n    if (lowerCaseImage.includes('.gif')) return true;\n\n    if (lowerCaseImage.includes('.webp')) return this.isAnimatedWebp(buffer);\n\n    return false;\n  }\n\n  public async mediaSticker(data: SendStickerDto, file?: any) {\n    const mediaData: SendStickerDto = { ...data };\n\n    if (file) mediaData.sticker = file.buffer.toString('base64');\n\n    const convert = data?.notConvertSticker\n      ? Buffer.from(data.sticker, 'base64')\n      : await this.convertToWebP(data.sticker);\n    const gifPlayback = data.sticker.includes('.gif');\n    const result = await this.sendMessageWithTyping(\n      data.number,\n      { sticker: convert, gifPlayback },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n\n    return result;\n  }\n\n  public async mediaMessage(data: SendMediaDto, file?: any, isIntegration = false) {\n    const mediaData: SendMediaDto = { ...data };\n\n    if (file) mediaData.media = file.buffer.toString('base64');\n\n    const generate = await this.prepareMediaMessage(mediaData);\n\n    const mediaSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...generate.message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n\n    return mediaSent;\n  }\n\n  public async ptvMessage(data: SendPtvDto, file?: any, isIntegration = false) {\n    const mediaData: SendMediaDto = {\n      number: data.number,\n      media: data.video,\n      mediatype: 'ptv',\n      delay: data?.delay,\n      quoted: data?.quoted,\n      mentionsEveryOne: data?.mentionsEveryOne,\n      mentioned: data?.mentioned,\n    };\n\n    if (file) mediaData.media = file.buffer.toString('base64');\n\n    const generate = await this.prepareMediaMessage(mediaData);\n\n    const mediaSent = await this.sendMessageWithTyping(\n      data.number,\n      { ...generate.message },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n      isIntegration,\n    );\n\n    return mediaSent;\n  }\n\n  public async processAudioMp4(audio: string) {\n    let inputStream: PassThrough;\n\n    if (isURL(audio)) {\n      const response = await axios.get(audio, { responseType: 'stream' });\n      inputStream = response.data;\n    } else {\n      const audioBuffer = Buffer.from(audio, 'base64');\n      inputStream = new PassThrough();\n      inputStream.end(audioBuffer);\n    }\n\n    return new Promise<Buffer>((resolve, reject) => {\n      const ffmpegProcess = spawn(ffmpegPath.path, [\n        '-i',\n        'pipe:0',\n        '-vn',\n        '-ab',\n        '128k',\n        '-ar',\n        '44100',\n        '-f',\n        'mp4',\n        '-movflags',\n        'frag_keyframe+empty_moov',\n        'pipe:1',\n      ]);\n\n      const outputChunks: Buffer[] = [];\n      let stderrData = '';\n\n      ffmpegProcess.stdout.on('data', (chunk) => {\n        outputChunks.push(chunk);\n      });\n\n      ffmpegProcess.stderr.on('data', (data) => {\n        stderrData += data.toString();\n        this.logger.verbose(`ffmpeg stderr: ${data}`);\n      });\n\n      ffmpegProcess.on('error', (error) => {\n        console.error('Error in ffmpeg process', error);\n        reject(error);\n      });\n\n      ffmpegProcess.on('close', (code) => {\n        if (code === 0) {\n          this.logger.verbose('Audio converted to mp4');\n          const outputBuffer = Buffer.concat(outputChunks);\n          resolve(outputBuffer);\n        } else {\n          this.logger.error(`ffmpeg exited with code ${code}`);\n          this.logger.error(`ffmpeg stderr: ${stderrData}`);\n          reject(new Error(`ffmpeg exited with code ${code}: ${stderrData}`));\n        }\n      });\n\n      inputStream.pipe(ffmpegProcess.stdin);\n\n      inputStream.on('error', (err) => {\n        console.error('Error in inputStream', err);\n        ffmpegProcess.stdin.end();\n        reject(err);\n      });\n    });\n  }\n\n  public async processAudio(audio: string): Promise<Buffer> {\n    const audioConverterConfig = this.configService.get<AudioConverter>('AUDIO_CONVERTER');\n    if (audioConverterConfig.API_URL) {\n      this.logger.verbose('Using audio converter API');\n      const formData = new FormData();\n\n      if (isURL(audio)) {\n        formData.append('url', audio);\n      } else {\n        formData.append('base64', audio);\n      }\n\n      const { data } = await axios.post(audioConverterConfig.API_URL, formData, {\n        headers: { ...formData.getHeaders(), apikey: audioConverterConfig.API_KEY },\n      });\n\n      if (!data.audio) {\n        throw new InternalServerErrorException('Failed to convert audio');\n      }\n\n      this.logger.verbose('Audio converted');\n      return Buffer.from(data.audio, 'base64');\n    } else {\n      let inputAudioStream: PassThrough;\n\n      if (isURL(audio)) {\n        const timestamp = new Date().getTime();\n        const parsedURL = new URL(audio);\n        parsedURL.searchParams.set('timestamp', timestamp.toString());\n        const url = parsedURL.toString();\n\n        const config: any = { responseType: 'stream' };\n\n        const response = await axios.get(url, config);\n        inputAudioStream = response.data.pipe(new PassThrough());\n      } else {\n        const audioBuffer = Buffer.from(audio, 'base64');\n        inputAudioStream = new PassThrough();\n        inputAudioStream.end(audioBuffer);\n      }\n\n      const isLpcm = isURL(audio) && /\\.lpcm($|\\?)/i.test(audio);\n\n      return new Promise((resolve, reject) => {\n        const outputAudioStream = new PassThrough();\n        const chunks: Buffer[] = [];\n\n        outputAudioStream.on('data', (chunk) => chunks.push(chunk));\n        outputAudioStream.on('end', () => {\n          const outputBuffer = Buffer.concat(chunks);\n          resolve(outputBuffer);\n        });\n\n        outputAudioStream.on('error', (error) => {\n          console.log('error', error);\n          reject(error);\n        });\n\n        ffmpeg.setFfmpegPath(ffmpegPath.path);\n\n        let command = ffmpeg(inputAudioStream);\n\n        if (isLpcm) {\n          this.logger.verbose('Detected LPCM input – applying raw PCM settings');\n          command = command.inputFormat('s16le').inputOptions(['-ar', '24000', '-ac', '1']);\n        }\n\n        command\n          .outputFormat('ogg')\n          .noVideo()\n          .audioCodec('libopus')\n          .addOutputOptions('-avoid_negative_ts make_zero')\n          .audioBitrate('128k')\n          .audioFrequency(48000)\n          .audioChannels(1)\n          .outputOptions([\n            '-write_xing',\n            '0',\n            '-compression_level',\n            '10',\n            '-application',\n            'voip',\n            '-fflags',\n            '+bitexact',\n            '-flags',\n            '+bitexact',\n            '-id3v2_version',\n            '0',\n            '-map_metadata',\n            '-1',\n            '-map_chapters',\n            '-1',\n            '-write_bext',\n            '0',\n          ])\n          .pipe(outputAudioStream, { end: true })\n          .on('error', function (error) {\n            console.log('error', error);\n            reject(error);\n          });\n      });\n    }\n  }\n\n  public async audioWhatsapp(data: SendAudioDto, file?: any, isIntegration = false) {\n    const mediaData: SendAudioDto = { ...data };\n\n    if (file?.buffer) {\n      mediaData.audio = file.buffer.toString('base64');\n    } else if (!isURL(data.audio) && !isBase64(data.audio)) {\n      console.error('Invalid file or audio source');\n      throw new BadRequestException('File buffer, URL, or base64 audio is required');\n    }\n\n    if (!data?.encoding && data?.encoding !== false) {\n      data.encoding = true;\n    }\n\n    if (data?.encoding) {\n      const convert = await this.processAudio(mediaData.audio);\n\n      if (Buffer.isBuffer(convert)) {\n        const result = this.sendMessageWithTyping<AnyMessageContent>(\n          data.number,\n          { audio: convert, ptt: true, mimetype: 'audio/ogg; codecs=opus' },\n          { presence: 'recording', delay: data?.delay },\n          isIntegration,\n        );\n\n        return result;\n      } else {\n        throw new InternalServerErrorException('Failed to convert audio');\n      }\n    }\n\n    return await this.sendMessageWithTyping<AnyMessageContent>(\n      data.number,\n      {\n        audio: isURL(data.audio) ? { url: data.audio } : Buffer.from(data.audio, 'base64'),\n        ptt: true,\n        mimetype: 'audio/ogg; codecs=opus',\n      },\n      { presence: 'recording', delay: data?.delay },\n      isIntegration,\n    );\n  }\n\n  private generateRandomId(length = 11) {\n    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n    let result = '';\n    for (let i = 0; i < length; i++) {\n      result += characters.charAt(Math.floor(Math.random() * characters.length));\n    }\n    return result;\n  }\n\n  private toJSONString(button: Button): string {\n    const toString = (obj: any) => JSON.stringify(obj);\n\n    const json = {\n      call: () => toString({ display_text: button.displayText, phone_number: button.phoneNumber }),\n      reply: () => toString({ display_text: button.displayText, id: button.id }),\n      copy: () => toString({ display_text: button.displayText, copy_code: button.copyCode }),\n      url: () => toString({ display_text: button.displayText, url: button.url, merchant_url: button.url }),\n      pix: () =>\n        toString({\n          currency: button.currency,\n          total_amount: { value: 0, offset: 100 },\n          reference_id: this.generateRandomId(),\n          type: 'physical-goods',\n          order: {\n            status: 'pending',\n            subtotal: { value: 0, offset: 100 },\n            order_type: 'ORDER',\n            items: [\n              { name: '', amount: { value: 0, offset: 100 }, quantity: 0, sale_amount: { value: 0, offset: 100 } },\n            ],\n          },\n          payment_settings: [\n            {\n              type: 'pix_static_code',\n              pix_static_code: {\n                merchant_name: button.name,\n                key: button.key,\n                key_type: this.mapKeyType.get(button.keyType),\n              },\n            },\n          ],\n          share_payment_status: false,\n        }),\n    };\n\n    return json[button.type]?.() || '';\n  }\n\n  private readonly mapType = new Map<TypeButton, string>([\n    ['reply', 'quick_reply'],\n    ['copy', 'cta_copy'],\n    ['url', 'cta_url'],\n    ['call', 'cta_call'],\n    ['pix', 'payment_info'],\n  ]);\n\n  private readonly mapKeyType = new Map<KeyType, string>([\n    ['phone', 'PHONE'],\n    ['email', 'EMAIL'],\n    ['cpf', 'CPF'],\n    ['cnpj', 'CNPJ'],\n    ['random', 'EVP'],\n  ]);\n\n  public async buttonMessage(data: SendButtonsDto) {\n    if (data.buttons.length === 0) {\n      throw new BadRequestException('At least one button is required');\n    }\n\n    const hasReplyButtons = data.buttons.some((btn) => btn.type === 'reply');\n\n    const hasPixButton = data.buttons.some((btn) => btn.type === 'pix');\n\n    const hasOtherButtons = data.buttons.some((btn) => btn.type !== 'reply' && btn.type !== 'pix');\n\n    if (hasReplyButtons) {\n      if (data.buttons.length > 3) {\n        throw new BadRequestException('Maximum of 3 reply buttons allowed');\n      }\n      if (hasOtherButtons) {\n        throw new BadRequestException('Reply buttons cannot be mixed with other button types');\n      }\n    }\n\n    if (hasPixButton) {\n      if (data.buttons.length > 1) {\n        throw new BadRequestException('Only one PIX button is allowed');\n      }\n      if (hasOtherButtons) {\n        throw new BadRequestException('PIX button cannot be mixed with other button types');\n      }\n\n      const message: proto.IMessage = {\n        viewOnceMessage: {\n          message: {\n            interactiveMessage: {\n              nativeFlowMessage: {\n                buttons: [{ name: this.mapType.get('pix'), buttonParamsJson: this.toJSONString(data.buttons[0]) }],\n                messageParamsJson: JSON.stringify({ from: 'api', templateId: v4() }),\n              },\n            },\n          },\n        },\n      };\n\n      return await this.sendMessageWithTyping(data.number, message, {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      });\n    }\n\n    const generate = await (async () => {\n      if (data?.thumbnailUrl) {\n        return await this.prepareMediaMessage({ mediatype: 'image', media: data.thumbnailUrl });\n      }\n    })();\n\n    const buttons = data.buttons.map((value) => {\n      return { name: this.mapType.get(value.type), buttonParamsJson: this.toJSONString(value) };\n    });\n\n    const message: proto.IMessage = {\n      viewOnceMessage: {\n        message: {\n          interactiveMessage: {\n            body: {\n              text: (() => {\n                let t = '*' + data.title + '*';\n                if (data?.description) {\n                  t += '\\n\\n';\n                  t += data.description;\n                  t += '\\n';\n                }\n                return t;\n              })(),\n            },\n            footer: { text: data?.footer },\n            header: (() => {\n              if (generate?.message?.imageMessage) {\n                return {\n                  hasMediaAttachment: !!generate.message.imageMessage,\n                  imageMessage: generate.message.imageMessage,\n                };\n              }\n            })(),\n            nativeFlowMessage: {\n              buttons: buttons,\n              messageParamsJson: JSON.stringify({ from: 'api', templateId: v4() }),\n            },\n          },\n        },\n      },\n    };\n\n    return await this.sendMessageWithTyping(data.number, message, {\n      delay: data?.delay,\n      presence: 'composing',\n      quoted: data?.quoted,\n      mentionsEveryOne: data?.mentionsEveryOne,\n      mentioned: data?.mentioned,\n    });\n  }\n\n  public async locationMessage(data: SendLocationDto) {\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        locationMessage: {\n          degreesLatitude: data.latitude,\n          degreesLongitude: data.longitude,\n          name: data?.name,\n          address: data?.address,\n        },\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  public async listMessage(data: SendListDto) {\n    return await this.sendMessageWithTyping(\n      data.number,\n      {\n        listMessage: {\n          title: data.title,\n          description: data.description,\n          buttonText: data?.buttonText,\n          footerText: data?.footerText,\n          sections: data.sections,\n          listType: 2,\n        },\n      },\n      {\n        delay: data?.delay,\n        presence: 'composing',\n        quoted: data?.quoted,\n        mentionsEveryOne: data?.mentionsEveryOne,\n        mentioned: data?.mentioned,\n      },\n    );\n  }\n\n  public async contactMessage(data: SendContactDto) {\n    const message: proto.IMessage = {};\n\n    const vcard = (contact: ContactMessage) => {\n      let result = 'BEGIN:VCARD\\n' + 'VERSION:3.0\\n' + `N:${contact.fullName}\\n` + `FN:${contact.fullName}\\n`;\n\n      if (contact.organization) {\n        result += `ORG:${contact.organization};\\n`;\n      }\n\n      if (contact.email) {\n        result += `EMAIL:${contact.email}\\n`;\n      }\n\n      if (contact.url) {\n        result += `URL:${contact.url}\\n`;\n      }\n\n      if (!contact.wuid) {\n        contact.wuid = createJid(contact.phoneNumber);\n      }\n\n      result += `item1.TEL;waid=${contact.wuid}:${contact.phoneNumber}\\n` + 'item1.X-ABLabel:Celular\\n' + 'END:VCARD';\n\n      return result;\n    };\n\n    if (data.contact.length === 1) {\n      message.contactMessage = { displayName: data.contact[0].fullName, vcard: vcard(data.contact[0]) };\n    } else {\n      message.contactsArrayMessage = {\n        displayName: `${data.contact.length} contacts`,\n        contacts: data.contact.map((contact) => {\n          return { displayName: contact.fullName, vcard: vcard(contact) };\n        }),\n      };\n    }\n\n    return await this.sendMessageWithTyping(data.number, { ...message }, {});\n  }\n\n  public async reactionMessage(data: SendReactionDto) {\n    return await this.sendMessageWithTyping(data.key.remoteJid, {\n      reactionMessage: { key: data.key, text: data.reaction },\n    });\n  }\n\n  // Chat Controller\n  public async whatsappNumber(data: WhatsAppNumberDto) {\n    const jids: {\n      groups: { number: string; jid: string }[];\n      broadcast: { number: string; jid: string }[];\n      users: { number: string; jid: string; name?: string }[];\n    } = { groups: [], broadcast: [], users: [] };\n\n    data.numbers.forEach((number) => {\n      const jid = createJid(number);\n\n      if (isJidGroup(jid)) {\n        jids.groups.push({ number, jid });\n      } else if (jid === 'status@broadcast') {\n        jids.broadcast.push({ number, jid });\n      } else {\n        jids.users.push({ number, jid });\n      }\n    });\n\n    const onWhatsapp: OnWhatsAppDto[] = [];\n\n    // BROADCAST\n    onWhatsapp.push(...jids.broadcast.map(({ jid, number }) => new OnWhatsAppDto(jid, false, number)));\n\n    // GROUPS\n    const groups = await Promise.all(\n      jids.groups.map(async ({ jid, number }) => {\n        const group = await this.findGroup({ groupJid: jid }, 'inner');\n\n        if (!group) {\n          return new OnWhatsAppDto(jid, false, number);\n        }\n\n        return new OnWhatsAppDto(group.id, true, number, group?.subject);\n      }),\n    );\n    onWhatsapp.push(...groups);\n\n    // USERS\n    const contacts: any[] = await this.prismaRepository.contact.findMany({\n      where: { instanceId: this.instanceId, remoteJid: { in: jids.users.map(({ jid }) => jid) } },\n    });\n\n    // Unified cache verification for all numbers (normal and LID)\n    const numbersToVerify = jids.users.map(({ jid }) => jid.replace('+', ''));\n\n    // Get all numbers from cache\n    const cachedNumbers = await getOnWhatsappCache(numbersToVerify);\n\n    // Separate numbers that are and are not in cache\n    const cachedJids = new Set(cachedNumbers.flatMap((cached) => cached.jidOptions));\n    const numbersNotInCache = numbersToVerify.filter((jid) => !cachedJids.has(jid));\n\n    // Only call Baileys for normal numbers (@s.whatsapp.net) that are not in cache\n    let verify: { jid: string; exists: boolean }[] = [];\n    const normalNumbersNotInCache = numbersNotInCache.filter((jid) => !jid.includes('@lid'));\n\n    if (normalNumbersNotInCache.length > 0) {\n      this.logger.verbose(`Checking ${normalNumbersNotInCache.length} numbers via Baileys (not found in cache)`);\n      verify = await this.client.onWhatsApp(...normalNumbersNotInCache);\n    }\n\n    const verifiedUsers = await Promise.all(\n      jids.users.map(async (user) => {\n        // Try to get from cache first (works for all: normal and LID)\n        const cached = cachedNumbers.find((cached) => cached.jidOptions.includes(user.jid.replace('+', '')));\n\n        if (cached) {\n          this.logger.verbose(`Number ${user.number} found in cache`);\n          return new OnWhatsAppDto(\n            cached.remoteJid,\n            true,\n            user.number,\n            contacts.find((c) => c.remoteJid === cached.remoteJid)?.pushName,\n            cached.lid || (cached.remoteJid.includes('@lid') ? 'lid' : undefined),\n          );\n        }\n\n        // If it's a LID number and not in cache, consider it valid\n        if (user.jid.includes('@lid')) {\n          return new OnWhatsAppDto(\n            user.jid,\n            true,\n            user.number,\n            contacts.find((c) => c.remoteJid === user.jid)?.pushName,\n            'lid',\n          );\n        }\n\n        // If not in cache and is a normal number, use Baileys verification\n        let numberVerified: (typeof verify)[0] | null = null;\n\n        // Brazilian numbers\n        if (user.number.startsWith('55')) {\n          const numberWithDigit =\n            user.number.slice(4, 5) === '9' && user.number.length === 13\n              ? user.number\n              : `${user.number.slice(0, 4)}9${user.number.slice(4)}`;\n          const numberWithoutDigit =\n            user.number.length === 12 ? user.number : user.number.slice(0, 4) + user.number.slice(5);\n\n          numberVerified = verify.find(\n            (v) => v.jid === `${numberWithDigit}@s.whatsapp.net` || v.jid === `${numberWithoutDigit}@s.whatsapp.net`,\n          );\n        }\n\n        // Mexican/Argentina numbers\n        // Ref: https://faq.whatsapp.com/1294841057948784\n        if (!numberVerified && (user.number.startsWith('52') || user.number.startsWith('54'))) {\n          let prefix = '';\n          if (user.number.startsWith('52')) {\n            prefix = '1';\n          }\n          if (user.number.startsWith('54')) {\n            prefix = '9';\n          }\n\n          const numberWithDigit =\n            user.number.slice(2, 3) === prefix && user.number.length === 13\n              ? user.number\n              : `${user.number.slice(0, 2)}${prefix}${user.number.slice(2)}`;\n          const numberWithoutDigit =\n            user.number.length === 12 ? user.number : user.number.slice(0, 2) + user.number.slice(3);\n\n          numberVerified = verify.find(\n            (v) => v.jid === `${numberWithDigit}@s.whatsapp.net` || v.jid === `${numberWithoutDigit}@s.whatsapp.net`,\n          );\n        }\n\n        if (!numberVerified) {\n          numberVerified = verify.find((v) => v.jid === user.jid);\n        }\n\n        const numberJid = numberVerified?.jid || user.jid;\n\n        return new OnWhatsAppDto(\n          numberJid,\n          !!numberVerified?.exists,\n          user.number,\n          contacts.find((c) => c.remoteJid === numberJid)?.pushName,\n          undefined,\n        );\n      }),\n    );\n\n    // Combine results\n    onWhatsapp.push(...verifiedUsers);\n\n    // TODO: Salvar no cache apenas números que NÃO estavam no cache\n    const numbersToCache = onWhatsapp.filter((user) => {\n      if (!user.exists) return false;\n      // Verifica se estava no cache usando jidOptions\n      const cached = cachedNumbers?.find((cached) => cached.jidOptions.includes(user.jid.replace('+', '')));\n      return !cached;\n    });\n\n    if (numbersToCache.length > 0) {\n      this.logger.verbose(`Salvando ${numbersToCache.length} números no cache`);\n      await saveOnWhatsappCache(\n        numbersToCache.map((user) => ({\n          remoteJid: user.jid,\n          lid: user.lid === 'lid' ? 'lid' : undefined,\n        })),\n      );\n    }\n\n    return onWhatsapp;\n  }\n\n  public async markMessageAsRead(data: ReadMessageDto) {\n    try {\n      const keys: proto.IMessageKey[] = [];\n      data.readMessages.forEach((read) => {\n        if (isJidGroup(read.remoteJid) || isPnUser(read.remoteJid)) {\n          keys.push({ remoteJid: read.remoteJid, fromMe: read.fromMe, id: read.id });\n        }\n      });\n      await this.client.readMessages(keys);\n      return { message: 'Read messages', read: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Read messages fail', error.toString());\n    }\n  }\n\n  public async getLastMessage(number: string) {\n    const where: any = { key: { remoteJid: number }, instanceId: this.instance.id };\n\n    const messages = await this.prismaRepository.message.findMany({\n      where,\n      orderBy: { messageTimestamp: 'desc' },\n      take: 1,\n    });\n\n    if (messages.length === 0) {\n      throw new NotFoundException('Messages not found');\n    }\n\n    let lastMessage = messages.pop();\n\n    for (const message of messages) {\n      if (message.messageTimestamp >= lastMessage.messageTimestamp) {\n        lastMessage = message;\n      }\n    }\n\n    return lastMessage as unknown as LastMessage;\n  }\n\n  public async archiveChat(data: ArchiveChatDto) {\n    try {\n      let last_message = data.lastMessage;\n      let number = data.chat;\n\n      if (!last_message && number) {\n        last_message = await this.getLastMessage(number);\n      } else {\n        last_message = data.lastMessage;\n        last_message.messageTimestamp = last_message?.messageTimestamp ?? Date.now();\n        number = last_message?.key?.remoteJid;\n      }\n\n      if (!last_message || Object.keys(last_message).length === 0) {\n        throw new NotFoundException('Last message not found');\n      }\n\n      await this.client.chatModify({ archive: data.archive, lastMessages: [last_message] }, createJid(number));\n\n      return { chatId: number, archived: true };\n    } catch (error) {\n      throw new InternalServerErrorException({\n        archived: false,\n        message: ['An error occurred while archiving the chat. Open a calling.', error.toString()],\n      });\n    }\n  }\n\n  public async markChatUnread(data: MarkChatUnreadDto) {\n    try {\n      let last_message = data.lastMessage;\n      let number = data.chat;\n\n      if (!last_message && number) {\n        last_message = await this.getLastMessage(number);\n      } else {\n        last_message = data.lastMessage;\n        last_message.messageTimestamp = last_message?.messageTimestamp ?? Date.now();\n        number = last_message?.key?.remoteJid;\n      }\n\n      if (!last_message || Object.keys(last_message).length === 0) {\n        throw new NotFoundException('Last message not found');\n      }\n\n      await this.client.chatModify({ markRead: false, lastMessages: [last_message] }, createJid(number));\n\n      return { chatId: number, markedChatUnread: true };\n    } catch (error) {\n      throw new InternalServerErrorException({\n        markedChatUnread: false,\n        message: ['An error occurred while marked unread the chat. Open a calling.', error.toString()],\n      });\n    }\n  }\n\n  public async deleteMessage(del: DeleteMessage) {\n    try {\n      const response = await this.client.sendMessage(del.remoteJid, { delete: del });\n      if (response) {\n        const messageId = response.message?.protocolMessage?.key?.id;\n        if (messageId) {\n          const isLogicalDeleted = configService.get<Database>('DATABASE').DELETE_DATA.LOGICAL_MESSAGE_DELETE;\n          let message = await this.prismaRepository.message.findFirst({\n            where: { key: { path: ['id'], equals: messageId } },\n          });\n          if (isLogicalDeleted) {\n            if (!message) return response;\n            const existingKey = typeof message?.key === 'object' && message.key !== null ? message.key : {};\n            message = await this.prismaRepository.message.update({\n              where: { id: message.id },\n              data: { key: { ...existingKey, deleted: true }, status: 'DELETED' },\n            });\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.MESSAGE_UPDATE) {\n              const messageUpdate: any = {\n                messageId: message.id,\n                keyId: messageId,\n                remoteJid: response.key.remoteJid,\n                fromMe: response.key.fromMe,\n                participant: response.key?.participant,\n                status: 'DELETED',\n                instanceId: this.instanceId,\n              };\n              await this.prismaRepository.messageUpdate.create({ data: messageUpdate });\n            }\n          } else {\n            if (!message) return response;\n            await this.prismaRepository.message.deleteMany({ where: { id: message.id } });\n          }\n          this.sendDataWebhook(Events.MESSAGES_DELETE, {\n            id: message.id,\n            instanceId: message.instanceId,\n            key: message.key,\n            messageType: message.messageType,\n            status: 'DELETED',\n            source: message.source,\n            messageTimestamp: message.messageTimestamp,\n            pushName: message.pushName,\n            participant: message.participant,\n            message: message.message,\n          });\n        }\n      }\n\n      return response;\n    } catch (error) {\n      throw new InternalServerErrorException('Error while deleting message for everyone', error?.toString());\n    }\n  }\n\n  public async mapMediaType(mediaType) {\n    const map = {\n      imageMessage: 'image',\n      videoMessage: 'video',\n      documentMessage: 'document',\n      stickerMessage: 'sticker',\n      audioMessage: 'audio',\n      ptvMessage: 'video',\n    };\n    return map[mediaType] || null;\n  }\n\n  public async getBase64FromMediaMessage(data: getBase64FromMediaMessageDto, getBuffer = false) {\n    try {\n      const m = data?.message;\n      const convertToMp4 = data?.convertToMp4 ?? false;\n\n      const msg = m?.message ? m : ((await this.getMessage(m.key, true)) as proto.IWebMessageInfo);\n\n      if (!msg) {\n        throw 'Message not found';\n      }\n\n      for (const subtype of MessageSubtype) {\n        if (msg.message[subtype]) {\n          msg.message = msg.message[subtype].message;\n        }\n      }\n\n      if ('messageContextInfo' in msg.message && Object.keys(msg.message).length === 1) {\n        this.logger.verbose('Message contains only messageContextInfo, skipping media processing');\n        return null;\n      }\n\n      let mediaMessage: any;\n      let mediaType: string;\n\n      if (msg.message?.templateMessage) {\n        const template =\n          msg.message.templateMessage.hydratedTemplate || msg.message.templateMessage.hydratedFourRowTemplate;\n\n        for (const type of TypeMediaMessage) {\n          if (template[type]) {\n            mediaMessage = template[type];\n            mediaType = type;\n            msg.message = { [type]: { ...template[type], url: template[type].staticUrl } };\n            break;\n          }\n        }\n\n        if (!mediaMessage) {\n          throw 'Template message does not contain a supported media type';\n        }\n      } else {\n        for (const type of TypeMediaMessage) {\n          mediaMessage = msg.message[type];\n          if (mediaMessage) {\n            mediaType = type;\n            break;\n          }\n        }\n\n        if (!mediaMessage) {\n          throw 'The message is not of the media type';\n        }\n      }\n\n      if (typeof mediaMessage['mediaKey'] === 'object') {\n        msg.message[mediaType].mediaKey = Uint8Array.from(Object.values(mediaMessage['mediaKey']));\n      }\n\n      let buffer: Buffer;\n\n      try {\n        buffer = await downloadMediaMessage(\n          { key: msg?.key, message: msg?.message },\n          'buffer',\n          {},\n          { logger: P({ level: 'error' }) as any, reuploadRequest: this.client.updateMediaMessage },\n        );\n      } catch {\n        this.logger.error('Download Media failed, trying to retry in 5 seconds...');\n        await new Promise((resolve) => setTimeout(resolve, 5000));\n        const mediaType = Object.keys(msg.message).find((key) => key.endsWith('Message'));\n        if (!mediaType) throw new Error('Could not determine mediaType for fallback');\n\n        try {\n          const media = await downloadContentFromMessage(\n            {\n              mediaKey: msg.message?.[mediaType]?.mediaKey,\n              directPath: msg.message?.[mediaType]?.directPath,\n              url: `https://mmg.whatsapp.net${msg?.message?.[mediaType]?.directPath}`,\n            },\n            await this.mapMediaType(mediaType),\n            {},\n          );\n          const chunks = [];\n          for await (const chunk of media) {\n            chunks.push(chunk);\n          }\n          buffer = Buffer.concat(chunks);\n          this.logger.info('Download Media with downloadContentFromMessage was successful!');\n        } catch (fallbackErr) {\n          this.logger.error('Download Media with downloadContentFromMessage also failed!');\n          throw fallbackErr;\n        }\n      }\n      const typeMessage = getContentType(msg.message);\n\n      const ext = mimeTypes.extension(mediaMessage?.['mimetype']);\n      const fileName = mediaMessage?.['fileName'] || `${msg.key.id}.${ext}` || `${v4()}.${ext}`;\n\n      if (convertToMp4 && typeMessage === 'audioMessage') {\n        try {\n          const convert = await this.processAudioMp4(buffer.toString('base64'));\n\n          if (Buffer.isBuffer(convert)) {\n            const result = {\n              mediaType,\n              fileName,\n              caption: mediaMessage['caption'],\n              size: {\n                fileLength: mediaMessage['fileLength'],\n                height: mediaMessage['height'],\n                width: mediaMessage['width'],\n              },\n              mimetype: 'audio/mp4',\n              base64: convert.toString('base64'),\n              buffer: getBuffer ? convert : null,\n            };\n\n            return result;\n          }\n        } catch (error) {\n          this.logger.error('Error converting audio to mp4:');\n          this.logger.error(error);\n          throw new BadRequestException('Failed to convert audio to MP4');\n        }\n      }\n\n      return {\n        mediaType,\n        fileName,\n        caption: mediaMessage['caption'],\n        size: { fileLength: mediaMessage['fileLength'], height: mediaMessage['height'], width: mediaMessage['width'] },\n        mimetype: mediaMessage['mimetype'],\n        base64: buffer.toString('base64'),\n        buffer: getBuffer ? buffer : null,\n      };\n    } catch (error) {\n      this.logger.error('Error processing media message:');\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  public async fetchPrivacySettings() {\n    const privacy = await this.client.fetchPrivacySettings();\n\n    return {\n      readreceipts: privacy.readreceipts,\n      profile: privacy.profile,\n      status: privacy.status,\n      online: privacy.online,\n      last: privacy.last,\n      groupadd: privacy.groupadd,\n    };\n  }\n\n  public async updatePrivacySettings(settings: PrivacySettingDto) {\n    try {\n      await this.client.updateReadReceiptsPrivacy(settings.readreceipts);\n      await this.client.updateProfilePicturePrivacy(settings.profile);\n      await this.client.updateStatusPrivacy(settings.status);\n      await this.client.updateOnlinePrivacy(settings.online);\n      await this.client.updateLastSeenPrivacy(settings.last);\n      await this.client.updateGroupsAddPrivacy(settings.groupadd);\n\n      this.reloadConnection();\n\n      return {\n        update: 'success',\n        data: {\n          readreceipts: settings.readreceipts,\n          profile: settings.profile,\n          status: settings.status,\n          online: settings.online,\n          last: settings.last,\n          groupadd: settings.groupadd,\n        },\n      };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating privacy settings', error.toString());\n    }\n  }\n\n  public async fetchBusinessProfile(number: string): Promise<NumberBusiness> {\n    try {\n      const jid = number ? createJid(number) : this.instance.wuid;\n\n      const profile = await this.client.getBusinessProfile(jid);\n\n      if (!profile) {\n        const info = await this.whatsappNumber({ numbers: [jid] });\n\n        return { isBusiness: false, message: 'Not is business profile', ...info?.shift() };\n      }\n\n      return { isBusiness: true, ...profile };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating profile name', error.toString());\n    }\n  }\n\n  public async updateProfileName(name: string) {\n    try {\n      await this.client.updateProfileName(name);\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating profile name', error.toString());\n    }\n  }\n\n  public async updateProfileStatus(status: string) {\n    try {\n      await this.client.updateProfileStatus(status);\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating profile status', error.toString());\n    }\n  }\n\n  public async updateProfilePicture(picture: string) {\n    try {\n      let pic: WAMediaUpload;\n      if (isURL(picture)) {\n        const timestamp = new Date().getTime();\n        const parsedURL = new URL(picture);\n        parsedURL.searchParams.set('timestamp', timestamp.toString());\n        const url = parsedURL.toString();\n\n        let config: any = { responseType: 'arraybuffer' };\n\n        if (this.localProxy?.enabled) {\n          config = {\n            ...config,\n            httpsAgent: makeProxyAgent({\n              host: this.localProxy.host,\n              port: this.localProxy.port,\n              protocol: this.localProxy.protocol,\n              username: this.localProxy.username,\n              password: this.localProxy.password,\n            }),\n          };\n        }\n\n        pic = (await axios.get(url, config)).data;\n      } else if (isBase64(picture)) {\n        pic = Buffer.from(picture, 'base64');\n      } else {\n        throw new BadRequestException('\"profilePicture\" must be a url or a base64');\n      }\n\n      await this.client.updateProfilePicture(this.instance.wuid, pic);\n\n      this.reloadConnection();\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating profile picture', error.toString());\n    }\n  }\n\n  public async removeProfilePicture() {\n    try {\n      await this.client.removeProfilePicture(this.instance.wuid);\n\n      this.reloadConnection();\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error removing profile picture', error.toString());\n    }\n  }\n\n  public async blockUser(data: BlockUserDto) {\n    try {\n      const { number } = data;\n\n      const isWA = (await this.whatsappNumber({ numbers: [number] }))?.shift();\n\n      if (!isWA.exists && !isJidGroup(isWA.jid) && !isWA.jid.includes('@broadcast')) {\n        throw new BadRequestException(isWA);\n      }\n\n      const sender = isWA.jid;\n\n      await this.client.updateBlockStatus(sender, data.status);\n\n      return { block: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error blocking user', error.toString());\n    }\n  }\n\n  private async formatUpdateMessage(data: UpdateMessageDto) {\n    try {\n      if (!this.configService.get<Database>('DATABASE').SAVE_DATA.NEW_MESSAGE) {\n        return data;\n      }\n\n      const msg: any = await this.getMessage(data.key, true);\n\n      if (msg?.messageType === 'conversation' || msg?.messageType === 'extendedTextMessage') {\n        return { text: data.text };\n      }\n\n      if (msg?.messageType === 'imageMessage') {\n        return { image: msg?.message?.imageMessage, caption: data.text };\n      }\n\n      if (msg?.messageType === 'videoMessage') {\n        return { video: msg?.message?.videoMessage, caption: data.text };\n      }\n\n      return null;\n    } catch (error) {\n      this.logger.error(error);\n      throw new BadRequestException(error.toString());\n    }\n  }\n\n  public async updateMessage(data: UpdateMessageDto) {\n    const jid = createJid(data.number);\n\n    const options = await this.formatUpdateMessage(data);\n\n    if (!options) {\n      this.logger.error('Message not compatible');\n      throw new BadRequestException('Message not compatible');\n    }\n\n    try {\n      const oldMessage: any = await this.getMessage(data.key, true);\n      if (this.configService.get<Database>('DATABASE').SAVE_DATA.NEW_MESSAGE) {\n        if (!oldMessage) throw new NotFoundException('Message not found');\n        if (oldMessage?.key?.remoteJid !== jid) {\n          throw new BadRequestException('RemoteJid does not match');\n        }\n        if (oldMessage?.messageTimestamp > Date.now() + 900000) {\n          // 15 minutes in milliseconds\n          throw new BadRequestException('Message is older than 15 minutes');\n        }\n      }\n\n      const messageSent = await this.client.sendMessage(jid, { ...(options as any), edit: data.key });\n      if (messageSent) {\n        const editedMessage =\n          messageSent?.message?.protocolMessage || messageSent?.message?.editedMessage?.message?.protocolMessage;\n\n        if (editedMessage) {\n          this.sendDataWebhook(Events.SEND_MESSAGE_UPDATE, editedMessage);\n          if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled)\n            this.chatwootService.eventWhatsapp(\n              'send.message.update',\n              { instanceName: this.instance.name, instanceId: this.instance.id },\n              editedMessage,\n            );\n\n          const messageId = messageSent.message?.protocolMessage?.key?.id;\n          if (messageId && this.configService.get<Database>('DATABASE').SAVE_DATA.NEW_MESSAGE) {\n            let message = await this.prismaRepository.message.findFirst({\n              where: { key: { path: ['id'], equals: messageId } },\n            });\n            if (!message) throw new NotFoundException('Message not found');\n\n            if (!(message.key.valueOf() as any).fromMe) {\n              new BadRequestException('You cannot edit others messages');\n            }\n            if ((message.key.valueOf() as any)?.deleted) {\n              new BadRequestException('You cannot edit deleted messages');\n            }\n\n            if (oldMessage.messageType === 'conversation' || oldMessage.messageType === 'extendedTextMessage') {\n              oldMessage.message.conversation = data.text;\n            } else {\n              oldMessage.message[oldMessage.messageType].caption = data.text;\n            }\n            message = await this.prismaRepository.message.update({\n              where: { id: message.id },\n              data: {\n                message: oldMessage.message,\n                status: 'EDITED',\n                messageTimestamp: Math.floor(Date.now() / 1000), // Convert to int32 by dividing by 1000 to get seconds\n              },\n            });\n\n            if (this.configService.get<Database>('DATABASE').SAVE_DATA.MESSAGE_UPDATE) {\n              const messageUpdate: any = {\n                messageId: message.id,\n                keyId: messageId,\n                remoteJid: messageSent.key.remoteJid,\n                fromMe: messageSent.key.fromMe,\n                participant: messageSent.key?.participant,\n                status: 'EDITED',\n                instanceId: this.instanceId,\n              };\n              await this.prismaRepository.messageUpdate.create({ data: messageUpdate });\n            }\n          }\n        }\n      }\n\n      return messageSent;\n    } catch (error) {\n      this.logger.error(error);\n      throw error;\n    }\n  }\n\n  public async fetchLabels(): Promise<LabelDto[]> {\n    const labels = await this.prismaRepository.label.findMany({ where: { instanceId: this.instanceId } });\n\n    return labels.map((label) => ({\n      color: label.color,\n      name: label.name,\n      id: label.labelId,\n      predefinedId: label.predefinedId,\n    }));\n  }\n\n  public async handleLabel(data: HandleLabelDto) {\n    const whatsappContact = await this.whatsappNumber({ numbers: [data.number] });\n    if (whatsappContact.length === 0) {\n      throw new NotFoundException('Number not found');\n    }\n    const contact = whatsappContact[0];\n    if (!contact.exists) {\n      throw new NotFoundException('Number is not on WhatsApp');\n    }\n\n    try {\n      if (data.action === 'add') {\n        await this.client.addChatLabel(contact.jid, data.labelId);\n        await this.addLabel(data.labelId, this.instanceId, contact.jid);\n\n        return { numberJid: contact.jid, labelId: data.labelId, add: true };\n      }\n      if (data.action === 'remove') {\n        await this.client.removeChatLabel(contact.jid, data.labelId);\n        await this.removeLabel(data.labelId, this.instanceId, contact.jid);\n\n        return { numberJid: contact.jid, labelId: data.labelId, remove: true };\n      }\n    } catch (error) {\n      throw new BadRequestException(`Unable to ${data.action} label to chat`, error.toString());\n    }\n  }\n\n  // Group\n  private async updateGroupMetadataCache(groupJid: string) {\n    try {\n      const meta = await this.client.groupMetadata(groupJid);\n\n      const cacheConf = this.configService.get<CacheConf>('CACHE');\n\n      if ((cacheConf?.REDIS?.ENABLED && cacheConf?.REDIS?.URI !== '') || cacheConf?.LOCAL?.ENABLED) {\n        this.logger.verbose(`Updating cache for group: ${groupJid}`);\n        await groupMetadataCache.set(groupJid, { timestamp: Date.now(), data: meta });\n      }\n\n      return meta;\n    } catch (error) {\n      this.logger.error(error);\n      return null;\n    }\n  }\n\n  private getGroupMetadataCache = async (groupJid: string) => {\n    if (!isJidGroup(groupJid)) return null;\n\n    const cacheConf = this.configService.get<CacheConf>('CACHE');\n\n    if ((cacheConf?.REDIS?.ENABLED && cacheConf?.REDIS?.URI !== '') || cacheConf?.LOCAL?.ENABLED) {\n      if (await groupMetadataCache?.has(groupJid)) {\n        console.log(`Cache request for group: ${groupJid}`);\n        const meta = await groupMetadataCache.get(groupJid);\n\n        if (Date.now() - meta.timestamp > 3600000) {\n          await this.updateGroupMetadataCache(groupJid);\n        }\n\n        return meta.data;\n      }\n\n      console.log(`Cache request for group: ${groupJid} - not found`);\n      return await this.updateGroupMetadataCache(groupJid);\n    }\n\n    return await this.findGroup({ groupJid }, 'inner');\n  };\n\n  public async createGroup(create: CreateGroupDto) {\n    try {\n      const participants = (await this.whatsappNumber({ numbers: create.participants }))\n        .filter((participant) => participant.exists)\n        .map((participant) => participant.jid);\n      const { id } = await this.client.groupCreate(create.subject, participants);\n\n      if (create?.description) {\n        await this.client.groupUpdateDescription(id, create.description);\n      }\n\n      if (create?.promoteParticipants) {\n        await this.updateGParticipant({ groupJid: id, action: 'promote', participants: participants });\n      }\n\n      const group = await this.client.groupMetadata(id);\n\n      return group;\n    } catch (error) {\n      this.logger.error(error);\n      throw new InternalServerErrorException('Error creating group', error.toString());\n    }\n  }\n\n  public async updateGroupPicture(picture: GroupPictureDto) {\n    try {\n      let pic: WAMediaUpload;\n      if (isURL(picture.image)) {\n        const timestamp = new Date().getTime();\n        const parsedURL = new URL(picture.image);\n        parsedURL.searchParams.set('timestamp', timestamp.toString());\n        const url = parsedURL.toString();\n\n        let config: any = { responseType: 'arraybuffer' };\n\n        if (this.localProxy?.enabled) {\n          config = {\n            ...config,\n            httpsAgent: makeProxyAgent({\n              host: this.localProxy.host,\n              port: this.localProxy.port,\n              protocol: this.localProxy.protocol,\n              username: this.localProxy.username,\n              password: this.localProxy.password,\n            }),\n          };\n        }\n\n        pic = (await axios.get(url, config)).data;\n      } else if (isBase64(picture.image)) {\n        pic = Buffer.from(picture.image, 'base64');\n      } else {\n        throw new BadRequestException('\"profilePicture\" must be a url or a base64');\n      }\n      await this.client.updateProfilePicture(picture.groupJid, pic);\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error update group picture', error.toString());\n    }\n  }\n\n  public async updateGroupSubject(data: GroupSubjectDto) {\n    try {\n      await this.client.groupUpdateSubject(data.groupJid, data.subject);\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating group subject', error.toString());\n    }\n  }\n\n  public async updateGroupDescription(data: GroupDescriptionDto) {\n    try {\n      await this.client.groupUpdateDescription(data.groupJid, data.description);\n\n      return { update: 'success' };\n    } catch (error) {\n      throw new InternalServerErrorException('Error updating group description', error.toString());\n    }\n  }\n\n  public async findGroup(id: GroupJid, reply: 'inner' | 'out' = 'out') {\n    try {\n      const group = await this.client.groupMetadata(id.groupJid);\n\n      if (!group) {\n        this.logger.error('Group not found');\n        return null;\n      }\n\n      const picture = await this.profilePicture(group.id);\n\n      return {\n        id: group.id,\n        subject: group.subject,\n        subjectOwner: group.subjectOwner,\n        subjectTime: group.subjectTime,\n        pictureUrl: picture.profilePictureUrl,\n        size: group.participants.length,\n        creation: group.creation,\n        owner: group.owner,\n        desc: group.desc,\n        descId: group.descId,\n        restrict: group.restrict,\n        announce: group.announce,\n        participants: group.participants,\n        isCommunity: group.isCommunity,\n        isCommunityAnnounce: group.isCommunityAnnounce,\n        linkedParent: group.linkedParent,\n      };\n    } catch (error) {\n      if (reply === 'inner') {\n        return;\n      }\n      throw new NotFoundException('Error fetching group', error.toString());\n    }\n  }\n\n  public async fetchAllGroups(getParticipants: GetParticipant) {\n    const fetch = Object.values(await this?.client?.groupFetchAllParticipating());\n\n    let groups = [];\n    for (const group of fetch) {\n      const picture = await this.profilePicture(group.id);\n\n      const result = {\n        id: group.id,\n        subject: group.subject,\n        subjectOwner: group.subjectOwner,\n        subjectTime: group.subjectTime,\n        pictureUrl: picture?.profilePictureUrl,\n        size: group.participants.length,\n        creation: group.creation,\n        owner: group.owner,\n        desc: group.desc,\n        descId: group.descId,\n        restrict: group.restrict,\n        announce: group.announce,\n        isCommunity: group.isCommunity,\n        isCommunityAnnounce: group.isCommunityAnnounce,\n        linkedParent: group.linkedParent,\n      };\n\n      if (getParticipants.getParticipants == 'true') {\n        result['participants'] = group.participants;\n      }\n\n      groups = [...groups, result];\n    }\n\n    return groups;\n  }\n\n  public async inviteCode(id: GroupJid) {\n    try {\n      const code = await this.client.groupInviteCode(id.groupJid);\n      return { inviteUrl: `https://chat.whatsapp.com/${code}`, inviteCode: code };\n    } catch (error) {\n      throw new NotFoundException('No invite code', error.toString());\n    }\n  }\n\n  public async inviteInfo(id: GroupInvite) {\n    try {\n      return await this.client.groupGetInviteInfo(id.inviteCode);\n    } catch {\n      throw new NotFoundException('No invite info', id.inviteCode);\n    }\n  }\n\n  public async sendInvite(id: GroupSendInvite) {\n    try {\n      const inviteCode = await this.inviteCode({ groupJid: id.groupJid });\n\n      const inviteUrl = inviteCode.inviteUrl;\n\n      const numbers = id.numbers.map((number) => createJid(number));\n      const description = id.description ?? '';\n\n      const msg = `${description}\\n\\n${inviteUrl}`;\n\n      const message = { conversation: msg };\n\n      for await (const number of numbers) {\n        await this.sendMessageWithTyping(number, message);\n      }\n\n      return { send: true, inviteUrl };\n    } catch {\n      throw new NotFoundException('No send invite');\n    }\n  }\n\n  public async acceptInviteCode(id: AcceptGroupInvite) {\n    try {\n      const groupJid = await this.client.groupAcceptInvite(id.inviteCode);\n      return { accepted: true, groupJid: groupJid };\n    } catch (error) {\n      throw new NotFoundException('Accept invite error', error.toString());\n    }\n  }\n\n  public async revokeInviteCode(id: GroupJid) {\n    try {\n      const inviteCode = await this.client.groupRevokeInvite(id.groupJid);\n      return { revoked: true, inviteCode };\n    } catch (error) {\n      throw new NotFoundException('Revoke error', error.toString());\n    }\n  }\n\n  public async findParticipants(id: GroupJid) {\n    try {\n      const participants = (await this.client.groupMetadata(id.groupJid)).participants;\n      const contacts = await this.prismaRepository.contact.findMany({\n        where: { instanceId: this.instanceId, remoteJid: { in: participants.map((p) => p.id) } },\n      });\n      const parsedParticipants = participants.map((participant) => {\n        const contact = contacts.find((c) => c.remoteJid === participant.id);\n        return {\n          ...participant,\n          name: participant.name ?? contact?.pushName,\n          imgUrl: participant.imgUrl ?? contact?.profilePicUrl,\n        };\n      });\n\n      const usersContacts = parsedParticipants.filter((c) => c.id.includes('@s.whatsapp'));\n      if (usersContacts) {\n        await saveOnWhatsappCache(usersContacts.map((c) => ({ remoteJid: c.id })));\n      }\n\n      return { participants: parsedParticipants };\n    } catch (error) {\n      console.error(error);\n      throw new NotFoundException('No participants', error.toString());\n    }\n  }\n\n  public async updateGParticipant(update: GroupUpdateParticipantDto) {\n    try {\n      const participants = update.participants.map((p) => createJid(p));\n      const updateParticipants = await this.client.groupParticipantsUpdate(\n        update.groupJid,\n        participants,\n        update.action,\n      );\n      return { updateParticipants: updateParticipants };\n    } catch (error) {\n      throw new BadRequestException('Error updating participants', error.toString());\n    }\n  }\n\n  public async updateGSetting(update: GroupUpdateSettingDto) {\n    try {\n      const updateSetting = await this.client.groupSettingUpdate(update.groupJid, update.action);\n      return { updateSetting: updateSetting };\n    } catch (error) {\n      throw new BadRequestException('Error updating setting', error.toString());\n    }\n  }\n\n  public async toggleEphemeral(update: GroupToggleEphemeralDto) {\n    try {\n      await this.client.groupToggleEphemeral(update.groupJid, update.expiration);\n      return { success: true };\n    } catch (error) {\n      throw new BadRequestException('Error updating setting', error.toString());\n    }\n  }\n\n  public async leaveGroup(id: GroupJid) {\n    try {\n      await this.client.groupLeave(id.groupJid);\n      return { groupJid: id.groupJid, leave: true };\n    } catch (error) {\n      throw new BadRequestException('Unable to leave the group', error.toString());\n    }\n  }\n\n  public async templateMessage() {\n    throw new Error('Method not available in the Baileys service');\n  }\n\n  private deserializeMessageBuffers(obj: any): any {\n    if (obj === null || obj === undefined) {\n      return obj;\n    }\n\n    if (typeof obj === 'object' && !Array.isArray(obj) && !Buffer.isBuffer(obj)) {\n      const keys = Object.keys(obj);\n      const isIndexedObject = keys.every((key) => !isNaN(Number(key)));\n\n      if (isIndexedObject && keys.length > 0) {\n        const values = keys.sort((a, b) => Number(a) - Number(b)).map((key) => obj[key]);\n        return new Uint8Array(values);\n      }\n    }\n\n    // Is Buffer?, converter to Uint8Array\n    if (Buffer.isBuffer(obj)) {\n      return new Uint8Array(obj);\n    }\n\n    // Process arrays recursively\n    if (Array.isArray(obj)) {\n      return obj.map((item) => this.deserializeMessageBuffers(item));\n    }\n\n    // Process objects recursively\n    if (typeof obj === 'object') {\n      const converted: any = {};\n      for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n          converted[key] = this.deserializeMessageBuffers(obj[key]);\n        }\n      }\n      return converted;\n    }\n\n    return obj;\n  }\n\n  private prepareMessage(message: proto.IWebMessageInfo): any {\n    const contentType = getContentType(message.message);\n    const contentMsg = message?.message[contentType] as any;\n\n    const messageRaw = {\n      key: message.key, // Save key exactly as it comes from Baileys\n      pushName:\n        message.pushName ||\n        (message.key.fromMe\n          ? 'Você'\n          : message?.participant || (message.key?.participant ? message.key.participant.split('@')[0] : null)),\n      status: status[message.status],\n      message: this.deserializeMessageBuffers({ ...message.message }),\n      contextInfo: this.deserializeMessageBuffers(contentMsg?.contextInfo),\n      messageType: contentType || 'unknown',\n      messageTimestamp: Long.isLong(message.messageTimestamp)\n        ? message.messageTimestamp.toNumber()\n        : (message.messageTimestamp as number),\n      instanceId: this.instanceId,\n      source: getDevice(message.key.id),\n    };\n\n    if (!messageRaw.status && message.key.fromMe === false) {\n      messageRaw.status = status[3]; // DELIVERED MESSAGE\n    }\n\n    if (messageRaw.message.extendedTextMessage) {\n      messageRaw.messageType = 'conversation';\n      messageRaw.message.conversation = messageRaw.message.extendedTextMessage.text;\n      delete messageRaw.message.extendedTextMessage;\n    }\n\n    if (messageRaw.message.documentWithCaptionMessage) {\n      messageRaw.messageType = 'documentMessage';\n      messageRaw.message.documentMessage = messageRaw.message.documentWithCaptionMessage.message.documentMessage;\n      delete messageRaw.message.documentWithCaptionMessage;\n    }\n\n    const quotedMessage = messageRaw?.contextInfo?.quotedMessage;\n    if (quotedMessage) {\n      if (quotedMessage.extendedTextMessage) {\n        quotedMessage.conversation = quotedMessage.extendedTextMessage.text;\n        delete quotedMessage.extendedTextMessage;\n      }\n\n      if (quotedMessage.documentWithCaptionMessage) {\n        quotedMessage.documentMessage = quotedMessage.documentWithCaptionMessage.message.documentMessage;\n        delete quotedMessage.documentWithCaptionMessage;\n      }\n    }\n\n    return messageRaw;\n  }\n\n  private async syncChatwootLostMessages() {\n    if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {\n      const chatwootConfig = await this.findChatwoot();\n      const prepare = (message: any) => this.prepareMessage(message);\n      this.chatwootService.syncLostMessages({ instanceName: this.instance.name }, chatwootConfig, prepare);\n\n      // Generate ID for this cron task and store in cache\n      const cronId = cuid();\n      const cronKey = `chatwoot:syncLostMessages`;\n      await this.chatwootService.getCache()?.hSet(cronKey, this.instance.name, cronId);\n\n      const task = cron.schedule('0,30 * * * *', async () => {\n        // Check ID before executing (only if cache is available)\n        const cache = this.chatwootService.getCache();\n        if (cache) {\n          const storedId = await cache.hGet(cronKey, this.instance.name);\n          if (storedId && storedId !== cronId) {\n            this.logger.info(`Stopping syncChatwootLostMessages cron - ID mismatch: ${cronId} vs ${storedId}`);\n            task.stop();\n            return;\n          }\n        }\n        this.chatwootService.syncLostMessages({ instanceName: this.instance.name }, chatwootConfig, prepare);\n      });\n      task.start();\n    }\n  }\n\n  private async updateMessagesReadedByTimestamp(remoteJid: string, timestamp?: number): Promise<number> {\n    if (timestamp === undefined || timestamp === null) return 0;\n\n    // Use raw SQL to avoid JSON path issues\n    const result = await this.prismaRepository.$executeRaw`\n      UPDATE \"Message\"\n      SET \"status\" = ${status[4]}\n      WHERE \"instanceId\" = ${this.instanceId}\n      AND \"key\"->>'remoteJid' = ${remoteJid}\n      AND (\"key\"->>'fromMe')::boolean = false\n      AND \"messageTimestamp\" <= ${timestamp}\n      AND (\"status\" IS NULL OR \"status\" = ${status[3]})\n    `;\n\n    if (result) {\n      if (result > 0) {\n        this.updateChatUnreadMessages(remoteJid);\n      }\n\n      return result;\n    }\n\n    return 0;\n  }\n\n  private async updateChatUnreadMessages(remoteJid: string): Promise<number> {\n    const [chat, unreadMessages] = await Promise.all([\n      this.prismaRepository.chat.findFirst({ where: { remoteJid } }),\n      // Use raw SQL to avoid JSON path issues\n      this.prismaRepository.$queryRaw`\n        SELECT COUNT(*)::int as count FROM \"Message\"\n        WHERE \"instanceId\" = ${this.instanceId}\n        AND \"key\"->>'remoteJid' = ${remoteJid}\n        AND (\"key\"->>'fromMe')::boolean = false\n        AND \"status\" = ${status[3]}\n      `.then((result: any[]) => result[0]?.count || 0),\n    ]);\n\n    if (chat && chat.unreadMessages !== unreadMessages) {\n      await this.prismaRepository.chat.update({ where: { id: chat.id }, data: { unreadMessages } });\n    }\n\n    return unreadMessages;\n  }\n\n  private async addLabel(labelId: string, instanceId: string, chatId: string) {\n    const id = cuid();\n\n    await this.prismaRepository.$executeRawUnsafe(\n      `INSERT INTO \"Chat\" (\"id\", \"instanceId\", \"remoteJid\", \"labels\", \"createdAt\", \"updatedAt\")\n       VALUES ($4, $2, $3, to_jsonb(ARRAY[$1]::text[]), NOW(), NOW()) ON CONFLICT (\"instanceId\", \"remoteJid\")\n     DO\n      UPDATE\n          SET \"labels\" = (\n          SELECT to_jsonb(array_agg(DISTINCT elem))\n          FROM (\n          SELECT jsonb_array_elements_text(\"Chat\".\"labels\") AS elem\n          UNION\n          SELECT $1::text AS elem\n          ) sub\n          ),\n          \"updatedAt\" = NOW();`,\n      labelId,\n      instanceId,\n      chatId,\n      id,\n    );\n  }\n\n  private async removeLabel(labelId: string, instanceId: string, chatId: string) {\n    const id = cuid();\n\n    await this.prismaRepository.$executeRawUnsafe(\n      `INSERT INTO \"Chat\" (\"id\", \"instanceId\", \"remoteJid\", \"labels\", \"createdAt\", \"updatedAt\")\n       VALUES ($4, $2, $3, '[]'::jsonb, NOW(), NOW()) ON CONFLICT (\"instanceId\", \"remoteJid\")\n     DO\n      UPDATE\n          SET \"labels\" = COALESCE (\n          (\n          SELECT jsonb_agg(elem)\n          FROM jsonb_array_elements_text(\"Chat\".\"labels\") AS elem\n          WHERE elem <> $1\n          ),\n          '[]'::jsonb\n          ),\n          \"updatedAt\" = NOW();`,\n      labelId,\n      instanceId,\n      chatId,\n      id,\n    );\n  }\n\n  public async baileysOnWhatsapp(jid: string) {\n    const response = await this.client.onWhatsApp(jid);\n\n    return response;\n  }\n\n  public async baileysProfilePictureUrl(jid: string, type: 'image' | 'preview', timeoutMs: number) {\n    const response = await this.client.profilePictureUrl(jid, type, timeoutMs);\n\n    return response;\n  }\n\n  public async baileysAssertSessions(jids: string[]) {\n    const response = await this.client.assertSessions(jids);\n\n    return response;\n  }\n\n  public async baileysCreateParticipantNodes(jids: string[], message: proto.IMessage, extraAttrs: any) {\n    const response = await this.client.createParticipantNodes(jids, message, extraAttrs);\n\n    const convertedResponse = {\n      ...response,\n      nodes: response.nodes.map((node: any) => ({\n        ...node,\n        content: node.content?.map((c: any) => ({\n          ...c,\n          content: c.content instanceof Uint8Array ? Buffer.from(c.content).toString('base64') : c.content,\n        })),\n      })),\n    };\n\n    return convertedResponse;\n  }\n\n  public async baileysSendNode(stanza: any) {\n    console.log('stanza', JSON.stringify(stanza));\n    const response = await this.client.sendNode(stanza);\n\n    return response;\n  }\n\n  public async baileysGetUSyncDevices(jids: string[], useCache: boolean, ignoreZeroDevices: boolean) {\n    const response = await this.client.getUSyncDevices(jids, useCache, ignoreZeroDevices);\n\n    return response;\n  }\n\n  public async baileysGenerateMessageTag() {\n    const response = await this.client.generateMessageTag();\n\n    return response;\n  }\n\n  public async baileysSignalRepositoryDecryptMessage(jid: string, type: 'pkmsg' | 'msg', ciphertext: string) {\n    try {\n      const ciphertextBuffer = Buffer.from(ciphertext, 'base64');\n\n      const response = await this.client.signalRepository.decryptMessage({ jid, type, ciphertext: ciphertextBuffer });\n\n      return response instanceof Uint8Array ? Buffer.from(response).toString('base64') : response;\n    } catch (error) {\n      this.logger.error('Error decrypting message:');\n      this.logger.error(error);\n      throw error;\n    }\n  }\n\n  public async baileysGetAuthState() {\n    const response = { me: this.client.authState.creds.me, account: this.client.authState.creds.account };\n\n    return response;\n  }\n\n  //Business Controller\n  public async fetchCatalog(instanceName: string, data: getCollectionsDto) {\n    const jid = data.number ? createJid(data.number) : this.client?.user?.id;\n    const limit = data.limit || 10;\n    const cursor = null;\n\n    const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n\n    if (!onWhatsapp.exists) {\n      throw new BadRequestException(onWhatsapp);\n    }\n\n    try {\n      const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n      const business = await this.fetchBusinessProfile(info?.jid);\n\n      let catalog = await this.getCatalog({ jid: info?.jid, limit, cursor });\n      let nextPageCursor = catalog.nextPageCursor;\n      let nextPageCursorJson = nextPageCursor ? JSON.parse(atob(nextPageCursor)) : null;\n      let pagination = nextPageCursorJson?.pagination_cursor\n        ? JSON.parse(atob(nextPageCursorJson.pagination_cursor))\n        : null;\n      let fetcherHasMore = pagination?.fetcher_has_more === true ? true : false;\n\n      let productsCatalog = catalog.products || [];\n      let countLoops = 0;\n      while (fetcherHasMore && countLoops < 4) {\n        catalog = await this.getCatalog({ jid: info?.jid, limit, cursor: nextPageCursor });\n        nextPageCursor = catalog.nextPageCursor;\n        nextPageCursorJson = nextPageCursor ? JSON.parse(atob(nextPageCursor)) : null;\n        pagination = nextPageCursorJson?.pagination_cursor\n          ? JSON.parse(atob(nextPageCursorJson.pagination_cursor))\n          : null;\n        fetcherHasMore = pagination?.fetcher_has_more === true ? true : false;\n        productsCatalog = [...productsCatalog, ...catalog.products];\n        countLoops++;\n      }\n\n      return {\n        wuid: info?.jid || jid,\n        numberExists: info?.exists,\n        isBusiness: business.isBusiness,\n        catalogLength: productsCatalog.length,\n        catalog: productsCatalog,\n      };\n    } catch (error) {\n      console.log(error);\n      return { wuid: jid, name: null, isBusiness: false };\n    }\n  }\n\n  public async getCatalog({\n    jid,\n    limit,\n    cursor,\n  }: GetCatalogOptions): Promise<{ products: Product[]; nextPageCursor: string | undefined }> {\n    try {\n      jid = jid ? createJid(jid) : this.instance.wuid;\n\n      const catalog = await this.client.getCatalog({ jid, limit: limit, cursor: cursor });\n\n      if (!catalog) {\n        return { products: undefined, nextPageCursor: undefined };\n      }\n\n      return catalog;\n    } catch (error) {\n      throw new InternalServerErrorException('Error getCatalog', error.toString());\n    }\n  }\n\n  public async fetchCollections(instanceName: string, data: getCollectionsDto) {\n    const jid = data.number ? createJid(data.number) : this.client?.user?.id;\n    const limit = data.limit <= 20 ? data.limit : 20; //(tem esse limite, não sei porque)\n\n    const onWhatsapp = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n\n    if (!onWhatsapp.exists) {\n      throw new BadRequestException(onWhatsapp);\n    }\n\n    try {\n      const info = (await this.whatsappNumber({ numbers: [jid] }))?.shift();\n      const business = await this.fetchBusinessProfile(info?.jid);\n      const collections = await this.getCollections(info?.jid, limit);\n\n      return {\n        wuid: info?.jid || jid,\n        name: info?.name,\n        numberExists: info?.exists,\n        isBusiness: business.isBusiness,\n        collectionsLength: collections?.length,\n        collections: collections,\n      };\n    } catch {\n      return { wuid: jid, name: null, isBusiness: false };\n    }\n  }\n\n  public async getCollections(jid?: string | undefined, limit?: number): Promise<CatalogCollection[]> {\n    try {\n      jid = jid ? createJid(jid) : this.instance.wuid;\n\n      const result = await this.client.getCollections(jid, limit);\n\n      if (!result) {\n        return [{ id: undefined, name: undefined, products: [], status: undefined }];\n      }\n\n      return result.collections;\n    } catch (error) {\n      throw new InternalServerErrorException('Error getCatalog', error.toString());\n    }\n  }\n\n  public async fetchMessages(query: Query<Message>) {\n    const keyFilters = query?.where?.key as ExtendedIMessageKey;\n\n    const timestampFilter = {};\n    if (query?.where?.messageTimestamp) {\n      if (query.where.messageTimestamp['gte'] && query.where.messageTimestamp['lte']) {\n        timestampFilter['messageTimestamp'] = {\n          gte: Math.floor(new Date(query.where.messageTimestamp['gte']).getTime() / 1000),\n          lte: Math.floor(new Date(query.where.messageTimestamp['lte']).getTime() / 1000),\n        };\n      }\n    }\n\n    const count = await this.prismaRepository.message.count({\n      where: {\n        instanceId: this.instanceId,\n        id: query?.where?.id,\n        source: query?.where?.source,\n        messageType: query?.where?.messageType,\n        ...timestampFilter,\n        AND: [\n          keyFilters?.id ? { key: { path: ['id'], equals: keyFilters?.id } } : {},\n          keyFilters?.fromMe ? { key: { path: ['fromMe'], equals: keyFilters?.fromMe } } : {},\n          keyFilters?.participant ? { key: { path: ['participant'], equals: keyFilters?.participant } } : {},\n          {\n            OR: [\n              keyFilters?.remoteJid ? { key: { path: ['remoteJid'], equals: keyFilters?.remoteJid } } : {},\n              keyFilters?.remoteJidAlt ? { key: { path: ['remoteJidAlt'], equals: keyFilters?.remoteJidAlt } } : {},\n            ],\n          },\n        ],\n      },\n    });\n\n    if (!query?.offset) {\n      query.offset = 50;\n    }\n\n    if (!query?.page) {\n      query.page = 1;\n    }\n\n    const messages = await this.prismaRepository.message.findMany({\n      where: {\n        instanceId: this.instanceId,\n        id: query?.where?.id,\n        source: query?.where?.source,\n        messageType: query?.where?.messageType,\n        ...timestampFilter,\n        AND: [\n          keyFilters?.id ? { key: { path: ['id'], equals: keyFilters?.id } } : {},\n          keyFilters?.fromMe ? { key: { path: ['fromMe'], equals: keyFilters?.fromMe } } : {},\n          keyFilters?.participant ? { key: { path: ['participant'], equals: keyFilters?.participant } } : {},\n          {\n            OR: [\n              keyFilters?.remoteJid ? { key: { path: ['remoteJid'], equals: keyFilters?.remoteJid } } : {},\n              keyFilters?.remoteJidAlt ? { key: { path: ['remoteJidAlt'], equals: keyFilters?.remoteJidAlt } } : {},\n            ],\n          },\n        ],\n      },\n      orderBy: { messageTimestamp: 'desc' },\n      skip: query.offset * (query?.page === 1 ? 0 : (query?.page as number) - 1),\n      take: query.offset,\n      select: {\n        id: true,\n        key: true,\n        pushName: true,\n        messageType: true,\n        message: true,\n        messageTimestamp: true,\n        instanceId: true,\n        source: true,\n        contextInfo: true,\n        MessageUpdate: { select: { status: true } },\n      },\n    });\n\n    const formattedMessages = messages.map((message) => {\n      const messageKey = message.key as { fromMe: boolean; remoteJid: string; id: string; participant?: string };\n\n      if (!message.pushName) {\n        if (messageKey.fromMe) {\n          message.pushName = 'Você';\n        } else if (message.contextInfo) {\n          const contextInfo = message.contextInfo as { participant?: string };\n          if (contextInfo.participant) {\n            message.pushName = contextInfo.participant.split('@')[0];\n          } else if (messageKey.participant) {\n            message.pushName = messageKey.participant.split('@')[0];\n          }\n        }\n      }\n\n      return message;\n    });\n\n    return {\n      messages: {\n        total: count,\n        pages: Math.ceil(count / query.offset),\n        currentPage: query.page,\n        records: formattedMessages,\n      },\n    };\n  }\n}\n","import { prismaRepository } from '@api/server.module';\nimport { configService, Database } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport dayjs from 'dayjs';\n\nconst logger = new Logger('OnWhatsappCache');\n\nfunction getAvailableNumbers(remoteJid: string) {\n  const numbersAvailable: string[] = [];\n\n  if (remoteJid.startsWith('+')) {\n    remoteJid = remoteJid.slice(1);\n  }\n\n  const [number, domain] = remoteJid.split('@');\n\n  // TODO: Se já for @lid, retornar apenas ele mesmo SEM adicionar @domain novamente\n  if (domain === 'lid' || domain === 'g.us') {\n    return [remoteJid]; // Retorna direto para @lid e @g.us\n  }\n\n  // Brazilian numbers\n  if (remoteJid.startsWith('55')) {\n    const numberWithDigit =\n      number.slice(4, 5) === '9' && number.length === 13 ? number : `${number.slice(0, 4)}9${number.slice(4)}`;\n    const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 4) + number.slice(5);\n\n    numbersAvailable.push(numberWithDigit);\n    numbersAvailable.push(numberWithoutDigit);\n  }\n\n  // Mexican/Argentina numbers\n  // Ref: https://faq.whatsapp.com/1294841057948784\n  else if (number.startsWith('52') || number.startsWith('54')) {\n    let prefix = '';\n    if (number.startsWith('52')) {\n      prefix = '1';\n    }\n    if (number.startsWith('54')) {\n      prefix = '9';\n    }\n\n    const numberWithDigit =\n      number.slice(2, 3) === prefix && number.length === 13\n        ? number\n        : `${number.slice(0, 2)}${prefix}${number.slice(2)}`;\n    const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 2) + number.slice(3);\n\n    numbersAvailable.push(numberWithDigit);\n    numbersAvailable.push(numberWithoutDigit);\n  }\n\n  // Other countries\n  else {\n    numbersAvailable.push(remoteJid);\n  }\n\n  // TODO: Adiciona @domain apenas para números que não são @lid\n  return numbersAvailable.map((number) => `${number}@${domain}`);\n}\n\ninterface ISaveOnWhatsappCacheParams {\n  remoteJid: string;\n  remoteJidAlt?: string;\n  lid?: 'lid' | undefined;\n}\n\nfunction normalizeJid(jid: string | null | undefined): string | null {\n  if (!jid) return null;\n  return jid.startsWith('+') ? jid.slice(1) : jid;\n}\n\nexport async function saveOnWhatsappCache(data: ISaveOnWhatsappCacheParams[]) {\n  if (!configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) {\n    return;\n  }\n\n  // Processa todos os itens em paralelo para melhor performance\n  const processingPromises = data.map(async (item) => {\n    try {\n      const remoteJid = normalizeJid(item.remoteJid);\n      if (!remoteJid) {\n        logger.warn('[saveOnWhatsappCache] Item skipped, missing remoteJid.');\n        return;\n      }\n\n      const altJidNormalized = normalizeJid(item.remoteJidAlt);\n      const lidAltJid = altJidNormalized && altJidNormalized.includes('@lid') ? altJidNormalized : null;\n\n      const baseJids = [remoteJid]; // Garante que o remoteJid esteja na lista inicial\n      if (lidAltJid) {\n        baseJids.push(lidAltJid);\n      }\n\n      const expandedJids = baseJids.flatMap((jid) => getAvailableNumbers(jid));\n\n      // 1. Busca entrada por jidOptions e também remoteJid\n      // Às vezes acontece do remoteJid atual NÃO ESTAR no jidOptions ainda, ocasionando o erro:\n      // 'Unique constraint failed on the fields: (`remoteJid`)'\n      // Isso acontece principalmente em grupos que possuem o número do criador no ID (ex.: '559911223345-1234567890@g.us')\n      const existingRecord = await prismaRepository.isOnWhatsapp.findFirst({\n        where: {\n          OR: [\n            ...expandedJids.map((jid) => ({ jidOptions: { contains: jid } })),\n            { remoteJid: remoteJid }, // TODO: Descobrir o motivo que causa o remoteJid não estar (às vezes) incluso na lista de jidOptions\n          ],\n        },\n      });\n\n      logger.verbose(\n        `[saveOnWhatsappCache] Register exists for [${expandedJids.join(',')}]? => ${existingRecord ? existingRecord.remoteJid : 'Not found'}`,\n      );\n\n      // 2. Unifica todos os JIDs usando um Set para garantir valores únicos\n      const finalJidOptions = new Set(expandedJids);\n\n      if (lidAltJid) {\n        finalJidOptions.add(lidAltJid);\n      }\n\n      if (existingRecord?.jidOptions) {\n        existingRecord.jidOptions.split(',').forEach((jid) => finalJidOptions.add(jid));\n      }\n\n      // 3. Prepara o payload final\n      // Ordena os JIDs para garantir consistência na string final\n      const sortedJidOptions = [...finalJidOptions].sort();\n      const newJidOptionsString = sortedJidOptions.join(',');\n      const newLid = item.lid === 'lid' || item.remoteJid?.includes('@lid') ? 'lid' : null;\n\n      const dataPayload = {\n        remoteJid: remoteJid,\n        jidOptions: newJidOptionsString,\n        lid: newLid,\n      };\n\n      // 4. Decide entre Criar ou Atualizar\n      if (existingRecord) {\n        // Compara a string de JIDs ordenada existente com a nova\n        const existingJidOptionsString = existingRecord.jidOptions\n          ? existingRecord.jidOptions.split(',').sort().join(',')\n          : '';\n\n        const isDataSame =\n          existingRecord.remoteJid === dataPayload.remoteJid &&\n          existingJidOptionsString === dataPayload.jidOptions &&\n          existingRecord.lid === dataPayload.lid;\n\n        if (isDataSame) {\n          logger.verbose(`[saveOnWhatsappCache] Data for ${remoteJid} is already up-to-date. Skipping update.`);\n          return; // Pula para o próximo item\n        }\n\n        // Os dados são diferentes, então atualiza\n        logger.verbose(\n          `[saveOnWhatsappCache] Register exists, updating: remoteJid=${remoteJid}, jidOptions=${dataPayload.jidOptions}, lid=${dataPayload.lid}`,\n        );\n        await prismaRepository.isOnWhatsapp.update({\n          where: { id: existingRecord.id },\n          data: dataPayload,\n        });\n      } else {\n        // Cria nova entrada\n        logger.verbose(\n          `[saveOnWhatsappCache] Register does not exist, creating: remoteJid=${remoteJid}, jidOptions=${dataPayload.jidOptions}, lid=${dataPayload.lid}`,\n        );\n        await prismaRepository.isOnWhatsapp.create({\n          data: dataPayload,\n        });\n      }\n    } catch (e) {\n      // Loga o erro mas não para a execução dos outros promises\n      logger.error(`[saveOnWhatsappCache] Error processing item for ${item.remoteJid}: `);\n      logger.error(e);\n    }\n  });\n\n  // Espera todas as operações paralelas terminarem\n  await Promise.allSettled(processingPromises);\n}\n\nexport async function getOnWhatsappCache(remoteJids: string[]) {\n  let results: {\n    remoteJid: string;\n    number: string;\n    jidOptions: string[];\n    lid?: string;\n  }[] = [];\n\n  if (configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) {\n    const remoteJidsWithoutPlus = remoteJids.map((remoteJid) => getAvailableNumbers(remoteJid)).flat();\n\n    const onWhatsappCache = await prismaRepository.isOnWhatsapp.findMany({\n      where: {\n        OR: remoteJidsWithoutPlus.map((remoteJid) => ({ jidOptions: { contains: remoteJid } })),\n        updatedAt: {\n          gte: dayjs().subtract(configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP_DAYS, 'days').toDate(),\n        },\n      },\n    });\n\n    results = onWhatsappCache.map((item) => ({\n      remoteJid: item.remoteJid,\n      number: item.remoteJid.split('@')[0],\n      jidOptions: item.jidOptions.split(','),\n      lid: item.lid,\n    }));\n  }\n\n  return results;\n}\n","/**\n * ┌──────────────────────────────────────────────────────────────────────────────┐\n * │ @author jrCleber                                                             │\n * │ @filename use-multi-file-auth-state-provider-files.ts                              │\n * │ Developed by: Cleber Wilson                                                  │\n * │ Creation date: May 31, 2024                                                 │\n * │ Contact: contato@codechat.dev                                                │\n * ├──────────────────────────────────────────────────────────────────────────────┤\n * │ @copyright © Cleber Wilson 2023. All rights reserved.                        │\n * │ Licensed under the Apache License, Version 2.0                               │\n * │                                                                              │\n * │  @license \"https://github.com/code-chat-br/whatsapp-api/blob/main/LICENSE\"   │\n * │                                                                              │\n * │ You may not use this file except in compliance with the License.             │\n * │ You may obtain a copy of the License at                                      │\n * │                                                                              │\n * │    http://www.apache.org/licenses/LICENSE-2.0                                │\n * │                                                                              │\n * │ Unless required by applicable law or agreed to in writing, software          │\n * │ distributed under the License is distributed on an \"AS IS\" BASIS,            │\n * │ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.     │\n * │                                                                              │\n * │ See the License for the specific language governing permissions and          │\n * │ limitations under the License.                                               │\n * │                                                                              │\n * │ @type {AuthState}                                                            │\n * │ @function useMultiFileAuthStateRedisDb                                       │\n * │ @returns {Promise<AuthState>}                                                │\n * ├──────────────────────────────────────────────────────────────────────────────┤\n * │ @important                                                                   │\n * │ For any future changes to the code in this file, it is recommended to        │\n * │ contain, together with the modification, the information of the developer    │\n * │ who changed it and the date of modification.                                 │\n * └──────────────────────────────────────────────────────────────────────────────┘\n */\n\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { Logger } from '@config/logger.config';\nimport { AuthenticationCreds, AuthenticationState, BufferJSON, initAuthCreds, proto, SignalDataTypeMap } from 'baileys';\nimport { isNotEmpty } from 'class-validator';\n\nexport type AuthState = {\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  removeCreds: () => Promise<void>;\n};\n\nexport class AuthStateProvider {\n  constructor(private readonly providerFiles: ProviderFiles) {}\n\n  private readonly logger = new Logger('AuthStateProvider');\n\n  public async authStateProvider(instance: string): Promise<AuthState> {\n    const [, error] = await this.providerFiles.create(instance);\n    if (error) {\n      this.logger.error(['Failed to create folder on file server', error?.message, error?.stack]);\n      return;\n    }\n\n    const writeData = async (data: any, key: string): Promise<any> => {\n      const json = JSON.stringify(data, BufferJSON.replacer);\n      const [response, error] = await this.providerFiles.write(instance, key, {\n        data: json,\n      });\n      if (error) {\n        // this.logger.error(['writeData', error?.message, error?.stack]);\n        return;\n      }\n      return response;\n    };\n\n    const readData = async (key: string): Promise<any> => {\n      const [response, error] = await this.providerFiles.read(instance, key);\n      if (error) {\n        // this.logger.error(['readData', error?.message, error?.stack]);\n        return;\n      }\n      if (isNotEmpty(response?.data)) {\n        return JSON.parse(JSON.stringify(response.data), BufferJSON.reviver);\n      }\n    };\n\n    const removeData = async (key: string) => {\n      const [response, error] = await this.providerFiles.delete(instance, key);\n      if (error) {\n        // this.logger.error(['removeData', error?.message, error?.stack]);\n        return;\n      }\n\n      return response;\n    };\n\n    const removeCreds = async () => {\n      const [response, error] = await this.providerFiles.removeSession(instance);\n      if (error) {\n        // this.logger.error(['removeData', error?.message, error?.stack]);\n        return;\n      }\n\n      logger.info({ action: 'remove.session', instance, response });\n\n      return;\n    };\n\n    const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n    return {\n      state: {\n        creds,\n        keys: {\n          get: async (type, ids: string[]) => {\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            const data: { [_: string]: SignalDataTypeMap[type] } = {};\n            await Promise.all(\n              ids.map(async (id) => {\n                let value = await readData(`${type}-${id}`);\n                if (type === 'app-state-sync-key' && value) {\n                  value = proto.Message.AppStateSyncKeyData.create(value);\n                }\n\n                data[id] = value;\n              }),\n            );\n\n            return data;\n          },\n          set: async (data: any) => {\n            const tasks: Promise<void>[] = [];\n            for (const category in data) {\n              for (const id in data[category]) {\n                const value = data[category][id];\n                const key = `${category}-${id}`;\n                tasks.push(value ? await writeData(value, key) : await removeData(key));\n              }\n            }\n\n            await Promise.all(tasks);\n          },\n        },\n      },\n      saveCreds: async () => {\n        return await writeData(creds, 'creds');\n      },\n\n      removeCreds,\n    };\n  }\n}\n\nconst logger = new Logger('useMultiFileAuthStatePrisma');\n","import { CacheService } from '@api/services/cache.service';\nimport { Logger } from '@config/logger.config';\nimport { AuthenticationCreds, AuthenticationState, initAuthCreds, proto, SignalDataTypeMap } from 'baileys';\n\nexport async function useMultiFileAuthStateRedisDb(\n  instanceName: string,\n  cache: CacheService,\n): Promise<{\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  removeCreds: () => Promise<void>;\n}> {\n  const logger = new Logger('useMultiFileAuthStateRedisDb');\n\n  const writeData = async (data: any, key: string): Promise<any> => {\n    try {\n      return await cache.hSet(instanceName, key, data);\n    } catch (error) {\n      return logger.error({ localError: 'writeData', error });\n    }\n  };\n\n  const readData = async (key: string): Promise<any> => {\n    try {\n      return await cache.hGet(instanceName, key);\n    } catch (error) {\n      logger.error({ localError: 'readData', error });\n      return;\n    }\n  };\n\n  const removeData = async (key: string) => {\n    try {\n      return await cache.hDelete(instanceName, key);\n    } catch (error) {\n      logger.error({ readData: 'removeData', error });\n    }\n  };\n\n  async function removeCreds(): Promise<any> {\n    try {\n      logger.warn({ action: 'redis.delete', instanceName });\n\n      return await cache.delete(instanceName);\n    } catch {\n      return;\n    }\n  }\n\n  const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds();\n\n  return {\n    state: {\n      creds,\n      keys: {\n        get: async (type, ids: string[]) => {\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          const data: { [_: string]: SignalDataTypeMap[type] } = {};\n          await Promise.all(\n            ids.map(async (id) => {\n              let value = await readData(`${type}-${id}`);\n              if (type === 'app-state-sync-key' && value) {\n                value = proto.Message.AppStateSyncKeyData.create(value);\n              }\n\n              data[id] = value;\n            }),\n          );\n\n          return data;\n        },\n        set: async (data: any) => {\n          const tasks: Promise<void>[] = [];\n          for (const category in data) {\n            for (const id in data[category]) {\n              const value = data[category][id];\n              const key = `${category}-${id}`;\n              tasks.push(value ? await writeData(value, key) : await removeData(key));\n            }\n          }\n\n          await Promise.all(tasks);\n        },\n      },\n    },\n    saveCreds: async () => {\n      return await writeData(creds, 'creds');\n    },\n\n    removeCreds,\n  };\n}\n","import { Logger } from '@config/logger.config';\nimport { BaileysEventMap, MessageUpsertType, WAMessage } from 'baileys';\nimport { catchError, concatMap, delay, EMPTY, from, retryWhen, Subject, Subscription, take, tap } from 'rxjs';\n\ntype MessageUpsertPayload = BaileysEventMap['messages.upsert'];\ntype MountProps = {\n  onMessageReceive: (payload: MessageUpsertPayload, settings: any) => Promise<void>;\n};\n\nexport class BaileysMessageProcessor {\n  private processorLogs = new Logger('BaileysMessageProcessor');\n  private subscription?: Subscription;\n\n  protected messageSubject = new Subject<{\n    messages: WAMessage[];\n    type: MessageUpsertType;\n    requestId?: string;\n    settings: any;\n  }>();\n\n  mount({ onMessageReceive }: MountProps) {\n    // Se já existe subscription, fazer cleanup primeiro\n    if (this.subscription && !this.subscription.closed) {\n      this.subscription.unsubscribe();\n    }\n\n    // Se o Subject foi completado, recriar\n    if (this.messageSubject.closed) {\n      this.processorLogs.warn('MessageSubject was closed, recreating...');\n      this.messageSubject = new Subject<{\n        messages: WAMessage[];\n        type: MessageUpsertType;\n        requestId?: string;\n        settings: any;\n      }>();\n    }\n\n    this.subscription = this.messageSubject\n      .pipe(\n        tap(({ messages }) => {\n          this.processorLogs.log(`Processing batch of ${messages.length} messages`);\n        }),\n        concatMap(({ messages, type, requestId, settings }) =>\n          from(onMessageReceive({ messages, type, requestId }, settings)).pipe(\n            retryWhen((errors) =>\n              errors.pipe(\n                tap((error) => this.processorLogs.warn(`Retrying message batch due to error: ${error.message}`)),\n                delay(1000), // 1 segundo de delay\n                take(3), // Máximo 3 tentativas\n              ),\n            ),\n          ),\n        ),\n        catchError((error) => {\n          this.processorLogs.error(`Error processing message batch: ${error}`);\n          return EMPTY;\n        }),\n      )\n      .subscribe({\n        error: (error) => {\n          this.processorLogs.error(`Message stream error: ${error}`);\n        },\n      });\n  }\n\n  processMessage(payload: MessageUpsertPayload, settings: any) {\n    const { messages, type, requestId } = payload;\n    this.messageSubject.next({ messages, type, requestId, settings });\n  }\n\n  onDestroy() {\n    this.subscription?.unsubscribe();\n    this.messageSubject.complete();\n  }\n}\n","import { ConnectionState, WAConnectionState, WASocket } from 'baileys';\nimport { io, Socket } from 'socket.io-client';\n\nimport { ClientToServerEvents, ServerToClientEvents } from './transport.type';\n\nlet baileys_connection_state: WAConnectionState = 'close';\n\nexport const useVoiceCallsBaileys = async (\n  wavoip_token: string,\n  baileys_sock: WASocket,\n  status?: WAConnectionState,\n  logger?: boolean,\n) => {\n  baileys_connection_state = status ?? 'close';\n\n  const socket: Socket<ServerToClientEvents, ClientToServerEvents> = io('https://devices.wavoip.com/baileys', {\n    transports: ['websocket'],\n    path: `/${wavoip_token}/websocket`,\n  });\n\n  socket.on('connect', () => {\n    if (logger) console.log('[*] - Wavoip connected', socket.id);\n\n    socket.emit(\n      'init',\n      baileys_sock.authState.creds.me,\n      baileys_sock.authState.creds.account,\n      baileys_connection_state,\n    );\n  });\n\n  socket.on('disconnect', () => {\n    if (logger) console.log('[*] - Wavoip disconnect');\n  });\n\n  socket.on('connect_error', (error) => {\n    if (socket.active) {\n      if (logger)\n        console.log(\n          '[*] - Wavoip connection error temporary failure, the socket will automatically try to reconnect',\n          error,\n        );\n    } else {\n      if (logger) console.log('[*] - Wavoip connection error', error.message);\n    }\n  });\n\n  socket.on('onWhatsApp', async (jid, callback) => {\n    try {\n      const response: any = await baileys_sock.onWhatsApp(jid);\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call onWhatsApp function', response, jid);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call onWhatsApp function', error);\n    }\n  });\n\n  socket.on('profilePictureUrl', async (jid, type, timeoutMs, callback) => {\n    try {\n      const response = await baileys_sock.profilePictureUrl(jid, type, timeoutMs);\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call profilePictureUrl function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call profilePictureUrl function', error);\n    }\n  });\n\n  socket.on('assertSessions', async (jids, force, callback) => {\n    try {\n      const response = await baileys_sock.assertSessions(jids);\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call assertSessions function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call assertSessions function', error);\n    }\n  });\n\n  socket.on('createParticipantNodes', async (jids, message, extraAttrs, callback) => {\n    try {\n      const response = await baileys_sock.createParticipantNodes(jids, message, extraAttrs);\n\n      callback(response, true);\n\n      if (logger) console.log('[*] Success on call createParticipantNodes function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call createParticipantNodes function', error);\n    }\n  });\n\n  socket.on('getUSyncDevices', async (jids, useCache, ignoreZeroDevices, callback) => {\n    try {\n      const response = await baileys_sock.getUSyncDevices(jids, useCache, ignoreZeroDevices);\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call getUSyncDevices function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call getUSyncDevices function', error);\n    }\n  });\n\n  socket.on('generateMessageTag', async (callback) => {\n    try {\n      const response = await baileys_sock.generateMessageTag();\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call generateMessageTag function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call generateMessageTag function', error);\n    }\n  });\n\n  socket.on('sendNode', async (stanza, callback) => {\n    try {\n      console.log('sendNode', JSON.stringify(stanza));\n      const response = await baileys_sock.sendNode(stanza);\n\n      callback(true);\n\n      if (logger) console.log('[*] Success on call sendNode function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call sendNode function', error);\n    }\n  });\n\n  socket.on('signalRepository:decryptMessage', async (jid, type, ciphertext, callback) => {\n    try {\n      const response = await baileys_sock.signalRepository.decryptMessage({\n        jid: jid,\n        type: type,\n        ciphertext: ciphertext,\n      });\n\n      callback(response);\n\n      if (logger) console.log('[*] Success on call signalRepository:decryptMessage function', response);\n    } catch (error) {\n      if (logger) console.error('[*] Error on call signalRepository:decryptMessage function', error);\n    }\n  });\n\n  // we only use this connection data to inform the webphone that the device is connected and creeds account to generate e2e whatsapp key for make call packets\n  baileys_sock.ev.on('connection.update', (update: Partial<ConnectionState>) => {\n    const { connection } = update;\n\n    if (connection) {\n      baileys_connection_state = connection;\n      socket\n        .timeout(1000)\n        .emit(\n          'connection.update:status',\n          baileys_sock.authState.creds.me,\n          baileys_sock.authState.creds.account,\n          connection,\n        );\n    }\n\n    if (update.qr) {\n      socket.timeout(1000).emit('connection.update:qr', update.qr);\n    }\n  });\n\n  baileys_sock.ws.on('CB:call', (packet) => {\n    if (logger) console.log('[*] Signling received');\n    socket.volatile.timeout(1000).emit('CB:call', packet);\n  });\n\n  baileys_sock.ws.on('CB:ack,class:call', (packet) => {\n    if (logger) console.log('[*] Signling ack received');\n    socket.volatile.timeout(1000).emit('CB:ack,class:call', packet);\n  });\n\n  return socket;\n};\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { CacheService } from '@api/services/cache.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService } from '@config/env.config';\nimport { BadRequestException } from '@exceptions';\nimport EventEmitter2 from 'eventemitter2';\n\nimport { EvolutionStartupService } from './evolution/evolution.channel.service';\nimport { BusinessStartupService } from './meta/whatsapp.business.service';\nimport { BaileysStartupService } from './whatsapp/whatsapp.baileys.service';\n\ntype ChannelDataType = {\n  configService: ConfigService;\n  eventEmitter: EventEmitter2;\n  prismaRepository: PrismaRepository;\n  cache: CacheService;\n  chatwootCache: CacheService;\n  baileysCache: CacheService;\n  providerFiles: ProviderFiles;\n};\n\nexport interface ChannelControllerInterface {\n  receiveWebhook(data: any): Promise<any>;\n}\n\nexport class ChannelController {\n  public prismaRepository: PrismaRepository;\n  public waMonitor: WAMonitoringService;\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    this.prisma = prismaRepository;\n    this.monitor = waMonitor;\n  }\n\n  public set prisma(prisma: PrismaRepository) {\n    this.prismaRepository = prisma;\n  }\n\n  public get prisma() {\n    return this.prismaRepository;\n  }\n\n  public set monitor(waMonitor: WAMonitoringService) {\n    this.waMonitor = waMonitor;\n  }\n\n  public get monitor() {\n    return this.waMonitor;\n  }\n\n  public init(instanceData: InstanceDto, data: ChannelDataType) {\n    if (!instanceData.token && instanceData.integration === Integration.WHATSAPP_BUSINESS) {\n      throw new BadRequestException('token is required');\n    }\n\n    if (instanceData.integration === Integration.WHATSAPP_BUSINESS) {\n      return new BusinessStartupService(\n        data.configService,\n        data.eventEmitter,\n        data.prismaRepository,\n        data.cache,\n        data.chatwootCache,\n        data.baileysCache,\n        data.providerFiles,\n      );\n    }\n\n    if (instanceData.integration === Integration.EVOLUTION) {\n      return new EvolutionStartupService(\n        data.configService,\n        data.eventEmitter,\n        data.prismaRepository,\n        data.cache,\n        data.chatwootCache,\n      );\n    }\n\n    if (instanceData.integration === Integration.WHATSAPP_BAILEYS) {\n      return new BaileysStartupService(\n        data.configService,\n        data.eventEmitter,\n        data.prismaRepository,\n        data.cache,\n        data.chatwootCache,\n        data.baileysCache,\n        data.providerFiles,\n      );\n    }\n\n    return null;\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Logger } from '@config/logger.config';\n\nimport { ChannelController, ChannelControllerInterface } from '../channel.controller';\n\nexport class EvolutionController extends ChannelController implements ChannelControllerInterface {\n  private readonly logger = new Logger('EvolutionController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor);\n  }\n\n  integrationEnabled: boolean;\n\n  public async receiveWebhook(data: any) {\n    const numberId = data.numberId;\n\n    if (!numberId) {\n      this.logger.error('WebhookService -> receiveWebhookEvolution -> numberId not found');\n      return;\n    }\n\n    const instance = await this.prismaRepository.instance.findFirst({\n      where: { number: numberId },\n    });\n\n    if (!instance) {\n      this.logger.error('WebhookService -> receiveWebhook -> instance not found');\n      return;\n    }\n\n    await this.waMonitor.waInstances[instance.name].connectToWhatsapp(data);\n\n    return {\n      status: 'success',\n    };\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Logger } from '@config/logger.config';\nimport axios from 'axios';\n\nimport { ChannelController, ChannelControllerInterface } from '../channel.controller';\n\nexport class MetaController extends ChannelController implements ChannelControllerInterface {\n  private readonly logger = new Logger('MetaController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor);\n  }\n\n  integrationEnabled: boolean;\n\n  public async receiveWebhook(data: any) {\n    if (data.object === 'whatsapp_business_account') {\n      if (data.entry[0]?.changes[0]?.field === 'message_template_status_update') {\n        const template = await this.prismaRepository.template.findFirst({\n          where: { templateId: `${data.entry[0].changes[0].value.message_template_id}` },\n        });\n\n        if (!template) {\n          console.log('template not found');\n          return;\n        }\n\n        const { webhookUrl } = template;\n\n        await axios.post(webhookUrl, data.entry[0].changes[0].value, {\n          headers: {\n            'Content-Type': 'application/json',\n          },\n        });\n        return;\n      }\n\n      data.entry?.forEach(async (entry: any) => {\n        const numberId = entry.changes[0].value.metadata.phone_number_id;\n\n        if (!numberId) {\n          this.logger.error('WebhookService -> receiveWebhookMeta -> numberId not found');\n          return {\n            status: 'success',\n          };\n        }\n\n        const instance = await this.prismaRepository.instance.findFirst({\n          where: { number: numberId },\n        });\n\n        if (!instance) {\n          this.logger.error('WebhookService -> receiveWebhookMeta -> instance not found');\n          return {\n            status: 'success',\n          };\n        }\n\n        await this.waMonitor.waInstances[instance.name].connectToWhatsapp(data);\n\n        return {\n          status: 'success',\n        };\n      });\n    }\n\n    return {\n      status: 'success',\n    };\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { WAMonitoringService } from '@api/services/monitor.service';\n\nexport class BaileysController {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  public async onWhatsapp({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysOnWhatsapp(body?.jid);\n  }\n\n  public async profilePictureUrl({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysProfilePictureUrl(body?.jid, body?.type, body?.timeoutMs);\n  }\n\n  public async assertSessions({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysAssertSessions(body?.jids, body?.force);\n  }\n\n  public async createParticipantNodes({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysCreateParticipantNodes(body?.jids, body?.message, body?.extraAttrs);\n  }\n\n  public async getUSyncDevices({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysGetUSyncDevices(body?.jids, body?.useCache, body?.ignoreZeroDevices);\n  }\n\n  public async generateMessageTag({ instanceName }: InstanceDto) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysGenerateMessageTag();\n  }\n\n  public async sendNode({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysSendNode(body?.stanza);\n  }\n\n  public async signalRepositoryDecryptMessage({ instanceName }: InstanceDto, body: any) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysSignalRepositoryDecryptMessage(body?.jid, body?.type, body?.ciphertext);\n  }\n\n  public async getAuthState({ instanceName }: InstanceDto) {\n    const instance = this.waMonitor.waInstances[instanceName];\n\n    return instance.baileysGetAuthState();\n  }\n}\n","function normalizeString(str: string): string {\n  return str\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .toLowerCase();\n}\n\nexport function advancedOperatorsSearch(data: string, query: string): boolean {\n  const filters = query.split(' ').reduce((acc: Record<string, string[]>, filter) => {\n    const [operator, ...values] = filter.split(':');\n    const value = values.join(':');\n\n    if (!acc[operator]) {\n      acc[operator] = [];\n    }\n    acc[operator].push(value);\n    return acc;\n  }, {});\n\n  const normalizedItem = normalizeString(data);\n\n  return Object.entries(filters).every(([operator, values]) => {\n    return values.some((val) => {\n      const subValues = val.split(',');\n      return subValues.every((subVal) => {\n        const normalizedSubVal = normalizeString(subVal);\n\n        switch (operator.toLowerCase()) {\n          case 'contains':\n            return normalizedItem.includes(normalizedSubVal);\n          case 'notcontains':\n            return !normalizedItem.includes(normalizedSubVal);\n          case 'startswith':\n            return normalizedItem.startsWith(normalizedSubVal);\n          case 'endswith':\n            return normalizedItem.endsWith(normalizedSubVal);\n          case 'exact':\n            return normalizedItem === normalizedSubVal;\n          default:\n            return false;\n        }\n      });\n    });\n  });\n}\n","import { advancedOperatorsSearch } from './advancedOperatorsSearch';\n\nexport const findBotByTrigger = async (botRepository: any, content: string, instanceId: string) => {\n  // Check for triggerType 'all' or 'none' (both should match any message)\n  const findTriggerAllOrNone = await botRepository.findFirst({\n    where: {\n      enabled: true,\n      triggerType: {\n        in: ['all', 'none'],\n      },\n      instanceId: instanceId,\n    },\n  });\n\n  if (findTriggerAllOrNone) {\n    return findTriggerAllOrNone;\n  }\n\n  const findTriggerAdvanced = await botRepository.findMany({\n    where: {\n      enabled: true,\n      triggerType: 'advanced',\n      instanceId: instanceId,\n    },\n  });\n  for (const advanced of findTriggerAdvanced) {\n    if (advancedOperatorsSearch(content, advanced.triggerValue)) {\n      return advanced;\n    }\n  }\n\n  // Check for exact match\n  const findTriggerEquals = await botRepository.findFirst({\n    where: {\n      enabled: true,\n      triggerType: 'keyword',\n      triggerOperator: 'equals',\n      triggerValue: content,\n      instanceId: instanceId,\n    },\n  });\n\n  if (findTriggerEquals) {\n    return findTriggerEquals;\n  }\n\n  // Check for regex match\n  const findRegex = await botRepository.findMany({\n    where: {\n      enabled: true,\n      triggerType: 'keyword',\n      triggerOperator: 'regex',\n      instanceId: instanceId,\n    },\n  });\n\n  let findTriggerRegex = null;\n\n  for (const regex of findRegex) {\n    const regexValue = new RegExp(regex.triggerValue);\n\n    if (regexValue.test(content)) {\n      findTriggerRegex = regex;\n      break;\n    }\n  }\n\n  if (findTriggerRegex) return findTriggerRegex;\n\n  // Check for startsWith match\n  const findStartsWith = await botRepository.findMany({\n    where: {\n      enabled: true,\n      triggerType: 'keyword',\n      triggerOperator: 'startsWith',\n      instanceId: instanceId,\n    },\n  });\n\n  let findTriggerStartsWith = null;\n\n  for (const startsWith of findStartsWith) {\n    if (content.startsWith(startsWith.triggerValue)) {\n      findTriggerStartsWith = startsWith;\n      break;\n    }\n  }\n\n  if (findTriggerStartsWith) return findTriggerStartsWith;\n\n  // Check for endsWith match\n  const findEndsWith = await botRepository.findMany({\n    where: {\n      enabled: true,\n      triggerType: 'keyword',\n      triggerOperator: 'endsWith',\n      instanceId: instanceId,\n    },\n  });\n\n  let findTriggerEndsWith = null;\n\n  for (const endsWith of findEndsWith) {\n    if (content.endsWith(endsWith.triggerValue)) {\n      findTriggerEndsWith = endsWith;\n      break;\n    }\n  }\n\n  if (findTriggerEndsWith) return findTriggerEndsWith;\n\n  // Check for contains match\n  const findContains = await botRepository.findMany({\n    where: {\n      enabled: true,\n      triggerType: 'keyword',\n      triggerOperator: 'contains',\n      instanceId: instanceId,\n    },\n  });\n\n  let findTriggerContains = null;\n\n  for (const contains of findContains) {\n    if (content.includes(contains.triggerValue)) {\n      findTriggerContains = contains;\n      break;\n    }\n  }\n\n  if (findTriggerContains) return findTriggerContains;\n\n  return null;\n};\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport {\n  difyController,\n  evoaiController,\n  evolutionBotController,\n  flowiseController,\n  n8nController,\n  openaiController,\n  typebotController,\n} from '@api/server.module';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Logger } from '@config/logger.config';\nimport { IntegrationSession } from '@prisma/client';\nimport { findBotByTrigger } from '@utils/findBotByTrigger';\n\nexport type EmitData = {\n  instance: InstanceDto;\n  remoteJid: string;\n  msg: any;\n  pushName?: string;\n};\n\nexport interface ChatbotControllerInterface {\n  integrationEnabled: boolean;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } };\n\n  createBot(instance: InstanceDto, data: any): Promise<any>;\n  findBot(instance: InstanceDto): Promise<any>;\n  fetchBot(instance: InstanceDto, botId: string): Promise<any>;\n  updateBot(instance: InstanceDto, botId: string, data: any): Promise<any>;\n  deleteBot(instance: InstanceDto, botId: string): Promise<any>;\n\n  settings(instance: InstanceDto, data: any): Promise<any>;\n  fetchSettings(instance: InstanceDto): Promise<any>;\n\n  changeStatus(instance: InstanceDto, botId: string, status: string): Promise<any>;\n  fetchSessions(instance: InstanceDto, botId: string, remoteJid?: string): Promise<any>;\n  ignoreJid(instance: InstanceDto, data: any): Promise<any>;\n\n  emit(data: EmitData): Promise<void>;\n}\n\nexport class ChatbotController {\n  public prismaRepository: PrismaRepository;\n  public waMonitor: WAMonitoringService;\n\n  public readonly logger = new Logger('ChatbotController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    this.prisma = prismaRepository;\n    this.monitor = waMonitor;\n  }\n\n  public set prisma(prisma: PrismaRepository) {\n    this.prismaRepository = prisma;\n  }\n\n  public get prisma() {\n    return this.prismaRepository;\n  }\n\n  public set monitor(waMonitor: WAMonitoringService) {\n    this.waMonitor = waMonitor;\n  }\n\n  public get monitor() {\n    return this.waMonitor;\n  }\n\n  public async emit({\n    instance,\n    remoteJid,\n    msg,\n    pushName,\n    isIntegration = false,\n  }: {\n    instance: InstanceDto;\n    remoteJid: string;\n    msg: any;\n    pushName?: string;\n    isIntegration?: boolean;\n  }): Promise<void> {\n    const emitData = {\n      instance,\n      remoteJid,\n      msg,\n      pushName,\n      isIntegration,\n    };\n    evolutionBotController.emit(emitData);\n\n    typebotController.emit(emitData);\n\n    openaiController.emit(emitData);\n\n    difyController.emit(emitData);\n\n    n8nController.emit(emitData);\n\n    evoaiController.emit(emitData);\n\n    flowiseController.emit(emitData);\n  }\n\n  public processDebounce(\n    userMessageDebounce: any,\n    content: string,\n    remoteJid: string,\n    debounceTime: number,\n    callback: any,\n  ) {\n    if (userMessageDebounce[remoteJid]) {\n      userMessageDebounce[remoteJid].message += `\\n${content}`;\n      this.logger.log('message debounced: ' + userMessageDebounce[remoteJid].message);\n      clearTimeout(userMessageDebounce[remoteJid].timeoutId);\n    } else {\n      userMessageDebounce[remoteJid] = {\n        message: content,\n        timeoutId: null,\n      };\n    }\n\n    userMessageDebounce[remoteJid].timeoutId = setTimeout(() => {\n      const myQuestion = userMessageDebounce[remoteJid].message;\n      this.logger.log('Debounce complete. Processing message: ' + myQuestion);\n\n      delete userMessageDebounce[remoteJid];\n      callback(myQuestion);\n    }, debounceTime * 1000);\n  }\n\n  public checkIgnoreJids(ignoreJids: any, remoteJid: string) {\n    if (ignoreJids && ignoreJids.length > 0) {\n      let ignoreGroups = false;\n      let ignoreContacts = false;\n\n      if (ignoreJids.includes('@g.us')) {\n        ignoreGroups = true;\n      }\n\n      if (ignoreJids.includes('@s.whatsapp.net')) {\n        ignoreContacts = true;\n      }\n\n      if (ignoreGroups && remoteJid.endsWith('@g.us')) {\n        this.logger.warn('Ignoring message from group: ' + remoteJid);\n        return true;\n      }\n\n      if (ignoreContacts && remoteJid.endsWith('@s.whatsapp.net')) {\n        this.logger.warn('Ignoring message from contact: ' + remoteJid);\n        return true;\n      }\n\n      if (ignoreJids.includes(remoteJid)) {\n        this.logger.warn('Ignoring message from jid: ' + remoteJid);\n        return true;\n      }\n\n      return false;\n    }\n\n    return false;\n  }\n\n  public async getSession(remoteJid: string, instance: InstanceDto) {\n    let session = await this.prismaRepository.integrationSession.findFirst({\n      where: {\n        remoteJid: remoteJid,\n        instanceId: instance.instanceId,\n      },\n      orderBy: { createdAt: 'desc' },\n    });\n\n    if (session) {\n      if (session.status !== 'closed' && !session.botId) {\n        this.logger.warn('Session is already opened in another integration');\n        return null;\n      } else if (!session.botId) {\n        session = null;\n      }\n    }\n\n    return session;\n  }\n\n  public async findBotTrigger(\n    botRepository: any,\n    content: string,\n    instance: InstanceDto,\n    session?: IntegrationSession,\n  ) {\n    let findBot: any = null;\n\n    if (!session) {\n      findBot = await findBotByTrigger(botRepository, content, instance.instanceId);\n\n      if (!findBot) {\n        return null;\n      }\n    } else {\n      findBot = await botRepository.findFirst({\n        where: {\n          id: session.botId,\n        },\n      });\n    }\n\n    return findBot;\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ChatwootDto } from '@api/integrations/chatbot/chatwoot/dto/chatwoot.dto';\nimport { ChatwootService } from '@api/integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { Chatwoot, ConfigService, HttpServer } from '@config/env.config';\nimport { BadRequestException } from '@exceptions';\nimport { isURL } from 'class-validator';\n\nexport class ChatwootController {\n  constructor(\n    private readonly chatwootService: ChatwootService,\n    private readonly configService: ConfigService,\n  ) {}\n\n  public async createChatwoot(instance: InstanceDto, data: ChatwootDto) {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) throw new BadRequestException('Chatwoot is disabled');\n\n    if (data?.enabled) {\n      if (!isURL(data.url, { require_tld: false })) {\n        throw new BadRequestException('url is not valid');\n      }\n\n      if (!data.accountId) {\n        throw new BadRequestException('accountId is required');\n      }\n\n      if (!data.token) {\n        throw new BadRequestException('token is required');\n      }\n\n      if (data.signMsg !== true && data.signMsg !== false) {\n        throw new BadRequestException('signMsg is required');\n      }\n      if (data.signMsg === false) data.signDelimiter = null;\n    }\n\n    if (!data.nameInbox || data.nameInbox === '') {\n      data.nameInbox = instance.instanceName;\n    }\n\n    const result = await this.chatwootService.create(instance, data);\n\n    const urlServer = this.configService.get<HttpServer>('SERVER').URL;\n\n    const response = {\n      ...result,\n      webhook_url: `${urlServer}/chatwoot/webhook/${encodeURIComponent(instance.instanceName)}`,\n    };\n\n    return response;\n  }\n\n  public async findChatwoot(instance: InstanceDto): Promise<ChatwootDto & { webhook_url: string }> {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) throw new BadRequestException('Chatwoot is disabled');\n\n    const result = await this.chatwootService.find(instance);\n\n    const urlServer = this.configService.get<HttpServer>('SERVER').URL;\n\n    if (Object.keys(result || {}).length === 0) {\n      return {\n        enabled: false,\n        url: '',\n        accountId: '',\n        token: '',\n        signMsg: false,\n        nameInbox: '',\n        webhook_url: '',\n      };\n    }\n\n    const response = {\n      ...result,\n      webhook_url: `${urlServer}/chatwoot/webhook/${encodeURIComponent(instance.instanceName)}`,\n    };\n\n    return response;\n  }\n\n  public async receiveWebhook(instance: InstanceDto, data: any) {\n    if (!this.configService.get<Chatwoot>('CHATWOOT').ENABLED) throw new BadRequestException('Chatwoot is disabled');\n\n    return this.chatwootService.receiveWebhook(instance, data);\n  }\n}\n","import { IgnoreJidDto } from '@api/dto/chatbot.dto';\nimport { InstanceDto } from '@api/dto/instance.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Events } from '@api/types/wa.types';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { TriggerOperator, TriggerType } from '@prisma/client';\nimport { getConversationMessage } from '@utils/getConversationMessage';\n\nimport { BaseChatbotDto } from './base-chatbot.dto';\nimport { ChatbotController, ChatbotControllerInterface, EmitData } from './chatbot.controller';\n\n// Common settings interface for all chatbot integrations\nexport interface ChatbotSettings {\n  expire: number;\n  keywordFinish: string;\n  delayMessage: number;\n  unknownMessage: string;\n  listeningFromMe: boolean;\n  stopBotFromMe: boolean;\n  keepOpen: boolean;\n  debounceTime: number;\n  ignoreJids: string[];\n  splitMessages: boolean;\n  timePerChar: number;\n  [key: string]: any;\n}\n\n// Common bot properties for all chatbot integrations\nexport interface BaseBotData {\n  enabled?: boolean;\n  description: string;\n  expire?: number;\n  keywordFinish?: string;\n  delayMessage?: number;\n  unknownMessage?: string;\n  listeningFromMe?: boolean;\n  stopBotFromMe?: boolean;\n  keepOpen?: boolean;\n  debounceTime?: number;\n  triggerType: string | TriggerType;\n  triggerOperator?: string | TriggerOperator;\n  triggerValue?: string;\n  ignoreJids?: string[];\n  splitMessages?: boolean;\n  timePerChar?: number;\n  [key: string]: any;\n}\n\nexport abstract class BaseChatbotController<BotType = any, BotData extends BaseChatbotDto = BaseChatbotDto>\n  extends ChatbotController\n  implements ChatbotControllerInterface\n{\n  public readonly logger: Logger;\n\n  integrationEnabled: boolean;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  // Name of the integration, to be set by the derived class\n  protected abstract readonly integrationName: string;\n\n  // Method to process bot-specific logic\n  protected abstract processBot(\n    waInstance: any,\n    remoteJid: string,\n    bot: BotType,\n    session: any,\n    settings: ChatbotSettings,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ): Promise<void>;\n\n  // Method to get the fallback bot ID from settings\n  protected abstract getFallbackBotId(settings: any): string | undefined;\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor);\n\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  // Base create bot implementation\n  public async createBot(instance: InstanceDto, data: BotData) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // Set default settings if not provided\n    if (\n      !data.expire ||\n      !data.keywordFinish ||\n      !data.delayMessage ||\n      !data.unknownMessage ||\n      !data.listeningFromMe ||\n      !data.stopBotFromMe ||\n      !data.keepOpen ||\n      !data.debounceTime ||\n      !data.ignoreJids ||\n      !data.splitMessages ||\n      !data.timePerChar\n    ) {\n      const defaultSettingCheck = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n      });\n\n      if (data.expire === undefined || data.expire === null) data.expire = defaultSettingCheck?.expire;\n      if (data.keywordFinish === undefined || data.keywordFinish === null)\n        data.keywordFinish = defaultSettingCheck?.keywordFinish;\n      if (data.delayMessage === undefined || data.delayMessage === null)\n        data.delayMessage = defaultSettingCheck?.delayMessage;\n      if (data.unknownMessage === undefined || data.unknownMessage === null)\n        data.unknownMessage = defaultSettingCheck?.unknownMessage;\n      if (data.listeningFromMe === undefined || data.listeningFromMe === null)\n        data.listeningFromMe = defaultSettingCheck?.listeningFromMe;\n      if (data.stopBotFromMe === undefined || data.stopBotFromMe === null)\n        data.stopBotFromMe = defaultSettingCheck?.stopBotFromMe;\n      if (data.keepOpen === undefined || data.keepOpen === null) data.keepOpen = defaultSettingCheck?.keepOpen;\n      if (data.debounceTime === undefined || data.debounceTime === null)\n        data.debounceTime = defaultSettingCheck?.debounceTime;\n      if (data.ignoreJids === undefined || data.ignoreJids === null) data.ignoreJids = defaultSettingCheck?.ignoreJids;\n      if (data.splitMessages === undefined || data.splitMessages === null)\n        data.splitMessages = defaultSettingCheck?.splitMessages ?? false;\n      if (data.timePerChar === undefined || data.timePerChar === null)\n        data.timePerChar = defaultSettingCheck?.timePerChar ?? 0;\n\n      if (!defaultSettingCheck) {\n        await this.settings(instance, {\n          expire: data.expire,\n          keywordFinish: data.keywordFinish,\n          delayMessage: data.delayMessage,\n          unknownMessage: data.unknownMessage,\n          listeningFromMe: data.listeningFromMe,\n          stopBotFromMe: data.stopBotFromMe,\n          keepOpen: data.keepOpen,\n          debounceTime: data.debounceTime,\n          ignoreJids: data.ignoreJids,\n          splitMessages: data.splitMessages,\n          timePerChar: data.timePerChar,\n        });\n      }\n    }\n\n    const checkTriggerAll = await this.botRepository.findFirst({\n      where: {\n        enabled: true,\n        triggerType: 'all',\n        instanceId: instanceId,\n      },\n    });\n\n    if (checkTriggerAll && data.triggerType === 'all') {\n      throw new Error(\n        `You already have a ${this.integrationName} with an \"All\" trigger, you cannot have more bots while it is active`,\n      );\n    }\n\n    // Check for trigger keyword duplicates\n    if (data.triggerType === 'keyword') {\n      if (!data.triggerOperator || !data.triggerValue) {\n        throw new Error('Trigger operator and value are required');\n      }\n\n      const checkDuplicate = await this.botRepository.findFirst({\n        where: {\n          triggerOperator: data.triggerOperator,\n          triggerValue: data.triggerValue,\n          instanceId: instanceId,\n        },\n      });\n\n      if (checkDuplicate) {\n        throw new Error('Trigger already exists');\n      }\n    }\n\n    // Check for trigger advanced duplicates\n    if (data.triggerType === 'advanced') {\n      if (!data.triggerValue) {\n        throw new Error('Trigger value is required');\n      }\n\n      const checkDuplicate = await this.botRepository.findFirst({\n        where: {\n          triggerValue: data.triggerValue,\n          instanceId: instanceId,\n        },\n      });\n\n      if (checkDuplicate) {\n        throw new Error('Trigger already exists');\n      }\n    }\n\n    // Derived classes should implement the specific duplicate checking before calling this method\n    // and add bot-specific fields to the data object\n\n    try {\n      const botData = {\n        enabled: data?.enabled,\n        description: data.description,\n        expire: data.expire,\n        keywordFinish: data.keywordFinish,\n        delayMessage: data.delayMessage,\n        unknownMessage: data.unknownMessage,\n        listeningFromMe: data.listeningFromMe,\n        stopBotFromMe: data.stopBotFromMe,\n        keepOpen: data.keepOpen,\n        debounceTime: data.debounceTime,\n        instanceId: instanceId,\n        triggerType: data.triggerType,\n        triggerOperator: data.triggerOperator,\n        triggerValue: data.triggerValue,\n        ignoreJids: data.ignoreJids,\n        splitMessages: data.splitMessages,\n        timePerChar: data.timePerChar,\n        ...this.getAdditionalBotData(data),\n      };\n\n      const bot = await this.botRepository.create({\n        data: botData,\n      });\n\n      return bot;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error creating ${this.integrationName}`);\n    }\n  }\n\n  // Additional fields needed for specific bot types\n  protected abstract getAdditionalBotData(data: BotData): Record<string, any>;\n\n  // Common implementation for findBot\n  public async findBot(instance: InstanceDto) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    try {\n      const bots = await this.botRepository.findMany({\n        where: {\n          instanceId: instanceId,\n        },\n      });\n\n      return bots;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error finding ${this.integrationName}`);\n    }\n  }\n\n  // Common implementation for fetchBot\n  public async fetchBot(instance: InstanceDto, botId: string) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const bot = await this.botRepository.findUnique({\n        where: {\n          id: botId,\n        },\n      });\n\n      if (!bot) {\n        return null;\n      }\n\n      return bot;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error fetching ${this.integrationName}`);\n    }\n  }\n\n  // Common implementation for settings\n  public async settings(instance: InstanceDto, data: any) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const existingSettings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n      });\n\n      // Get the name of the fallback field for this integration type\n      const fallbackFieldName = this.getFallbackFieldName();\n\n      const settingsData = {\n        expire: data.expire,\n        keywordFinish: data.keywordFinish,\n        delayMessage: data.delayMessage,\n        unknownMessage: data.unknownMessage,\n        listeningFromMe: data.listeningFromMe,\n        stopBotFromMe: data.stopBotFromMe,\n        keepOpen: data.keepOpen,\n        debounceTime: data.debounceTime,\n        ignoreJids: data.ignoreJids,\n        splitMessages: data.splitMessages,\n        timePerChar: data.timePerChar,\n        [fallbackFieldName]: data.fallbackId, // Use the correct field name dynamically\n      };\n\n      if (existingSettings) {\n        const settings = await this.settingsRepository.update({\n          where: {\n            id: existingSettings.id,\n          },\n          data: settingsData,\n        });\n\n        // Map the specific fallback field to a generic 'fallbackId' in the response\n        return {\n          ...settings,\n          fallbackId: settings[fallbackFieldName],\n        };\n      } else {\n        const settings = await this.settingsRepository.create({\n          data: {\n            ...settingsData,\n            Instance: {\n              connect: {\n                id: instanceId,\n              },\n            },\n          },\n        });\n\n        // Map the specific fallback field to a generic 'fallbackId' in the response\n        return {\n          ...settings,\n          fallbackId: settings[fallbackFieldName],\n        };\n      }\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error setting default settings');\n    }\n  }\n\n  // Abstract method to get the field name for the fallback ID\n  protected abstract getFallbackFieldName(): string;\n\n  // Abstract method to get the integration type (dify, n8n, evoai, etc.)\n  protected abstract getIntegrationType(): string;\n\n  // Common implementation for fetchSettings\n  public async fetchSettings(instance: InstanceDto) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const settings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n        include: {\n          Fallback: true,\n        },\n      });\n\n      // Get the name of the fallback field for this integration type\n      const fallbackFieldName = this.getFallbackFieldName();\n\n      if (!settings) {\n        return {\n          expire: 300,\n          keywordFinish: 'bye',\n          delayMessage: 1000,\n          unknownMessage: 'Sorry, I dont understand',\n          listeningFromMe: true,\n          stopBotFromMe: true,\n          keepOpen: false,\n          debounceTime: 1,\n          ignoreJids: [],\n          splitMessages: false,\n          timePerChar: 0,\n          fallbackId: '',\n          fallback: null,\n        };\n      }\n\n      // Return with standardized fallbackId field\n      return {\n        ...settings,\n        fallbackId: settings[fallbackFieldName],\n        fallback: settings.Fallback,\n      };\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error fetching settings');\n    }\n  }\n\n  // Common implementation for changeStatus\n  public async changeStatus(instance: InstanceDto, data: any) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const defaultSettingCheck = await this.settingsRepository.findFirst({\n        where: {\n          instanceId,\n        },\n      });\n\n      const remoteJid = data.remoteJid;\n      const status = data.status;\n      const session = await this.getSession(remoteJid, instance);\n\n      if (this.integrationName === 'Typebot') {\n        const typebotData = {\n          remoteJid: remoteJid,\n          status: status,\n          session,\n        };\n        this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n      }\n\n      if (status === 'delete') {\n        await this.sessionRepository.deleteMany({\n          where: {\n            remoteJid: remoteJid,\n            botId: { not: null },\n          },\n        });\n\n        return { bot: { remoteJid: remoteJid, status: status } };\n      }\n\n      if (status === 'closed') {\n        if (defaultSettingCheck?.keepOpen) {\n          await this.sessionRepository.updateMany({\n            where: {\n              remoteJid: remoteJid,\n              botId: { not: null },\n            },\n            data: {\n              status: 'closed',\n            },\n          });\n        } else {\n          await this.sessionRepository.deleteMany({\n            where: {\n              remoteJid: remoteJid,\n              botId: { not: null },\n            },\n          });\n        }\n\n        return { bot: { ...instance, bot: { remoteJid: remoteJid, status: status } } };\n      } else {\n        const session = await this.sessionRepository.updateMany({\n          where: {\n            instanceId: instanceId,\n            remoteJid: remoteJid,\n            botId: { not: null },\n          },\n          data: {\n            status: status,\n          },\n        });\n\n        const botData = {\n          remoteJid: remoteJid,\n          status: status,\n          session,\n        };\n\n        return { bot: { ...instance, bot: botData } };\n      }\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error changing ${this.integrationName} status`);\n    }\n  }\n\n  // Common implementation for fetchSessions\n  public async fetchSessions(instance: InstanceDto, botId: string, remoteJid?: string) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const bot = await this.botRepository.findFirst({\n        where: {\n          id: botId,\n        },\n      });\n\n      if (bot && bot.instanceId !== instanceId) {\n        throw new Error(`${this.integrationName} not found`);\n      }\n\n      // Get the integration type (dify, n8n, evoai, etc.)\n      const integrationType = this.getIntegrationType();\n\n      return await this.sessionRepository.findMany({\n        where: {\n          instanceId: instanceId,\n          remoteJid,\n          botId: bot ? botId : { not: null },\n          type: integrationType,\n        },\n      });\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error fetching sessions');\n    }\n  }\n\n  // Common implementation for ignoreJid\n  public async ignoreJid(instance: InstanceDto, data: IgnoreJidDto) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const settings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n      });\n\n      if (!settings) {\n        throw new Error('Settings not found');\n      }\n\n      let ignoreJids: any = settings?.ignoreJids || [];\n\n      if (data.action === 'add') {\n        if (ignoreJids.includes(data.remoteJid)) return { ignoreJids: ignoreJids };\n\n        ignoreJids.push(data.remoteJid);\n      } else {\n        ignoreJids = ignoreJids.filter((jid) => jid !== data.remoteJid);\n      }\n\n      const updateSettings = await this.settingsRepository.update({\n        where: {\n          id: settings.id,\n        },\n        data: {\n          ignoreJids: ignoreJids,\n        },\n      });\n\n      return {\n        ignoreJids: updateSettings.ignoreJids,\n      };\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error setting default settings');\n    }\n  }\n\n  // Base implementation for updateBot\n  public async updateBot(instance: InstanceDto, botId: string, data: BotData) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const bot = await this.botRepository.findFirst({\n        where: {\n          id: botId,\n        },\n      });\n\n      if (!bot) {\n        throw new Error(`${this.integrationName} not found`);\n      }\n\n      if (bot.instanceId !== instanceId) {\n        throw new Error(`${this.integrationName} not found`);\n      }\n\n      // Check for \"all\" trigger type conflicts\n      if (data.triggerType === 'all') {\n        const checkTriggerAll = await this.botRepository.findFirst({\n          where: {\n            enabled: true,\n            triggerType: 'all',\n            id: {\n              not: botId,\n            },\n            instanceId: instanceId,\n          },\n        });\n\n        if (checkTriggerAll) {\n          throw new Error(\n            `You already have a ${this.integrationName} with an \"All\" trigger, you cannot have more bots while it is active`,\n          );\n        }\n      }\n\n      // Let subclasses check for integration-specific duplicates\n      await this.validateNoDuplicatesOnUpdate(botId, instanceId, data);\n\n      // Check for keyword trigger duplicates\n      if (data.triggerType === 'keyword') {\n        if (!data.triggerOperator || !data.triggerValue) {\n          throw new Error('Trigger operator and value are required');\n        }\n\n        const checkDuplicate = await this.botRepository.findFirst({\n          where: {\n            triggerOperator: data.triggerOperator,\n            triggerValue: data.triggerValue,\n            id: { not: botId },\n            instanceId: instanceId,\n          },\n        });\n\n        if (checkDuplicate) {\n          throw new Error('Trigger already exists');\n        }\n      }\n\n      // Check for advanced trigger duplicates\n      if (data.triggerType === 'advanced') {\n        if (!data.triggerValue) {\n          throw new Error('Trigger value is required');\n        }\n\n        const checkDuplicate = await this.botRepository.findFirst({\n          where: {\n            triggerValue: data.triggerValue,\n            id: { not: botId },\n            instanceId: instanceId,\n          },\n        });\n\n        if (checkDuplicate) {\n          throw new Error('Trigger already exists');\n        }\n      }\n\n      // Combine common fields with bot-specific fields\n      const updateData = {\n        enabled: data?.enabled,\n        description: data.description,\n        expire: data.expire,\n        keywordFinish: data.keywordFinish,\n        delayMessage: data.delayMessage,\n        unknownMessage: data.unknownMessage,\n        listeningFromMe: data.listeningFromMe,\n        stopBotFromMe: data.stopBotFromMe,\n        keepOpen: data.keepOpen,\n        debounceTime: data.debounceTime,\n        instanceId: instanceId,\n        triggerType: data.triggerType,\n        triggerOperator: data.triggerOperator,\n        triggerValue: data.triggerValue,\n        ignoreJids: data.ignoreJids,\n        splitMessages: data.splitMessages,\n        timePerChar: data.timePerChar,\n        ...this.getAdditionalUpdateFields(data),\n      };\n\n      const updatedBot = await this.botRepository.update({\n        where: {\n          id: botId,\n        },\n        data: updateData,\n      });\n\n      return updatedBot;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error updating ${this.integrationName}`);\n    }\n  }\n\n  // Abstract method for validating bot-specific duplicates on update\n  protected abstract validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: BotData): Promise<void>;\n\n  // Abstract method for getting additional fields for update\n  protected abstract getAdditionalUpdateFields(data: BotData): Record<string, any>;\n\n  // Base implementation for deleteBot\n  public async deleteBot(instance: InstanceDto, botId: string) {\n    if (!this.integrationEnabled) throw new BadRequestException(`${this.integrationName} is disabled`);\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const bot = await this.botRepository.findFirst({\n        where: {\n          id: botId,\n        },\n      });\n\n      if (!bot) {\n        throw new Error(`${this.integrationName} not found`);\n      }\n\n      if (bot.instanceId !== instanceId) {\n        throw new Error(`${this.integrationName} not found`);\n      }\n\n      await this.prismaRepository.integrationSession.deleteMany({\n        where: {\n          botId: botId,\n        },\n      });\n\n      await this.botRepository.delete({\n        where: {\n          id: botId,\n        },\n      });\n\n      return { bot: { id: botId } };\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error(`Error deleting ${this.integrationName} bot`);\n    }\n  }\n\n  // Base implementation for emit\n  public async emit({ instance, remoteJid, msg }: EmitData) {\n    if (!this.integrationEnabled) return;\n\n    try {\n      const settings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instance.instanceId,\n        },\n      });\n\n      if (this.checkIgnoreJids(settings?.ignoreJids, remoteJid)) return;\n\n      const session = await this.getSession(remoteJid, instance);\n\n      const content = getConversationMessage(msg);\n\n      // Get integration type\n      // const integrationType = this.getIntegrationType();\n\n      // Find a bot for this message\n      let findBot: any = await this.findBotTrigger(this.botRepository, content, instance, session);\n\n      // If no bot is found, try to use fallback\n      if (!findBot) {\n        const fallback = await this.settingsRepository.findFirst({\n          where: {\n            instanceId: instance.instanceId,\n          },\n        });\n\n        // Get the fallback ID for this integration type\n        const fallbackId = this.getFallbackBotId(fallback);\n\n        if (fallbackId) {\n          const findFallback = await this.botRepository.findFirst({\n            where: {\n              id: fallbackId,\n            },\n          });\n\n          findBot = findFallback;\n        } else {\n          return;\n        }\n      }\n\n      // If we still don't have a bot, return\n      if (!findBot) {\n        return;\n      }\n\n      // Collect settings with fallbacks to default settings\n      let expire = findBot.expire;\n      let keywordFinish = findBot.keywordFinish;\n      let delayMessage = findBot.delayMessage;\n      let unknownMessage = findBot.unknownMessage;\n      let listeningFromMe = findBot.listeningFromMe;\n      let stopBotFromMe = findBot.stopBotFromMe;\n      let keepOpen = findBot.keepOpen;\n      let debounceTime = findBot.debounceTime;\n      let ignoreJids = findBot.ignoreJids;\n      let splitMessages = findBot.splitMessages;\n      let timePerChar = findBot.timePerChar;\n\n      if (expire === undefined || expire === null) expire = settings.expire;\n      if (keywordFinish === undefined || keywordFinish === null) keywordFinish = settings.keywordFinish;\n      if (delayMessage === undefined || delayMessage === null) delayMessage = settings.delayMessage;\n      if (unknownMessage === undefined || unknownMessage === null) unknownMessage = settings.unknownMessage;\n      if (listeningFromMe === undefined || listeningFromMe === null) listeningFromMe = settings.listeningFromMe;\n      if (stopBotFromMe === undefined || stopBotFromMe === null) stopBotFromMe = settings.stopBotFromMe;\n      if (keepOpen === undefined || keepOpen === null) keepOpen = settings.keepOpen;\n      if (debounceTime === undefined || debounceTime === null) debounceTime = settings.debounceTime;\n      if (ignoreJids === undefined || ignoreJids === null) ignoreJids = settings.ignoreJids;\n      if (splitMessages === undefined || splitMessages === null) splitMessages = settings?.splitMessages ?? false;\n      if (timePerChar === undefined || timePerChar === null) timePerChar = settings?.timePerChar ?? 0;\n\n      const key = msg.key as {\n        id: string;\n        remoteJid: string;\n        fromMe: boolean;\n        participant: string;\n      };\n\n      // Handle stopping the bot if message is from me\n      if (stopBotFromMe && key.fromMe && session) {\n        await this.prismaRepository.integrationSession.update({\n          where: {\n            id: session.id,\n          },\n          data: {\n            status: 'paused',\n          },\n        });\n\n        if (this.integrationName === 'Typebot') {\n          const typebotData = {\n            remoteJid: remoteJid,\n            status: 'paused',\n            session,\n          };\n          this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData);\n        }\n\n        return;\n      }\n\n      // Skip if not listening to messages from me\n      if (!listeningFromMe && key.fromMe) {\n        return;\n      }\n\n      // Skip if session exists but not awaiting user input\n      if (session && session.status === 'closed') {\n        return;\n      }\n\n      // Merged settings\n      const mergedSettings = {\n        ...settings,\n        expire,\n        keywordFinish,\n        delayMessage,\n        unknownMessage,\n        listeningFromMe,\n        stopBotFromMe,\n        keepOpen,\n        debounceTime,\n        ignoreJids,\n        splitMessages,\n        timePerChar,\n      };\n\n      // Process with debounce if needed\n      if (debounceTime && debounceTime > 0) {\n        this.processDebounce(this.userMessageDebounce, content, remoteJid, debounceTime, async (debouncedContent) => {\n          await this.processBot(\n            this.waMonitor.waInstances[instance.instanceName],\n            remoteJid,\n            findBot,\n            session,\n            mergedSettings,\n            debouncedContent,\n            msg?.pushName,\n            msg,\n          );\n        });\n      } else {\n        await this.processBot(\n          this.waMonitor.waInstances[instance.instanceName],\n          remoteJid,\n          findBot,\n          session,\n          mergedSettings,\n          content,\n          msg?.pushName,\n          msg,\n        );\n      }\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { DifyDto } from '@api/integrations/chatbot/dify/dto/dify.dto';\nimport { DifyService } from '@api/integrations/chatbot/dify/services/dify.service';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Dify } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { Dify as DifyModel, IntegrationSession } from '@prisma/client';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\n\nexport class DifyController extends BaseChatbotController<DifyModel, DifyDto> {\n  constructor(\n    private readonly difyService: DifyService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.dify;\n    this.settingsRepository = this.prismaRepository.difySetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('DifyController');\n  protected readonly integrationName = 'Dify';\n\n  integrationEnabled = configService.get<Dify>('DIFY').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.fallbackId;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'difyIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'dify';\n  }\n\n  protected getAdditionalBotData(data: DifyDto): Record<string, any> {\n    return {\n      botType: data.botType,\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: DifyDto): Record<string, any> {\n    return {\n      botType: data.botType,\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: DifyDto): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        id: {\n          not: botId,\n        },\n        instanceId: instanceId,\n        botType: data.botType,\n        apiUrl: data.apiUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Dify already exists');\n    }\n  }\n\n  // Override createBot to add Dify-specific validation\n  public async createBot(instance: InstanceDto, data: DifyDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Dify is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // Dify-specific duplicate check\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        instanceId: instanceId,\n        botType: data.botType,\n        apiUrl: data.apiUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Dify already exists');\n    }\n\n    // Let the base class handle the rest\n    return super.createBot(instance, data);\n  }\n\n  // Process Dify-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: DifyModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.difyService.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { EvoaiDto } from '@api/integrations/chatbot/evoai/dto/evoai.dto';\nimport { EvoaiService } from '@api/integrations/chatbot/evoai/services/evoai.service';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Evoai } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { Evoai as EvoaiModel, IntegrationSession } from '@prisma/client';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\n\nexport class EvoaiController extends BaseChatbotController<EvoaiModel, EvoaiDto> {\n  constructor(\n    private readonly evoaiService: EvoaiService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.evoai;\n    this.settingsRepository = this.prismaRepository.evoaiSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('EvoaiController');\n  protected readonly integrationName = 'Evoai';\n\n  integrationEnabled = configService.get<Evoai>('EVOAI').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.evoaiIdFallback;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'evoaiIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'evoai';\n  }\n\n  protected getAdditionalBotData(data: EvoaiDto): Record<string, any> {\n    return {\n      agentUrl: data.agentUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: EvoaiDto): Record<string, any> {\n    return {\n      agentUrl: data.agentUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: EvoaiDto): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        id: {\n          not: botId,\n        },\n        instanceId: instanceId,\n        agentUrl: data.agentUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Evoai already exists');\n    }\n  }\n\n  // Override createBot to add EvoAI-specific validation\n  public async createBot(instance: InstanceDto, data: EvoaiDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Evoai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // EvoAI-specific duplicate check\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        instanceId: instanceId,\n        agentUrl: data.agentUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Evoai already exists');\n    }\n\n    // Let the base class handle the rest\n    return super.createBot(instance, data);\n  }\n\n  // Process Evoai-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: EvoaiModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.evoaiService.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService, HttpServer } from '@config/env.config';\nimport { Evoai, EvoaiSetting, IntegrationSession } from '@prisma/client';\nimport axios from 'axios';\nimport { downloadMediaMessage } from 'baileys';\nimport { isURL } from 'class-validator';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class EvoaiService extends BaseChatbotService<Evoai, EvoaiSetting> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    configService: ConfigService,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'EvoaiService', configService);\n    this.openaiService = openaiService;\n  }\n\n  /**\n   * Return the bot type for EvoAI\n   */\n  protected getBotType(): string {\n    return 'evoai';\n  }\n\n  /**\n   * Implement the abstract method to send message to EvoAI API\n   * Handles audio transcription, image processing, and complex JSON-RPC payload\n   */\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: EvoaiSetting,\n    evoai: Evoai,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    try {\n      this.logger.debug(`[EvoAI] Sending message to bot with content: ${content}`);\n\n      let processedContent = content;\n\n      // Handle audio messages - transcribe using OpenAI Whisper\n      if (this.isAudioMessage(content) && msg) {\n        try {\n          this.logger.debug(`[EvoAI] Downloading audio for Whisper transcription`);\n          const transcription = await this.openaiService.speechToText(msg, instance);\n          if (transcription) {\n            processedContent = `[audio] ${transcription}`;\n          }\n        } catch (err) {\n          this.logger.error(`[EvoAI] Failed to transcribe audio: ${err}`);\n        }\n      }\n\n      const endpoint: string = evoai.agentUrl;\n\n      if (!endpoint) {\n        this.logger.error('No EvoAI endpoint defined');\n        return;\n      }\n\n      const callId = `req-${uuidv4().substring(0, 8)}`;\n      const messageId = remoteJid.split('@')[0] || uuidv4(); // Use phone number as messageId\n\n      // Prepare message parts\n      const parts = [\n        {\n          type: 'text',\n          text: processedContent,\n        },\n      ];\n\n      // Handle image message if present\n      if (this.isImageMessage(content) && msg) {\n        const media = content.split('|');\n        parts[0].text = media[2] || content;\n\n        try {\n          if (msg.message.mediaUrl || msg.message.base64) {\n            let mediaBase64 = msg.message.base64 || null;\n\n            if (msg.message.mediaUrl && isURL(msg.message.mediaUrl)) {\n              const result = await axios.get(msg.message.mediaUrl, { responseType: 'arraybuffer' });\n              mediaBase64 = Buffer.from(result.data).toString('base64');\n            }\n\n            if (mediaBase64) {\n              parts.push({\n                type: 'file',\n                file: {\n                  name: msg.key.id + '.jpeg',\n                  mimeType: 'image/jpeg',\n                  bytes: mediaBase64,\n                },\n              } as any);\n            }\n          } else {\n            // Download the image\n            const mediaBuffer = await downloadMediaMessage(msg, 'buffer', {});\n            const fileContent = Buffer.from(mediaBuffer).toString('base64');\n            const fileName = media[2] || `${msg.key?.id || 'image'}.jpg`;\n\n            parts.push({\n              type: 'file',\n              file: {\n                name: fileName,\n                mimeType: 'image/jpeg',\n                bytes: fileContent,\n              },\n            } as any);\n          }\n        } catch (fileErr) {\n          this.logger.error(`[EvoAI] Failed to process image: ${fileErr}`);\n        }\n      }\n\n      const payload = {\n        jsonrpc: '2.0',\n        id: callId,\n        method: 'message/send',\n        params: {\n          contextId: session.sessionId,\n          message: {\n            role: 'user',\n            parts,\n            messageId: messageId,\n            metadata: {\n              messageKey: msg?.key,\n            },\n          },\n          metadata: {\n            remoteJid: remoteJid,\n            pushName: pushName,\n            fromMe: msg?.key?.fromMe,\n            instanceName: instance.instanceName,\n            serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n            apiKey: instance.token,\n          },\n        },\n      };\n\n      this.logger.debug(`[EvoAI] Sending request to: ${endpoint}`);\n      // Redact base64 file bytes from payload log\n      const redactedPayload = JSON.parse(JSON.stringify(payload));\n      if (redactedPayload?.params?.message?.parts) {\n        redactedPayload.params.message.parts = redactedPayload.params.message.parts.map((part) => {\n          if (part.type === 'file' && part.file && part.file.bytes) {\n            return { ...part, file: { ...part.file, bytes: '[base64 omitted]' } };\n          }\n          return part;\n        });\n      }\n      this.logger.debug(`[EvoAI] Payload: ${JSON.stringify(redactedPayload)}`);\n\n      if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n        await instance.client.presenceSubscribe(remoteJid);\n        await instance.client.sendPresenceUpdate('composing', remoteJid);\n      }\n\n      const response = await axios.post(endpoint, payload, {\n        headers: {\n          'x-api-key': evoai.apiKey,\n          'Content-Type': 'application/json',\n        },\n      });\n\n      this.logger.debug(`[EvoAI] Response: ${JSON.stringify(response.data)}`);\n\n      if (instance.integration === Integration.WHATSAPP_BAILEYS)\n        await instance.client.sendPresenceUpdate('paused', remoteJid);\n\n      let message = undefined;\n      const result = response?.data?.result;\n\n      // Extract message from artifacts array\n      if (result?.artifacts && Array.isArray(result.artifacts) && result.artifacts.length > 0) {\n        const artifact = result.artifacts[0];\n        if (artifact?.parts && Array.isArray(artifact.parts)) {\n          const textPart = artifact.parts.find((p) => p.type === 'text' && p.text);\n          if (textPart) message = textPart.text;\n        }\n      }\n\n      this.logger.debug(`[EvoAI] Extracted message to send: ${message}`);\n\n      if (message) {\n        await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n      }\n    } catch (error) {\n      this.logger.error(\n        `[EvoAI] Error sending message: ${error?.response?.data ? JSON.stringify(error.response.data) : error}`,\n      );\n      return;\n    }\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Logger } from '@config/logger.config';\nimport { EvolutionBot, IntegrationSession } from '@prisma/client';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\nimport { EvolutionBotDto } from '../dto/evolutionBot.dto';\nimport { EvolutionBotService } from '../services/evolutionBot.service';\n\nexport class EvolutionBotController extends BaseChatbotController<EvolutionBot, EvolutionBotDto> {\n  constructor(\n    private readonly evolutionBotService: EvolutionBotService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.evolutionBot;\n    this.settingsRepository = this.prismaRepository.evolutionBotSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('EvolutionBotController');\n  protected readonly integrationName = 'EvolutionBot';\n\n  integrationEnabled = true; // Set to true by default or use config value if available\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  // Implementation of abstract methods required by BaseChatbotController\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.botIdFallback;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'botIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'evolution';\n  }\n\n  protected getAdditionalBotData(data: EvolutionBotDto): Record<string, any> {\n    return {\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: EvolutionBotDto): Record<string, any> {\n    return {\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(\n    botId: string,\n    instanceId: string,\n    data: EvolutionBotDto,\n  ): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        id: {\n          not: botId,\n        },\n        instanceId: instanceId,\n        apiUrl: data.apiUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Evolution Bot already exists');\n    }\n  }\n\n  // Process bot-specific logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: EvolutionBot,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.evolutionBotService.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService, HttpServer } from '@config/env.config';\nimport { EvolutionBot, EvolutionBotSetting, IntegrationSession } from '@prisma/client';\nimport { sendTelemetry } from '@utils/sendTelemetry';\nimport axios from 'axios';\nimport { isURL } from 'class-validator';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class EvolutionBotService extends BaseChatbotService<EvolutionBot, EvolutionBotSetting> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    configService: ConfigService,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'EvolutionBotService', configService);\n    this.openaiService = openaiService;\n  }\n\n  /**\n   * Get the bot type identifier\n   */\n  protected getBotType(): string {\n    return 'evolution';\n  }\n\n  /**\n   * Send a message to the Evolution Bot API\n   */\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: EvolutionBotSetting,\n    bot: EvolutionBot,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    try {\n      const payload: any = {\n        inputs: {\n          sessionId: session.id,\n          remoteJid: remoteJid,\n          pushName: pushName,\n          fromMe: msg?.key?.fromMe,\n          instanceName: instance.instanceName,\n          serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n          apiKey: instance.token,\n        },\n        query: content,\n        conversation_id: session.sessionId === remoteJid ? undefined : session.sessionId,\n        user: remoteJid,\n      };\n\n      if (this.isAudioMessage(content) && msg) {\n        try {\n          this.logger.debug(`[EvolutionBot] Downloading audio for Whisper transcription`);\n          const transcription = await this.openaiService.speechToText(msg, instance);\n          if (transcription) {\n            payload.query = `[audio] ${transcription}`;\n          }\n        } catch (err) {\n          this.logger.error(`[EvolutionBot] Failed to transcribe audio: ${err}`);\n        }\n      }\n\n      if (this.isImageMessage(content) && msg) {\n        const media = content.split('|');\n\n        if (msg.message.mediaUrl || msg.message.base64) {\n          payload.files = [\n            {\n              type: 'image',\n              url: msg.message.base64 || msg.message.mediaUrl,\n            },\n          ];\n        } else {\n          payload.files = [\n            {\n              type: 'image',\n              url: media[1].split('?')[0],\n            },\n          ];\n        }\n\n        payload.query = media[2] || content;\n      }\n\n      if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n        await instance.client.presenceSubscribe(remoteJid);\n        await instance.client.sendPresenceUpdate('composing', remoteJid);\n      }\n\n      const endpoint = bot.apiUrl;\n\n      if (!endpoint) {\n        this.logger.error('No Evolution Bot endpoint defined');\n        return;\n      }\n\n      let headers: any = {\n        'Content-Type': 'application/json',\n      };\n\n      if (bot.apiKey) {\n        headers = {\n          ...headers,\n          Authorization: `Bearer ${bot.apiKey}`,\n        };\n      }\n\n      // Sanitize payload for logging (remove sensitive data)\n      const sanitizedPayload = {\n        ...payload,\n        inputs: {\n          ...payload.inputs,\n          apiKey: payload.inputs.apiKey ? '[REDACTED]' : undefined,\n        },\n      };\n\n      const response = await axios.post(endpoint, payload, {\n        headers,\n      });\n\n      if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n        await instance.client.sendPresenceUpdate('paused', remoteJid);\n      }\n\n      let message = response?.data?.message;\n      const rawLinkPreview = response?.data?.linkPreview;\n\n      // Validate linkPreview is boolean and default to true for backward compatibility\n      const linkPreview = typeof rawLinkPreview === 'boolean' ? rawLinkPreview : true;\n\n      if (message && typeof message === 'string' && message.startsWith(\"'\") && message.endsWith(\"'\")) {\n        const innerContent = message.slice(1, -1);\n        if (!innerContent.includes(\"'\")) {\n          message = innerContent;\n        }\n      }\n\n      if (message) {\n        // Use the base class method that handles splitMessages functionality\n        await this.sendMessageWhatsApp(instance, remoteJid, message, settings, linkPreview);\n      } else {\n        this.logger.warn(`[EvolutionBot] No message content received from bot response`);\n      }\n\n      // Send telemetry\n      sendTelemetry('/message/sendText');\n    } catch (error) {\n      this.logger.error(`Error in sendMessageToBot: ${error.message || JSON.stringify(error)}`);\n      return;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Flowise } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { Flowise as FlowiseModel, IntegrationSession } from '@prisma/client';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\nimport { FlowiseDto } from '../dto/flowise.dto';\nimport { FlowiseService } from '../services/flowise.service';\n\nexport class FlowiseController extends BaseChatbotController<FlowiseModel, FlowiseDto> {\n  constructor(\n    private readonly flowiseService: FlowiseService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.flowise;\n    this.settingsRepository = this.prismaRepository.flowiseSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('FlowiseController');\n  protected readonly integrationName = 'Flowise';\n\n  integrationEnabled = configService.get<Flowise>('FLOWISE').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.flowiseIdFallback;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'flowiseIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'flowise';\n  }\n\n  protected getAdditionalBotData(data: FlowiseDto): Record<string, any> {\n    return {\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  protected getAdditionalUpdateFields(data: FlowiseDto): Record<string, any> {\n    return {\n      apiUrl: data.apiUrl,\n      apiKey: data.apiKey,\n    };\n  }\n\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: FlowiseDto): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        id: { not: botId },\n        instanceId: instanceId,\n        apiUrl: data.apiUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Flowise already exists');\n    }\n  }\n\n  // Process Flowise-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: FlowiseModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.flowiseService.processBot(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n\n  // Override createBot to add module availability check and Flowise-specific validation\n  public async createBot(instance: InstanceDto, data: FlowiseDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Flowise is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // Flowise-specific duplicate check\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        instanceId: instanceId,\n        apiUrl: data.apiUrl,\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Flowise already exists');\n    }\n\n    // Let the base class handle the rest\n    return super.createBot(instance, data);\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Integration } from '@api/types/wa.types';\nimport { ConfigService, HttpServer } from '@config/env.config';\nimport { Flowise as FlowiseModel, IntegrationSession } from '@prisma/client';\nimport axios from 'axios';\nimport { isURL } from 'class-validator';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class FlowiseService extends BaseChatbotService<FlowiseModel> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    configService: ConfigService,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'FlowiseService', configService);\n    this.openaiService = openaiService;\n  }\n\n  // Return the bot type for Flowise\n  protected getBotType(): string {\n    return 'flowise';\n  }\n\n  // Process Flowise-specific bot logic\n  public async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: FlowiseModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n\n  // Implement the abstract method to send message to Flowise API\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: any,\n    bot: FlowiseModel,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ): Promise<void> {\n    const payload: any = {\n      question: content,\n      overrideConfig: {\n        sessionId: remoteJid,\n        vars: {\n          messageId: msg?.key?.id,\n          fromMe: msg?.key?.fromMe,\n          remoteJid: remoteJid,\n          pushName: pushName,\n          instanceName: instance.instanceName,\n          serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n          apiKey: instance.token,\n        },\n      },\n    };\n\n    // Handle audio messages\n    if (this.isAudioMessage(content) && msg) {\n      try {\n        this.logger.debug(`[Flowise] Downloading audio for Whisper transcription`);\n        const transcription = await this.openaiService.speechToText(msg, instance);\n        if (transcription) {\n          payload.question = `[audio] ${transcription}`;\n        }\n      } catch (err) {\n        this.logger.error(`[Flowise] Failed to transcribe audio: ${err}`);\n      }\n    }\n\n    if (this.isImageMessage(content)) {\n      const media = content.split('|');\n\n      if (msg.message.mediaUrl || msg.message.base64) {\n        payload.uploads = [\n          {\n            data: msg.message.base64 || msg.message.mediaUrl,\n            type: 'url',\n            name: 'Flowise.png',\n            mime: 'image/png',\n          },\n        ];\n      } else {\n        payload.uploads = [\n          {\n            data: media[1].split('?')[0],\n            type: 'url',\n            name: 'Flowise.png',\n            mime: 'image/png',\n          },\n        ];\n        payload.question = media[2] || content;\n      }\n    }\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.presenceSubscribe(remoteJid);\n      await instance.client.sendPresenceUpdate('composing', remoteJid);\n    }\n\n    let headers: any = {\n      'Content-Type': 'application/json',\n    };\n\n    if (bot.apiKey) {\n      headers = {\n        ...headers,\n        Authorization: `Bearer ${bot.apiKey}`,\n      };\n    }\n\n    const endpoint = bot.apiUrl;\n\n    if (!endpoint) {\n      this.logger.error('No Flowise endpoint defined');\n      return;\n    }\n\n    const response = await axios.post(endpoint, payload, {\n      headers,\n    });\n\n    if (instance.integration === Integration.WHATSAPP_BAILEYS) {\n      await instance.client.sendPresenceUpdate('paused', remoteJid);\n    }\n\n    const message = response?.data?.text;\n\n    if (message) {\n      // Use the base class method to send the message to WhatsApp\n      await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n    }\n  }\n\n  // The service is now complete with just the abstract method implementations\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { N8nDto } from '@api/integrations/chatbot/n8n/dto/n8n.dto';\nimport { N8nService } from '@api/integrations/chatbot/n8n/services/n8n.service';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { IntegrationSession, N8n as N8nModel } from '@prisma/client';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\n\nexport class N8nController extends BaseChatbotController<N8nModel, N8nDto> {\n  constructor(\n    private readonly n8nService: N8nService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.n8n;\n    this.settingsRepository = this.prismaRepository.n8nSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('N8nController');\n  protected readonly integrationName = 'N8n';\n\n  integrationEnabled = configService.get('N8N').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.fallbackId;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'n8nIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'n8n';\n  }\n\n  protected getAdditionalBotData(data: N8nDto): Record<string, any> {\n    return {\n      webhookUrl: data.webhookUrl,\n      basicAuthUser: data.basicAuthUser,\n      basicAuthPass: data.basicAuthPass,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: N8nDto): Record<string, any> {\n    return {\n      webhookUrl: data.webhookUrl,\n      basicAuthUser: data.basicAuthUser,\n      basicAuthPass: data.basicAuthPass,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: N8nDto): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        id: {\n          not: botId,\n        },\n        instanceId: instanceId,\n        webhookUrl: data.webhookUrl,\n        basicAuthUser: data.basicAuthUser,\n        basicAuthPass: data.basicAuthPass,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('N8n already exists');\n    }\n  }\n\n  // Bots\n  public async createBot(instance: InstanceDto, data: N8nDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('N8n is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // Check for N8n-specific duplicate\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        instanceId: instanceId,\n        webhookUrl: data.webhookUrl,\n        basicAuthUser: data.basicAuthUser,\n        basicAuthPass: data.basicAuthPass,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('N8n already exists');\n    }\n\n    // Let the base class handle the rest of the bot creation process\n    return super.createBot(instance, data);\n  }\n\n  // Process N8n-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: N8nModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    // Use the base class pattern instead of calling n8nService.process directly\n    await this.n8nService.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { ConfigService, HttpServer } from '@config/env.config';\nimport { IntegrationSession, N8n, N8nSetting } from '@prisma/client';\nimport axios from 'axios';\n\nimport { BaseChatbotService } from '../../base-chatbot.service';\nimport { OpenaiService } from '../../openai/services/openai.service';\n\nexport class N8nService extends BaseChatbotService<N8n, N8nSetting> {\n  private openaiService: OpenaiService;\n\n  constructor(\n    waMonitor: WAMonitoringService,\n    prismaRepository: PrismaRepository,\n    configService: ConfigService,\n    openaiService: OpenaiService,\n  ) {\n    super(waMonitor, prismaRepository, 'N8nService', configService);\n    this.openaiService = openaiService;\n  }\n\n  /**\n   * Return the bot type for N8n\n   */\n  protected getBotType(): string {\n    return 'n8n';\n  }\n\n  protected async sendMessageToBot(\n    instance: any,\n    session: IntegrationSession,\n    settings: N8nSetting,\n    n8n: N8n,\n    remoteJid: string,\n    pushName: string,\n    content: string,\n    msg?: any,\n  ) {\n    try {\n      if (!session) {\n        this.logger.error('Session is null in sendMessageToBot');\n        return;\n      }\n\n      const endpoint: string = n8n.webhookUrl;\n      const payload: any = {\n        chatInput: content,\n        sessionId: session.sessionId,\n        remoteJid: remoteJid,\n        pushName: pushName,\n        keyId: msg?.key?.id,\n        fromMe: msg?.key?.fromMe,\n        quotedMessage: msg?.contextInfo?.quotedMessage,\n        instanceName: instance.instanceName,\n        serverUrl: this.configService.get<HttpServer>('SERVER').URL,\n        apiKey: instance.token,\n      };\n\n      // Handle audio messages\n      if (this.isAudioMessage(content) && msg) {\n        try {\n          this.logger.debug(`[N8n] Downloading audio for Whisper transcription`);\n          const transcription = await this.openaiService.speechToText(msg, instance);\n          if (transcription) {\n            payload.chatInput = `[audio] ${transcription}`;\n          }\n        } catch (err) {\n          this.logger.error(`[N8n] Failed to transcribe audio: ${err}`);\n        }\n      }\n\n      const headers: Record<string, string> = {};\n      if (n8n.basicAuthUser && n8n.basicAuthPass) {\n        const auth = Buffer.from(`${n8n.basicAuthUser}:${n8n.basicAuthPass}`).toString('base64');\n        headers['Authorization'] = `Basic ${auth}`;\n      }\n      const response = await axios.post(endpoint, payload, { headers });\n      const message = response?.data?.output || response?.data?.answer;\n\n      // Use base class method instead of custom implementation\n      await this.sendMessageWhatsApp(instance, remoteJid, message, settings, true);\n\n      await this.prismaRepository.integrationSession.update({\n        where: {\n          id: session.id,\n        },\n        data: {\n          status: 'opened',\n          awaitUser: true,\n        },\n      });\n    } catch (error) {\n      this.logger.error(error.response?.data || error);\n      return;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { OpenaiCredsDto, OpenaiDto } from '@api/integrations/chatbot/openai/dto/openai.dto';\nimport { OpenaiService } from '@api/integrations/chatbot/openai/services/openai.service';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Openai } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { IntegrationSession, OpenaiBot } from '@prisma/client';\nimport OpenAI from 'openai';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\n\nexport class OpenaiController extends BaseChatbotController<OpenaiBot, OpenaiDto> {\n  constructor(\n    private readonly openaiService: OpenaiService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.openaiBot;\n    this.settingsRepository = this.prismaRepository.openaiSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n    this.credsRepository = this.prismaRepository.openaiCreds;\n  }\n\n  public readonly logger = new Logger('OpenaiController');\n  protected readonly integrationName = 'Openai';\n\n  integrationEnabled = configService.get<Openai>('OPENAI').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n  private client: OpenAI;\n  private credsRepository: any;\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.openaiIdFallback;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'openaiIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'openai';\n  }\n\n  protected getAdditionalBotData(data: OpenaiDto): Record<string, any> {\n    return {\n      openaiCredsId: data.openaiCredsId,\n      botType: data.botType,\n      assistantId: data.assistantId,\n      functionUrl: data.functionUrl,\n      model: data.model,\n      systemMessages: data.systemMessages,\n      assistantMessages: data.assistantMessages,\n      userMessages: data.userMessages,\n      maxTokens: data.maxTokens,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: OpenaiDto): Record<string, any> {\n    return {\n      openaiCredsId: data.openaiCredsId,\n      botType: data.botType,\n      assistantId: data.assistantId,\n      functionUrl: data.functionUrl,\n      model: data.model,\n      systemMessages: data.systemMessages,\n      assistantMessages: data.assistantMessages,\n      userMessages: data.userMessages,\n      maxTokens: data.maxTokens,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: OpenaiDto): Promise<void> {\n    let whereDuplication: any = {\n      id: {\n        not: botId,\n      },\n      instanceId: instanceId,\n    };\n\n    if (data.botType === 'assistant') {\n      if (!data.assistantId) throw new Error('Assistant ID is required');\n\n      whereDuplication = {\n        ...whereDuplication,\n        assistantId: data.assistantId,\n        botType: data.botType,\n      };\n    } else if (data.botType === 'chatCompletion') {\n      if (!data.model) throw new Error('Model is required');\n      if (!data.maxTokens) throw new Error('Max tokens is required');\n\n      whereDuplication = {\n        ...whereDuplication,\n        model: data.model,\n        maxTokens: data.maxTokens,\n        botType: data.botType,\n      };\n    } else {\n      throw new Error('Bot type is required');\n    }\n\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: whereDuplication,\n    });\n\n    if (checkDuplicate) {\n      throw new Error('OpenAI Bot already exists');\n    }\n  }\n\n  // Override createBot to handle OpenAI-specific credential logic\n  public async createBot(instance: InstanceDto, data: OpenaiDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    // OpenAI specific validation\n    let whereDuplication: any = {\n      instanceId: instanceId,\n    };\n\n    if (data.botType === 'assistant') {\n      if (!data.assistantId) throw new Error('Assistant ID is required');\n\n      whereDuplication = {\n        ...whereDuplication,\n        assistantId: data.assistantId,\n        botType: data.botType,\n      };\n    } else if (data.botType === 'chatCompletion') {\n      if (!data.model) throw new Error('Model is required');\n      if (!data.maxTokens) throw new Error('Max tokens is required');\n\n      whereDuplication = {\n        ...whereDuplication,\n        model: data.model,\n        maxTokens: data.maxTokens,\n        botType: data.botType,\n      };\n    } else {\n      throw new Error('Bot type is required');\n    }\n\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: whereDuplication,\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Openai Bot already exists');\n    }\n\n    // Check if settings exist and create them if not\n    const existingSettings = await this.settingsRepository.findFirst({\n      where: {\n        instanceId: instanceId,\n      },\n    });\n\n    if (!existingSettings) {\n      // Create default settings with the OpenAI credentials\n      await this.settings(instance, {\n        openaiCredsId: data.openaiCredsId,\n        expire: data.expire || 300,\n        keywordFinish: data.keywordFinish || 'bye',\n        delayMessage: data.delayMessage || 1000,\n        unknownMessage: data.unknownMessage || 'Sorry, I dont understand',\n        listeningFromMe: data.listeningFromMe !== undefined ? data.listeningFromMe : true,\n        stopBotFromMe: data.stopBotFromMe !== undefined ? data.stopBotFromMe : true,\n        keepOpen: data.keepOpen !== undefined ? data.keepOpen : false,\n        debounceTime: data.debounceTime || 1,\n        ignoreJids: data.ignoreJids || [],\n        speechToText: false,\n      });\n    } else if (!existingSettings.openaiCredsId && data.openaiCredsId) {\n      // Update settings with OpenAI credentials if they're missing\n      await this.settingsRepository.update({\n        where: {\n          id: existingSettings.id,\n        },\n        data: {\n          OpenaiCreds: {\n            connect: {\n              id: data.openaiCredsId,\n            },\n          },\n        },\n      });\n    }\n\n    // Let the base class handle the rest of the bot creation process\n    return super.createBot(instance, data);\n  }\n\n  // Process OpenAI-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: OpenaiBot,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    await this.openaiService.process(instance, remoteJid, bot, session, settings, content, pushName, msg);\n  }\n\n  // Credentials - OpenAI specific functionality\n  public async createOpenaiCreds(instance: InstanceDto, data: OpenaiCredsDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    if (!data.apiKey) throw new BadRequestException('API Key is required');\n    if (!data.name) throw new BadRequestException('Name is required');\n\n    // Check if API key already exists\n    const existingApiKey = await this.credsRepository.findFirst({\n      where: {\n        apiKey: data.apiKey,\n      },\n    });\n\n    if (existingApiKey) {\n      throw new BadRequestException('This API key is already registered. Please use a different API key.');\n    }\n\n    // Check if name already exists for this instance\n    const existingName = await this.credsRepository.findFirst({\n      where: {\n        name: data.name,\n        instanceId: instanceId,\n      },\n    });\n\n    if (existingName) {\n      throw new BadRequestException('This credential name is already in use. Please choose a different name.');\n    }\n\n    try {\n      const creds = await this.credsRepository.create({\n        data: {\n          name: data.name,\n          apiKey: data.apiKey,\n          instanceId: instanceId,\n        },\n      });\n\n      return creds;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error creating openai creds');\n    }\n  }\n\n  public async findOpenaiCreds(instance: InstanceDto) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    const creds = await this.credsRepository.findMany({\n      where: {\n        instanceId: instanceId,\n      },\n      include: {\n        OpenaiAssistant: true,\n      },\n    });\n\n    return creds;\n  }\n\n  public async deleteCreds(instance: InstanceDto, openaiCredsId: string) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    const creds = await this.credsRepository.findFirst({\n      where: {\n        id: openaiCredsId,\n      },\n    });\n\n    if (!creds) {\n      throw new Error('Openai Creds not found');\n    }\n\n    if (creds.instanceId !== instanceId) {\n      throw new Error('Openai Creds not found');\n    }\n\n    try {\n      await this.credsRepository.delete({\n        where: {\n          id: openaiCredsId,\n        },\n      });\n\n      return { openaiCreds: { id: openaiCredsId } };\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error deleting openai creds');\n    }\n  }\n\n  // Override the settings method to handle the OpenAI credentials\n  public async settings(instance: InstanceDto, data: any) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    try {\n      const instanceId = await this.prismaRepository.instance\n        .findFirst({\n          where: {\n            name: instance.instanceName,\n          },\n        })\n        .then((instance) => instance.id);\n\n      const existingSettings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n      });\n\n      // Convert keywordFinish to string if it's an array\n      const keywordFinish = data.keywordFinish;\n\n      // Additional OpenAI-specific fields\n      const settingsData = {\n        expire: data.expire,\n        keywordFinish,\n        delayMessage: data.delayMessage,\n        unknownMessage: data.unknownMessage,\n        listeningFromMe: data.listeningFromMe,\n        stopBotFromMe: data.stopBotFromMe,\n        keepOpen: data.keepOpen,\n        debounceTime: data.debounceTime,\n        ignoreJids: data.ignoreJids,\n        splitMessages: data.splitMessages,\n        timePerChar: data.timePerChar,\n        openaiIdFallback: data.fallbackId,\n        OpenaiCreds: data.openaiCredsId\n          ? {\n              connect: {\n                id: data.openaiCredsId,\n              },\n            }\n          : undefined,\n        speechToText: data.speechToText,\n      };\n\n      if (existingSettings) {\n        const settings = await this.settingsRepository.update({\n          where: {\n            id: existingSettings.id,\n          },\n          data: settingsData,\n        });\n\n        // Map the specific fallback field to a generic 'fallbackId' in the response\n        return {\n          ...settings,\n          fallbackId: settings.openaiIdFallback,\n        };\n      } else {\n        const settings = await this.settingsRepository.create({\n          data: {\n            ...settingsData,\n            Instance: {\n              connect: {\n                id: instanceId,\n              },\n            },\n          },\n        });\n\n        // Map the specific fallback field to a generic 'fallbackId' in the response\n        return {\n          ...settings,\n          fallbackId: settings.openaiIdFallback,\n        };\n      }\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error setting default settings');\n    }\n  }\n\n  // Models - OpenAI specific functionality\n  public async getModels(instance: InstanceDto, openaiCredsId?: string) {\n    if (!this.integrationEnabled) throw new BadRequestException('Openai is disabled');\n\n    const instanceId = await this.prismaRepository.instance\n      .findFirst({\n        where: {\n          name: instance.instanceName,\n        },\n      })\n      .then((instance) => instance.id);\n\n    if (!instanceId) throw new Error('Instance not found');\n\n    let apiKey: string;\n\n    if (openaiCredsId) {\n      // Use specific credential ID if provided\n      const creds = await this.credsRepository.findFirst({\n        where: {\n          id: openaiCredsId,\n          instanceId: instanceId, // Ensure the credential belongs to this instance\n        },\n      });\n\n      if (!creds) throw new Error('OpenAI credentials not found for the provided ID');\n\n      apiKey = creds.apiKey;\n    } else {\n      // Use default credentials from settings if no ID provided\n      const defaultSettings = await this.settingsRepository.findFirst({\n        where: {\n          instanceId: instanceId,\n        },\n        include: {\n          OpenaiCreds: true,\n        },\n      });\n\n      if (!defaultSettings) throw new Error('Settings not found');\n\n      if (!defaultSettings.OpenaiCreds)\n        throw new Error(\n          'OpenAI credentials not found. Please create credentials and associate them with the settings.',\n        );\n\n      apiKey = defaultSettings.OpenaiCreds.apiKey;\n    }\n\n    try {\n      this.client = new OpenAI({ apiKey });\n\n      const models: any = await this.client.models.list();\n\n      return models?.body?.data;\n    } catch (error) {\n      this.logger.error(error);\n      throw new Error('Error fetching models');\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { TypebotDto } from '@api/integrations/chatbot/typebot/dto/typebot.dto';\nimport { TypebotService } from '@api/integrations/chatbot/typebot/services/typebot.service';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Events } from '@api/types/wa.types';\nimport { configService, Typebot } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\nimport { IntegrationSession, Typebot as TypebotModel } from '@prisma/client';\nimport axios from 'axios';\n\nimport { BaseChatbotController } from '../../base-chatbot.controller';\n\nexport class TypebotController extends BaseChatbotController<TypebotModel, TypebotDto> {\n  constructor(\n    private readonly typebotService: TypebotService,\n    prismaRepository: PrismaRepository,\n    waMonitor: WAMonitoringService,\n  ) {\n    super(prismaRepository, waMonitor);\n\n    this.botRepository = this.prismaRepository.typebot;\n    this.settingsRepository = this.prismaRepository.typebotSetting;\n    this.sessionRepository = this.prismaRepository.integrationSession;\n  }\n\n  public readonly logger = new Logger('TypebotController');\n  protected readonly integrationName = 'Typebot';\n\n  integrationEnabled = configService.get<Typebot>('TYPEBOT').ENABLED;\n  botRepository: any;\n  settingsRepository: any;\n  sessionRepository: any;\n  userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } } = {};\n\n  protected getFallbackBotId(settings: any): string | undefined {\n    return settings?.typebotIdFallback;\n  }\n\n  protected getFallbackFieldName(): string {\n    return 'typebotIdFallback';\n  }\n\n  protected getIntegrationType(): string {\n    return 'typebot';\n  }\n\n  protected getAdditionalBotData(data: TypebotDto): Record<string, any> {\n    return {\n      url: data.url,\n      typebot: data.typebot,\n    };\n  }\n\n  // Implementation for bot-specific updates\n  protected getAdditionalUpdateFields(data: TypebotDto): Record<string, any> {\n    return {\n      url: data.url,\n      typebot: data.typebot,\n    };\n  }\n\n  // Implementation for bot-specific duplicate validation on update\n  protected async validateNoDuplicatesOnUpdate(botId: string, instanceId: string, data: TypebotDto): Promise<void> {\n    const checkDuplicate = await this.botRepository.findFirst({\n      where: {\n        url: data.url,\n        typebot: data.typebot,\n        id: {\n          not: botId,\n        },\n        instanceId: instanceId,\n      },\n    });\n\n    if (checkDuplicate) {\n      throw new Error('Typebot already exists');\n    }\n  }\n\n  // Process Typebot-specific bot logic\n  protected async processBot(\n    instance: any,\n    remoteJid: string,\n    bot: TypebotModel,\n    session: IntegrationSession,\n    settings: any,\n    content: string,\n    pushName?: string,\n    msg?: any,\n  ) {\n    // Map to the original processTypebot method signature\n    await this.typebotService.processTypebot(\n      instance,\n      remoteJid,\n      msg,\n      session,\n      bot,\n      bot.url,\n      settings.expire,\n      bot.typebot,\n      settings.keywordFinish,\n      settings.delayMessage,\n      settings.unknownMessage,\n      settings.listeningFromMe,\n      settings.stopBotFromMe,\n      settings.keepOpen,\n      content,\n      {}, // prefilledVariables (optional)\n    );\n  }\n\n  // TypeBot specific method for starting a bot from API\n  public async startBot(instance: InstanceDto, data: any) {\n    if (!this.integrationEnabled) throw new BadRequestException('Typebot is disabled');\n\n    if (data.remoteJid === 'status@broadcast') return;\n\n    const instanceData = await this.prismaRepository.instance.findFirst({\n      where: {\n        name: instance.instanceName,\n      },\n    });\n\n    if (!instanceData) throw new Error('Instance not found');\n\n    const remoteJid = data.remoteJid;\n    const url = data.url;\n    const typebot = data.typebot;\n    const startSession = data.startSession;\n    const variables = data.variables;\n    let expire = data?.typebot?.expire;\n    let keywordFinish = data?.typebot?.keywordFinish;\n    let delayMessage = data?.typebot?.delayMessage;\n    let unknownMessage = data?.typebot?.unknownMessage;\n    let listeningFromMe = data?.typebot?.listeningFromMe;\n    let stopBotFromMe = data?.typebot?.stopBotFromMe;\n    let keepOpen = data?.typebot?.keepOpen;\n    let debounceTime = data?.typebot?.debounceTime;\n    let ignoreJids = data?.typebot?.ignoreJids;\n\n    const defaultSettingCheck = await this.settingsRepository.findFirst({\n      where: {\n        instanceId: instanceData.id,\n      },\n    });\n\n    if (this.checkIgnoreJids(defaultSettingCheck?.ignoreJids, remoteJid)) throw new Error('Jid not allowed');\n\n    if (\n      !expire ||\n      !keywordFinish ||\n      !delayMessage ||\n      !unknownMessage ||\n      !listeningFromMe ||\n      !stopBotFromMe ||\n      !keepOpen ||\n      !debounceTime ||\n      !ignoreJids\n    ) {\n      if (expire === undefined || expire === null) expire = defaultSettingCheck.expire;\n      if (keywordFinish === undefined || keywordFinish === null) keywordFinish = defaultSettingCheck.keywordFinish;\n      if (delayMessage === undefined || delayMessage === null) delayMessage = defaultSettingCheck.delayMessage;\n      if (unknownMessage === undefined || unknownMessage === null) unknownMessage = defaultSettingCheck.unknownMessage;\n      if (listeningFromMe === undefined || listeningFromMe === null)\n        listeningFromMe = defaultSettingCheck.listeningFromMe;\n      if (stopBotFromMe === undefined || stopBotFromMe === null) stopBotFromMe = defaultSettingCheck.stopBotFromMe;\n      if (keepOpen === undefined || keepOpen === null) keepOpen = defaultSettingCheck.keepOpen;\n      if (debounceTime === undefined || debounceTime === null) debounceTime = defaultSettingCheck.debounceTime;\n      if (ignoreJids === undefined || ignoreJids === null) ignoreJids = defaultSettingCheck.ignoreJids;\n\n      if (!defaultSettingCheck) {\n        await this.settings(instance, {\n          expire: expire,\n          keywordFinish: keywordFinish,\n          delayMessage: delayMessage,\n          unknownMessage: unknownMessage,\n          listeningFromMe: listeningFromMe,\n          stopBotFromMe: stopBotFromMe,\n          keepOpen: keepOpen,\n          debounceTime: debounceTime,\n          ignoreJids: ignoreJids,\n        });\n      }\n    }\n\n    const prefilledVariables: any = {};\n\n    if (variables?.length) {\n      variables.forEach((variable: { name: string | number; value: string }) => {\n        prefilledVariables[variable.name] = variable.value;\n      });\n    }\n\n    if (startSession) {\n      let findBot: any = await this.botRepository.findFirst({\n        where: {\n          url: url,\n          typebot: typebot,\n          instanceId: instanceData.id,\n        },\n      });\n\n      if (!findBot) {\n        findBot = await this.botRepository.create({\n          data: {\n            enabled: true,\n            url: url,\n            typebot: typebot,\n            instanceId: instanceData.id,\n            expire: expire,\n            keywordFinish: keywordFinish,\n            delayMessage: delayMessage,\n            unknownMessage: unknownMessage,\n            listeningFromMe: listeningFromMe,\n            stopBotFromMe: stopBotFromMe,\n            keepOpen: keepOpen,\n          },\n        });\n      }\n\n      await this.prismaRepository.integrationSession.deleteMany({\n        where: {\n          remoteJid: remoteJid,\n          instanceId: instanceData.id,\n          botId: { not: null },\n        },\n      });\n\n      // Use the original processTypebot method with all parameters\n      await this.typebotService.processTypebot(\n        this.waMonitor.waInstances[instanceData.name],\n        remoteJid,\n        null, // msg\n        null, // session\n        findBot,\n        url,\n        expire,\n        typebot,\n        keywordFinish,\n        delayMessage,\n        unknownMessage,\n        listeningFromMe,\n        stopBotFromMe,\n        keepOpen,\n        'init',\n        prefilledVariables,\n      );\n    } else {\n      const id = Math.floor(Math.random() * 10000000000).toString();\n\n      try {\n        const version = configService.get<Typebot>('TYPEBOT').API_VERSION;\n        let url: string;\n        let reqData: {};\n        if (version === 'latest') {\n          url = `${data.url}/api/v1/typebots/${data.typebot}/startChat`;\n\n          reqData = {\n            prefilledVariables: prefilledVariables,\n          };\n        } else {\n          url = `${data.url}/api/v1/sendMessage`;\n\n          reqData = {\n            startParams: {\n              publicId: data.typebot,\n              prefilledVariables: prefilledVariables,\n            },\n          };\n        }\n        const request = await axios.post(url, reqData);\n\n        await this.typebotService.sendWAMessage(\n          instanceData,\n          null,\n          {\n            expire: expire,\n            keywordFinish: keywordFinish,\n            delayMessage: delayMessage,\n            unknownMessage: unknownMessage,\n            listeningFromMe: listeningFromMe,\n            stopBotFromMe: stopBotFromMe,\n            keepOpen: keepOpen,\n          },\n          remoteJid,\n          request.data.messages,\n          request.data.input,\n          request.data.clientSideActions,\n        );\n\n        this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, {\n          remoteJid: remoteJid,\n          url: url,\n          typebot: typebot,\n          variables: variables,\n          sessionId: id,\n        });\n      } catch (error) {\n        this.logger.error(error);\n        return;\n      }\n    }\n\n    return {\n      typebot: {\n        ...instance,\n        typebot: {\n          url: url,\n          remoteJid: remoteJid,\n          typebot: typebot,\n          prefilledVariables: prefilledVariables,\n        },\n      },\n    };\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Kafka, Log } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { Consumer, ConsumerConfig, Kafka as KafkaJS, KafkaConfig, Producer, ProducerConfig } from 'kafkajs';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\n\nexport class KafkaController extends EventController implements EventControllerInterface {\n  private kafkaClient: KafkaJS | null = null;\n  private producer: Producer | null = null;\n  private consumer: Consumer | null = null;\n  private readonly logger = new Logger('KafkaController');\n  private reconnectAttempts = 0;\n  private maxReconnectAttempts = 10;\n  private reconnectDelay = 5000; // 5 seconds\n  private isReconnecting = false;\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<Kafka>('KAFKA')?.ENABLED, 'kafka');\n  }\n\n  public async init(): Promise<void> {\n    if (!this.status) {\n      return;\n    }\n\n    await this.connect();\n  }\n\n  private async connect(): Promise<void> {\n    try {\n      const kafkaConfig = configService.get<Kafka>('KAFKA');\n\n      const clientConfig: KafkaConfig = {\n        clientId: kafkaConfig.CLIENT_ID || 'evolution-api',\n        brokers: kafkaConfig.BROKERS || ['localhost:9092'],\n        connectionTimeout: kafkaConfig.CONNECTION_TIMEOUT || 3000,\n        requestTimeout: kafkaConfig.REQUEST_TIMEOUT || 30000,\n        retry: {\n          initialRetryTime: 100,\n          retries: 8,\n        },\n      };\n\n      // Add SASL authentication if configured\n      if (kafkaConfig.SASL?.ENABLED) {\n        clientConfig.sasl = {\n          mechanism: (kafkaConfig.SASL.MECHANISM as any) || 'plain',\n          username: kafkaConfig.SASL.USERNAME,\n          password: kafkaConfig.SASL.PASSWORD,\n        };\n      }\n\n      // Add SSL configuration if enabled\n      if (kafkaConfig.SSL?.ENABLED) {\n        clientConfig.ssl = {\n          rejectUnauthorized: kafkaConfig.SSL.REJECT_UNAUTHORIZED !== false,\n          ca: kafkaConfig.SSL.CA ? [kafkaConfig.SSL.CA] : undefined,\n          key: kafkaConfig.SSL.KEY,\n          cert: kafkaConfig.SSL.CERT,\n        };\n      }\n\n      this.kafkaClient = new KafkaJS(clientConfig);\n\n      // Initialize producer\n      const producerConfig: ProducerConfig = {\n        maxInFlightRequests: 1,\n        idempotent: true,\n        transactionTimeout: 30000,\n      };\n\n      this.producer = this.kafkaClient.producer(producerConfig);\n      await this.producer.connect();\n\n      // Initialize consumer for global events if enabled\n      if (kafkaConfig.GLOBAL_ENABLED) {\n        await this.initGlobalConsumer();\n      }\n\n      this.reconnectAttempts = 0;\n      this.isReconnecting = false;\n\n      this.logger.info('Kafka initialized successfully');\n\n      // Create topics if they don't exist\n      if (kafkaConfig.AUTO_CREATE_TOPICS) {\n        await this.createTopics();\n      }\n    } catch (error) {\n      this.logger.error({\n        local: 'KafkaController.connect',\n        message: 'Failed to connect to Kafka',\n        error: error.message || error,\n      });\n      this.scheduleReconnect();\n      throw error;\n    }\n  }\n\n  private async initGlobalConsumer(): Promise<void> {\n    try {\n      const kafkaConfig = configService.get<Kafka>('KAFKA');\n\n      const consumerConfig: ConsumerConfig = {\n        groupId: kafkaConfig.CONSUMER_GROUP_ID || 'evolution-api-consumers',\n        sessionTimeout: 30000,\n        heartbeatInterval: 3000,\n      };\n\n      this.consumer = this.kafkaClient.consumer(consumerConfig);\n      await this.consumer.connect();\n\n      // Subscribe to global topics\n      const events = kafkaConfig.EVENTS;\n      if (events) {\n        const eventKeys = Object.keys(events).filter((event) => events[event]);\n\n        for (const event of eventKeys) {\n          const topicName = this.getTopicName(event, true);\n          await this.consumer.subscribe({ topic: topicName });\n        }\n\n        // Start consuming messages\n        await this.consumer.run({\n          eachMessage: async ({ topic, message }) => {\n            try {\n              const data = JSON.parse(message.value?.toString() || '{}');\n              this.logger.debug(`Received message from topic ${topic}: ${JSON.stringify(data)}`);\n\n              // Process the message here if needed\n              // This is where you can add custom message processing logic\n            } catch (error) {\n              this.logger.error(`Error processing message from topic ${topic}: ${error}`);\n            }\n          },\n        });\n\n        this.logger.info('Global Kafka consumer initialized');\n      }\n    } catch (error) {\n      this.logger.error(`Failed to initialize global Kafka consumer: ${error}`);\n    }\n  }\n\n  private async createTopics(): Promise<void> {\n    try {\n      const kafkaConfig = configService.get<Kafka>('KAFKA');\n      const admin = this.kafkaClient.admin();\n      await admin.connect();\n\n      const topics = [];\n\n      // Create global topics if enabled\n      if (kafkaConfig.GLOBAL_ENABLED && kafkaConfig.EVENTS) {\n        const eventKeys = Object.keys(kafkaConfig.EVENTS).filter((event) => kafkaConfig.EVENTS[event]);\n\n        for (const event of eventKeys) {\n          const topicName = this.getTopicName(event, true);\n          topics.push({\n            topic: topicName,\n            numPartitions: kafkaConfig.NUM_PARTITIONS || 1,\n            replicationFactor: kafkaConfig.REPLICATION_FACTOR || 1,\n          });\n        }\n      }\n\n      if (topics.length > 0) {\n        await admin.createTopics({\n          topics,\n          waitForLeaders: true,\n        });\n\n        this.logger.info(`Created ${topics.length} Kafka topics`);\n      }\n\n      await admin.disconnect();\n    } catch (error) {\n      this.logger.error(`Failed to create Kafka topics: ${error}`);\n    }\n  }\n\n  private getTopicName(event: string, isGlobal: boolean = false, instanceName?: string): string {\n    const kafkaConfig = configService.get<Kafka>('KAFKA');\n    const prefix = kafkaConfig.TOPIC_PREFIX || 'evolution';\n\n    if (isGlobal) {\n      return `${prefix}.global.${event.toLowerCase().replace(/_/g, '.')}`;\n    } else {\n      return `${prefix}.${instanceName}.${event.toLowerCase().replace(/_/g, '.')}`;\n    }\n  }\n\n  private handleConnectionLoss(): void {\n    if (this.isReconnecting) {\n      return;\n    }\n\n    this.cleanup();\n    this.scheduleReconnect();\n  }\n\n  private scheduleReconnect(): void {\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      this.logger.error(\n        `Maximum reconnect attempts (${this.maxReconnectAttempts}) reached. Stopping reconnection attempts.`,\n      );\n      return;\n    }\n\n    if (this.isReconnecting) {\n      return;\n    }\n\n    this.isReconnecting = true;\n    this.reconnectAttempts++;\n\n    const delay = this.reconnectDelay * Math.pow(2, Math.min(this.reconnectAttempts - 1, 5));\n\n    this.logger.info(\n      `Scheduling Kafka reconnection attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms`,\n    );\n\n    setTimeout(async () => {\n      try {\n        this.logger.info(\n          `Attempting to reconnect to Kafka (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\n        );\n        await this.connect();\n        this.logger.info('Successfully reconnected to Kafka');\n      } catch (error) {\n        this.logger.error({\n          local: 'KafkaController.scheduleReconnect',\n          message: `Reconnection attempt ${this.reconnectAttempts} failed`,\n          error: error.message || error,\n        });\n        this.isReconnecting = false;\n        this.scheduleReconnect();\n      }\n    }, delay);\n  }\n\n  private async ensureConnection(): Promise<boolean> {\n    if (!this.producer) {\n      this.logger.warn('Kafka producer is not available, attempting to reconnect...');\n      if (!this.isReconnecting) {\n        this.scheduleReconnect();\n      }\n      return false;\n    }\n    return true;\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('kafka')) {\n      return;\n    }\n\n    if (!this.status) {\n      return;\n    }\n\n    if (!(await this.ensureConnection())) {\n      this.logger.warn(`Failed to emit event ${event} for instance ${instanceName}: No Kafka connection`);\n      return;\n    }\n\n    const instanceKafka = await this.get(instanceName);\n    const kafkaLocal = instanceKafka?.events;\n    const kafkaGlobal = configService.get<Kafka>('KAFKA').GLOBAL_ENABLED;\n    const kafkaEvents = configService.get<Kafka>('KAFKA').EVENTS;\n    const we = event.replace(/[.-]/gm, '_').toUpperCase();\n    const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS');\n\n    const message = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      server_url: serverUrl,\n      date_time: dateTime,\n      sender,\n      apikey: apiKey,\n      timestamp: Date.now(),\n    };\n\n    const messageValue = JSON.stringify(message);\n\n    // Instance-specific events\n    if (instanceKafka?.enabled && this.producer && Array.isArray(kafkaLocal) && kafkaLocal.includes(we)) {\n      const topicName = this.getTopicName(event, false, instanceName);\n\n      let retry = 0;\n      while (retry < 3) {\n        try {\n          await this.producer.send({\n            topic: topicName,\n            messages: [\n              {\n                key: instanceName,\n                value: messageValue,\n                headers: {\n                  event,\n                  instance: instanceName,\n                  origin,\n                  timestamp: dateTime,\n                },\n              },\n            ],\n          });\n\n          if (logEnabled) {\n            const logData = {\n              local: `${origin}.sendData-Kafka`,\n              ...message,\n            };\n            this.logger.log(logData);\n          }\n\n          break;\n        } catch (error) {\n          this.logger.error({\n            local: 'KafkaController.emit',\n            message: `Error publishing local Kafka message (attempt ${retry + 1}/3)`,\n            error: error.message || error,\n          });\n          retry++;\n          if (retry >= 3) {\n            this.handleConnectionLoss();\n          }\n        }\n      }\n    }\n\n    // Global events\n    if (kafkaGlobal && kafkaEvents[we] && this.producer) {\n      const topicName = this.getTopicName(event, true);\n\n      let retry = 0;\n      while (retry < 3) {\n        try {\n          await this.producer.send({\n            topic: topicName,\n            messages: [\n              {\n                key: `${instanceName}-${event}`,\n                value: messageValue,\n                headers: {\n                  event,\n                  instance: instanceName,\n                  origin,\n                  timestamp: dateTime,\n                },\n              },\n            ],\n          });\n\n          if (logEnabled) {\n            const logData = {\n              local: `${origin}.sendData-Kafka-Global`,\n              ...message,\n            };\n            this.logger.log(logData);\n          }\n\n          break;\n        } catch (error) {\n          this.logger.error({\n            local: 'KafkaController.emit',\n            message: `Error publishing global Kafka message (attempt ${retry + 1}/3)`,\n            error: error.message || error,\n          });\n          retry++;\n          if (retry >= 3) {\n            this.handleConnectionLoss();\n          }\n        }\n      }\n    }\n  }\n\n  public async cleanup(): Promise<void> {\n    try {\n      if (this.consumer) {\n        await this.consumer.disconnect();\n        this.consumer = null;\n      }\n      if (this.producer) {\n        await this.producer.disconnect();\n        this.producer = null;\n      }\n      this.kafkaClient = null;\n    } catch (error) {\n      this.logger.warn({\n        local: 'KafkaController.cleanup',\n        message: 'Error during cleanup',\n        error: error.message || error,\n      });\n      this.producer = null;\n      this.consumer = null;\n      this.kafkaClient = null;\n    }\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Log, Nats } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { connect, NatsConnection, StringCodec } from 'nats';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\n\nexport class NatsController extends EventController implements EventControllerInterface {\n  public natsClient: NatsConnection | null = null;\n  private readonly logger = new Logger('NatsController');\n  private readonly sc = StringCodec();\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<Nats>('NATS')?.ENABLED, 'nats');\n  }\n\n  public async init(): Promise<void> {\n    if (!this.status) {\n      return;\n    }\n\n    try {\n      const uri = configService.get<Nats>('NATS').URI;\n\n      this.natsClient = await connect({ servers: uri });\n\n      this.logger.info('NATS initialized');\n\n      if (configService.get<Nats>('NATS')?.GLOBAL_ENABLED) {\n        await this.initGlobalSubscriptions();\n      }\n    } catch (error) {\n      this.logger.error('Failed to connect to NATS:');\n      this.logger.error(error);\n      throw error;\n    }\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('nats')) {\n      return;\n    }\n\n    if (!this.status || !this.natsClient) {\n      return;\n    }\n\n    const instanceNats = await this.get(instanceName);\n    const natsLocal = instanceNats?.events;\n    const natsGlobal = configService.get<Nats>('NATS').GLOBAL_ENABLED;\n    const natsEvents = configService.get<Nats>('NATS').EVENTS;\n    const prefixKey = configService.get<Nats>('NATS').PREFIX_KEY;\n    const we = event.replace(/[.-]/gm, '_').toUpperCase();\n    const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS');\n\n    const message = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      server_url: serverUrl,\n      date_time: dateTime,\n      sender,\n      apikey: apiKey,\n    };\n\n    // Instância específica\n    if (instanceNats?.enabled) {\n      if (Array.isArray(natsLocal) && natsLocal.includes(we)) {\n        const subject = `${instanceName}.${event.toLowerCase()}`;\n\n        try {\n          this.natsClient.publish(subject, this.sc.encode(JSON.stringify(message)));\n\n          if (logEnabled) {\n            const logData = {\n              local: `${origin}.sendData-NATS`,\n              ...message,\n            };\n            this.logger.log(logData);\n          }\n        } catch (error) {\n          this.logger.error(`Failed to publish to NATS (instance): ${error}`);\n        }\n      }\n    }\n\n    // Global\n    if (natsGlobal && natsEvents[we]) {\n      try {\n        const subject = prefixKey ? `${prefixKey}.${event.toLowerCase()}` : event.toLowerCase();\n\n        this.natsClient.publish(subject, this.sc.encode(JSON.stringify(message)));\n\n        if (logEnabled) {\n          const logData = {\n            local: `${origin}.sendData-NATS-Global`,\n            ...message,\n          };\n          this.logger.log(logData);\n        }\n      } catch (error) {\n        this.logger.error(`Failed to publish to NATS (global): ${error}`);\n      }\n    }\n  }\n\n  private async initGlobalSubscriptions(): Promise<void> {\n    this.logger.info('Initializing global subscriptions');\n\n    const events = configService.get<Nats>('NATS').EVENTS;\n    const prefixKey = configService.get<Nats>('NATS').PREFIX_KEY;\n\n    if (!events) {\n      this.logger.warn('No events to initialize on NATS');\n      return;\n    }\n\n    const eventKeys = Object.keys(events);\n\n    for (const event of eventKeys) {\n      if (events[event] === false) continue;\n\n      const subject = prefixKey ? `${prefixKey}.${event.toLowerCase()}` : event.toLowerCase();\n\n      // Criar uma subscription para cada evento\n      try {\n        const subscription = this.natsClient.subscribe(subject);\n        this.logger.info(`Subscribed to: ${subject}`);\n\n        // Processar mensagens (exemplo básico)\n        (async () => {\n          for await (const msg of subscription) {\n            try {\n              const data = JSON.parse(this.sc.decode(msg.data));\n              // Aqui você pode adicionar a lógica de processamento\n              this.logger.debug(`Received message on ${subject}:`);\n              this.logger.debug(data);\n            } catch (error) {\n              this.logger.error(`Error processing message on ${subject}:`);\n              this.logger.error(error);\n            }\n          }\n        })();\n      } catch (error) {\n        this.logger.error(`Failed to subscribe to ${subject}:`);\n        this.logger.error(error);\n      }\n    }\n  }\n}\n","import { EventDto } from '@api/integrations/event/event.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { wa } from '@api/types/wa.types';\nimport { configService, Log, Pusher as ConfigPusher } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport Pusher from 'pusher';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\nexport class PusherController extends EventController implements EventControllerInterface {\n  private readonly logger = new Logger('PusherController');\n  private pusherClients: { [instanceName: string]: Pusher } = {};\n  private globalPusherClient: Pusher | null = null;\n  private pusherConfig: ConfigPusher = configService.get<ConfigPusher>('PUSHER');\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<ConfigPusher>('PUSHER')?.ENABLED, 'pusher');\n    this.init();\n  }\n  public async init(): Promise<void> {\n    if (!this.status) {\n      return;\n    }\n    if (this.pusherConfig.GLOBAL?.ENABLED) {\n      const { APP_ID, KEY, SECRET, CLUSTER, USE_TLS } = this.pusherConfig.GLOBAL;\n      if (APP_ID && KEY && SECRET && CLUSTER) {\n        this.globalPusherClient = new Pusher({\n          appId: APP_ID,\n          key: KEY,\n          secret: SECRET,\n          cluster: CLUSTER,\n          useTLS: USE_TLS,\n        });\n        this.logger.info('Pusher global client initialized');\n      }\n    }\n    const instances = await this.prismaRepository.instance.findMany({\n      where: {\n        Pusher: {\n          isNot: null,\n        },\n      },\n      include: {\n        Pusher: true,\n      },\n    });\n    instances.forEach((instance) => {\n      if (\n        instance.Pusher.enabled &&\n        instance.Pusher.appId &&\n        instance.Pusher.key &&\n        instance.Pusher.secret &&\n        instance.Pusher.cluster\n      ) {\n        this.pusherClients[instance.name] = new Pusher({\n          appId: instance.Pusher.appId,\n          key: instance.Pusher.key,\n          secret: instance.Pusher.secret,\n          cluster: instance.Pusher.cluster,\n          useTLS: instance.Pusher.useTLS,\n        });\n        this.logger.info(`Pusher client initialized for instance ${instance.name}`);\n      } else {\n        delete this.pusherClients[instance.name];\n        this.logger.warn(`Pusher client disabled or misconfigured for instance ${instance.name}`);\n      }\n    });\n  }\n  override async set(instanceName: string, data: EventDto): Promise<wa.LocalPusher> {\n    if (!data.pusher?.enabled) {\n      data.pusher.events = [];\n    } else if (data.pusher.events.length === 0) {\n      data.pusher.events = EventController.events;\n    }\n    const instance = await this.prisma.pusher.upsert({\n      where: {\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n      update: {\n        enabled: data.pusher.enabled,\n        events: data.pusher.events,\n        appId: data.pusher.appId,\n        key: data.pusher.key,\n        secret: data.pusher.secret,\n        cluster: data.pusher.cluster,\n        useTLS: data.pusher.useTLS,\n      },\n      create: {\n        enabled: data.pusher.enabled,\n        events: data.pusher.events,\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n        appId: data.pusher.appId,\n        key: data.pusher.key,\n        secret: data.pusher.secret,\n        cluster: data.pusher.cluster,\n        useTLS: data.pusher.useTLS,\n      },\n    });\n    if (instance.enabled && instance.appId && instance.key && instance.secret && instance.cluster) {\n      this.pusherClients[instanceName] = new Pusher({\n        appId: instance.appId,\n        key: instance.key,\n        secret: instance.secret,\n        cluster: instance.cluster,\n        useTLS: instance.useTLS,\n      });\n      this.logger.info(`Pusher client initialized for instance ${instanceName}`);\n    } else {\n      delete this.pusherClients[instanceName];\n      this.logger.warn(`Pusher client disabled or misconfigured for instance ${instanceName}`);\n    }\n    return instance;\n  }\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    local,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('pusher')) {\n      return;\n    }\n    if (!this.status) {\n      return;\n    }\n    const instance = (await this.get(instanceName)) as wa.LocalPusher;\n    const we = event.replace(/[.-]/gm, '_').toUpperCase();\n    const enabledLog = configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS');\n    const eventName = event.replace(/_/g, '.').toLowerCase();\n    const pusherData = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      destination: instance?.appId || this.pusherConfig.GLOBAL?.APP_ID,\n      date_time: dateTime,\n      sender,\n      server_url: serverUrl,\n      apikey: apiKey,\n    };\n    if (event == 'qrcode.updated') {\n      delete pusherData.data.qrcode.base64;\n    }\n    const payload = JSON.stringify(pusherData);\n    const payloadSize = Buffer.byteLength(payload, 'utf8');\n    const MAX_SIZE = 10240;\n    if (payloadSize > MAX_SIZE) {\n      this.logger.error({\n        local: `${origin}.sendData-Pusher`,\n        message: 'Payload size exceeds Pusher limit',\n        event,\n        instanceName,\n        payloadSize,\n      });\n      return;\n    }\n    if (local && instance && instance.enabled) {\n      const pusherLocalEvents = instance.events;\n      if (Array.isArray(pusherLocalEvents) && pusherLocalEvents.includes(we)) {\n        if (enabledLog) {\n          this.logger.log({\n            local: `${origin}.sendData-Pusher`,\n            appId: instance.appId,\n            ...pusherData,\n          });\n        }\n        try {\n          const pusher = this.pusherClients[instanceName];\n          if (pusher) {\n            pusher.trigger(instanceName, eventName, pusherData);\n          } else {\n            this.logger.error(`Pusher client not found for instance ${instanceName}`);\n          }\n        } catch (error) {\n          this.logger.error({\n            local: `${origin}.sendData-Pusher`,\n            message: error?.message,\n            error,\n          });\n        }\n      }\n    }\n    if (this.pusherConfig.GLOBAL?.ENABLED) {\n      const globalEvents = this.pusherConfig.EVENTS;\n      if (globalEvents[we]) {\n        if (enabledLog) {\n          this.logger.log({\n            local: `${origin}.sendData-Pusher-Global`,\n            appId: this.pusherConfig.GLOBAL?.APP_ID,\n            ...pusherData,\n          });\n        }\n        try {\n          if (this.globalPusherClient) {\n            this.globalPusherClient.trigger(instanceName, eventName, pusherData);\n          } else {\n            this.logger.error('Global Pusher client not initialized');\n          }\n        } catch (error) {\n          this.logger.error({\n            local: `${origin}.sendData-Pusher-Global`,\n            message: error?.message,\n            error,\n          });\n        }\n      }\n    }\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { configService, Log, Rabbitmq } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport * as amqp from 'amqplib/callback_api';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\n\nexport class RabbitmqController extends EventController implements EventControllerInterface {\n  public amqpChannel: amqp.Channel | null = null;\n  private amqpConnection: amqp.Connection | null = null;\n  private readonly logger = new Logger('RabbitmqController');\n  private reconnectAttempts = 0;\n  private maxReconnectAttempts = 10;\n  private reconnectDelay = 5000; // 5 seconds\n  private isReconnecting = false;\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<Rabbitmq>('RABBITMQ')?.ENABLED, 'rabbitmq');\n  }\n\n  public async init(): Promise<void> {\n    if (!this.status) {\n      return;\n    }\n\n    await this.connect();\n  }\n\n  private async connect(): Promise<void> {\n    return new Promise<void>((resolve, reject) => {\n      const uri = configService.get<Rabbitmq>('RABBITMQ').URI;\n      const frameMax = configService.get<Rabbitmq>('RABBITMQ').FRAME_MAX;\n      const rabbitmqExchangeName = configService.get<Rabbitmq>('RABBITMQ').EXCHANGE_NAME;\n\n      const url = new URL(uri);\n      const connectionOptions = {\n        protocol: url.protocol.slice(0, -1),\n        hostname: url.hostname,\n        port: url.port || 5672,\n        username: url.username || 'guest',\n        password: url.password || 'guest',\n        vhost: url.pathname.slice(1) || '/',\n        frameMax: frameMax,\n        heartbeat: 30, // Add heartbeat of 30 seconds\n      };\n\n      amqp.connect(connectionOptions, (error: Error, connection: amqp.Connection) => {\n        if (error) {\n          this.logger.error({\n            local: 'RabbitmqController.connect',\n            message: 'Failed to connect to RabbitMQ',\n            error: error.message || error,\n          });\n          reject(error);\n          return;\n        }\n\n        // Connection event handlers\n        connection.on('error', (err: Error) => {\n          this.logger.error({\n            local: 'RabbitmqController.connectionError',\n            message: 'RabbitMQ connection error',\n            error: err.message || err,\n          });\n          this.handleConnectionLoss();\n        });\n\n        connection.on('close', () => {\n          this.logger.warn('RabbitMQ connection closed');\n          this.handleConnectionLoss();\n        });\n\n        connection.createChannel((channelError: Error, channel: amqp.Channel) => {\n          if (channelError) {\n            this.logger.error({\n              local: 'RabbitmqController.createChannel',\n              message: 'Failed to create RabbitMQ channel',\n              error: channelError.message || channelError,\n            });\n            reject(channelError);\n            return;\n          }\n\n          // Channel event handlers\n          channel.on('error', (err: Error) => {\n            this.logger.error({\n              local: 'RabbitmqController.channelError',\n              message: 'RabbitMQ channel error',\n              error: err.message || err,\n            });\n            this.handleConnectionLoss();\n          });\n\n          channel.on('close', () => {\n            this.logger.warn('RabbitMQ channel closed');\n            this.handleConnectionLoss();\n          });\n\n          const exchangeName = rabbitmqExchangeName;\n\n          channel.assertExchange(exchangeName, 'topic', {\n            durable: true,\n            autoDelete: false,\n          });\n\n          this.amqpConnection = connection;\n          this.amqpChannel = channel;\n          this.reconnectAttempts = 0; // Reset reconnect attempts on successful connection\n          this.isReconnecting = false;\n\n          this.logger.info('AMQP initialized successfully');\n\n          resolve();\n        });\n      });\n    })\n      .then(() => {\n        if (configService.get<Rabbitmq>('RABBITMQ')?.GLOBAL_ENABLED) {\n          this.initGlobalQueues();\n        }\n      })\n      .catch((error) => {\n        this.logger.error({\n          local: 'RabbitmqController.init',\n          message: 'Failed to initialize AMQP',\n          error: error.message || error,\n        });\n        this.scheduleReconnect();\n        throw error;\n      });\n  }\n\n  private handleConnectionLoss(): void {\n    if (this.isReconnecting) {\n      return; // Already attempting to reconnect\n    }\n\n    this.cleanup();\n    this.scheduleReconnect();\n  }\n\n  private scheduleReconnect(): void {\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      this.logger.error(\n        `Maximum reconnect attempts (${this.maxReconnectAttempts}) reached. Stopping reconnection attempts.`,\n      );\n      return;\n    }\n\n    if (this.isReconnecting) {\n      return; // Already scheduled\n    }\n\n    this.isReconnecting = true;\n    this.reconnectAttempts++;\n\n    const delay = this.reconnectDelay * Math.pow(2, Math.min(this.reconnectAttempts - 1, 5)); // Exponential backoff with max delay\n\n    this.logger.info(\n      `Scheduling RabbitMQ reconnection attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms`,\n    );\n\n    setTimeout(async () => {\n      try {\n        this.logger.info(\n          `Attempting to reconnect to RabbitMQ (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\n        );\n        await this.connect();\n        this.logger.info('Successfully reconnected to RabbitMQ');\n      } catch (error) {\n        this.logger.error({\n          local: 'RabbitmqController.scheduleReconnect',\n          message: `Reconnection attempt ${this.reconnectAttempts} failed`,\n          error: error.message || error,\n        });\n        this.isReconnecting = false;\n        this.scheduleReconnect();\n      }\n    }, delay);\n  }\n\n  private set channel(channel: amqp.Channel) {\n    this.amqpChannel = channel;\n  }\n\n  public get channel(): amqp.Channel {\n    return this.amqpChannel;\n  }\n\n  private async ensureConnection(): Promise<boolean> {\n    if (!this.amqpChannel) {\n      this.logger.warn('AMQP channel is not available, attempting to reconnect...');\n      if (!this.isReconnecting) {\n        this.scheduleReconnect();\n      }\n      return false;\n    }\n    return true;\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('rabbitmq')) {\n      return;\n    }\n\n    if (!this.status) {\n      return;\n    }\n\n    if (!(await this.ensureConnection())) {\n      this.logger.warn(`Failed to emit event ${event} for instance ${instanceName}: No AMQP connection`);\n      return;\n    }\n\n    const instanceRabbitmq = await this.get(instanceName);\n    const rabbitmqLocal = instanceRabbitmq?.events;\n    const rabbitmqGlobal = configService.get<Rabbitmq>('RABBITMQ').GLOBAL_ENABLED;\n    const rabbitmqEvents = configService.get<Rabbitmq>('RABBITMQ').EVENTS;\n    const prefixKey = configService.get<Rabbitmq>('RABBITMQ').PREFIX_KEY;\n    const rabbitmqExchangeName = configService.get<Rabbitmq>('RABBITMQ').EXCHANGE_NAME;\n    const we = event.replace(/[.-]/gm, '_').toUpperCase();\n    const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS');\n\n    const message = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      server_url: serverUrl,\n      date_time: dateTime,\n      sender,\n      apikey: apiKey,\n    };\n\n    if (instanceRabbitmq?.enabled && this.amqpChannel) {\n      if (Array.isArray(rabbitmqLocal) && rabbitmqLocal.includes(we)) {\n        const exchangeName = instanceName ?? rabbitmqExchangeName;\n\n        let retry = 0;\n\n        while (retry < 3) {\n          try {\n            await this.amqpChannel.assertExchange(exchangeName, 'topic', {\n              durable: true,\n              autoDelete: false,\n            });\n\n            const eventName = event.replace(/_/g, '.').toLowerCase();\n\n            const queueName = `${instanceName}.${eventName}`;\n\n            await this.amqpChannel.assertQueue(queueName, {\n              durable: true,\n              autoDelete: false,\n              arguments: {\n                'x-queue-type': 'quorum',\n              },\n            });\n\n            await this.amqpChannel.bindQueue(queueName, exchangeName, eventName);\n\n            await this.amqpChannel.publish(exchangeName, event, Buffer.from(JSON.stringify(message)));\n\n            if (logEnabled) {\n              const logData = {\n                local: `${origin}.sendData-RabbitMQ`,\n                ...message,\n              };\n\n              this.logger.log(logData);\n            }\n\n            break;\n          } catch (error) {\n            this.logger.error({\n              local: 'RabbitmqController.emit',\n              message: `Error publishing local RabbitMQ message (attempt ${retry + 1}/3)`,\n              error: error.message || error,\n            });\n            retry++;\n            if (retry >= 3) {\n              this.handleConnectionLoss();\n            }\n          }\n        }\n      }\n    }\n\n    if (rabbitmqGlobal && rabbitmqEvents[we] && this.amqpChannel) {\n      const exchangeName = rabbitmqExchangeName;\n\n      let retry = 0;\n\n      while (retry < 3) {\n        try {\n          await this.amqpChannel.assertExchange(exchangeName, 'topic', {\n            durable: true,\n            autoDelete: false,\n          });\n\n          const queueName = prefixKey\n            ? `${prefixKey}.${event.replace(/_/g, '.').toLowerCase()}`\n            : event.replace(/_/g, '.').toLowerCase();\n\n          await this.amqpChannel.assertQueue(queueName, {\n            durable: true,\n            autoDelete: false,\n            arguments: {\n              'x-queue-type': 'quorum',\n            },\n          });\n\n          await this.amqpChannel.bindQueue(queueName, exchangeName, event);\n\n          await this.amqpChannel.publish(exchangeName, event, Buffer.from(JSON.stringify(message)));\n\n          if (logEnabled) {\n            const logData = {\n              local: `${origin}.sendData-RabbitMQ-Global`,\n              ...message,\n            };\n\n            this.logger.log(logData);\n          }\n\n          break;\n        } catch (error) {\n          this.logger.error({\n            local: 'RabbitmqController.emit',\n            message: `Error publishing global RabbitMQ message (attempt ${retry + 1}/3)`,\n            error: error.message || error,\n          });\n          retry++;\n          if (retry >= 3) {\n            this.handleConnectionLoss();\n          }\n        }\n      }\n    }\n  }\n\n  private async initGlobalQueues(): Promise<void> {\n    this.logger.info('Initializing global queues');\n\n    if (!(await this.ensureConnection())) {\n      this.logger.error('Cannot initialize global queues: No AMQP connection');\n      return;\n    }\n\n    const rabbitmqExchangeName = configService.get<Rabbitmq>('RABBITMQ').EXCHANGE_NAME;\n    const events = configService.get<Rabbitmq>('RABBITMQ').EVENTS;\n    const prefixKey = configService.get<Rabbitmq>('RABBITMQ').PREFIX_KEY;\n\n    if (!events) {\n      this.logger.warn('No events to initialize on AMQP');\n      return;\n    }\n\n    const eventKeys = Object.keys(events);\n\n    for (const event of eventKeys) {\n      if (events[event] === false) continue;\n\n      try {\n        const queueName =\n          prefixKey !== ''\n            ? `${prefixKey}.${event.replace(/_/g, '.').toLowerCase()}`\n            : `${event.replace(/_/g, '.').toLowerCase()}`;\n        const exchangeName = rabbitmqExchangeName;\n\n        await this.amqpChannel.assertExchange(exchangeName, 'topic', {\n          durable: true,\n          autoDelete: false,\n        });\n\n        await this.amqpChannel.assertQueue(queueName, {\n          durable: true,\n          autoDelete: false,\n          arguments: {\n            'x-queue-type': 'quorum',\n          },\n        });\n\n        await this.amqpChannel.bindQueue(queueName, exchangeName, event);\n\n        this.logger.info(`Global queue initialized: ${queueName}`);\n      } catch (error) {\n        this.logger.error({\n          local: 'RabbitmqController.initGlobalQueues',\n          message: `Failed to initialize global queue for event ${event}`,\n          error: error.message || error,\n        });\n        this.handleConnectionLoss();\n        break;\n      }\n    }\n  }\n\n  public async cleanup(): Promise<void> {\n    try {\n      if (this.amqpChannel) {\n        await this.amqpChannel.close();\n        this.amqpChannel = null;\n      }\n      if (this.amqpConnection) {\n        await this.amqpConnection.close();\n        this.amqpConnection = null;\n      }\n    } catch (error) {\n      this.logger.warn({\n        local: 'RabbitmqController.cleanup',\n        message: 'Error during cleanup',\n        error: error.message || error,\n      });\n      this.amqpChannel = null;\n      this.amqpConnection = null;\n    }\n  }\n}\n","import * as s3Service from '@api/integrations/storage/s3/libs/minio.server';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { CreateQueueCommand, DeleteQueueCommand, ListQueuesCommand, SQS } from '@aws-sdk/client-sqs';\nimport { configService, HttpServer, Log, S3, Sqs } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\nimport { EventDto } from '../event.dto';\n\nexport class SqsController extends EventController implements EventControllerInterface {\n  private sqs: SQS;\n  private readonly logger = new Logger('SqsController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<Sqs>('SQS')?.ENABLED, 'sqs');\n  }\n\n  public async init(): Promise<void> {\n    if (!this.status) {\n      return;\n    }\n\n    const awsConfig = configService.get<Sqs>('SQS');\n\n    this.sqs = new SQS({\n      credentials: {\n        accessKeyId: awsConfig.ACCESS_KEY_ID,\n        secretAccessKey: awsConfig.SECRET_ACCESS_KEY,\n      },\n\n      region: awsConfig.REGION,\n    });\n\n    this.logger.info('SQS initialized');\n\n    const sqsConfig = configService.get<Sqs>('SQS');\n    if (this.sqs && sqsConfig.GLOBAL_ENABLED) {\n      const sqsEvents = Object.keys(sqsConfig.EVENTS).filter((e) => sqsConfig.EVENTS[e]);\n      await this.saveQueues(sqsConfig.GLOBAL_PREFIX_NAME, sqsEvents, true);\n    }\n  }\n\n  private set channel(sqs: SQS) {\n    this.sqs = sqs;\n  }\n\n  public get channel(): SQS {\n    return this.sqs;\n  }\n\n  override async set(instanceName: string, data: EventDto): Promise<any> {\n    if (!this.status || configService.get<Sqs>('SQS').GLOBAL_ENABLED) {\n      return;\n    }\n\n    if (!data[this.name]?.enabled) {\n      data[this.name].events = [];\n    } else {\n      if (0 === data[this.name].events.length) {\n        data[this.name].events = EventController.events;\n      }\n    }\n\n    await this.saveQueues(instanceName, data[this.name].events, data[this.name]?.enabled);\n\n    const payload: any = {\n      where: {\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n      update: {\n        enabled: data[this.name]?.enabled,\n        events: data[this.name].events,\n      },\n      create: {\n        enabled: data[this.name]?.enabled,\n        events: data[this.name].events,\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n    };\n\n    console.log('*** payload: ', payload);\n    return this.prisma[this.name].upsert(payload);\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('sqs')) {\n      return;\n    }\n\n    if (!this.status) {\n      return;\n    }\n\n    if (this.sqs) {\n      const serverConfig = configService.get<HttpServer>('SERVER');\n      const sqsConfig = configService.get<Sqs>('SQS');\n\n      const we = event.replace(/[.-]/gm, '_').toUpperCase();\n\n      let sqsEvents = [];\n      if (sqsConfig.GLOBAL_ENABLED) {\n        sqsEvents = Object.keys(sqsConfig.EVENTS).filter((e) => sqsConfig.EVENTS[e]);\n      } else {\n        const instanceSqs = await this.get(instanceName);\n        if (instanceSqs?.enabled && Array.isArray(instanceSqs?.events)) {\n          sqsEvents = instanceSqs?.events;\n        }\n      }\n\n      if (Array.isArray(sqsEvents) && sqsEvents.includes(we)) {\n        const prefixName = sqsConfig.GLOBAL_ENABLED ? sqsConfig.GLOBAL_PREFIX_NAME : instanceName;\n        const eventFormatted =\n          sqsConfig.GLOBAL_ENABLED && sqsConfig.GLOBAL_FORCE_SINGLE_QUEUE\n            ? 'singlequeue'\n            : `${event.replace('.', '_').toLowerCase()}`;\n        const queueName = `${prefixName}_${eventFormatted}.fifo`;\n        const sqsUrl = `https://sqs.${sqsConfig.REGION}.amazonaws.com/${sqsConfig.ACCOUNT_ID}/${queueName}`;\n\n        const message = {\n          ...(extra ?? {}),\n          event,\n          instance: instanceName,\n          dataType: 'json',\n          data,\n          server: serverConfig.NAME,\n          server_url: serverUrl,\n          date_time: dateTime,\n          sender,\n          apikey: apiKey,\n        };\n\n        const jsonStr = JSON.stringify(message);\n        const size = Buffer.byteLength(jsonStr, 'utf8');\n        if (size > sqsConfig.MAX_PAYLOAD_SIZE) {\n          if (!configService.get<S3>('S3').ENABLE) {\n            this.logger.error(\n              `${instanceName} - ${eventFormatted} - SQS ignored: payload (${size} bytes) exceeds SQS size limit (${sqsConfig.MAX_PAYLOAD_SIZE} bytes) and S3 storage is not enabled.`,\n            );\n            return;\n          }\n\n          const buffer = Buffer.from(jsonStr, 'utf8');\n          const fullName = `messages/${instanceName}_${eventFormatted}_${Date.now()}.json`;\n\n          await s3Service.uploadFile(fullName, buffer, size, {\n            'Content-Type': 'application/json',\n            'Cache-Control': 'no-store',\n          });\n\n          const fileUrl = await s3Service.getObjectUrl(fullName);\n\n          message.data = { fileUrl };\n          message.dataType = 's3';\n        }\n\n        const messageGroupId = sqsConfig.GLOBAL_ENABLED\n          ? `${serverConfig.NAME}-${eventFormatted}-${instanceName}`\n          : 'evolution';\n        const isGlobalEnabled = sqsConfig.GLOBAL_ENABLED;\n        const params = {\n          MessageBody: JSON.stringify(message),\n          MessageGroupId: messageGroupId,\n          QueueUrl: sqsUrl,\n          ...(!isGlobalEnabled && {\n            MessageDeduplicationId: `${instanceName}_${eventFormatted}_${Date.now()}`,\n          }),\n        };\n\n        this.sqs.sendMessage(params, (err) => {\n          if (err) {\n            this.logger.error({\n              local: `${origin}.sendData-SQS`,\n              params: JSON.stringify(message),\n              sqsUrl: sqsUrl,\n              message: err?.message,\n              hostName: err?.hostname,\n              code: err?.code,\n              stack: err?.stack,\n              name: err?.name,\n              url: queueName,\n              server_url: serverUrl,\n            });\n          } else if (configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS')) {\n            const logData = {\n              local: `${origin}.sendData-SQS`,\n              ...message,\n            };\n\n            this.logger.log(logData);\n          }\n        });\n      }\n    }\n  }\n\n  private async saveQueues(prefixName: string, events: string[], enable: boolean) {\n    if (enable) {\n      const sqsConfig = configService.get<Sqs>('SQS');\n      const eventsFinded = await this.listQueues(prefixName);\n      console.log('eventsFinded', eventsFinded);\n\n      for (const event of events) {\n        const normalizedEvent =\n          sqsConfig.GLOBAL_ENABLED && sqsConfig.GLOBAL_FORCE_SINGLE_QUEUE ? 'singlequeue' : event.toLowerCase();\n        if (eventsFinded.includes(normalizedEvent)) {\n          this.logger.info(`A queue para o evento \"${normalizedEvent}\" já existe. Ignorando criação.`);\n          continue;\n        }\n\n        const queueName = `${prefixName}_${normalizedEvent}.fifo`;\n        try {\n          const isGlobalEnabled = sqsConfig.GLOBAL_ENABLED;\n          const createCommand = new CreateQueueCommand({\n            QueueName: queueName,\n            Attributes: {\n              FifoQueue: 'true',\n              ...(isGlobalEnabled && { ContentBasedDeduplication: 'true' }),\n            },\n          });\n\n          const data = await this.sqs.send(createCommand);\n          this.logger.info(`Queue ${queueName} criada: ${data.QueueUrl}`);\n        } catch (err: any) {\n          this.logger.error(`Erro ao criar queue ${queueName}: ${err.message}`);\n        }\n\n        if (sqsConfig.GLOBAL_ENABLED && sqsConfig.GLOBAL_FORCE_SINGLE_QUEUE) {\n          break;\n        }\n      }\n    }\n  }\n\n  private async listQueues(prefixName: string) {\n    let existingQueues: string[] = [];\n\n    try {\n      const listCommand = new ListQueuesCommand({\n        QueueNamePrefix: `${prefixName}_`,\n      });\n\n      const listData = await this.sqs.send(listCommand);\n      if (listData.QueueUrls && listData.QueueUrls.length > 0) {\n        // Extrai o nome da fila a partir da URL\n        existingQueues = listData.QueueUrls.map((queueUrl) => {\n          const parts = queueUrl.split('/');\n          return parts[parts.length - 1];\n        });\n      }\n    } catch (error: any) {\n      this.logger.error(`Erro ao listar filas para ${prefixName}: ${error.message}`);\n      return;\n    }\n\n    // Mapeia os eventos já existentes nas filas: remove o prefixo e o sufixo \".fifo\"\n    return existingQueues\n      .map((queueName) => {\n        // Espera-se que o nome seja `${instanceName}_${event}.fifo`\n        if (queueName.startsWith(`${prefixName}_`) && queueName.endsWith('.fifo')) {\n          return queueName.substring(prefixName.length + 1, queueName.length - 5).toLowerCase();\n        }\n        return '';\n      })\n      .filter((event) => event !== '');\n  }\n\n  // Para uma futura feature de exclusão forçada das queues\n  private async removeQueuesByInstance(prefixName: string) {\n    try {\n      const listCommand = new ListQueuesCommand({\n        QueueNamePrefix: `${prefixName}_`,\n      });\n      const listData = await this.sqs.send(listCommand);\n\n      if (!listData.QueueUrls || listData.QueueUrls.length === 0) {\n        this.logger.info(`No queues found for ${prefixName}`);\n        return;\n      }\n\n      for (const queueUrl of listData.QueueUrls) {\n        try {\n          const deleteCommand = new DeleteQueueCommand({ QueueUrl: queueUrl });\n          await this.sqs.send(deleteCommand);\n          this.logger.info(`Queue ${queueUrl} deleted`);\n        } catch (err: any) {\n          this.logger.error(`Error deleting queue ${queueUrl}: ${err.message}`);\n        }\n      }\n    } catch (err: any) {\n      this.logger.error(`Error listing queues for ${prefixName}: ${err.message}`);\n    }\n  }\n}\n","import { EventDto } from '@api/integrations/event/event.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { wa } from '@api/types/wa.types';\nimport { configService, Log, Webhook } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\n// import { BadRequestException } from '@exceptions';\nimport axios, { AxiosInstance } from 'axios';\nimport * as jwt from 'jsonwebtoken';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\n\nexport class WebhookController extends EventController implements EventControllerInterface {\n  private readonly logger = new Logger('WebhookController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, true, 'webhook');\n  }\n\n  override async set(instanceName: string, data: EventDto): Promise<wa.LocalWebHook> {\n    // if (!/^(https?:\\/\\/)/.test(data.webhook.url)) {\n    //   throw new BadRequestException('Invalid \"url\" property');\n    // }\n\n    if (!data.webhook?.enabled) {\n      data.webhook.events = [];\n    } else {\n      if (0 === data.webhook.events.length) {\n        data.webhook.events = EventController.events;\n      }\n    }\n\n    return this.prisma.webhook.upsert({\n      where: {\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n      },\n      update: {\n        enabled: data.webhook?.enabled,\n        events: data.webhook?.events,\n        url: data.webhook?.url,\n        headers: data.webhook?.headers,\n        webhookBase64: data.webhook.base64,\n        webhookByEvents: data.webhook.byEvents,\n      },\n      create: {\n        enabled: data.webhook?.enabled,\n        events: data.webhook?.events,\n        instanceId: this.monitor.waInstances[instanceName].instanceId,\n        url: data.webhook?.url,\n        headers: data.webhook?.headers,\n        webhookBase64: data.webhook.base64,\n        webhookByEvents: data.webhook.byEvents,\n      },\n    });\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    local,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('webhook')) {\n      return;\n    }\n\n    const instance = (await this.get(instanceName)) as wa.LocalWebHook;\n\n    const webhookConfig = configService.get<Webhook>('WEBHOOK');\n    const webhookLocal = instance?.events;\n    const webhookHeaders = { ...((instance?.headers as Record<string, string>) || {}) };\n\n    if (webhookHeaders && 'jwt_key' in webhookHeaders) {\n      const jwtKey = webhookHeaders['jwt_key'];\n      const jwtToken = this.generateJwtToken(jwtKey);\n      webhookHeaders['Authorization'] = `Bearer ${jwtToken}`;\n\n      delete webhookHeaders['jwt_key'];\n    }\n\n    const we = event.replace(/[.-]/gm, '_').toUpperCase();\n    const transformedWe = we.replace(/_/gm, '-').toLowerCase();\n    const enabledLog = configService.get<Log>('LOG').LEVEL.includes('WEBHOOKS');\n    const regex = /^(https?:\\/\\/)/;\n\n    const webhookData = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      destination: instance?.url || `${webhookConfig.GLOBAL.URL}/${transformedWe}`,\n      date_time: dateTime,\n      sender,\n      server_url: serverUrl,\n      apikey: apiKey,\n    };\n\n    if (local && instance?.enabled) {\n      if (Array.isArray(webhookLocal) && webhookLocal.includes(we)) {\n        let baseURL: string;\n\n        if (instance?.webhookByEvents) {\n          baseURL = `${instance?.url}/${transformedWe}`;\n        } else {\n          baseURL = instance?.url;\n        }\n\n        if (enabledLog) {\n          const logData = {\n            local: `${origin}.sendData-Webhook`,\n            url: baseURL,\n            ...webhookData,\n          };\n\n          this.logger.log(logData);\n        }\n\n        try {\n          if (instance?.enabled && regex.test(instance.url)) {\n            const httpService = axios.create({\n              baseURL,\n              headers: webhookHeaders as Record<string, string> | undefined,\n              timeout: webhookConfig.REQUEST?.TIMEOUT_MS ?? 30000,\n            });\n\n            await this.retryWebhookRequest(httpService, webhookData, `${origin}.sendData-Webhook`, baseURL, serverUrl);\n          }\n        } catch (error) {\n          this.logger.error({\n            local: `${origin}.sendData-Webhook`,\n            message: `Todas as tentativas falharam: ${error?.message}`,\n            hostName: error?.hostname,\n            syscall: error?.syscall,\n            code: error?.code,\n            error: error?.errno,\n            stack: error?.stack,\n            name: error?.name,\n            url: baseURL,\n            server_url: serverUrl,\n          });\n        }\n      }\n    }\n\n    if (webhookConfig.GLOBAL?.ENABLED) {\n      if (webhookConfig.EVENTS[we]) {\n        let globalURL = webhookConfig.GLOBAL.URL;\n\n        if (webhookConfig.GLOBAL.WEBHOOK_BY_EVENTS) {\n          globalURL = `${globalURL}/${transformedWe}`;\n        }\n\n        if (enabledLog) {\n          const logData = {\n            local: `${origin}.sendData-Webhook-Global`,\n            url: globalURL,\n            ...webhookData,\n          };\n\n          this.logger.log(logData);\n        }\n\n        try {\n          if (regex.test(globalURL)) {\n            const httpService = axios.create({\n              baseURL: globalURL,\n              timeout: webhookConfig.REQUEST?.TIMEOUT_MS ?? 30000,\n            });\n\n            await this.retryWebhookRequest(\n              httpService,\n              webhookData,\n              `${origin}.sendData-Webhook-Global`,\n              globalURL,\n              serverUrl,\n            );\n          }\n        } catch (error) {\n          this.logger.error({\n            local: `${origin}.sendData-Webhook-Global`,\n            message: `Todas as tentativas falharam: ${error?.message}`,\n            hostName: error?.hostname,\n            syscall: error?.syscall,\n            code: error?.code,\n            error: error?.errno,\n            stack: error?.stack,\n            name: error?.name,\n            url: globalURL,\n            server_url: serverUrl,\n          });\n        }\n      }\n    }\n  }\n\n  private async retryWebhookRequest(\n    httpService: AxiosInstance,\n    webhookData: any,\n    origin: string,\n    baseURL: string,\n    serverUrl: string,\n    maxRetries?: number,\n    delaySeconds?: number,\n  ): Promise<void> {\n    const webhookConfig = configService.get<Webhook>('WEBHOOK');\n    const maxRetryAttempts = maxRetries ?? webhookConfig.RETRY?.MAX_ATTEMPTS ?? 10;\n    const initialDelay = delaySeconds ?? webhookConfig.RETRY?.INITIAL_DELAY_SECONDS ?? 5;\n    const useExponentialBackoff = webhookConfig.RETRY?.USE_EXPONENTIAL_BACKOFF ?? true;\n    const maxDelay = webhookConfig.RETRY?.MAX_DELAY_SECONDS ?? 300;\n    const jitterFactor = webhookConfig.RETRY?.JITTER_FACTOR ?? 0.2;\n    const nonRetryableStatusCodes = webhookConfig.RETRY?.NON_RETRYABLE_STATUS_CODES ?? [400, 401, 403, 404, 422];\n\n    let attempts = 0;\n\n    while (attempts < maxRetryAttempts) {\n      try {\n        await httpService.post('', webhookData);\n        if (attempts > 0) {\n          this.logger.log({\n            local: `${origin}`,\n            message: `Sucesso no envio após ${attempts + 1} tentativas`,\n            url: baseURL,\n          });\n        }\n        return;\n      } catch (error) {\n        attempts++;\n\n        const isTimeout = error.code === 'ECONNABORTED';\n\n        if (error?.response?.status && nonRetryableStatusCodes.includes(error.response.status)) {\n          this.logger.error({\n            local: `${origin}`,\n            message: `Erro não recuperável (${error.response.status}): ${error?.message}. Cancelando retentativas.`,\n            statusCode: error?.response?.status,\n            url: baseURL,\n            server_url: serverUrl,\n          });\n          throw error;\n        }\n\n        this.logger.error({\n          local: `${origin}`,\n          message: `Tentativa ${attempts}/${maxRetryAttempts} falhou: ${isTimeout ? 'Timeout da requisição' : error?.message}`,\n          hostName: error?.hostname,\n          syscall: error?.syscall,\n          code: error?.code,\n          isTimeout,\n          statusCode: error?.response?.status,\n          error: error?.errno,\n          stack: error?.stack,\n          name: error?.name,\n          url: baseURL,\n          server_url: serverUrl,\n        });\n\n        if (attempts === maxRetryAttempts) {\n          throw error;\n        }\n\n        let nextDelay = initialDelay;\n        if (useExponentialBackoff) {\n          nextDelay = Math.min(initialDelay * Math.pow(2, attempts - 1), maxDelay);\n\n          const jitter = nextDelay * jitterFactor * (Math.random() * 2 - 1);\n          nextDelay = Math.max(initialDelay, nextDelay + jitter);\n        }\n\n        this.logger.log({\n          local: `${origin}`,\n          message: `Aguardando ${nextDelay.toFixed(1)} segundos antes da próxima tentativa`,\n          url: baseURL,\n        });\n\n        await new Promise((resolve) => setTimeout(resolve, nextDelay * 1000));\n      }\n    }\n  }\n\n  private generateJwtToken(authToken: string): string {\n    try {\n      const payload = {\n        iat: Math.floor(Date.now() / 1000),\n        exp: Math.floor(Date.now() / 1000) + 600, // 10 min expiration\n        app: 'evolution',\n        action: 'webhook',\n      };\n\n      const token = jwt.sign(payload, authToken, { algorithm: 'HS256' });\n      return token;\n    } catch (error) {\n      this.logger.error({\n        local: 'WebhookController.generateJwtToken',\n        message: `JWT generation failed: ${error?.message}`,\n      });\n      throw error;\n    }\n  }\n}\n","import { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Auth, configService, Cors, Log, Websocket } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { Server } from 'http';\nimport { Server as SocketIO } from 'socket.io';\n\nimport { EmitData, EventController, EventControllerInterface } from '../event.controller';\n\nexport class WebsocketController extends EventController implements EventControllerInterface {\n  private io: SocketIO;\n  private corsConfig: Array<any>;\n  private readonly logger = new Logger('WebsocketController');\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    super(prismaRepository, waMonitor, configService.get<Websocket>('WEBSOCKET')?.ENABLED, 'websocket');\n\n    this.cors = configService.get<Cors>('CORS').ORIGIN;\n  }\n\n  public init(httpServer: Server): void {\n    if (!this.status) {\n      return;\n    }\n\n    this.socket = new SocketIO(httpServer, {\n      cors: { origin: this.cors },\n      allowRequest: async (req, callback) => {\n        try {\n          const url = new URL(req.url || '', 'http://localhost');\n          const params = new URLSearchParams(url.search);\n\n          const { remoteAddress } = req.socket;\n          const websocketConfig = configService.get<Websocket>('WEBSOCKET');\n          const allowedHosts = websocketConfig.ALLOWED_HOSTS || '127.0.0.1,::1,::ffff:127.0.0.1';\n          const allowAllHosts = allowedHosts.trim() === '*';\n          const isAllowedHost =\n            allowAllHosts ||\n            allowedHosts\n              .split(',')\n              .map((h) => h.trim())\n              .includes(remoteAddress);\n\n          if (params.has('EIO') && isAllowedHost) {\n            return callback(null, true);\n          }\n\n          const apiKey = params.get('apikey') || (req.headers.apikey as string);\n\n          if (!apiKey) {\n            this.logger.error('Connection rejected: apiKey not provided');\n            return callback('apiKey is required', false);\n          }\n\n          const instance = await this.prismaRepository.instance.findFirst({ where: { token: apiKey } });\n\n          if (!instance) {\n            const globalToken = configService.get<Auth>('AUTHENTICATION').API_KEY.KEY;\n            if (apiKey !== globalToken) {\n              this.logger.error('Connection rejected: invalid global token');\n              return callback('Invalid global token', false);\n            }\n          }\n\n          callback(null, true);\n        } catch (error) {\n          this.logger.error('Authentication error:');\n          this.logger.error(error);\n          callback('Authentication error', false);\n        }\n      },\n    });\n\n    this.socket.on('connection', (socket) => {\n      this.logger.info('User connected');\n\n      socket.on('disconnect', () => {\n        this.logger.info('User disconnected');\n      });\n\n      socket.on('sendNode', async (data) => {\n        try {\n          await this.waMonitor.waInstances[data.instanceId].baileysSendNode(data.stanza);\n          this.logger.info('Node sent successfully');\n        } catch (error) {\n          this.logger.error('Error sending node:');\n          this.logger.error(error);\n        }\n      });\n    });\n\n    this.logger.info('Socket.io initialized');\n  }\n\n  private set cors(cors: Array<any>) {\n    this.corsConfig = cors;\n  }\n\n  private get cors(): string | Array<any> {\n    return this.corsConfig?.includes('*') ? '*' : this.corsConfig;\n  }\n\n  private set socket(socket: SocketIO) {\n    this.io = socket;\n  }\n\n  public get socket(): SocketIO {\n    return this.io;\n  }\n\n  public async emit({\n    instanceName,\n    origin,\n    event,\n    data,\n    serverUrl,\n    dateTime,\n    sender,\n    apiKey,\n    integration,\n    extra,\n  }: EmitData): Promise<void> {\n    if (integration && !integration.includes('websocket')) {\n      return;\n    }\n\n    if (!this.status) {\n      return;\n    }\n\n    const configEv = event.replace(/[.-]/gm, '_').toUpperCase();\n    const logEnabled = configService.get<Log>('LOG').LEVEL.includes('WEBSOCKET');\n    const message = {\n      ...(extra ?? {}),\n      event,\n      instance: instanceName,\n      data,\n      server_url: serverUrl,\n      date_time: dateTime,\n      sender,\n      apikey: apiKey,\n    };\n\n    if (configService.get<Websocket>('WEBSOCKET')?.GLOBAL_EVENTS) {\n      this.socket.emit(event, message);\n\n      if (logEnabled) {\n        this.logger.log({ local: `${origin}.sendData-WebsocketGlobal`, ...message });\n      }\n    }\n\n    try {\n      const instance = await this.get(instanceName);\n\n      if (!instance?.enabled) {\n        return;\n      }\n\n      if (Array.isArray(instance?.events) && instance?.events.includes(configEv)) {\n        this.socket.of(`/${instanceName}`).emit(event, message);\n\n        if (logEnabled) {\n          this.logger.log({ local: `${origin}.sendData-Websocket`, ...message });\n        }\n      }\n    } catch (err) {\n      if (logEnabled) {\n        this.logger.log(err);\n      }\n    }\n  }\n}\n","import { KafkaController } from '@api/integrations/event/kafka/kafka.controller';\nimport { NatsController } from '@api/integrations/event/nats/nats.controller';\nimport { PusherController } from '@api/integrations/event/pusher/pusher.controller';\nimport { RabbitmqController } from '@api/integrations/event/rabbitmq/rabbitmq.controller';\nimport { SqsController } from '@api/integrations/event/sqs/sqs.controller';\nimport { WebhookController } from '@api/integrations/event/webhook/webhook.controller';\nimport { WebsocketController } from '@api/integrations/event/websocket/websocket.controller';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { WAMonitoringService } from '@api/services/monitor.service';\nimport { Server } from 'http';\n\nexport class EventManager {\n  private prismaRepository: PrismaRepository;\n  private waMonitor: WAMonitoringService;\n  private websocketController: WebsocketController;\n  private webhookController: WebhookController;\n  private rabbitmqController: RabbitmqController;\n  private natsController: NatsController;\n  private sqsController: SqsController;\n  private pusherController: PusherController;\n  private kafkaController: KafkaController;\n\n  constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {\n    this.prisma = prismaRepository;\n    this.monitor = waMonitor;\n\n    this.websocket = new WebsocketController(prismaRepository, waMonitor);\n    this.webhook = new WebhookController(prismaRepository, waMonitor);\n    this.rabbitmq = new RabbitmqController(prismaRepository, waMonitor);\n    this.nats = new NatsController(prismaRepository, waMonitor);\n    this.sqs = new SqsController(prismaRepository, waMonitor);\n    this.pusher = new PusherController(prismaRepository, waMonitor);\n    this.kafka = new KafkaController(prismaRepository, waMonitor);\n  }\n\n  public set prisma(prisma: PrismaRepository) {\n    this.prismaRepository = prisma;\n  }\n\n  public get prisma() {\n    return this.prismaRepository;\n  }\n\n  public set monitor(waMonitor: WAMonitoringService) {\n    this.waMonitor = waMonitor;\n  }\n\n  public get monitor() {\n    return this.waMonitor;\n  }\n\n  public set websocket(websocket: WebsocketController) {\n    this.websocketController = websocket;\n  }\n\n  public get websocket() {\n    return this.websocketController;\n  }\n\n  public set webhook(webhook: WebhookController) {\n    this.webhookController = webhook;\n  }\n\n  public get webhook() {\n    return this.webhookController;\n  }\n\n  public set rabbitmq(rabbitmq: RabbitmqController) {\n    this.rabbitmqController = rabbitmq;\n  }\n\n  public get rabbitmq() {\n    return this.rabbitmqController;\n  }\n\n  public set nats(nats: NatsController) {\n    this.natsController = nats;\n  }\n\n  public get nats() {\n    return this.natsController;\n  }\n\n  public set sqs(sqs: SqsController) {\n    this.sqsController = sqs;\n  }\n\n  public get sqs() {\n    return this.sqsController;\n  }\n\n  public set pusher(pusher: PusherController) {\n    this.pusherController = pusher;\n  }\n  public get pusher() {\n    return this.pusherController;\n  }\n\n  public set kafka(kafka: KafkaController) {\n    this.kafkaController = kafka;\n  }\n  public get kafka() {\n    return this.kafkaController;\n  }\n\n  public init(httpServer: Server): void {\n    this.websocket.init(httpServer);\n    this.rabbitmq.init();\n    this.nats.init();\n    this.sqs.init();\n    this.pusher.init();\n    this.kafka.init();\n  }\n\n  public async emit(eventData: {\n    instanceName: string;\n    origin: string;\n    event: string;\n    data: object;\n    serverUrl: string;\n    dateTime: string;\n    sender: string;\n    apiKey?: string;\n    local?: boolean;\n    integration?: string[];\n    extra?: Record<string, any>;\n  }): Promise<void> {\n    await this.websocket.emit(eventData);\n    await this.rabbitmq.emit(eventData);\n    await this.nats.emit(eventData);\n    await this.sqs.emit(eventData);\n    await this.webhook.emit(eventData);\n    await this.pusher.emit(eventData);\n    await this.kafka.emit(eventData);\n  }\n\n  public async setInstance(instanceName: string, data: any): Promise<any> {\n    if (data.websocket) {\n      await this.websocket.set(instanceName, {\n        websocket: {\n          enabled: true,\n          events: data.websocket?.events,\n        },\n      });\n    }\n\n    if (data.rabbitmq) {\n      await this.rabbitmq.set(instanceName, {\n        rabbitmq: {\n          enabled: true,\n          events: data.rabbitmq?.events,\n        },\n      });\n    }\n\n    if (data.nats) {\n      await this.nats.set(instanceName, {\n        nats: {\n          enabled: true,\n          events: data.nats?.events,\n        },\n      });\n    }\n\n    if (data.sqs) {\n      await this.sqs.set(instanceName, {\n        sqs: {\n          enabled: true,\n          events: data.sqs?.events,\n        },\n      });\n    }\n\n    if (data.webhook) {\n      await this.webhook.set(instanceName, {\n        webhook: {\n          enabled: true,\n          events: data.webhook?.events,\n          url: data.webhook?.url,\n          headers: data.webhook?.headers,\n          base64: data.webhook?.base64,\n          byEvents: data.webhook?.byEvents,\n        },\n      });\n    }\n\n    if (data.pusher) {\n      await this.pusher.set(instanceName, {\n        pusher: {\n          enabled: true,\n          events: data.pusher?.events,\n          appId: data.pusher?.appId,\n          key: data.pusher?.key,\n          secret: data.pusher?.secret,\n          cluster: data.pusher?.cluster,\n          useTLS: data.pusher?.useTLS,\n        },\n      });\n    }\n\n    if (data.kafka) {\n      await this.kafka.set(instanceName, {\n        kafka: {\n          enabled: true,\n          events: data.kafka?.events,\n        },\n      });\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { MediaDto } from '@api/integrations/storage/s3/dto/media.dto';\nimport { S3Service } from '@api/integrations/storage/s3/services/s3.service';\n\nexport class S3Controller {\n  constructor(private readonly s3Service: S3Service) {}\n\n  public async getMedia(instance: InstanceDto, data: MediaDto) {\n    return this.s3Service.getMedia(instance, data);\n  }\n\n  public async getMediaUrl(instance: InstanceDto, data: MediaDto) {\n    return this.s3Service.getMediaUrl(instance, data);\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { MediaDto } from '@api/integrations/storage/s3/dto/media.dto';\nimport { getObjectUrl } from '@api/integrations/storage/s3/libs/minio.server';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { Logger } from '@config/logger.config';\nimport { BadRequestException } from '@exceptions';\n\nexport class S3Service {\n  constructor(private readonly prismaRepository: PrismaRepository) {}\n\n  private readonly logger = new Logger('S3Service');\n\n  public async getMedia(instance: InstanceDto, query?: MediaDto) {\n    try {\n      const where: any = {\n        instanceId: instance.instanceId,\n        ...query,\n      };\n\n      const media = await this.prismaRepository.media.findMany({\n        where,\n        select: {\n          id: true,\n          fileName: true,\n          type: true,\n          mimetype: true,\n          createdAt: true,\n          Message: true,\n        },\n      });\n\n      if (!media || media.length === 0) {\n        throw 'Media not found';\n      }\n\n      return media;\n    } catch (error) {\n      throw new BadRequestException(error);\n    }\n  }\n\n  public async getMediaUrl(instance: InstanceDto, data: MediaDto) {\n    const media = (await this.getMedia(instance, { id: data.id }))[0];\n    const mediaUrl = await getObjectUrl(media.fileName, data.expiry);\n    return {\n      mediaUrl,\n      ...media,\n    };\n  }\n}\n","import { Auth, ConfigService, ProviderSession } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport axios from 'axios';\nimport { execFileSync } from 'child_process';\n\ntype ResponseSuccess = { status: number; data?: any };\ntype ResponseProvider = Promise<[ResponseSuccess?, Error?]>;\n\nexport class ProviderFiles {\n  constructor(private readonly configService: ConfigService) {\n    this.baseUrl = `http://${this.config.HOST}:${this.config.PORT}/session/${this.config.PREFIX}`;\n    this.globalApiToken = this.configService.get<Auth>('AUTHENTICATION').API_KEY.KEY;\n  }\n\n  private readonly logger = new Logger('ProviderFiles');\n\n  private baseUrl: string;\n  private globalApiToken: string;\n\n  private readonly config = Object.freeze(this.configService.get<ProviderSession>('PROVIDER'));\n\n  get isEnabled() {\n    return !!this.config?.ENABLED;\n  }\n\n  public async onModuleInit() {\n    if (this.config.ENABLED) {\n      const url = `http://${this.config.HOST}:${this.config.PORT}`;\n      try {\n        const response = await axios.options(url + '/ping');\n        if (response?.data != 'pong') {\n          throw new Error('Offline file provider.');\n        }\n\n        await axios.post(`${url}/session`, { group: this.config.PREFIX }, { headers: { apikey: this.globalApiToken } });\n      } catch (error) {\n        this.logger.error(['Failed to connect to the file server', error?.message, error?.stack]);\n        const pid = process.pid;\n        execFileSync('kill', ['-9', `${pid}`]);\n      }\n    }\n  }\n\n  public async onModuleDestroy() {\n    //\n  }\n\n  public async create(instance: string): ResponseProvider {\n    try {\n      const response = await axios.post(\n        `${this.baseUrl}`,\n        {\n          instance,\n        },\n        { headers: { apikey: this.globalApiToken } },\n      );\n      return [{ status: response.status, data: response?.data }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n\n  public async write(instance: string, key: string, data: any): ResponseProvider {\n    try {\n      const response = await axios.post(`${this.baseUrl}/${instance}/${key}`, data, {\n        headers: { apikey: this.globalApiToken },\n      });\n      return [{ status: response.status, data: response?.data }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n\n  public async read(instance: string, key: string): ResponseProvider {\n    try {\n      const response = await axios.get(`${this.baseUrl}/${instance}/${key}`, {\n        headers: { apikey: this.globalApiToken },\n      });\n      return [{ status: response.status, data: response?.data }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n\n  public async delete(instance: string, key: string): ResponseProvider {\n    try {\n      const response = await axios.delete(`${this.baseUrl}/${instance}/${key}`, {\n        headers: { apikey: this.globalApiToken },\n      });\n      return [{ status: response.status, data: response?.data }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n\n  public async allInstances(): ResponseProvider {\n    try {\n      const response = await axios.get(`${this.baseUrl}/list-instances`, { headers: { apikey: this.globalApiToken } });\n      return [{ status: response.status, data: response?.data as string[] }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n\n  public async removeSession(instance: string): ResponseProvider {\n    try {\n      const response = await axios.delete(`${this.baseUrl}/${instance}`, { headers: { apikey: this.globalApiToken } });\n      return [{ status: response.status, data: response?.data }];\n    } catch (error) {\n      return [\n        {\n          status: error?.response?.status,\n          data: error?.response?.data,\n        },\n        error,\n      ];\n    }\n  }\n}\n","import { join } from 'path';\n\nexport const ROOT_DIR = process.cwd();\nexport const INSTANCE_DIR = join(ROOT_DIR, 'instances');\nexport const SRC_DIR = join(ROOT_DIR, 'src');\nexport const AUTH_DIR = join(ROOT_DIR, 'store', 'auth');\nexport const STORE_DIR = join(ROOT_DIR, 'store');\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ProviderFiles } from '@api/provider/sessions';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { channelController } from '@api/server.module';\nimport { Events, Integration } from '@api/types/wa.types';\nimport { CacheConf, Chatwoot, ConfigService, Database, DelInstance, ProviderSession } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { INSTANCE_DIR, STORE_DIR } from '@config/path.config';\nimport { NotFoundException } from '@exceptions';\nimport { execFileSync } from 'child_process';\nimport EventEmitter2 from 'eventemitter2';\nimport { rmSync } from 'fs';\nimport { join } from 'path';\n\nimport { CacheService } from './cache.service';\n\nexport class WAMonitoringService {\n  constructor(\n    private readonly eventEmitter: EventEmitter2,\n    private readonly configService: ConfigService,\n    private readonly prismaRepository: PrismaRepository,\n    private readonly providerFiles: ProviderFiles,\n    private readonly cache: CacheService,\n    private readonly chatwootCache: CacheService,\n    private readonly baileysCache: CacheService,\n  ) {\n    this.removeInstance();\n    this.noConnection();\n\n    Object.assign(this.db, configService.get<Database>('DATABASE'));\n    Object.assign(this.redis, configService.get<CacheConf>('CACHE'));\n\n    (this as any).providerSession = Object.freeze(configService.get<ProviderSession>('PROVIDER'));\n  }\n\n  private readonly db: Partial<Database> = {};\n  private readonly redis: Partial<CacheConf> = {};\n\n  private readonly logger = new Logger('WAMonitoringService');\n  public readonly waInstances: Record<string, any> = {};\n  private readonly delInstanceTimeouts: Record<string, NodeJS.Timeout> = {};\n\n  private readonly providerSession: ProviderSession;\n\n  public delInstanceTime(instance: string) {\n    const time = this.configService.get<DelInstance>('DEL_INSTANCE');\n    if (typeof time === 'number' && time > 0) {\n      // Clear previous timeout if exists\n      if (this.delInstanceTimeouts[instance]) {\n        clearTimeout(this.delInstanceTimeouts[instance]);\n      }\n\n      // Set new timeout and store reference\n      this.delInstanceTimeouts[instance] = setTimeout(\n        async () => {\n          try {\n            if (this.waInstances[instance]?.connectionStatus?.state !== 'open') {\n              if (this.waInstances[instance]?.connectionStatus?.state === 'connecting') {\n                if ((await this.waInstances[instance].integration) === Integration.WHATSAPP_BAILEYS) {\n                  await this.waInstances[instance]?.client?.logout('Log out instance: ' + instance);\n                  this.waInstances[instance]?.client?.ws?.close();\n                  this.waInstances[instance]?.client?.end(undefined);\n                }\n                this.eventEmitter.emit('remove.instance', instance, 'inner');\n              } else {\n                this.eventEmitter.emit('remove.instance', instance, 'inner');\n              }\n            }\n          } finally {\n            // Clean up timeout reference\n            delete this.delInstanceTimeouts[instance];\n          }\n        },\n        1000 * 60 * time,\n      );\n    }\n  }\n\n  public clearDelInstanceTime(instance: string) {\n    if (this.delInstanceTimeouts[instance]) {\n      clearTimeout(this.delInstanceTimeouts[instance]);\n      delete this.delInstanceTimeouts[instance];\n    }\n  }\n\n  public async instanceInfo(instanceNames?: string[]): Promise<any> {\n    if (instanceNames && instanceNames.length > 0) {\n      const inexistentInstances = instanceNames ? instanceNames.filter((instance) => !this.waInstances[instance]) : [];\n\n      if (inexistentInstances.length > 0) {\n        throw new NotFoundException(\n          `Instance${inexistentInstances.length > 1 ? 's' : ''} \"${inexistentInstances.join(', ')}\" not found`,\n        );\n      }\n    }\n\n    const clientName = this.configService.get<Database>('DATABASE').CONNECTION.CLIENT_NAME;\n\n    const where =\n      instanceNames && instanceNames.length > 0\n        ? {\n            name: {\n              in: instanceNames,\n            },\n            clientName,\n          }\n        : { clientName };\n\n    const instances = await this.prismaRepository.instance.findMany({\n      where,\n      include: {\n        Chatwoot: true,\n        Proxy: true,\n        Rabbitmq: true,\n        Nats: true,\n        Sqs: true,\n        Websocket: true,\n        Setting: true,\n        _count: {\n          select: {\n            Message: true,\n            Contact: true,\n            Chat: true,\n          },\n        },\n      },\n    });\n\n    return instances;\n  }\n\n  public async instanceInfoById(instanceId?: string, number?: string) {\n    let instanceName: string;\n    if (instanceId) {\n      instanceName = await this.prismaRepository.instance.findFirst({ where: { id: instanceId } }).then((r) => r?.name);\n      if (!instanceName) {\n        throw new NotFoundException(`Instance \"${instanceId}\" not found`);\n      }\n    } else if (number) {\n      instanceName = await this.prismaRepository.instance.findFirst({ where: { number } }).then((r) => r?.name);\n      if (!instanceName) {\n        throw new NotFoundException(`Instance \"${number}\" not found`);\n      }\n    }\n\n    if (!instanceName) {\n      throw new NotFoundException(`Instance \"${instanceId}\" not found`);\n    }\n\n    if (instanceName && !this.waInstances[instanceName]) {\n      throw new NotFoundException(`Instance \"${instanceName}\" not found`);\n    }\n\n    const instanceNames = instanceName ? [instanceName] : null;\n\n    return this.instanceInfo(instanceNames);\n  }\n\n  public async cleaningUp(instanceName: string) {\n    let instanceDbId: string;\n    if (this.db.SAVE_DATA.INSTANCE) {\n      const findInstance = await this.prismaRepository.instance.findFirst({\n        where: { name: instanceName },\n      });\n\n      if (findInstance) {\n        const instance = await this.prismaRepository.instance.update({\n          where: { name: instanceName },\n          data: { connectionStatus: 'close' },\n        });\n\n        rmSync(join(INSTANCE_DIR, instance.id), { recursive: true, force: true });\n\n        instanceDbId = instance.id;\n        await this.prismaRepository.session.deleteMany({ where: { sessionId: instance.id } });\n      }\n    }\n\n    if (this.redis.REDIS.ENABLED && this.redis.REDIS.SAVE_INSTANCES) {\n      await this.cache.delete(instanceName);\n      if (instanceDbId) {\n        await this.cache.delete(instanceDbId);\n      }\n    }\n\n    if (this.providerSession?.ENABLED) {\n      await this.providerFiles.removeSession(instanceName);\n    }\n  }\n\n  public async cleaningStoreData(instanceName: string) {\n    if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n      const instancePath = join(STORE_DIR, 'chatwoot', instanceName);\n      execFileSync('rm', ['-rf', instancePath]);\n    }\n\n    const instance = await this.prismaRepository.instance.findFirst({\n      where: { name: instanceName },\n    });\n\n    if (!instance) return;\n\n    rmSync(join(INSTANCE_DIR, instance.id), { recursive: true, force: true });\n\n    await this.prismaRepository.session.deleteMany({ where: { sessionId: instance.id } });\n\n    await this.prismaRepository.chat.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.contact.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.messageUpdate.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.message.deleteMany({ where: { instanceId: instance.id } });\n\n    await this.prismaRepository.webhook.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.chatwoot.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.proxy.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.rabbitmq.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.nats.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.sqs.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.integrationSession.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.typebot.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.websocket.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.setting.deleteMany({ where: { instanceId: instance.id } });\n    await this.prismaRepository.label.deleteMany({ where: { instanceId: instance.id } });\n\n    await this.prismaRepository.instance.delete({ where: { name: instanceName } });\n  }\n\n  public async loadInstance() {\n    try {\n      if (this.providerSession?.ENABLED) {\n        await this.loadInstancesFromProvider();\n      } else if (this.db.SAVE_DATA.INSTANCE) {\n        await this.loadInstancesFromDatabasePostgres();\n      } else if (this.redis.REDIS.ENABLED && this.redis.REDIS.SAVE_INSTANCES) {\n        await this.loadInstancesFromRedis();\n      }\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  public async saveInstance(data: any) {\n    try {\n      const clientName = await this.configService.get<Database>('DATABASE').CONNECTION.CLIENT_NAME;\n      await this.prismaRepository.instance.create({\n        data: {\n          id: data.instanceId,\n          name: data.instanceName,\n          ownerJid: data.ownerJid,\n          profileName: data.profileName,\n          profilePicUrl: data.profilePicUrl,\n          connectionStatus:\n            data.integration && data.integration === Integration.WHATSAPP_BAILEYS ? 'close' : (data.status ?? 'open'),\n          number: data.number,\n          integration: data.integration || Integration.WHATSAPP_BAILEYS,\n          token: data.hash,\n          clientName: clientName,\n          businessId: data.businessId,\n        },\n      });\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  public deleteInstance(instanceName: string) {\n    try {\n      this.eventEmitter.emit('remove.instance', instanceName, 'inner');\n    } catch (error) {\n      this.logger.error(error);\n    }\n  }\n\n  private async setInstance(instanceData: InstanceDto) {\n    const instance = channelController.init(instanceData, {\n      configService: this.configService,\n      eventEmitter: this.eventEmitter,\n      prismaRepository: this.prismaRepository,\n      cache: this.cache,\n      chatwootCache: this.chatwootCache,\n      baileysCache: this.baileysCache,\n      providerFiles: this.providerFiles,\n    });\n\n    if (!instance) return;\n\n    instance.setInstance({\n      instanceId: instanceData.instanceId,\n      instanceName: instanceData.instanceName,\n      integration: instanceData.integration,\n      token: instanceData.token,\n      number: instanceData.number,\n      businessId: instanceData.businessId,\n      ownerJid: instanceData.ownerJid,\n    });\n\n    if (instanceData.connectionStatus === 'open' || instanceData.connectionStatus === 'connecting') {\n      this.logger.info(\n        `Auto-connecting instance \"${instanceData.instanceName}\" (status: ${instanceData.connectionStatus})`,\n      );\n      await instance.connectToWhatsapp();\n    } else {\n      this.logger.info(\n        `Skipping auto-connect for instance \"${instanceData.instanceName}\" (status: ${instanceData.connectionStatus || 'close'})`,\n      );\n    }\n\n    this.waInstances[instanceData.instanceName] = instance;\n  }\n\n  private async loadInstancesFromRedis() {\n    const keys = await this.cache.keys();\n\n    if (keys?.length > 0) {\n      await Promise.all(\n        keys.map(async (k) => {\n          const instanceData = await this.prismaRepository.instance.findUnique({\n            where: { id: k.split(':')[1] },\n          });\n\n          if (!instanceData) {\n            return;\n          }\n\n          const instance = {\n            instanceId: k.split(':')[1],\n            instanceName: k.split(':')[2],\n            integration: instanceData.integration,\n            token: instanceData.token,\n            number: instanceData.number,\n            businessId: instanceData.businessId,\n            connectionStatus: instanceData.connectionStatus as any, // Pass connection status\n          };\n\n          this.setInstance(instance);\n        }),\n      );\n    }\n  }\n\n  private async loadInstancesFromDatabasePostgres() {\n    const clientName = await this.configService.get<Database>('DATABASE').CONNECTION.CLIENT_NAME;\n\n    const instances = await this.prismaRepository.instance.findMany({\n      where: { clientName: clientName },\n    });\n\n    if (instances.length === 0) {\n      return;\n    }\n\n    await Promise.all(\n      instances.map(async (instance) => {\n        this.setInstance({\n          instanceId: instance.id,\n          instanceName: instance.name,\n          integration: instance.integration,\n          token: instance.token,\n          number: instance.number,\n          businessId: instance.businessId,\n          ownerJid: instance.ownerJid,\n          connectionStatus: instance.connectionStatus as any, // Pass connection status\n        });\n      }),\n    );\n  }\n\n  private async loadInstancesFromProvider() {\n    const [instances] = await this.providerFiles.allInstances();\n\n    if (!instances?.data) {\n      return;\n    }\n\n    await Promise.all(\n      instances?.data?.map(async (instanceId: string) => {\n        const instance = await this.prismaRepository.instance.findUnique({\n          where: { id: instanceId },\n        });\n\n        this.setInstance({\n          instanceId: instance.id,\n          instanceName: instance.name,\n          integration: instance.integration,\n          token: instance.token,\n          businessId: instance.businessId,\n          connectionStatus: instance.connectionStatus as any, // Pass connection status\n        });\n      }),\n    );\n  }\n\n  private removeInstance() {\n    this.eventEmitter.on('remove.instance', async (instanceName: string) => {\n      try {\n        await this.waInstances[instanceName]?.sendDataWebhook(Events.REMOVE_INSTANCE, null);\n\n        this.clearDelInstanceTime(instanceName);\n\n        this.cleaningUp(instanceName);\n        this.cleaningStoreData(instanceName);\n      } finally {\n        this.logger.warn(`Instance \"${instanceName}\" - REMOVED`);\n      }\n\n      try {\n        delete this.waInstances[instanceName];\n      } catch (error) {\n        this.logger.error(error);\n      }\n    });\n    this.eventEmitter.on('logout.instance', async (instanceName: string) => {\n      try {\n        await this.waInstances[instanceName]?.sendDataWebhook(Events.LOGOUT_INSTANCE, null);\n\n        this.clearDelInstanceTime(instanceName);\n\n        if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n          this.waInstances[instanceName]?.clearCacheChatwoot();\n        }\n\n        this.cleaningUp(instanceName);\n      } finally {\n        this.logger.warn(`Instance \"${instanceName}\" - LOGOUT`);\n      }\n    });\n  }\n\n  private noConnection() {\n    this.eventEmitter.on('no.connection', async (instanceName) => {\n      try {\n        await this.waInstances[instanceName]?.client?.logout('Log out instance: ' + instanceName);\n\n        this.waInstances[instanceName]?.client?.ws?.close();\n\n        this.waInstances[instanceName].instance.qrcode = { count: 0 };\n        this.waInstances[instanceName].stateConnection.state = 'close';\n      } catch (error) {\n        this.logger.error({\n          localError: 'noConnection',\n          warn: 'Error deleting instance from memory.',\n          error,\n        });\n      } finally {\n        this.logger.warn(`Instance \"${instanceName}\" - NOT CONNECTION`);\n      }\n    });\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { ProxyDto } from '@api/dto/proxy.dto';\nimport { Logger } from '@config/logger.config';\nimport { Proxy } from '@prisma/client';\n\nimport { WAMonitoringService } from './monitor.service';\n\nexport class ProxyService {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  private readonly logger = new Logger('ProxyService');\n\n  public create(instance: InstanceDto, data: ProxyDto) {\n    this.waMonitor.waInstances[instance.instanceName].setProxy(data);\n\n    return { proxy: { ...instance, proxy: data } };\n  }\n\n  public async find(instance: InstanceDto): Promise<Proxy> {\n    try {\n      const result = await this.waMonitor.waInstances[instance.instanceName].findProxy();\n\n      if (Object.keys(result).length === 0) {\n        throw new Error('Proxy not found');\n      }\n\n      return result;\n    } catch {\n      return null;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { SettingsDto } from '@api/dto/settings.dto';\nimport { Logger } from '@config/logger.config';\n\nimport { WAMonitoringService } from './monitor.service';\n\nexport class SettingsService {\n  constructor(private readonly waMonitor: WAMonitoringService) {}\n\n  private readonly logger = new Logger('SettingsService');\n\n  public async create(instance: InstanceDto, data: SettingsDto) {\n    await this.waMonitor.waInstances[instance.instanceName].setSettings(data);\n\n    return { settings: { ...instance, settings: data } };\n  }\n\n  public async find(instance: InstanceDto): Promise<SettingsDto> {\n    try {\n      const result = await this.waMonitor.waInstances[instance.instanceName].findSettings();\n\n      if (Object.keys(result).length === 0) {\n        throw new Error('Settings not found');\n      }\n\n      return result;\n    } catch {\n      return null;\n    }\n  }\n}\n","import { InstanceDto } from '@api/dto/instance.dto';\nimport { TemplateDto } from '@api/dto/template.dto';\nimport { PrismaRepository } from '@api/repository/repository.service';\nimport { ConfigService, WaBusiness } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport axios from 'axios';\n\nimport { WAMonitoringService } from './monitor.service';\n\nexport class TemplateService {\n  constructor(\n    private readonly waMonitor: WAMonitoringService,\n    public readonly prismaRepository: PrismaRepository,\n    private readonly configService: ConfigService,\n  ) {}\n\n  private readonly logger = new Logger('TemplateService');\n\n  private businessId: string;\n  private token: string;\n\n  public async find(instance: InstanceDto) {\n    const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance;\n\n    if (!getInstance) {\n      throw new Error('Instance not found');\n    }\n\n    this.businessId = getInstance.businessId;\n    this.token = getInstance.token;\n\n    const response = await this.requestTemplate({}, 'GET');\n\n    if (!response) {\n      throw new Error('Error to create template');\n    }\n\n    return response.data;\n  }\n\n  public async create(instance: InstanceDto, data: TemplateDto) {\n    try {\n      const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance;\n\n      if (!getInstance) {\n        throw new Error('Instance not found');\n      }\n\n      this.businessId = getInstance.businessId;\n      this.token = getInstance.token;\n\n      const postData = {\n        name: data.name,\n        category: data.category,\n        allow_category_change: data.allowCategoryChange,\n        language: data.language,\n        components: data.components,\n      };\n\n      const response = await this.requestTemplate(postData, 'POST');\n\n      if (!response || response.error) {\n        // If there's an error from WhatsApp API, throw it with the real error data\n        if (response && response.error) {\n          // Create an error object that includes the template field for Meta errors\n          const metaError = new Error(response.error.message || 'WhatsApp API Error');\n          (metaError as any).template = response.error;\n          throw metaError;\n        }\n        throw new Error('Error to create template');\n      }\n\n      const template = await this.prismaRepository.template.create({\n        data: {\n          templateId: response.id,\n          name: data.name,\n          template: response,\n          webhookUrl: data.webhookUrl,\n          instanceId: getInstance.id,\n        },\n      });\n\n      return template;\n    } catch (error) {\n      this.logger.error('Error in create template: ' + error);\n      // Propagate the real error instead of \"engolindo\" it\n      throw error;\n    }\n  }\n\n  public async edit(\n    instance: InstanceDto,\n    data: { templateId: string; category?: string; components?: any; allowCategoryChange?: boolean; ttl?: number },\n  ) {\n    const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance;\n    if (!getInstance) {\n      throw new Error('Instance not found');\n    }\n\n    this.businessId = getInstance.businessId;\n    this.token = getInstance.token;\n\n    const payload: Record<string, unknown> = {};\n    if (typeof data.category === 'string') payload.category = data.category;\n    if (typeof data.allowCategoryChange === 'boolean') payload.allow_category_change = data.allowCategoryChange;\n    if (typeof data.ttl === 'number') payload.time_to_live = data.ttl;\n    if (data.components) payload.components = data.components;\n\n    const response = await this.requestEditTemplate(data.templateId, payload);\n\n    if (!response || response.error) {\n      if (response && response.error) {\n        const metaError = new Error(response.error.message || 'WhatsApp API Error');\n        (metaError as any).template = response.error;\n        throw metaError;\n      }\n      throw new Error('Error to edit template');\n    }\n\n    return response;\n  }\n\n  public async delete(instance: InstanceDto, data: { name: string; hsmId?: string }) {\n    const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance;\n    if (!getInstance) {\n      throw new Error('Instance not found');\n    }\n\n    this.businessId = getInstance.businessId;\n    this.token = getInstance.token;\n\n    const response = await this.requestDeleteTemplate({ name: data.name, hsm_id: data.hsmId });\n\n    if (!response || response.error) {\n      if (response && response.error) {\n        const metaError = new Error(response.error.message || 'WhatsApp API Error');\n        (metaError as any).template = response.error;\n        throw metaError;\n      }\n      throw new Error('Error to delete template');\n    }\n\n    try {\n      // Best-effort local cleanup of stored template metadata\n      await this.prismaRepository.template.deleteMany({\n        where: {\n          OR: [\n            { name: data.name, instanceId: getInstance.id },\n            data.hsmId ? { templateId: data.hsmId, instanceId: getInstance.id } : undefined,\n          ].filter(Boolean) as any,\n        },\n      });\n    } catch (err) {\n      this.logger.warn(\n        `Failed to cleanup local template records after delete: ${(err as Error)?.message || String(err)}`,\n      );\n    }\n\n    return response;\n  }\n\n  private async requestTemplate(data: any, method: string) {\n    try {\n      let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n      const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n      urlServer = `${urlServer}/${version}/${this.businessId}/message_templates`;\n      const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` };\n\n      if (method === 'GET') {\n        const result = await axios.get(urlServer, { headers });\n        return result.data;\n      } else if (method === 'POST') {\n        const result = await axios.post(urlServer, data, { headers });\n        return result.data;\n      }\n    } catch (e) {\n      this.logger.error(\n        'WhatsApp API request error: ' + (e.response?.data ? JSON.stringify(e.response?.data) : e.message),\n      );\n\n      // Return the complete error response from WhatsApp API\n      if (e.response?.data) {\n        return e.response.data;\n      }\n\n      // If no response data, throw connection error\n      throw new Error(`Connection error: ${e.message}`);\n    }\n  }\n\n  private async requestEditTemplate(templateId: string, data: any) {\n    try {\n      let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n      const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n      urlServer = `${urlServer}/${version}/${templateId}`;\n      const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` };\n      const result = await axios.post(urlServer, data, { headers });\n      return result.data;\n    } catch (e) {\n      this.logger.error(\n        'WhatsApp API request error: ' + (e.response?.data ? JSON.stringify(e.response?.data) : e.message),\n      );\n      if (e.response?.data) return e.response.data;\n      throw new Error(`Connection error: ${e.message}`);\n    }\n  }\n\n  private async requestDeleteTemplate(params: { name: string; hsm_id?: string }) {\n    try {\n      let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL;\n      const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION;\n      urlServer = `${urlServer}/${version}/${this.businessId}/message_templates`;\n      const headers = { Authorization: `Bearer ${this.token}` };\n      const result = await axios.delete(urlServer, { headers, params });\n      return result.data;\n    } catch (e) {\n      this.logger.error(\n        'WhatsApp API request error: ' + (e.response?.data ? JSON.stringify(e.response?.data) : e.message),\n      );\n      if (e.response?.data) return e.response.data;\n      throw new Error(`Connection error: ${e.message}`);\n    }\n  }\n}\n","import { CacheEngine } from '@cache/cacheengine';\nimport { Chatwoot, configService, ProviderSession } from '@config/env.config';\nimport { eventEmitter } from '@config/event.config';\nimport { Logger } from '@config/logger.config';\n\nimport { BusinessController } from './controllers/business.controller';\nimport { CallController } from './controllers/call.controller';\nimport { ChatController } from './controllers/chat.controller';\nimport { GroupController } from './controllers/group.controller';\nimport { InstanceController } from './controllers/instance.controller';\nimport { LabelController } from './controllers/label.controller';\nimport { ProxyController } from './controllers/proxy.controller';\nimport { SendMessageController } from './controllers/sendMessage.controller';\nimport { SettingsController } from './controllers/settings.controller';\nimport { TemplateController } from './controllers/template.controller';\nimport { ChannelController } from './integrations/channel/channel.controller';\nimport { EvolutionController } from './integrations/channel/evolution/evolution.controller';\nimport { MetaController } from './integrations/channel/meta/meta.controller';\nimport { BaileysController } from './integrations/channel/whatsapp/baileys.controller';\nimport { ChatbotController } from './integrations/chatbot/chatbot.controller';\nimport { ChatwootController } from './integrations/chatbot/chatwoot/controllers/chatwoot.controller';\nimport { ChatwootService } from './integrations/chatbot/chatwoot/services/chatwoot.service';\nimport { DifyController } from './integrations/chatbot/dify/controllers/dify.controller';\nimport { DifyService } from './integrations/chatbot/dify/services/dify.service';\nimport { EvoaiController } from './integrations/chatbot/evoai/controllers/evoai.controller';\nimport { EvoaiService } from './integrations/chatbot/evoai/services/evoai.service';\nimport { EvolutionBotController } from './integrations/chatbot/evolutionBot/controllers/evolutionBot.controller';\nimport { EvolutionBotService } from './integrations/chatbot/evolutionBot/services/evolutionBot.service';\nimport { FlowiseController } from './integrations/chatbot/flowise/controllers/flowise.controller';\nimport { FlowiseService } from './integrations/chatbot/flowise/services/flowise.service';\nimport { N8nController } from './integrations/chatbot/n8n/controllers/n8n.controller';\nimport { N8nService } from './integrations/chatbot/n8n/services/n8n.service';\nimport { OpenaiController } from './integrations/chatbot/openai/controllers/openai.controller';\nimport { OpenaiService } from './integrations/chatbot/openai/services/openai.service';\nimport { TypebotController } from './integrations/chatbot/typebot/controllers/typebot.controller';\nimport { TypebotService } from './integrations/chatbot/typebot/services/typebot.service';\nimport { EventManager } from './integrations/event/event.manager';\nimport { S3Controller } from './integrations/storage/s3/controllers/s3.controller';\nimport { S3Service } from './integrations/storage/s3/services/s3.service';\nimport { ProviderFiles } from './provider/sessions';\nimport { PrismaRepository } from './repository/repository.service';\nimport { CacheService } from './services/cache.service';\nimport { WAMonitoringService } from './services/monitor.service';\nimport { ProxyService } from './services/proxy.service';\nimport { SettingsService } from './services/settings.service';\nimport { TemplateService } from './services/template.service';\n\nconst logger = new Logger('WA MODULE');\n\nlet chatwootCache: CacheService = null;\nif (configService.get<Chatwoot>('CHATWOOT').ENABLED) {\n  chatwootCache = new CacheService(new CacheEngine(configService, ChatwootService.name).getEngine());\n}\n\nexport const cache = new CacheService(new CacheEngine(configService, 'instance').getEngine());\nconst baileysCache = new CacheService(new CacheEngine(configService, 'baileys').getEngine());\n\nlet providerFiles: ProviderFiles = null;\nif (configService.get<ProviderSession>('PROVIDER').ENABLED) {\n  providerFiles = new ProviderFiles(configService);\n}\n\nexport const prismaRepository = new PrismaRepository(configService);\n\nexport const waMonitor = new WAMonitoringService(\n  eventEmitter,\n  configService,\n  prismaRepository,\n  providerFiles,\n  cache,\n  chatwootCache,\n  baileysCache,\n);\n\nconst s3Service = new S3Service(prismaRepository);\nexport const s3Controller = new S3Controller(s3Service);\n\nconst templateService = new TemplateService(waMonitor, prismaRepository, configService);\nexport const templateController = new TemplateController(templateService);\n\nconst proxyService = new ProxyService(waMonitor);\nexport const proxyController = new ProxyController(proxyService, waMonitor);\n\nconst chatwootService = new ChatwootService(waMonitor, configService, prismaRepository, chatwootCache);\nexport const chatwootController = new ChatwootController(chatwootService, configService);\n\nconst settingsService = new SettingsService(waMonitor);\nexport const settingsController = new SettingsController(settingsService);\n\nexport const instanceController = new InstanceController(\n  waMonitor,\n  configService,\n  prismaRepository,\n  eventEmitter,\n  chatwootService,\n  settingsService,\n  proxyController,\n  cache,\n  chatwootCache,\n  baileysCache,\n  providerFiles,\n);\nexport const sendMessageController = new SendMessageController(waMonitor);\nexport const callController = new CallController(waMonitor);\nexport const chatController = new ChatController(waMonitor);\nexport const businessController = new BusinessController(waMonitor);\nexport const groupController = new GroupController(waMonitor);\nexport const labelController = new LabelController(waMonitor);\n\nexport const eventManager = new EventManager(prismaRepository, waMonitor);\nexport const chatbotController = new ChatbotController(prismaRepository, waMonitor);\nexport const channelController = new ChannelController(prismaRepository, waMonitor);\n\n// channels\nexport const evolutionController = new EvolutionController(prismaRepository, waMonitor);\nexport const metaController = new MetaController(prismaRepository, waMonitor);\nexport const baileysController = new BaileysController(waMonitor);\n\nconst openaiService = new OpenaiService(waMonitor, prismaRepository, configService);\nexport const openaiController = new OpenaiController(openaiService, prismaRepository, waMonitor);\n\n// chatbots\nconst typebotService = new TypebotService(waMonitor, configService, prismaRepository, openaiService);\nexport const typebotController = new TypebotController(typebotService, prismaRepository, waMonitor);\n\nconst difyService = new DifyService(waMonitor, prismaRepository, configService, openaiService);\nexport const difyController = new DifyController(difyService, prismaRepository, waMonitor);\n\nconst evolutionBotService = new EvolutionBotService(waMonitor, prismaRepository, configService, openaiService);\nexport const evolutionBotController = new EvolutionBotController(evolutionBotService, prismaRepository, waMonitor);\n\nconst flowiseService = new FlowiseService(waMonitor, prismaRepository, configService, openaiService);\nexport const flowiseController = new FlowiseController(flowiseService, prismaRepository, waMonitor);\n\nconst n8nService = new N8nService(waMonitor, prismaRepository, configService, openaiService);\nexport const n8nController = new N8nController(n8nService, prismaRepository, waMonitor);\n\nconst evoaiService = new EvoaiService(waMonitor, prismaRepository, configService, openaiService);\nexport const evoaiController = new EvoaiController(evoaiService, prismaRepository, waMonitor);\n\nlogger.info('Module - ON');\n","import { prismaRepository } from '@api/server.module';\nimport { CacheService } from '@api/services/cache.service';\nimport { CacheConf, configService } from '@config/env.config';\nimport { Logger } from '@config/logger.config';\nimport { INSTANCE_DIR } from '@config/path.config';\nimport { AuthenticationState, BufferJSON, initAuthCreds, WAProto as proto } from 'baileys';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nconst fixFileName = (file: string): string | undefined => {\n  if (!file) {\n    return undefined;\n  }\n  const replacedSlash = file.replace(/\\//g, '__');\n  const replacedColon = replacedSlash.replace(/:/g, '-');\n  return replacedColon;\n};\n\nexport async function keyExists(sessionId: string): Promise<any> {\n  try {\n    const key = await prismaRepository.session.findUnique({ where: { sessionId: sessionId } });\n    return !!key;\n  } catch {\n    return false;\n  }\n}\n\nexport async function saveKey(sessionId: string, keyJson: any): Promise<any> {\n  const exists = await keyExists(sessionId);\n  try {\n    if (!exists)\n      return await prismaRepository.session.create({\n        data: {\n          sessionId: sessionId,\n          creds: JSON.stringify(keyJson),\n        },\n      });\n    await prismaRepository.session.update({\n      where: { sessionId: sessionId },\n      data: { creds: JSON.stringify(keyJson) },\n    });\n  } catch {\n    return null;\n  }\n}\n\nexport async function getAuthKey(sessionId: string): Promise<any> {\n  try {\n    const register = await keyExists(sessionId);\n    if (!register) return null;\n    const auth = await prismaRepository.session.findUnique({ where: { sessionId: sessionId } });\n    return JSON.parse(auth?.creds);\n  } catch {\n    return null;\n  }\n}\n\nasync function deleteAuthKey(sessionId: string): Promise<any> {\n  try {\n    const register = await keyExists(sessionId);\n    if (!register) return;\n    await prismaRepository.session.delete({ where: { sessionId: sessionId } });\n  } catch {\n    return;\n  }\n}\n\nasync function fileExists(file: string): Promise<any> {\n  try {\n    const stat = await fs.stat(file);\n    if (stat.isFile()) return true;\n  } catch {\n    return;\n  }\n}\n\nconst logger = new Logger('useMultiFileAuthStatePrisma');\n\nexport default async function useMultiFileAuthStatePrisma(\n  sessionId: string,\n  cache: CacheService,\n): Promise<{\n  state: AuthenticationState;\n  saveCreds: () => Promise<void>;\n  removeCreds: () => Promise<void>;\n}> {\n  const localFolder = path.join(INSTANCE_DIR, sessionId);\n  const localFile = (key: string) => path.join(localFolder, fixFileName(key) + '.json');\n  await fs.mkdir(localFolder, { recursive: true });\n\n  async function writeData(data: any, key: string): Promise<any> {\n    const dataString = JSON.stringify(data, BufferJSON.replacer);\n    const cacheConfig = configService.get<CacheConf>('CACHE');\n\n    if (key != 'creds') {\n      if (cacheConfig.REDIS.ENABLED) {\n        return await cache.hSet(sessionId, key, data);\n      } else {\n        await fs.writeFile(localFile(key), dataString);\n        return;\n      }\n    }\n    await saveKey(sessionId, dataString);\n    return;\n  }\n\n  async function readData(key: string): Promise<any> {\n    try {\n      let rawData;\n      const cacheConfig = configService.get<CacheConf>('CACHE');\n\n      if (key != 'creds') {\n        if (cacheConfig.REDIS.ENABLED) {\n          return await cache.hGet(sessionId, key);\n        } else {\n          if (!(await fileExists(localFile(key)))) return null;\n          rawData = await fs.readFile(localFile(key), { encoding: 'utf-8' });\n          return JSON.parse(rawData, BufferJSON.reviver);\n        }\n      } else {\n        rawData = await getAuthKey(sessionId);\n      }\n\n      const parsedData = JSON.parse(rawData, BufferJSON.reviver);\n      return parsedData;\n    } catch {\n      return null;\n    }\n  }\n\n  async function removeData(key: string): Promise<any> {\n    try {\n      const cacheConfig = configService.get<CacheConf>('CACHE');\n\n      if (key != 'creds') {\n        if (cacheConfig.REDIS.ENABLED) {\n          return await cache.hDelete(sessionId, key);\n        } else {\n          await fs.unlink(localFile(key));\n        }\n      } else {\n        await deleteAuthKey(sessionId);\n      }\n    } catch {\n      return;\n    }\n  }\n\n  async function removeCreds(): Promise<any> {\n    const cacheConfig = configService.get<CacheConf>('CACHE');\n\n    // Redis\n    try {\n      if (cacheConfig.REDIS.ENABLED) {\n        await cache.delete(sessionId);\n        logger.info({ action: 'redis.delete', sessionId });\n\n        return;\n      }\n    } catch (err) {\n      logger.warn({ action: 'redis.delete', sessionId, err });\n    }\n\n    logger.info({ action: 'auth.key.delete', sessionId });\n\n    await deleteAuthKey(sessionId);\n  }\n\n  let creds = await readData('creds');\n  if (!creds) {\n    creds = initAuthCreds();\n    await writeData(creds, 'creds');\n  }\n\n  return {\n    state: {\n      creds,\n      keys: {\n        get: async (type, ids) => {\n          const data = {};\n          await Promise.all(\n            ids.map(async (id) => {\n              let value = await readData(`${type}-${id}`);\n              if (type === 'app-state-sync-key' && value) {\n                value = proto.Message.AppStateSyncKeyData.create(value);\n              }\n\n              data[id] = value;\n            }),\n          );\n          return data;\n        },\n        set: async (data) => {\n          const tasks = [];\n          for (const category in data) {\n            for (const id in data[category]) {\n              const value = data[category][id];\n              const key = `${category}-${id}`;\n\n              tasks.push(value ? writeData(value, key) : removeData(key));\n            }\n          }\n          await Promise.all(tasks);\n        },\n      },\n    },\n    saveCreds: () => {\n      return writeData(creds, 'creds');\n    },\n\n    removeCreds,\n  };\n}\n"],"mappings":"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C1B,aAAc,CAAE,KAAM,SAAU,EAChC,aAAc,CAAE,KAAM,SAAU,EAChC,aAAc,CAAE,KAAM,SAAU,EAChC,WAAY,CAAE,KAAM,SAAU,EAC9B,gBAAiB,CAAE,KAAM,SAAU,EACnC,YAAa,CAAE,KAAM,QAAS,EAE9B,UAAW,CAAE,KAAM,QAAS,EAC5B,UAAW,CAAE,KAAM,QAAS,EAC5B,cAAe,CAAE,KAAM,QAAS,EAChC,cAAe,CAAE,KAAM,QAAS,EAChC,cAAe,CAAE,KAAM,QAAS,EAEhC,WAAY,CAAE,KAAM,QAAS,EAC7B,gBAAiB,CAAE,KAAM,SAAU,EACnC,cAAe,CAAE,KAAM,SAAU,EACjC,cAAe,CACb,KAAM,QACN,SAAU,EACV,MAAO,CACL,KAAM,SACN,KAAM,CACJ,sBACA,iBACA,eACA,kBACA,kBACA,kBACA,kBACA,eACA,sBACA,eACA,kBACA,kBACA,kBACA,YACA,eACA,eACA,eACA,gBACA,eACA,4BACA,oBACA,cACA,qBACA,OACA,gBACA,uBACF,CACF,CACF,EAEA,gBAAiB,CAAE,KAAM,SAAU,EACnC,eAAgB,CACd,KAAM,QACN,SAAU,EACV,MAAO,CACL,KAAM,SACN,KAAM,CACJ,sBACA,iBACA,eACA,kBACA,kBACA,kBACA,kBACA,eACA,sBACA,eACA,kBACA,kBACA,kBACA,YACA,eACA,eACA,eACA,gBACA,eACA,4BACA,oBACA,cACA,qBACA,OACA,gBACA,uBACF,CACF,CACF,EAEA,YAAa,CAAE,KAAM,SAAU,EAC/B,WAAY,CACV,KAAM,QACN,SAAU,EACV,MAAO,CACL,KAAM,SACN,KAAM,CACJ,sBACA,iBACA,eACA,kBACA,kBACA,kBACA,kBACA,eACA,sBACA,eACA,kBACA,kBACA,kBACA,YACA,eACA,eACA,eACA,gBACA,eACA,4BACA,oBACA,cACA,qBACA,OACA,gBACA,uBACF,CACF,CACF,EAEA,WAAY,CAAE,KAAM,SAAU,EAC9B,UAAW,CACT,KAAM,QACN,SAAU,EACV,MAAO,CACL,KAAM,SACN,KAAM,CACJ,sBACA,iBACA,eACA,kBACA,k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","names":["dayjs","fs","isBooleanString","dotenv","ConfigService","key","configService","packageJson","fs","formatDateLog","timestamp","dayjs","Color","Level","Type","Background","Logger","context","configService","value","type","types","level","typeValue","Color","packageJson","formatDateLog","BufferJSON","NodeCache","_LocalCache","configService","module","Logger","key","value","ttl","appendCriteria","keys","filter","field","data","error","json","hash","LocalCache","BufferJSON","createClient","Redis","Logger","configService","e","redisClient","RedisCache","configService","module","Logger","redisClient","key","error","field","data","BufferJSON","value","ttl","json","appendCriteria","keys","match","logger","Logger","CacheEngine","configService","module","cacheConf","RedisCache","LocalCache","EventEmitter2","eventEmitterConfig","configService","eventEmitter","BusinessController","waMonitor","instanceName","data","CallController","waMonitor","instanceName","data","ChatController","waMonitor","instanceName","data","query","remoteJid","GroupController","waMonitor","instance","create","update","groupJid","getPaticipants","inviteCode","data","TypeMediaMessage","MessageSubtype","Integration","logger","Logger","apikey","req","_","next","env","configService","key","db","UnauthorizedException","ForbiddenException","param","prismaRepository","error","authGuard","getInstance","instanceName","cacheConf","configService","exists","waMonitor","keyExists","cache","prismaRepository","error","InternalServerErrorException","instanceExistsGuard","req","_","next","param","BadRequestException","NotFoundException","instanceLoggedGuard","instance","ForbiddenException","axios","fs","packageJson","sendTelemetry","route","telemetryConfig","configService","telemetry","url","Telemetry","req","res","next","sendTelemetry","telemetry_guard_default","Router","validate","logger","Logger","RouterBroker","path","param","route","args","request","schema","ClassRef","execute","ref","body","instance","v","message","stack","BadRequestException","property","groupJid","inviteCode","getParticipants","Router","EvolutionRouter","RouterBroker","configService","req","res","body","response","evolutionController","Router","MetaRouter","RouterBroker","configService","req","res","body","response","metaController","ChatwootDto","ChatwootInstanceMixin","Base","EventDto","EventInstanceMixin","Base","IntegrationDto","EventInstanceMixin","ChatwootInstanceMixin","InstanceDto","IntegrationDto","SetPresenceDto","v4","isNotEmpty","propertyNames","properties","property","instanceSchema","Integration","presenceOnlySchema","Router","BaileysRouter","RouterBroker","guards","req","res","response","instanceSchema","InstanceDto","instance","baileysController","ChannelRouter","configService","guards","Router","EvolutionRouter","MetaRouter","BaileysRouter","catalogSchema","collectionsSchema","v4","isNotEmpty","propertyNames","properties","property","numberDefinition","whatsappNumberSchema","readMessageSchema","archiveChatSchema","markChatUnreadSchema","deleteMessageSchema","profilePictureSchema","updateMessageSchema","presenceSchema","blockUserSchema","contactValidateSchema","messageValidateSchema","messageUpSchema","privacySettingsSchema","profileNameSchema","profileStatusSchema","profileSchema","v4","isNotEmpty","propertyNames","properties","property","createGroupSchema","groupJidSchema","getParticipantsSchema","groupSendInviteSchema","groupInviteSchema","AcceptGroupInviteSchema","updateParticipantsSchema","updateSettingsSchema","toggleEphemeralSchema","updateGroupPictureSchema","updateGroupSubjectSchema","updateGroupDescriptionSchema","v4","isNotEmpty","propertyNames","properties","property","numberDefinition","handleLabelSchema","v4","isNotEmpty","propertyNames","properties","property","numberDefinition","templateMessageSchema","quotedOptionsSchema","offerCallSchema","textMessageSchema","mediaMessageSchema","ptvMessageSchema","audioMessageSchema","statusMessageSchema","stickerMessageSchema","locationMessageSchema","contactMessageSchema","reactionMessageSchema","pollMessageSchema","listMessageSchema","buttonsMessageSchema","v4","isNotEmpty","propertyNames","properties","property","proxySchema","v4","isNotEmpty","propertyNames","properties","property","settingsSchema","v4","isNotEmpty","propertyNames","properties","property","templateSchema","v4","isNotEmpty","propertyNames","properties","property","templateDeleteSchema","v4","isNotEmpty","propertyNames","properties","property","templateEditSchema","v4","isNotEmpty","propertyNames","properties","property","chatwootSchema","v4","isNotEmpty","propertyNames","properties","property","difySchema","difyStatusSchema","difySettingSchema","difyIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","evoaiSchema","evoaiStatusSchema","evoaiSettingSchema","evoaiIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","evolutionBotSchema","evolutionBotStatusSchema","evolutionBotSettingSchema","evolutionBotIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","flowiseSchema","flowiseStatusSchema","flowiseSettingSchema","flowiseIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","n8nSchema","n8nStatusSchema","n8nSettingSchema","n8nIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","openaiSchema","openaiCredsSchema","openaiStatusSchema","openaiSettingSchema","openaiIgnoreJidSchema","v4","isNotEmpty","propertyNames","properties","property","typebotSchema","typebotStatusSchema","typebotStartSchema","typebotSettingSchema","typebotIgnoreJidSchema","v4","_EventController","prismaRepository","waMonitor","integrationStatus","integrationName","prisma","name","status","instanceName","data","EventController","v4","isNotEmpty","propertyNames","properties","property","pusherSchema","v4","EventController","v4","isNotEmpty","propertyNames","properties","property","webhookSchema","v4","EventController","eventSchema","v4","EventController","Router","ChatwootRouter","RouterBroker","guards","req","res","response","chatwootSchema","ChatwootDto","instance","data","chatwootController","instanceSchema","InstanceDto","IgnoreJidDto","BaseChatbotDto","BaseChatbotSettingDto","DifyDto","BaseChatbotDto","DifySettingDto","BaseChatbotSettingDto","Router","DifyRouter","RouterBroker","guards","req","res","response","difySchema","DifyDto","instance","data","difyController","instanceSchema","InstanceDto","difySettingSchema","DifySettingDto","difyStatusSchema","difyIgnoreJidSchema","IgnoreJidDto","OpenaiCredsDto","OpenaiDto","BaseChatbotDto","OpenaiSettingDto","BaseChatbotSettingDto","Router","OpenaiRouter","RouterBroker","guards","req","res","response","openaiCredsSchema","OpenaiCredsDto","instance","data","openaiController","instanceSchema","InstanceDto","openaiSchema","OpenaiDto","openaiSettingSchema","OpenaiSettingDto","openaiStatusSchema","openaiIgnoreJidSchema","IgnoreJidDto","TypebotDto","BaseChatbotDto","TypebotSettingDto","BaseChatbotSettingDto","Router","TypebotRouter","RouterBroker","guards","req","res","response","typebotSchema","TypebotDto","instance","data","typebotController","instanceSchema","InstanceDto","typebotSettingSchema","TypebotSettingDto","typebotStartSchema","typebotStatusSchema","typebotIgnoreJidSchema","IgnoreJidDto","Router","Router","EvoaiDto","BaseChatbotDto","EvoaiSettingDto","BaseChatbotSettingDto","EvoaiRouter","RouterBroker","guards","Router","req","res","response","evoaiSchema","EvoaiDto","instance","data","evoaiController","instanceSchema","InstanceDto","evoaiSettingSchema","EvoaiSettingDto","evoaiStatusSchema","evoaiIgnoreJidSchema","IgnoreJidDto","Router","EvolutionBotDto","BaseChatbotDto","EvolutionBotSettingDto","BaseChatbotSettingDto","EvolutionBotRouter","RouterBroker","guards","Router","req","res","response","evolutionBotSchema","EvolutionBotDto","instance","data","evolutionBotController","instanceSchema","InstanceDto","evolutionBotSettingSchema","EvolutionBotSettingDto","evolutionBotStatusSchema","evolutionBotIgnoreJidSchema","IgnoreJidDto","Router","FlowiseDto","BaseChatbotDto","FlowiseSettingDto","BaseChatbotSettingDto","FlowiseRouter","RouterBroker","guards","Router","req","res","response","flowiseSchema","FlowiseDto","instance","data","flowiseController","instanceSchema","InstanceDto","flowiseSettingSchema","FlowiseSettingDto","flowiseStatusSchema","flowiseIgnoreJidSchema","IgnoreJidDto","Router","N8nDto","BaseChatbotDto","N8nSettingDto","BaseChatbotSettingDto","N8nRouter","RouterBroker","guards","Router","req","res","response","n8nSchema","N8nDto","instance","data","n8nController","instanceSchema","InstanceDto","n8nSettingSchema","N8nSettingDto","n8nStatusSchema","n8nIgnoreJidSchema","IgnoreJidDto","ChatbotRouter","guards","Router","EvolutionBotRouter","ChatwootRouter","TypebotRouter","OpenaiRouter","DifyRouter","FlowiseRouter","N8nRouter","EvoaiRouter","Router","KafkaRouter","RouterBroker","guards","req","res","response","eventSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","NatsRouter","RouterBroker","guards","req","res","response","eventSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","PusherRouter","RouterBroker","guards","req","res","response","pusherSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","RabbitmqRouter","RouterBroker","guards","req","res","response","eventSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","SqsRouter","RouterBroker","guards","req","res","response","eventSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","WebhookRouter","RouterBroker","configService","guards","req","res","response","webhookSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","WebsocketRouter","RouterBroker","guards","req","res","response","eventSchema","EventDto","instance","data","eventManager","instanceSchema","InstanceDto","Router","EventRouter","configService","guards","WebhookRouter","WebsocketRouter","RabbitmqRouter","NatsRouter","PusherRouter","SqsRouter","KafkaRouter","MediaDto","v4","isNotEmpty","propertyNames","properties","property","s3Schema","s3UrlSchema","Router","S3Router","RouterBroker","guards","req","res","response","s3Schema","MediaDto","instance","data","s3Controller","s3UrlSchema","Router","StorageRouter","guards","S3Router","axios","fetchLatestBaileysVersion","fetchLatestWaWebVersion","options","data","regex","match","error","Router","fs","mimeTypes","path","OnWhatsAppDto","jid","exists","number","name","lid","getBase64FromMediaMessageDto","WhatsAppNumberDto","NumberDto","ProfileNameDto","ProfileStatusDto","ProfilePictureDto","ReadMessageDto","ArchiveChatDto","MarkChatUnreadDto","PrivacySettingDto","DeleteMessage","OptionsMessage","Metadata","SendPresenceDto","UpdateMessageDto","BlockUserDto","createMetaErrorResponse","error","context","metaError","errorUserTitle","errorUserMsg","Router","BusinessRouter","RouterBroker","guards","Router","req","res","response","catalogSchema","NumberDto","instance","data","businessController","error","errorResponse","createMetaErrorResponse","collectionsSchema","Metadata","OfferCallDto","Router","CallRouter","RouterBroker","guards","Router","req","res","response","offerCallSchema","OfferCallDto","instance","data","callController","PrismaClient","Query","PrismaRepository","configService","Logger","Router","ChatRouter","RouterBroker","guards","Router","req","res","response","whatsappNumberSchema","WhatsAppNumberDto","instance","data","chatController","error","readMessageSchema","ReadMessageDto","archiveChatSchema","ArchiveChatDto","markChatUnreadSchema","MarkChatUnreadDto","deleteMessageSchema","DeleteMessage","profilePictureSchema","NumberDto","getBase64FromMediaMessageDto","updateMessageSchema","UpdateMessageDto","presenceSchema","SendPresenceDto","blockUserSchema","BlockUserDto","contactValidateSchema","Query","messageValidateSchema","messageUpSchema","remoteJid","ProfilePictureDto","profileSchema","profileNameSchema","ProfileNameDto","profileStatusSchema","ProfileStatusDto","InstanceDto","privacySettingsSchema","PrivacySettingDto","CreateGroupDto","GroupPictureDto","GroupSubjectDto","GroupDescriptionDto","GroupJid","GetParticipant","GroupInvite","AcceptGroupInvite","GroupSendInvite","GroupUpdateParticipantDto","GroupUpdateSettingDto","GroupToggleEphemeralDto","Router","GroupRouter","RouterBroker","guards","Router","req","res","response","createGroupSchema","CreateGroupDto","instance","data","groupController","updateGroupSubjectSchema","GroupSubjectDto","updateGroupPictureSchema","GroupPictureDto","updateGroupDescriptionSchema","GroupDescriptionDto","groupJidSchema","GroupJid","getParticipantsSchema","GetParticipant","groupInviteSchema","GroupInvite","AcceptGroupInviteSchema","AcceptGroupInvite","groupSendInviteSchema","GroupSendInvite","updateParticipantsSchema","GroupUpdateParticipantDto","updateSettingsSchema","GroupUpdateSettingDto","toggleEphemeralSchema","GroupToggleEphemeralDto","Router","InstanceRouter","RouterBroker","configService","guards","Router","req","res","response","instanceSchema","InstanceDto","instance","instanceController","key","presenceOnlySchema","SetPresenceDto","data","LabelDto","HandleLabelDto","Router","LabelRouter","RouterBroker","guards","Router","req","res","response","LabelDto","instance","labelController","handleLabelSchema","HandleLabelDto","data","ProxyDto","Router","ProxyRouter","RouterBroker","guards","Router","req","res","response","proxySchema","ProxyDto","instance","data","proxyController","instanceSchema","InstanceDto","Metadata","SendTextDto","SendStatusDto","Metadata","SendPollDto","SendMediaDto","SendPtvDto","SendStickerDto","SendButtonsDto","Metadata","SendLocationDto","SendListDto","Metadata","SendTemplateDto","Metadata","SendContactDto","SendReactionDto","Router","multer","upload","multer","MessageRouter","RouterBroker","guards","Router","req","res","response","templateMessageSchema","SendTemplateDto","instance","data","sendMessageController","textMessageSchema","SendTextDto","bodyData","mediaMessageSchema","SendMediaDto","ptvMessageSchema","SendPtvDto","audioMessageSchema","statusMessageSchema","SendStatusDto","stickerMessageSchema","SendStickerDto","locationMessageSchema","SendLocationDto","contactMessageSchema","SendContactDto","reactionMessageSchema","SendReactionDto","pollMessageSchema","SendPollDto","listMessageSchema","SendListDto","buttonsMessageSchema","SendButtonsDto","SettingsDto","Router","SettingsRouter","RouterBroker","guards","Router","req","res","response","settingsSchema","SettingsDto","instance","data","settingsController","InstanceDto","TemplateDto","TemplateEditDto","TemplateDeleteDto","Router","TemplateRouter","RouterBroker","configService","guards","Router","req","res","response","templateSchema","TemplateDto","instance","data","templateController","error","errorResponse","createMetaErrorResponse","templateEditSchema","TemplateEditDto","templateDeleteSchema","TemplateDeleteDto","instanceSchema","InstanceDto","express","Router","path","ViewsRouter","RouterBroker","basePath","indexPath","req","res","router","Router","serverConfig","configService","databaseConfig","guards","instanceExistsGuard","instanceLoggedGuard","authGuard","telemetry","telemetry_guard_default","packageJson","fs","metricsIPWhitelist","req","res","next","allowedIPs","ip","clientIPs","metricsBasicAuth","metricsConfig","metricsUser","metricsPass","auth","credentials","user","pass","metricsMiddleware","escapeLabel","value","lines","clientName","serverUrl","instances","waMonitor","instanceEntries","name","instance","state","integration","up","ViewsRouter","fileName","path","basePath","assetsPath","filePath","resolvedPath","resolvedAssetsPath","mimeTypes","fetchLatestWaWebVersion","facebookConfig","InstanceRouter","MessageRouter","CallRouter","ChatRouter","BusinessRouter","GroupRouter","TemplateRouter","SettingsRouter","ProxyRouter","LabelRouter","ChannelRouter","EventRouter","ChatbotRouter","StorageRouter","BadRequestException","objectError","UnauthorizedException","objectError","ForbiddenException","objectError","NotFoundException","objectError","InternalServerErrorException","objectError","delay","isArray","isURL","v4","InstanceController","waMonitor","configService","prismaRepository","eventEmitter","chatwootService","settingsService","proxyService","cache","chatwootCache","baileysCache","providerFiles","Logger","instanceData","instance","channelController","BadRequestException","instanceId","hash","eventManager","instanceDto","settings","webhookWaBusiness","accessTokenWaBusiness","Integration","getQrcode","urlServer","error","instanceName","number","state","r","key","instancesByKey","names","UnauthorizedException","instanceNames","data","InternalServerErrorException","waInstances","LabelController","waMonitor","instanceName","data","socksDispatcher","HttpsProxyAgent","SocksProxyAgent","ProxyAgent","selectProxyAgent","proxyUrl","url","PROXY_HTTP_PROTOCOL","PROXY_SOCKS_PROTOCOL","PROXY_SOCKS5_PROTOCOL","urlSocks","makeProxyAgent","proxy","host","password","port","protocol","username","makeProxyAgentUndici","proto","auth","PROXY_HTTPS_PROTOCOL","PROXY_SOCKS4_PROTOCOL","type","axios","logger","Logger","ProxyController","proxyService","waMonitor","instance","data","NotFoundException","BadRequestException","proxy","serverIp","result","makeProxyAgent","error","isBase64","isURL","emojiRegex","regex","isEmoji","str","match","SendMessageController","waMonitor","instanceName","data","file","BadRequestException","SettingsController","settingsService","instance","data","TemplateController","templateService","instance","data","MinIo","join","logger","Logger","BUCKET","ConfigService","minioClient","bucketName","bucketExists","bucket","setBucketPolicy","policy","createBucket","error","uploadFile","fileName","file","size","metadata","objectName","getObjectUrl","expiry","BadRequestException","postgresql","Pool","Postgres","Logger","connectionString","uri","configService","postgresClient","ChatwootImport","Logger","instance","repositoryMessagesCache","messagesRaw","actualValue","contactsRaw","provider","pgClient","postgresClient","totalContactsImported","contacts","contactsChunk","labelSql","labelId","sqlLabel","sqlInsert","bindInsert","contact","isGroup","contactName","bindName","bindPhoneNumber","bindIdentifier","sqlTags","tagId","sqlTag","sqlInsertLabel","bindTaggableId","error","sourceIds","conversationId","existingSourceIdsSet","formattedSourceIds","sourceId","params","query","result","row","chatwootService","inbox","chatwootUser","totalMessagesImported","messagesOrdered","a","b","aKey","bKey","aMessageTimestamp","bMessageTimestamp","allMessagesMappedByPhoneNumber","phoneNumbersWithTimestamp","messages","phoneNumber","existingSourceIds","message","batchSize","messagesChunk","messagesByPhoneNumber","fksByNumber","sqlInsertMsg","bindInsertMsg","fksChatwoot","contentMessage","bindContent","bindConversationId","bindMessageType","bindSenderType","bindSenderId","bindSourceId","bindmessageTimestamp","providerData","event","bindValues","sqlFromChatwoot","phoneNumberTimestamp","bindStr","fksFromChatwoot","item","acc","key","phoneNumberPlus","limit","msg","configService","types","doc","fileName","caption","template","arr","chunkSize","remoteJid","messageId","chatwootImport","ChatwootClient","chatwootRequest","fs","i18next","path","languages","translationsPath","configService","ConfigService","resources","language","languagePath","translationContent","i18n_default","axios","dayjs","FormData","Jimp","JimpMime","parsePhoneNumberFromString","Long","mimeTypes","path","Readable","ChatwootService","waMonitor","configService","prismaRepository","cache","Logger","postgresClient","instance","cacheKey","provider","ChatwootClient","data","urlServer","id","client","contact","inboxName","webhookUrl","qrcode","number","organization","logo","findInbox","checkDuplicate","inbox","inboxId","contactId","conversation","contentMsg","phoneNumber","isGroup","name","avatar_url","jid","error","existingContact","nameInbox","tagData","tagId","taggingsCount","identifier","contactByAttr","query","chatwootRequest","baseId","mergeId","contacts","phoneNumbers","searchableFields","phone","savedNumber","contact_with9","field","numbers","withoutNine","withNine","filterPayload","fieldsToSearch","index1","index2","queryOperator","body","isLid","remoteJid","lockKey","maxWaitTime","baseContact","conversationId","conversationExists","start","res","chatId","nameContact","filterInbox","group","participantJid","picture_url","findParticipant","waProfilePictureFile","chatwootProfilePictureFile","pictureNeedsUpdate","nameNeedsUpdate","contactConversations","inboxConversation","findByName","content","messageType","privateMessage","attachments","messageBody","sourceId","quotedMsg","replyToIds","sourceReplyId","message","fileStream","fileName","messageAlreadySaved","chatwootImport","config","waInstance","media","caption","options","parsedMedia","mimeType","parts","type","sendTelemetry","i18n_default","resolve","keyToDelete","messageReceived","senderName","key","cwBotContact","command","state","msgLogout","formatText","formattedDelimiter","textToConcat","attachment","messageSent","lastMessage","updateMessage","chatwootMessageIds","result","keyId","msg","inReplyTo","inReplyToExternalId","messageContent","types","typeKey","latitude","longitude","locationName","locationAddress","vCardData","contactInfo","line","value","formattedContact","numberCount","listTitle","listDescription","listFooter","formattedList","section","sectionIndex","row","rowIndex","responseTitle","responseDescription","responseRowId","event","ignoreJids","ignoreGroups","ignoreContacts","originalMessage","bodyMessage","quotedId","isMedia","adsMessage","reactionMessage","isInteractiveButtonMessage","getConversation","downloadBase64","nameFile","originalFilename","parsedFile","fileData","participantName","rawPhoneNumber","formattedPhoneNumber","send","buttons","button","paymentSettings","pixSettings","pixKeyType","pixKey","imgBuffer","extension","img","processedBuffer","truncStr","str","len","title","description","editedMessageContent","editedText","contactInboxSourceId","url","msgStatus","now","timeSinceLastNotification","msgConnection","erroQRcode","msgQrCode","uri","messagesRaw","contactsRaw","totalMessagesImported","limitContacts","recentContacts","contactIdentifiers","contactsWithProfilePicture","acc","chatwootConfig","prepareMessage","sqlMessages","ids","filteredMessages","axios","isURL","BaseChatbotService","waMonitor","prismaRepository","loggerName","configService","Logger","content","str","url","extension","imageExtensions","audioExtensions","videoExtensions","documentExtensions","instance","data","type","pushNameValue","remoteJidValue","error","remoteJid","bot","session","settings","pushName","msg","keywordFinish","normalizedContent","message","linkPreview","linkRegex","textBuffer","lastIndex","match","splitMessages","fullMatch","altText","mediaType","beforeText","remainingText","part","timePerChar","delay","Integration","resolve","text","messageParts","index","sessionResult","DifyService","BaseChatbotService","waMonitor","prismaRepository","configService","openaiService","instance","session","settings","dify","remoteJid","pushName","content","msg","endpoint","processedContent","transcription","err","payload","media","mediaBase64","isURL","result","axios","Integration","response","message","conversationId","answer","events","line","eventString","event","error","axios","downloadMediaMessage","isURL","FormData","OpenAI","P","OpenaiService","BaseChatbotService","waMonitor","prismaRepository","configService","apiKey","OpenAI","instance","remoteJid","openaiBot","session","settings","content","pushName","msg","creds","transcription","keywordFinish","normalizedContent","sendTelemetry","data","createSession","error","message","fromMe","messageData","media","mediaBase64","isURL","result","axios","url","threadId","runAssistant","Integration","response","responseText","messages","messageContent","textContent","conversationHistory","messagesSystem","messagesAssistant","messagesUser","completions","responseContent","runId","functionUrl","status","maxRetries","checkInterval","resolve","toolCalls","toolOutputs","toolCall","payloadData","audio","downloadMediaMessage","P","lang","formData","FormData","getTypeMessage","msg","mediaId","configService","types","messageType","key","getMessageContent","typeKey","result","getConversationMessage","axios","TypebotService","BaseChatbotService","waMonitor","configService","prismaRepository","openaiService","instance","session","settings","bot","remoteJid","pushName","content","msg","data","id","version","url","reqData","request","axios","typebotData","error","instanceDb","messages","input","clientSideActions","waInstance","err","element","text","child","line","index","formats","formattedText","applyFormatting","findItemAndGetSecondsToWait","array","targetId","item","message","richText","sendTelemetry","wait","resolve","items","statusChange","listJson","titleMatch","descriptionMatch","buttonTextMatch","footerTextMatch","menuContent","sections","section","sectionTitle","rows","sectionData","row","buttonJson","thumbnailUrlMatch","footerMatch","buttonTypes","type","pattern","match","button","findTypebot","expire","typebot","keywordFinish","delayMessage","unknownMessage","listeningFromMe","stopBotFromMe","keepOpen","prefilledVariables","now","sessionUpdatedAt","diff","getConversationMessage","urlTypebot","transcription","Prisma","formatMXOrARNumber","jid","countryCode","formatBRNumber","regexp","match","joker","ddd","createJid","number","isArray","v4","ChannelStartupService","_ChannelStartupService","configService","eventEmitter","prismaRepository","chatwootCache","Logger","ChatwootService","waMonitor","OpenaiService","TypebotService","DifyService","instance","name","id","integration","number","token","data","ignoreJidsArray","event","proxyConfig","NotFoundException","local","extra","serverUrl","tzoffset","now","expose","instanceApikey","eventManager","jid","countryCode","regexp","match","joker","ddd","query","where","remoteJid","createJid","contactFindManyArgs","validPage","contact","isGroup","isSaved","message","cleanedMessage","mediaUrl","keyFilters","timestampFilter","count","messages","Prisma","limit","offset","results","lastMessage","msg","type","axios","isBase64","isURL","FormData","mimeTypes","join","v4","EvolutionStartupService","ChannelStartupService","configService","eventEmitter","prismaRepository","cache","chatwootCache","instance","number","createJid","data","error","InternalServerErrorException","received","messageRaw","isAudio","openAiDefaultSettings","sendTelemetry","chatbotController","chatwootSentMessage","contactRaw","chat","chatRaw","message","options","file","isIntegration","quoted","webhookUrl","msg","resolve","audioFile","messageId","key","findMessage","base64","fileBuffer","buffer","mediaType","mimetype","fileName","size","fullName","uploadFile","mediaUrl","getObjectUrl","BadRequestException","mediaMessage","arrayMatch","prepareMedia","mediaData","audio","hash","audioConverterConfig","formData","response","status","axios","arrayUnique","isURL","FormData","mimeTypes","join","BusinessStartupService","ChannelStartupService","configService","eventEmitter","prismaRepository","cache","chatwootCache","baileysCache","providerFiles","message","params","urlServer","version","headers","e","number","createJid","data","content","error","InternalServerErrorException","id","result","received","vcard","contact","type","messageType","database","settings","messageRaw","pushName","key","messageContent","buffer","mediaType","mimetype","contentDisposition","fileName","match","size","fullName","uploadFile","createdMessage","mediaUrl","getObjectUrl","openAiDefaultSettings","speechError","openAiBase64","sendTelemetry","chatbotController","chatwootSentMessage","contactRaw","item","findMessage","convertMessage","options","isIntegration","quoted","webhookUrl","msg","messageSent","isImage","formattedText","section","row","status","BadRequestException","mediaMessage","isFile","formData","response","url","arrayMatch","prepareMedia","file","mediaData","audio","hash","audioConverterConfig","audioConverter","embeddedMedia","btnItems","btn","button","sectionsItems","list","sendData","BufferJSON","CacheService","cache","Logger","key","field","data","error","value","ttl","json","appendCriteria","ffmpegPath","cuid","dayjs","logger","Logger","getAvailableNumbers","remoteJid","numbersAvailable","number","domain","numberWithDigit","numberWithoutDigit","prefix","normalizeJid","jid","saveOnWhatsappCache","data","configService","processingPromises","item","altJidNormalized","lidAltJid","baseJids","expandedJids","existingRecord","prismaRepository","finalJidOptions","newJidOptionsString","newLid","dataPayload","existingJidOptionsString","e","getOnWhatsappCache","remoteJids","results","remoteJidsWithoutPlus","BufferJSON","initAuthCreds","proto","isNotEmpty","AuthStateProvider","providerFiles","Logger","instance","error","writeData","data","key","json","response","readData","removeData","removeCreds","logger","creds","type","ids","id","value","tasks","category","initAuthCreds","proto","useMultiFileAuthStateRedisDb","instanceName","cache","logger","Logger","writeData","data","key","error","readData","removeData","removeCreds","creds","type","ids","id","value","tasks","category","axios","makeWASocket","BufferJSON","decryptPollVote","delay","DisconnectReason","downloadContentFromMessage","downloadMediaMessage","generateWAMessageFromContent","getAggregateVotesInPollMessage","getContentType","getDevice","isJidBroadcast","isJidGroup","isJidNewsletter","isPnUser","jidNormalizedUser","makeCacheableSignalKeyStore","prepareWAMessageMedia","proto","spawn","isArray","isBase64","isURL","createHash","ffmpeg","FormData","Long","mimeTypes","NodeCache","cron","release","join","P","qrcode","qrcodeTerminal","sharp","PassThrough","Readable","v4","catchError","concatMap","delay","EMPTY","from","retryWhen","Subject","take","tap","BaileysMessageProcessor","Logger","onMessageReceive","messages","type","requestId","settings","errors","error","payload","io","baileys_connection_state","useVoiceCallsBaileys","wavoip_token","baileys_sock","status","logger","socket","error","jid","callback","response","type","timeoutMs","jids","force","message","extraAttrs","useCache","ignoreZeroDevices","stanza","ciphertext","update","connection","packet","groupMetadataCache","CacheService","CacheEngine","configService","getVideoDuration","input","MediaInfoFactory","mediainfo","fileSize","readChunk","size","offset","fs","fd","buffer","result","duration","t","Readable","chunks","chunk","data","BaileysStartupService","ChannelStartupService","eventEmitter","prismaRepository","cache","chatwootCache","baileysCache","providerFiles","BaileysMessageProcessor","NodeCache","chats","existingChatIds","existingChatIdSet","chat","chatsToInsert","chatsRaw","contacts","contactsRaw","contact","usersContacts","c","saveOnWhatsappCache","chatwootImport","updatedContacts","instance","findParticipant","error","updateTransactions","messages","isLatest","progress","syncType","proto","timestampLimitToImport","daysLimitToImport","date","message","contactsMap","chatsRepository","messagesRaw","messagesRepository","m","Long","participantJid","msg","type","requestId","settings","received","param","err","text","messageId","editedMessage","oldMessage","editedMessageTimestamp","existingChat","messageRaw","pollCreationKey","pollMessage","pollMessageSecret","pollOptions","pollVote","voterJid","pollEncKey","successfulVoterJid","creatorCandidates","key","voterCandidates","uniqueCreators","id","jidNormalizedUser","uniqueVoters","decryptedVote","creator","voter","decryptPollVote","selectedOptions","selectedOptionNames","option","hash","createHash","selected","pollUpdates","isMedia","isVideo","chatwootSentMessage","openAiDefaultSettings","messageData","remoteJid","timestamp","fromMe","messageKey","status","media","mediaType","fileName","mimetype","mimeTypes","fullName","join","uploadFile","mediaUrl","getObjectUrl","downloadMediaMessage","P","sendTelemetry","chatbotController","contactRaw","args","readChatToUpdate","update","updateKey","cached","secondsSinceEpoch","pollCreation","getAggregateVotesInPollMessage","findMessage","configDatabaseData","protocolMapKey","originalMessageId","searchId","_msg","chatToInsert","groupMetadata","groupMetadataUpdate","group","isJidGroup","participantsUpdate","normalizePhoneNumber","groupParticipants","resolvedParticipants","participantId","participantData","p","phoneNumber","enhancedParticipantsUpdate","label","savedLabel","l","labelName","labelData","database","instanceId","chatId","labelId","groupJid","cacheConf","meta","AuthStateProvider","db","useMultiFileAuthStateRedisDb","useMultiFileAuthStatePrisma","profileName","creds","BufferJSON","qr","connection","lastDisconnect","DisconnectReason","optsQrcode","delay","qrcode","base64","qrcodeTerminal","statusCode","profilePic","formattedWuid","formattedName","full","webMessageInfo","messageSecretBase64","number","session","browserOptions","browser","release","version","fetchLatestWaWebVersion","log","options","proxyUrls","axios","rand","proxyUrl","makeProxyAgent","makeProxyAgentUndici","socketConfig","makeCacheableSignalKeyStore","jid","isGroupJid","isBroadcast","isJidBroadcast","isNewsletter","isJidNewsletter","makeWASocket","useVoiceCallsBaileys","packet","payload","InternalServerErrorException","events","call","remotesJidMap","event","createJid","profilePictureUrl","instanceName","onWhatsapp","BadRequestException","info","picture","business","instanceNames","waMonitor","callDuration","sender","mentions","linkPreview","quoted","ephemeralExpiration","contextInfo","generateWAMessageFromContent","isPnUser","value","isArray","jidList","batchSize","batches","_","i","msgId","firstMessage","firstBatch","batch","isIntegration","isWA","remainingDelay","messageSent","NotFoundException","participant","mention","convert","file","mediaData","mediaMessage","mediaInput","imageBuffer","isURL","config","response","sharp","prepareMedia","prepareWAMessageMedia","arrayMatch","mediaBuffer","image","isBase64","base64Data","parsedURL","url","lowerCaseImage","gifPlayback","generate","audio","inputStream","audioBuffer","PassThrough","resolve","reject","ffmpegProcess","spawn","ffmpegPath","outputChunks","stderrData","code","outputBuffer","audioConverterConfig","formData","FormData","inputAudioStream","isLpcm","outputAudioStream","ffmpeg","command","length","characters","button","toString","obj","hasReplyButtons","btn","hasPixButton","hasOtherButtons","v4","buttons","vcard","jids","OnWhatsAppDto","groups","numbersToVerify","cachedNumbers","getOnWhatsappCache","cachedJids","numbersNotInCache","verify","normalNumbersNotInCache","verifiedUsers","user","numberVerified","numberWithDigit","numberWithoutDigit","v","prefix","numberJid","numbersToCache","keys","read","where","lastMessage","last_message","del","isLogicalDeleted","existingKey","messageUpdate","getBuffer","convertToMp4","subtype","MessageSubtype","template","TypeMediaMessage","downloadContentFromMessage","fallbackErr","typeMessage","getContentType","ext","privacy","profile","name","pic","whatsappContact","create","participants","reply","getParticipants","fetch","inviteUrl","numbers","parsedParticipants","values","a","b","item","converted","contentType","contentMsg","getDevice","quotedMessage","chatwootConfig","prepare","cronId","cuid","cronKey","task","cron","storedId","unreadMessages","timeoutMs","extraAttrs","node","stanza","useCache","ignoreZeroDevices","ciphertext","ciphertextBuffer","limit","cursor","catalog","nextPageCursor","nextPageCursorJson","pagination","fetcherHasMore","productsCatalog","countLoops","collections","query","keyFilters","timestampFilter","count","formattedMessages","ChannelController","prismaRepository","waMonitor","prisma","instanceData","data","Integration","BadRequestException","BusinessStartupService","EvolutionStartupService","BaileysStartupService","EvolutionController","ChannelController","prismaRepository","waMonitor","Logger","data","numberId","instance","axios","MetaController","ChannelController","prismaRepository","waMonitor","Logger","data","template","webhookUrl","axios","entry","numberId","instance","BaileysController","waMonitor","instanceName","body","normalizeString","str","advancedOperatorsSearch","data","query","filters","acc","filter","operator","values","value","normalizedItem","val","subVal","normalizedSubVal","findBotByTrigger","botRepository","content","instanceId","findTriggerAllOrNone","findTriggerAdvanced","advanced","advancedOperatorsSearch","findTriggerEquals","findRegex","findTriggerRegex","regex","findStartsWith","findTriggerStartsWith","startsWith","findEndsWith","findTriggerEndsWith","endsWith","findContains","findTriggerContains","contains","ChatbotController","prismaRepository","waMonitor","Logger","prisma","instance","remoteJid","msg","pushName","isIntegration","emitData","evolutionBotController","typebotController","openaiController","difyController","n8nController","evoaiController","flowiseController","userMessageDebounce","content","debounceTime","callback","myQuestion","ignoreJids","ignoreGroups","ignoreContacts","session","botRepository","findBot","findBotByTrigger","isURL","ChatwootController","chatwootService","configService","instance","data","BadRequestException","result","urlServer","BaseChatbotController","ChatbotController","prismaRepository","waMonitor","instance","data","BadRequestException","instanceId","defaultSettingCheck","botData","error","botId","bot","existingSettings","fallbackFieldName","settingsData","settings","remoteJid","status","session","typebotData","integrationType","ignoreJids","jid","updateData","msg","content","getConversationMessage","findBot","fallback","fallbackId","expire","keywordFinish","delayMessage","unknownMessage","listeningFromMe","stopBotFromMe","keepOpen","debounceTime","splitMessages","timePerChar","key","mergedSettings","debouncedContent","DifyController","BaseChatbotController","difyService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","instance","BadRequestException","remoteJid","bot","session","content","pushName","msg","EvoaiController","BaseChatbotController","evoaiService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","instance","BadRequestException","remoteJid","bot","session","content","pushName","msg","axios","downloadMediaMessage","isURL","uuidv4","EvoaiService","BaseChatbotService","waMonitor","prismaRepository","configService","openaiService","instance","session","settings","evoai","remoteJid","pushName","content","msg","processedContent","transcription","err","endpoint","callId","uuidv4","messageId","parts","media","mediaBase64","isURL","result","axios","mediaBuffer","downloadMediaMessage","fileContent","fileName","fileErr","payload","redactedPayload","part","Integration","response","message","artifact","textPart","p","error","EvolutionBotController","BaseChatbotController","evolutionBotService","prismaRepository","waMonitor","Logger","settings","data","botId","instanceId","instance","remoteJid","bot","session","content","pushName","msg","axios","EvolutionBotService","BaseChatbotService","waMonitor","prismaRepository","configService","openaiService","instance","session","settings","bot","remoteJid","pushName","content","msg","payload","transcription","err","media","Integration","endpoint","headers","sanitizedPayload","response","axios","message","rawLinkPreview","linkPreview","innerContent","sendTelemetry","error","FlowiseController","BaseChatbotController","flowiseService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","instance","remoteJid","bot","session","content","pushName","msg","BadRequestException","axios","FlowiseService","BaseChatbotService","waMonitor","prismaRepository","configService","openaiService","instance","remoteJid","bot","session","settings","content","pushName","msg","payload","transcription","err","media","Integration","headers","endpoint","response","axios","message","N8nController","BaseChatbotController","n8nService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","instance","BadRequestException","remoteJid","bot","session","content","pushName","msg","axios","N8nService","BaseChatbotService","waMonitor","prismaRepository","configService","openaiService","instance","session","settings","n8n","remoteJid","pushName","content","msg","endpoint","payload","transcription","err","headers","auth","response","axios","message","error","OpenAI","OpenaiController","BaseChatbotController","openaiService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","whereDuplication","instance","BadRequestException","existingSettings","remoteJid","bot","session","content","pushName","msg","error","openaiCredsId","creds","keywordFinish","settingsData","apiKey","defaultSettings","OpenAI","axios","TypebotController","BaseChatbotController","typebotService","prismaRepository","waMonitor","Logger","configService","settings","data","botId","instanceId","instance","remoteJid","bot","session","content","pushName","msg","BadRequestException","instanceData","url","typebot","startSession","variables","expire","keywordFinish","delayMessage","unknownMessage","listeningFromMe","stopBotFromMe","keepOpen","debounceTime","ignoreJids","defaultSettingCheck","prefilledVariables","variable","findBot","id","version","reqData","request","axios","error","KafkaJS","KafkaController","EventController","prismaRepository","waMonitor","configService","Logger","kafkaConfig","clientConfig","KafkaJS","producerConfig","error","consumerConfig","events","eventKeys","event","topicName","topic","message","data","admin","topics","isGlobal","instanceName","prefix","delay","origin","serverUrl","dateTime","sender","apiKey","integration","extra","instanceKafka","kafkaLocal","kafkaGlobal","kafkaEvents","we","logEnabled","messageValue","retry","logData","connect","StringCodec","NatsController","EventController","prismaRepository","waMonitor","configService","Logger","StringCodec","uri","connect","error","instanceName","origin","event","data","serverUrl","dateTime","sender","apiKey","integration","extra","instanceNats","natsLocal","natsGlobal","natsEvents","prefixKey","we","logEnabled","message","subject","logData","events","eventKeys","subscription","msg","Pusher","PusherController","EventController","prismaRepository","waMonitor","configService","Logger","APP_ID","KEY","SECRET","CLUSTER","USE_TLS","Pusher","instance","instanceName","data","origin","event","serverUrl","dateTime","sender","apiKey","local","integration","extra","we","enabledLog","eventName","pusherData","payload","payloadSize","pusherLocalEvents","pusher","error","amqp","RabbitmqController","EventController","prismaRepository","waMonitor","configService","Logger","resolve","reject","uri","frameMax","rabbitmqExchangeName","url","connectionOptions","error","connection","err","channelError","channel","exchangeName","delay","instanceName","origin","event","data","serverUrl","dateTime","sender","apiKey","integration","extra","instanceRabbitmq","rabbitmqLocal","rabbitmqGlobal","rabbitmqEvents","prefixKey","we","logEnabled","message","retry","eventName","queueName","logData","events","eventKeys","CreateQueueCommand","DeleteQueueCommand","ListQueuesCommand","SQS","SqsController","EventController","prismaRepository","waMonitor","configService","Logger","awsConfig","SQS","sqsConfig","sqsEvents","e","sqs","instanceName","data","payload","origin","event","serverUrl","dateTime","sender","apiKey","integration","extra","serverConfig","we","instanceSqs","prefixName","eventFormatted","queueName","sqsUrl","message","jsonStr","size","buffer","fullName","uploadFile","fileUrl","getObjectUrl","messageGroupId","isGlobalEnabled","params","err","logData","events","enable","eventsFinded","normalizedEvent","createCommand","CreateQueueCommand","existingQueues","listCommand","ListQueuesCommand","listData","queueUrl","parts","error","deleteCommand","DeleteQueueCommand","axios","jwt","WebhookController","EventController","prismaRepository","waMonitor","Logger","instanceName","data","origin","event","serverUrl","dateTime","sender","apiKey","local","integration","extra","instance","webhookConfig","configService","webhookLocal","webhookHeaders","jwtKey","jwtToken","we","transformedWe","enabledLog","regex","webhookData","baseURL","logData","httpService","axios","error","globalURL","maxRetries","delaySeconds","maxRetryAttempts","initialDelay","useExponentialBackoff","maxDelay","jitterFactor","nonRetryableStatusCodes","attempts","isTimeout","nextDelay","jitter","resolve","authToken","payload","SocketIO","WebsocketController","EventController","prismaRepository","waMonitor","configService","Logger","httpServer","SocketIO","req","callback","url","params","remoteAddress","allowedHosts","isAllowedHost","apiKey","globalToken","error","socket","data","cors","instanceName","origin","event","serverUrl","dateTime","sender","integration","extra","configEv","logEnabled","message","instance","err","EventManager","prismaRepository","waMonitor","WebsocketController","WebhookController","RabbitmqController","NatsController","SqsController","PusherController","KafkaController","prisma","websocket","webhook","rabbitmq","nats","sqs","pusher","kafka","httpServer","eventData","instanceName","data","S3Controller","s3Service","instance","data","S3Service","prismaRepository","Logger","instance","query","where","media","error","BadRequestException","data","getObjectUrl","axios","execFileSync","ProviderFiles","configService","Logger","url","error","pid","instance","response","key","data","join","ROOT_DIR","INSTANCE_DIR","SRC_DIR","AUTH_DIR","STORE_DIR","execFileSync","rmSync","join","WAMonitoringService","eventEmitter","configService","prismaRepository","providerFiles","cache","chatwootCache","baileysCache","Logger","instance","time","Integration","instanceNames","inexistentInstances","NotFoundException","clientName","where","instanceId","number","instanceName","r","instanceDbId","INSTANCE_DIR","instancePath","STORE_DIR","error","data","instanceData","channelController","keys","k","instances","ProxyService","waMonitor","Logger","instance","data","result","SettingsService","waMonitor","Logger","instance","data","result","axios","TemplateService","waMonitor","prismaRepository","configService","Logger","instance","getInstance","response","data","postData","metaError","error","payload","err","method","urlServer","version","headers","e","templateId","params","logger","Logger","chatwootCache","configService","CacheService","CacheEngine","ChatwootService","cache","baileysCache","providerFiles","ProviderFiles","prismaRepository","PrismaRepository","waMonitor","WAMonitoringService","eventEmitter","s3Service","S3Service","s3Controller","S3Controller","templateService","TemplateService","templateController","TemplateController","proxyService","ProxyService","proxyController","ProxyController","chatwootService","chatwootController","ChatwootController","settingsService","SettingsService","settingsController","SettingsController","instanceController","InstanceController","sendMessageController","SendMessageController","callController","CallController","chatController","ChatController","businessController","BusinessController","groupController","GroupController","labelController","LabelController","eventManager","EventManager","chatbotController","ChatbotController","channelController","ChannelController","evolutionController","EvolutionController","metaController","MetaController","baileysController","BaileysController","openaiService","OpenaiService","openaiController","OpenaiController","typebotService","TypebotService","typebotController","TypebotController","difyService","DifyService","difyController","DifyController","evolutionBotService","EvolutionBotService","evolutionBotController","EvolutionBotController","flowiseService","FlowiseService","flowiseController","FlowiseController","n8nService","N8nService","n8nController","N8nController","evoaiService","EvoaiService","evoaiController","EvoaiController","BufferJSON","initAuthCreds","proto","fs","path","fixFileName","file","keyExists","sessionId","prismaRepository","saveKey","keyJson","exists","getAuthKey","auth","deleteAuthKey","fileExists","logger","Logger","useMultiFileAuthStatePrisma","cache","localFolder","INSTANCE_DIR","localFile","key","writeData","data","dataString","cacheConfig","configService","readData","rawData","removeData","removeCreds","err","creds","type","ids","id","value","tasks","category"]}