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
This commit is contained in:
Marcos
2026-03-22 15:38:27 -03:00
parent d7bc7df32c
commit b782b611a2

View File

@@ -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: