diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/__init__.py new file mode 100644 index 000000000..17c33b8ab --- /dev/null +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/__init__.py @@ -0,0 +1,25 @@ +"""Per-turn cooperative busy-lock middleware + cancel primitives (main-agent).""" + +from .builder import build_busy_mutex_mw +from .middleware import ( + BusyMutexMiddleware, + end_turn, + get_cancel_event, + get_cancel_state, + is_cancel_requested, + manager, + request_cancel, + reset_cancel, +) + +__all__ = [ + "BusyMutexMiddleware", + "build_busy_mutex_mw", + "end_turn", + "get_cancel_event", + "get_cancel_state", + "is_cancel_requested", + "manager", + "request_cancel", + "reset_cancel", +] diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex.py b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/builder.py similarity index 85% rename from surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/builder.py index c550a1207..0daf87e0b 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/builder.py @@ -3,10 +3,11 @@ from __future__ import annotations from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import ( +from app.agents.chat.multi_agent_chat.shared.middleware.flags import enabled + +from .middleware import ( BusyMutexMiddleware, ) -from app.agents.chat.multi_agent_chat.shared.middleware.flags import enabled def build_busy_mutex_mw(flags: AgentFeatureFlags) -> BusyMutexMiddleware | None: diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/busy_mutex.py b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/middleware.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/busy_mutex.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/busy_mutex/middleware.py diff --git a/surfsense_backend/app/routes/new_chat_routes.py b/surfsense_backend/app/routes/new_chat_routes.py index 5b63ce52b..0e4e557be 100644 --- a/surfsense_backend/app/routes/new_chat_routes.py +++ b/surfsense_backend/app/routes/new_chat_routes.py @@ -24,18 +24,18 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy.orm import selectinload +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import ( + get_cancel_state, + is_cancel_requested, + manager, + request_cancel, +) from app.agents.chat.multi_agent_chat.shared.filesystem_selection import ( ClientPlatform, FilesystemMode, FilesystemSelection, LocalFilesystemMount, ) -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import ( - get_cancel_state, - is_cancel_requested, - manager, - request_cancel, -) from app.config import config from app.db import ( ChatComment, diff --git a/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py b/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py index 6ae5af40f..6b37df343 100644 --- a/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py +++ b/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py @@ -7,7 +7,7 @@ import logging import time from typing import Any, Literal -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import ( +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import ( get_cancel_state, is_cancel_requested, ) diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/orchestrator.py b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/orchestrator.py index 3ab36680e..e33dca376 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/orchestrator.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/orchestrator.py @@ -30,11 +30,11 @@ from typing import Any, Literal import anyio from app.agents.chat.multi_agent_chat import create_multi_agent_chat_deep_agent +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import end_turn from app.agents.chat.multi_agent_chat.shared.filesystem_selection import ( FilesystemMode, FilesystemSelection, ) -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import end_turn from app.db import ChatVisibility, async_session_maker from app.observability import otel as ot from app.services.new_streaming_service import VercelStreamingService diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py b/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py index 327a2376e..6d0924850 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py @@ -24,11 +24,11 @@ from uuid import UUID import anyio from app.agents.chat.multi_agent_chat import create_multi_agent_chat_deep_agent +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import end_turn from app.agents.chat.multi_agent_chat.shared.filesystem_selection import ( FilesystemMode, FilesystemSelection, ) -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import end_turn from app.db import ChatVisibility, async_session_maker from app.observability import otel as ot from app.services.chat_session_state_service import set_ai_responding diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py index b059828bf..29018fe07 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py @@ -17,7 +17,7 @@ from typing import Literal from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import end_turn +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import end_turn from app.observability import otel as ot from app.services.auto_model_pin_service import ( mark_runtime_cooldown, diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py b/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py index c9ce67206..5a39c6e66 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py @@ -4,7 +4,7 @@ from __future__ import annotations import pytest -from app.agents.chat.multi_agent_chat.shared.middleware.busy_mutex import ( +from app.agents.chat.multi_agent_chat.main_agent.middleware.busy_mutex import ( BusyMutexMiddleware, end_turn, get_cancel_event,