From b782b611a2322b77beb9f795458e381bf34eecc7 Mon Sep 17 00:00:00 2001 From: Marcos Date: Sun, 22 Mar 2026 15:38:27 -0300 Subject: [PATCH] fix: Save full plan for confirmation instead of just task - Store complete plan in pending_plans dict - When user confirms, execute stored plan directly - Fixes 0/0 steps issue when confirming --- bot_logic.py | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/bot_logic.py b/bot_logic.py index c6a3323..7ad1a94 100644 --- a/bot_logic.py +++ b/bot_logic.py @@ -45,6 +45,9 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): # Memória persistente da conversa (em memória RAM) chat_histories = {} +# Armazena planos pendentes de confirmação +pending_plans = {} + async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): if not await auth_check(update): return @@ -86,18 +89,39 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']: # Verifica se há confirmação pendente - if 'pending_confirmation' in context.bot_data: - task = context.bot_data['pending_confirmation'] - result = orchestrate(task, user_confirmed=True) - reply = format_completion_message(result) - del context.bot_data['pending_confirmation'] + plan_key = f"plan_{chat_id}" + if plan_key in pending_plans: + plan = pending_plans[plan_key] + del pending_plans[plan_key] + # Executa o plano usando execute_plan + from orchestrator import execute_step + results = [] + for step in plan.get("steps", []): + result = execute_step(step) + results.append(result) + # Para em erro crítico + if not result.get("success") and step.get("danger") == "dangerous": + results.append({ + "success": False, + "output": "Execucao abortada.", + "step": -1 + }) + break + # Formata resultado + plan_result = { + "status": "completed", + "plan": plan, + "results": results + } + reply = format_completion_message(plan_result) await update.message.reply_text(reply) return if user_msg.lower() in ['nao', 'não', 'cancelar', 'cancela', 'n', 'n!']: # Cancela confirmação pendente - if 'pending_confirmation' in context.bot_data: - del context.bot_data['pending_confirmation'] + plan_key = f"plan_{chat_id}" + if plan_key in pending_plans: + del pending_plans[plan_key] await update.message.reply_text("Operacao cancelada.") return await update.message.reply_text("Nada pendente para cancelar.") @@ -117,8 +141,9 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): if is_orchestrator_task: result = orchestrate(user_msg, user_confirmed=False) if result["status"] == "needs_confirmation": - # Salva tarefa pendente - context.bot_data['pending_confirmation'] = user_msg + # Salva plano pendente + plan_key = f"plan_{chat_id}" + pending_plans[plan_key] = result["plan"] reply = format_confirmation_message(result) reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar." else: