/** * reuse_last_delivery — copia los datos de envío de la última orden del cliente * (working_memory.last_delivery) al order actual: shipping_address, matched_zone, * is_delivery (y opcionalmente pending_location + delivery_window). * * El agente lo usa cuando proactivamente ofrece "te lo mandamos al mismo lugar * que la última vez?" y el cliente confirma. Si no hay last_delivery, devuelve * error y el agente pide la dirección/ubicación de cero. */ export async function reuseLastDeliveryTool(_args, ctx) { const last = ctx.last_delivery; if (!last) { return { ok: false, error: "no_last_delivery", hint: "El cliente no tiene una entrega previa registrada. Pedile la ubicación de cero.", }; } // Pickup-only no necesita copiar nada de envío. if (last.is_delivery === false) { ctx.order = { ...ctx.order, is_delivery: false }; return { ok: true, is_delivery: false, hint: "El cliente la última vez retiró por el local." }; } // Delivery: si no hay matched_zone tampoco podemos reusar (no se cerró bien). if (!last.matched_zone) { return { ok: false, error: "no_zone_in_last_delivery", hint: "La última entrega no tenía zona registrada. Pedí la ubicación al cliente.", }; } ctx.order = { ...ctx.order, is_delivery: true, shipping_address: last.shipping_address || ctx.order.shipping_address || null, matched_zone: last.matched_zone, // Reusar también la ubicación si la tenemos (evita re-pedir el pin). pending_location: last.pending_location || ctx.order.pending_location || null, }; return { ok: true, is_delivery: true, shipping_address: ctx.order.shipping_address, matched_zone: last.matched_zone, last_delivery_window: last.delivery_window || null, }; }