From a229d1a64b4a8f2c265cd255d58723ca6cc931f9 Mon Sep 17 00:00:00 2001 From: Marcos Date: Sun, 22 Mar 2026 15:57:48 -0300 Subject: [PATCH] fix: Use context.bot_data for plan persistence - Store pending plan in context.bot_data (Telegram persists this) - Add debug prints for troubleshooting - Fixes plan not being retrieved on confirmation --- bot_logic.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/bot_logic.py b/bot_logic.py index 7ad1a94..0388d68 100644 --- a/bot_logic.py +++ b/bot_logic.py @@ -45,9 +45,6 @@ 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 @@ -88,17 +85,19 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): return if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']: - # Verifica se há confirmação pendente - 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 + # Verifica se há confirmação pendente (usa chat_id do update atual) + if 'pending_plan' in context.bot_data: + plan = context.bot_data['pending_plan'] + del context.bot_data['pending_plan'] + # Executa o plano from orchestrator import execute_step results = [] + print(f"[CONFIRM] Executando plano com {len(plan.get('steps', []))} passos") for step in plan.get("steps", []): + print(f"[STEP] Executando: {step.get('action')}") result = execute_step(step) results.append(result) + print(f"[STEP RESULT] Success: {result.get('success')}, Output: {str(result.get('output'))[:100]}") # Para em erro crítico if not result.get("success") and step.get("danger") == "dangerous": results.append({ @@ -116,12 +115,14 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): reply = format_completion_message(plan_result) await update.message.reply_text(reply) return + else: + await update.message.reply_text("Nenhuma operacao pendente para confirmar.") + return if user_msg.lower() in ['nao', 'não', 'cancelar', 'cancela', 'n', 'n!']: # Cancela confirmação pendente - plan_key = f"plan_{chat_id}" - if plan_key in pending_plans: - del pending_plans[plan_key] + if 'pending_plan' in context.bot_data: + del context.bot_data['pending_plan'] await update.message.reply_text("Operacao cancelada.") return await update.message.reply_text("Nada pendente para cancelar.") @@ -141,9 +142,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 plano pendente - plan_key = f"plan_{chat_id}" - pending_plans[plan_key] = result["plan"] + # Salva plano pendente no context (persistente entre mensagens) + context.bot_data['pending_plan'] = result["plan"] + print(f"[ORCH] Plano salvo. Steps: {len(result['plan'].get('steps', []))}") reply = format_confirmation_message(result) reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar." else: