From 6f488d956487d3dc2a79735b8821fa076819767a Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Thu, 4 Jun 2026 12:52:54 +0200 Subject: [PATCH] refactor(agents): move checkpointer + mention_resolver to app/agents/shared (slice 5b) Two independent leaf modules (no intra-new_chat deps, no frozen importer), consumed only by flows/routes/tests. Flipped 8 importers across both the dotted-path and module-style (from app.agents.new_chat import mention_resolver) forms. No shims needed. --- .../app/agents/{new_chat => shared}/checkpointer.py | 0 .../app/agents/{new_chat => shared}/mention_resolver.py | 0 surfsense_backend/app/app.py | 2 +- .../app/automations/actions/builtin/agent_task/invoke.py | 2 +- surfsense_backend/app/routes/anonymous_chat_routes.py | 2 +- surfsense_backend/app/routes/new_chat_routes.py | 2 +- surfsense_backend/app/tasks/chat/stream_new_chat.py | 4 ++-- .../app/tasks/chat/streaming/flows/new_chat/input_state.py | 2 +- .../app/tasks/chat/streaming/flows/shared/pre_stream_setup.py | 4 ++-- .../tests/unit/agents/new_chat/test_mention_resolver.py | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) rename surfsense_backend/app/agents/{new_chat => shared}/checkpointer.py (100%) rename surfsense_backend/app/agents/{new_chat => shared}/mention_resolver.py (100%) diff --git a/surfsense_backend/app/agents/new_chat/checkpointer.py b/surfsense_backend/app/agents/shared/checkpointer.py similarity index 100% rename from surfsense_backend/app/agents/new_chat/checkpointer.py rename to surfsense_backend/app/agents/shared/checkpointer.py diff --git a/surfsense_backend/app/agents/new_chat/mention_resolver.py b/surfsense_backend/app/agents/shared/mention_resolver.py similarity index 100% rename from surfsense_backend/app/agents/new_chat/mention_resolver.py rename to surfsense_backend/app/agents/shared/mention_resolver.py diff --git a/surfsense_backend/app/app.py b/surfsense_backend/app/app.py index ffb159148..7990f5099 100644 --- a/surfsense_backend/app/app.py +++ b/surfsense_backend/app/app.py @@ -23,7 +23,7 @@ from starlette.requests import Request as StarletteRequest from starlette.responses import Response as StarletteResponse from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware -from app.agents.new_chat.checkpointer import ( +from app.agents.shared.checkpointer import ( close_checkpointer, setup_checkpointer_tables, ) diff --git a/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py b/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py index d8e2f2073..de0642346 100644 --- a/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py +++ b/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py @@ -12,7 +12,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.agents.multi_agent_chat import create_multi_agent_chat_deep_agent from app.agents.shared.context import SurfSenseContextSchema -from app.agents.new_chat.mention_resolver import resolve_mentions, substitute_in_text +from app.agents.shared.mention_resolver import resolve_mentions, substitute_in_text from app.db import ChatVisibility, async_session_maker from app.schemas.new_chat import MentionedDocumentInfo diff --git a/surfsense_backend/app/routes/anonymous_chat_routes.py b/surfsense_backend/app/routes/anonymous_chat_routes.py index 8072664a0..f7e84be3c 100644 --- a/surfsense_backend/app/routes/anonymous_chat_routes.py +++ b/surfsense_backend/app/routes/anonymous_chat_routes.py @@ -352,7 +352,7 @@ async def stream_anonymous_chat( from langchain_core.messages import AIMessage, HumanMessage from app.agents.new_chat.anonymous_agent import create_anonymous_chat_agent - from app.agents.new_chat.checkpointer import get_checkpointer + from app.agents.shared.checkpointer import get_checkpointer from app.db import shielded_async_session from app.services.new_streaming_service import VercelStreamingService from app.services.token_tracking_service import start_turn diff --git a/surfsense_backend/app/routes/new_chat_routes.py b/surfsense_backend/app/routes/new_chat_routes.py index f69394cdd..aa83b6847 100644 --- a/surfsense_backend/app/routes/new_chat_routes.py +++ b/surfsense_backend/app/routes/new_chat_routes.py @@ -1934,7 +1934,7 @@ async def regenerate_response( """ from langchain_core.messages import HumanMessage - from app.agents.new_chat.checkpointer import get_checkpointer + from app.agents.shared.checkpointer import get_checkpointer try: # Verify thread exists and user has permission diff --git a/surfsense_backend/app/tasks/chat/stream_new_chat.py b/surfsense_backend/app/tasks/chat/stream_new_chat.py index 22fdc1df9..323ea2736 100644 --- a/surfsense_backend/app/tasks/chat/stream_new_chat.py +++ b/surfsense_backend/app/tasks/chat/stream_new_chat.py @@ -28,7 +28,7 @@ from sqlalchemy.future import select from app.agents.multi_agent_chat import create_multi_agent_chat_deep_agent from app.agents.new_chat.chat_deepagent import create_surfsense_deep_agent -from app.agents.new_chat.checkpointer import get_checkpointer +from app.agents.shared.checkpointer import get_checkpointer from app.agents.shared.context import SurfSenseContextSchema from app.agents.shared.errors import BusyError from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection @@ -39,7 +39,7 @@ from app.agents.shared.llm_config import ( load_agent_config, load_global_llm_config_by_id, ) -from app.agents.new_chat.mention_resolver import resolve_mentions, substitute_in_text +from app.agents.shared.mention_resolver import resolve_mentions, substitute_in_text from app.agents.new_chat.middleware.busy_mutex import ( end_turn, get_cancel_state, diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py index 61371d62b..3ec015e4a 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py @@ -29,7 +29,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.mention_resolver import resolve_mentions, substitute_in_text +from app.agents.shared.mention_resolver import resolve_mentions, substitute_in_text from app.db import ( ChatVisibility, NewChatThread, diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/pre_stream_setup.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/pre_stream_setup.py index ec92306dd..316500abb 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/pre_stream_setup.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/pre_stream_setup.py @@ -4,7 +4,7 @@ from __future__ import annotations from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.checkpointer import get_checkpointer +from app.agents.shared.checkpointer import get_checkpointer from app.db import SearchSourceConnectorType from app.services.connector_service import ConnectorService @@ -33,7 +33,7 @@ async def setup_connector_and_firecrawl( async def get_chat_checkpointer(): """Resolve the PostgreSQL checkpointer for persistent conversation memory. - Thin wrapper around ``app.agents.new_chat.checkpointer.get_checkpointer`` so + Thin wrapper around ``app.agents.shared.checkpointer.get_checkpointer`` so flow orchestrators can rely on a streaming-local symbol and we have a hook point if the checkpointer source ever needs to vary per flow. """ diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py b/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py index f7fecb00e..755431ce0 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py @@ -15,8 +15,8 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from app.agents.new_chat import mention_resolver -from app.agents.new_chat.mention_resolver import ( +from app.agents.shared import mention_resolver +from app.agents.shared.mention_resolver import ( ResolvedMention, ResolvedMentionSet, resolve_mentions,