""" Spatial Atlas — A2A AgentExecutor Routes incoming A2A requests to per-context Agent instances. Follows the standard AgentBeats executor pattern. """ from a2a.server.agent_execution import AgentExecutor, RequestContext from a2a.server.events import EventQueue from a2a.server.tasks import TaskUpdater from a2a.types import ( InvalidRequestError, Task, TaskState, UnsupportedOperationError, ) from a2a.utils import ( new_agent_text_message, new_task, ) from a2a.utils.errors import ServerError from agent import Agent TERMINAL_STATES = { TaskState.completed, TaskState.canceled, TaskState.failed, TaskState.rejected, } class Executor(AgentExecutor): def __init__(self): self.agents: dict[str, Agent] = {} async def execute(self, context: RequestContext, event_queue: EventQueue) -> None: msg = context.message if not msg: raise ServerError(error=InvalidRequestError(message="Missing message in request")) task = context.current_task if task and task.status.state in TERMINAL_STATES: raise ServerError( error=InvalidRequestError( message=f"Task {task.id} already processed (state: {task.status.state})" ) ) if not task: task = new_task(msg) await event_queue.enqueue_event(task) context_id = task.context_id updater = TaskUpdater(event_queue, task.id, context_id) await updater.start_work() try: agent = self.agents.get(context_id) if not agent: agent = Agent() self.agents[context_id] = agent await agent.run(msg, updater) if not updater._terminal_state_reached: await updater.complete() except Exception as e: print(f"Task failed with agent error: {e}") await updater.failed( new_agent_text_message( f"Agent error: {e}", context_id=context_id, task_id=task.id, ) ) async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None: raise ServerError(error=UnsupportedOperationError())