Abandoned Cart Recovery
POST /api/v1/cart/session — upsert carrito (por session_id)
PUT /api/v1/cart/session/:id/recovered — marcar como recuperado
GET /api/v1/abandoned-carts — listar carritos abandonados (admin)
Los carritos inactivos por más de 1 hora disparan el evento abandonedcarts.cart.abandoned.