Reconexión: persistir 'executing' + objetivo al inicio del turno
Para que un reattach (tras recargar el frontend a mitad de turno) detecte que hay un turno en curso, se persiste status=EXECUTING + current_objective ANTES de la ejecución larga (el estado final lo sigue guardando el finally). Además get_session expone el objetivo desde metadata mientras status==executing, ya que current_task aún no está persistido durante el turno. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -414,6 +414,16 @@ async def _execute_and_persist(orchestrator, storage, session, message, attachme
|
|||||||
"status": "busy",
|
"status": "busy",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Persistir 'executing' + el objetivo ANTES de la ejecución larga, para que
|
||||||
|
# un reattach (tras recargar el frontend a mitad de turno) detecte que hay
|
||||||
|
# un turno en curso. El estado final lo guarda el `finally`.
|
||||||
|
try:
|
||||||
|
session.status = SessionStatus.EXECUTING
|
||||||
|
session.metadata["current_objective"] = message
|
||||||
|
await storage.update_session(session)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("No se pudo persistir 'executing' al arrancar: %s", e)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await orchestrator.process_message(session, message, attachments)
|
result = await orchestrator.process_message(session, message, attachments)
|
||||||
return result
|
return result
|
||||||
@@ -578,11 +588,20 @@ async def get_session(session_id: str) -> SessionResponse:
|
|||||||
"status": plan.get("status", "active"),
|
"status": plan.get("status", "active"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Durante el turno el current_task aún no está persistido (begin_task corre en
|
||||||
|
# process_message; solo se guarda en el finally). Para que un reattach sepa el
|
||||||
|
# objetivo, lo exponemos desde metadata mientras status==executing.
|
||||||
|
ct = session.current_task.model_dump() if session.current_task else None
|
||||||
|
if ct is None and session.status == SessionStatus.EXECUTING:
|
||||||
|
_obj = session.metadata.get("current_objective")
|
||||||
|
if _obj:
|
||||||
|
ct = {"objective": _obj}
|
||||||
|
|
||||||
return SessionResponse(
|
return SessionResponse(
|
||||||
session_id=session.session_id,
|
session_id=session.session_id,
|
||||||
status=session.status.value,
|
status=session.status.value,
|
||||||
turn_count=session.turn_count,
|
turn_count=session.turn_count,
|
||||||
current_task=session.current_task.model_dump() if session.current_task else None,
|
current_task=ct,
|
||||||
completed_tasks=session.completed_tasks,
|
completed_tasks=session.completed_tasks,
|
||||||
created_at=session.created_at.isoformat(),
|
created_at=session.created_at.isoformat(),
|
||||||
updated_at=session.updated_at.isoformat(),
|
updated_at=session.updated_at.isoformat(),
|
||||||
|
|||||||
Reference in New Issue
Block a user