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
This commit is contained in:
Marcos
2026-03-22 15:57:48 -03:00
parent b782b611a2
commit a229d1a64b

View File

@@ -45,9 +45,6 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Memória persistente da conversa (em memória RAM) # Memória persistente da conversa (em memória RAM)
chat_histories = {} chat_histories = {}
# Armazena planos pendentes de confirmação
pending_plans = {}
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE): async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not await auth_check(update): return if not await auth_check(update): return
@@ -88,17 +85,19 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
return return
if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']: if user_msg.lower() in ['sim', 'confirmar', 'confirma', 'sim!', 'confirma!', 's']:
# Verifica se há confirmação pendente # Verifica se há confirmação pendente (usa chat_id do update atual)
plan_key = f"plan_{chat_id}" if 'pending_plan' in context.bot_data:
if plan_key in pending_plans: plan = context.bot_data['pending_plan']
plan = pending_plans[plan_key] del context.bot_data['pending_plan']
del pending_plans[plan_key] # Executa o plano
# Executa o plano usando execute_plan
from orchestrator import execute_step from orchestrator import execute_step
results = [] results = []
print(f"[CONFIRM] Executando plano com {len(plan.get('steps', []))} passos")
for step in plan.get("steps", []): for step in plan.get("steps", []):
print(f"[STEP] Executando: {step.get('action')}")
result = execute_step(step) result = execute_step(step)
results.append(result) results.append(result)
print(f"[STEP RESULT] Success: {result.get('success')}, Output: {str(result.get('output'))[:100]}")
# Para em erro crítico # Para em erro crítico
if not result.get("success") and step.get("danger") == "dangerous": if not result.get("success") and step.get("danger") == "dangerous":
results.append({ results.append({
@@ -116,12 +115,14 @@ async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
reply = format_completion_message(plan_result) reply = format_completion_message(plan_result)
await update.message.reply_text(reply) await update.message.reply_text(reply)
return 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!']: if user_msg.lower() in ['nao', 'não', 'cancelar', 'cancela', 'n', 'n!']:
# Cancela confirmação pendente # Cancela confirmação pendente
plan_key = f"plan_{chat_id}" if 'pending_plan' in context.bot_data:
if plan_key in pending_plans: del context.bot_data['pending_plan']
del pending_plans[plan_key]
await update.message.reply_text("Operacao cancelada.") await update.message.reply_text("Operacao cancelada.")
return return
await update.message.reply_text("Nada pendente para cancelar.") 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: if is_orchestrator_task:
result = orchestrate(user_msg, user_confirmed=False) result = orchestrate(user_msg, user_confirmed=False)
if result["status"] == "needs_confirmation": if result["status"] == "needs_confirmation":
# Salva plano pendente # Salva plano pendente no context (persistente entre mensagens)
plan_key = f"plan_{chat_id}" context.bot_data['pending_plan'] = result["plan"]
pending_plans[plan_key] = result["plan"] print(f"[ORCH] Plano salvo. Steps: {len(result['plan'].get('steps', []))}")
reply = format_confirmation_message(result) reply = format_confirmation_message(result)
reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar." reply += "\n\nResponda *sim* para confirmar ou *nao* para cancelar."
else: else: