badges on the right, evolution api sender

This commit is contained in:
Lucas Tettamanti
2026-01-26 01:21:08 -03:00
parent e85afab3e6
commit 53293ce9b3
13 changed files with 422 additions and 51 deletions

View File

@@ -1,3 +1,4 @@
import crypto from "crypto";
import {
createTakeover,
listPendingTakeovers,
@@ -10,7 +11,9 @@ import {
getTakeoverStats,
} from "../db/takeoverRepo.js";
import { insertAlias, upsertAliasMapping } from "../db/repo.js";
import { getRecentMessagesForLLM, getConversationState, upsertConversationState } from "../../2-identity/db/repo.js";
import { getRecentMessagesForLLM, getConversationState, upsertConversationState, insertMessage } from "../../2-identity/db/repo.js";
import { sseSend } from "../../shared/sse.js";
import { sendTextMessage, isEvolutionEnabled } from "../../1-intake/services/evolutionSender.js";
/**
* Lista takeovers pendientes de respuesta
@@ -107,12 +110,69 @@ export async function handleRespondToTakeover({
id,
humanResponse: response,
respondedBy,
cartItems, // Pasar los items para que se guarden
cartItems,
});
if (!result) {
throw new Error("Takeover not found or already responded");
}
// INSERTAR EL MENSAJE DE RESPUESTA EN LA BD
if (result.chat_id && response) {
try {
const messageId = `takeover_${crypto.randomUUID()}`;
await insertMessage({
tenant_id: tenantId,
wa_chat_id: result.chat_id,
provider: "takeover",
message_id: messageId,
direction: "out",
text: response,
payload: {
reply: response,
takeover_id: id,
railguard: { simulated: false, source: "human_takeover" }
},
run_id: null,
});
// Emitir SSE para que la UI se actualice
sseSend("run.created", {
run_id: null,
ts: new Date().toISOString(),
chat_id: result.chat_id,
from: respondedBy || "admin",
status: "ok",
prev_state: "AWAITING_HUMAN",
input: { text: "[human takeover response]" },
llm_output: {
reply: response,
intent: "human_response",
next_state: "CART",
},
tools: [],
invariants: { ok: true, checks: [] },
final_reply: response,
order_id: null,
payment_link: null,
latency_ms: 0,
});
// Enviar a WhatsApp via Evolution API (si está habilitado)
if (isEvolutionEnabled()) {
try {
await sendTextMessage({ chatId: result.chat_id, text: response });
console.log(`[takeovers] Message sent to Evolution for ${result.chat_id}`);
} catch (e) {
console.error("[takeovers] Evolution send error:", e.message);
}
}
console.log(`[takeovers] Message inserted for ${result.chat_id}`);
} catch (e) {
console.error("[takeovers] Error inserting message:", e);
}
}
// Si hay items para agregar al carrito, actualizar el estado de la conversación
if (cartItems && cartItems.length > 0 && result.chat_id) {
@@ -132,7 +192,7 @@ export async function handleRespondToTakeover({
}));
order.cart = [...(order.cart || []), ...newCartItems];
// Actualizar estado: cambiar a CART para que el bot retome
await upsertConversationState({
tenant_id: tenantId,