From 8710524f2b0c03d4dbf273924be044929df40f67 Mon Sep 17 00:00:00 2001 From: chengyongru Date: Sat, 9 May 2026 15:32:58 +0800 Subject: [PATCH] refactor(loop): add TurnState and TurnContext --- nanobot/agent/loop.py | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/nanobot/agent/loop.py b/nanobot/agent/loop.py index 662c29a45..c1fe1dee3 100644 --- a/nanobot/agent/loop.py +++ b/nanobot/agent/loop.py @@ -8,6 +8,8 @@ import json import os import time from contextlib import AsyncExitStack, nullcontext, suppress +from dataclasses import dataclass, field +from enum import Enum, auto from pathlib import Path from typing import TYPE_CHECKING, Any, Awaitable, Callable @@ -182,6 +184,48 @@ class _LoopHook(AgentHook): return self._loop._strip_think(content) +class TurnState(Enum): + RESTORE = auto() + COMPACT = auto() + COMMAND = auto() + BUILD = auto() + RUN = auto() + SAVE = auto() + RESPOND = auto() + DONE = auto() + + +@dataclass +class TurnContext: + msg: InboundMessage + session: Session + session_key: str + state: TurnState + + history: list[dict[str, Any]] = field(default_factory=list) + initial_messages: list[dict[str, Any]] = field(default_factory=list) + + final_content: str | None = None + tools_used: list[str] = field(default_factory=list) + all_messages: list[dict[str, Any]] = field(default_factory=list) + stop_reason: str = "" + had_injections: bool = False + + user_persisted_early: bool = False + save_skip: int = 0 + + outbound: OutboundMessage | None = None + generated_media: list[str] = field(default_factory=list) + + on_progress: Callable[..., Awaitable[None]] | None = None + on_stream: Callable[[str], Awaitable[None]] | None = None + on_stream_end: Callable[..., Awaitable[None]] | None = None + on_retry_wait: Callable[[str], Awaitable[None]] | None = None + + pending_queue: asyncio.Queue | None = None + pending_summary: Any = None + + class AgentLoop: """ The agent loop is the core processing engine.