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:
43
bot_logic.py
43
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:
|
||||
|
||||
Reference in New Issue
Block a user