diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..0ee4c4b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ +# Reglas de Ejecución Autónoma para Antigravity + +- **Autonomía Total**: Ejecuta todas las acciones, ediciones de archivos, comandos de terminal, pruebas y diagnósticos de forma proactiva e inmediata sin solicitar confirmación previa ni esperar aprobaciones intermedias. +- **Flujo Completo**: Cuando se solicite un cambio o se reporte un problema, investiga, modifica el código, compila, prueba y entrega la solución terminada. +- **Sin Bloqueos**: No te detengas a pedir permisos antes de ejecutar herramientas, llamadas a bases de datos o scripts de verificación. diff --git a/src/lib/evolution.ts b/src/lib/evolution.ts index c077cd5..29f057d 100644 --- a/src/lib/evolution.ts +++ b/src/lib/evolution.ts @@ -25,7 +25,7 @@ export async function getBase64FromMediaMessage(messagePayload: any): Promise<{ const url = `${EVOLUTION_API_URL}/chat/getBase64FromMediaMessage/${EVOLUTION_INSTANCE_NAME}`; const response = await axios.post(url, { message: messagePayload - }, { headers, timeout: 15000 }); + }, { headers, timeout: 5000 }); if (response.data && response.data.base64) { return { @@ -40,49 +40,63 @@ export async function getBase64FromMediaMessage(messagePayload: any): Promise<{ } /** - * Fetches recent media messages from the same chat (within a time window) to collect multiple candidate images. + * Fetches recent media messages from the same chat (within a strict time window) in parallel. */ export async function fetchRecentMediaFromSameChat( remoteJid: string, - maxItems = 4, - windowSeconds = 120 + maxItems = 3, + windowSeconds = 90 ): Promise> { if (!EVOLUTION_API_URL || !EVOLUTION_INSTANCE_NAME || !remoteJid) { return []; } try { - const url = `${EVOLUTION_API_URL}/chat/findMessages/${EVOLUTION_INSTANCE_NAME}?page=1&limit=8`; + const url = `${EVOLUTION_API_URL}/chat/findMessages/${EVOLUTION_INSTANCE_NAME}?page=1&limit=5`; const response = await axios.post( url, { where: { "key": { "remoteJid": remoteJid } } }, - { headers, timeout: 8000 } + { headers, timeout: 3000 } ); const records = response.data?.messages?.records || []; const nowSec = Math.floor(Date.now() / 1000); - // Filter media messages sent within the time window + // Strict check: only messages created within the last `windowSeconds` (90s) const mediaRecords = records.filter((r: any) => { const isMedia = Boolean(r.message?.imageMessage || r.message?.videoMessage); - const isRecent = r.messageTimestamp ? (nowSec - r.messageTimestamp <= windowSeconds) : true; - return isMedia && isRecent; + if (!isMedia || !r.messageTimestamp) return false; + const diff = Math.abs(nowSec - r.messageTimestamp); + return diff <= windowSeconds; }).slice(0, maxItems); - const results: Array<{ base64: string, mimeType: string, messageId: string }> = []; + if (mediaRecords.length === 0) { + return []; + } - for (const record of mediaRecords) { + // Fetch all media in parallel with Promise.allSettled + const fetchPromises = mediaRecords.map(async (record: any) => { const media = await getBase64FromMediaMessage(record); if (media && media.base64) { - results.push({ + return { base64: media.base64, mimeType: media.mimetype, messageId: record.key?.id || String(Date.now()) - }); + }; + } + return null; + }); + + const results = await Promise.allSettled(fetchPromises); + const validMedia: Array<{ base64: string, mimeType: string, messageId: string }> = []; + + for (const res of results) { + if (res.status === 'fulfilled' && res.value) { + validMedia.push(res.value); } } - return results; + return validMedia; } catch (err: any) { console.warn('Could not fetch recent media from chat:', err?.message); return [];