From 3efe51e6ec971ea195ad5431ac10af883d563a2d Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Thu, 4 Jun 2026 12:34:28 +0200 Subject: [PATCH] refactor(agents): move filesystem_state, path_resolver, sandbox to app/agents/shared (slice 3b) Relocate three leaf filesystem-cluster modules to the shared kernel and flip all 38 importers. No re-export shims needed (no frozen single-agent importer). This also resolves the pre-existing shared->new_chat back-edge from shared/receipt_command.py onto filesystem_state. filesystem_backends is intentionally deferred to slice 5: it depends on new_chat middleware (kb_postgres_backend, multi_root_local_folder_backend) that have not yet moved, so relocating it now would create a shared->new_chat edge. --- .../middleware/shared/filesystem/middleware/middleware.py | 4 ++-- .../middleware/shared/filesystem/middleware/mode.py | 2 +- .../shared/filesystem/middleware/namespace_policy.py | 4 ++-- .../shared/filesystem/middleware/path_resolution.py | 2 +- .../middleware/shared/filesystem/tools/cd/index.py | 4 ++-- .../middleware/shared/filesystem/tools/edit_file/index.py | 2 +- .../shared/filesystem/tools/execute_code/helpers.py | 4 ++-- .../shared/filesystem/tools/execute_code/index.py | 2 +- .../middleware/shared/filesystem/tools/list_tree/index.py | 2 +- .../middleware/shared/filesystem/tools/ls/index.py | 2 +- .../middleware/shared/filesystem/tools/mkdir/index.py | 4 ++-- .../middleware/shared/filesystem/tools/move_file/helpers.py | 4 ++-- .../middleware/shared/filesystem/tools/move_file/index.py | 2 +- .../middleware/shared/filesystem/tools/pwd/index.py | 2 +- .../middleware/shared/filesystem/tools/read_file/index.py | 2 +- .../middleware/shared/filesystem/tools/rm/helpers.py | 4 ++-- .../middleware/shared/filesystem/tools/rm/index.py | 2 +- .../middleware/shared/filesystem/tools/rmdir/helpers.py | 4 ++-- .../middleware/shared/filesystem/tools/rmdir/index.py | 2 +- .../middleware/shared/filesystem/tools/write_file/index.py | 2 +- .../middleware/shared/kb_context_projection.py | 2 +- surfsense_backend/app/agents/new_chat/mention_resolver.py | 2 +- .../app/agents/new_chat/middleware/anonymous_document.py | 4 ++-- .../app/agents/new_chat/middleware/filesystem.py | 6 +++--- .../app/agents/new_chat/middleware/kb_persistence.py | 4 ++-- .../app/agents/new_chat/middleware/kb_postgres_backend.py | 2 +- .../app/agents/new_chat/middleware/knowledge_search.py | 4 ++-- .../app/agents/new_chat/middleware/knowledge_tree.py | 4 ++-- .../app/agents/{new_chat => shared}/filesystem_state.py | 0 .../app/agents/{new_chat => shared}/path_resolver.py | 0 surfsense_backend/app/agents/shared/receipt_command.py | 4 ++-- .../app/agents/{new_chat => shared}/sandbox.py | 0 surfsense_backend/app/routes/documents_routes.py | 2 +- surfsense_backend/app/routes/new_chat_routes.py | 2 +- surfsense_backend/app/routes/sandbox_routes.py | 4 ++-- surfsense_backend/app/services/revert_service.py | 2 +- surfsense_backend/app/tasks/chat/stream_new_chat.py | 2 +- .../app/tasks/chat/streaming/flows/new_chat/orchestrator.py | 2 +- .../tests/unit/agents/new_chat/test_mention_resolver.py | 2 +- .../tests/unit/agents/new_chat/test_path_resolver.py | 2 +- .../tests/unit/middleware/test_knowledge_tree.py | 4 ++-- 41 files changed, 55 insertions(+), 55 deletions(-) rename surfsense_backend/app/agents/{new_chat => shared}/filesystem_state.py (100%) rename surfsense_backend/app/agents/{new_chat => shared}/path_resolver.py (100%) rename surfsense_backend/app/agents/{new_chat => shared}/sandbox.py (100%) diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/middleware.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/middleware.py index 21f6e236f..07e02ecc9 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/middleware.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/middleware.py @@ -8,8 +8,8 @@ from deepagents import FilesystemMiddleware from langchain_core.tools import BaseTool from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.sandbox import is_sandbox_enabled +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.sandbox import is_sandbox_enabled from ..system_prompt import build_system_prompt from ..tools import ( diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/mode.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/mode.py index e5d49ca8e..6baf0375b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/mode.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/mode.py @@ -3,7 +3,7 @@ from __future__ import annotations from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.path_resolver import DOCUMENTS_ROOT def is_cloud(mode: FilesystemMode) -> bool: diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/namespace_policy.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/namespace_policy.py index 539050414..f3d1e5fc3 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/namespace_policy.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/namespace_policy.py @@ -11,8 +11,8 @@ from typing import TYPE_CHECKING from langchain.tools import ToolRuntime -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from ..shared.paths import TEMP_PREFIX, basename from .mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/path_resolution.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/path_resolution.py index a45bce8c4..d01da8074 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/path_resolution.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/middleware/path_resolution.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING from langchain.tools import ToolRuntime from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.multi_root_local_folder_backend import ( MultiRootLocalFolderBackend, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/cd/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/cd/index.py index 8df6b9edb..3fb0f380b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/cd/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/cd/index.py @@ -10,8 +10,8 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from ...middleware.async_dispatch import run_async_blocking from ...middleware.path_resolution import resolve_relative diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/edit_file/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/edit_file/index.py index 324ef09b0..675d36077 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/edit_file/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/edit_file/index.py @@ -11,7 +11,7 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend from ...middleware.async_dispatch import run_async_blocking diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/helpers.py index cda9f535d..b3cf3f999 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/helpers.py @@ -14,8 +14,8 @@ from typing import TYPE_CHECKING from daytona.common.errors import DaytonaError from langchain.tools import ToolRuntime -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.sandbox import ( +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.sandbox import ( _evict_sandbox_cache, delete_sandbox, get_or_create_sandbox, diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/index.py index 2711636e4..ea981ba31 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/execute_code/index.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Annotated from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.async_dispatch import run_async_blocking from .description import select_description diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/list_tree/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/list_tree/index.py index 8bad88a74..ca15d0160 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/list_tree/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/list_tree/index.py @@ -9,7 +9,7 @@ from deepagents.backends.utils import validate_path from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend from ...middleware.async_dispatch import run_async_blocking diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/ls/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/ls/index.py index 70f31dd04..cec881e8b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/ls/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/ls/index.py @@ -8,7 +8,7 @@ from deepagents.backends.utils import validate_path from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import paginate_listing from ...middleware.async_dispatch import run_async_blocking diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/mkdir/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/mkdir/index.py index 788381faa..f9d86cd01 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/mkdir/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/mkdir/index.py @@ -11,8 +11,8 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from ...middleware.async_dispatch import run_async_blocking from ...middleware.mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/helpers.py index 22c0c2524..b82e825cb 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/helpers.py @@ -8,9 +8,9 @@ from langchain.tools import ToolRuntime from langchain_core.messages import ToolMessage from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.state_reducers import _CLEAR if TYPE_CHECKING: diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/index.py index d90535990..6c66aa4a1 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/move_file/index.py @@ -11,7 +11,7 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.async_dispatch import run_async_blocking from ...middleware.mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/pwd/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/pwd/index.py index c15b67114..eea69b5bd 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/pwd/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/pwd/index.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.path_resolution import current_cwd from .description import select_description diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/read_file/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/read_file/index.py index 8b0a1a1c8..e922ec417 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/read_file/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/read_file/index.py @@ -10,7 +10,7 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend from ...middleware.async_dispatch import run_async_blocking diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/helpers.py index 4019bc9e9..82706a6b2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/helpers.py @@ -12,9 +12,9 @@ from langchain.tools import ToolRuntime from langchain_core.messages import ToolMessage from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.state_reducers import _CLEAR if TYPE_CHECKING: diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/index.py index 0c4e2fc71..49e597cb0 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rm/index.py @@ -9,7 +9,7 @@ from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.async_dispatch import run_async_blocking from ...middleware.mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/helpers.py index 9daa99aec..79b3c3488 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/helpers.py @@ -13,9 +13,9 @@ from langchain.tools import ToolRuntime from langchain_core.messages import ToolMessage from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import KBPostgresBackend -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.state_reducers import _CLEAR from ...middleware.path_resolution import current_cwd diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/index.py index cdf057353..a1c2da690 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/rmdir/index.py @@ -9,7 +9,7 @@ from langchain.tools import ToolRuntime from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.async_dispatch import run_async_blocking from ...middleware.mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/write_file/index.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/write_file/index.py index a42f7ed62..1a4674db2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/write_file/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem/tools/write_file/index.py @@ -11,7 +11,7 @@ from langchain_core.messages import ToolMessage from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from ...middleware.async_dispatch import run_async_blocking from ...middleware.mode import is_cloud diff --git a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/kb_context_projection.py b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/kb_context_projection.py index 2685d8a9b..dcb984be6 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/kb_context_projection.py +++ b/surfsense_backend/app/agents/multi_agent_chat/middleware/shared/kb_context_projection.py @@ -9,7 +9,7 @@ from langchain.agents.middleware import AgentMiddleware, AgentState from langchain_core.messages import SystemMessage from langgraph.runtime import Runtime -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.knowledge_search import _render_priority_message from app.utils.perf import get_perf_logger diff --git a/surfsense_backend/app/agents/new_chat/mention_resolver.py b/surfsense_backend/app/agents/new_chat/mention_resolver.py index f13dbc6ae..6ce5a784b 100644 --- a/surfsense_backend/app/agents/new_chat/mention_resolver.py +++ b/surfsense_backend/app/agents/new_chat/mention_resolver.py @@ -36,7 +36,7 @@ from dataclasses import dataclass, field from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, build_path_index, doc_to_virtual_path, diff --git a/surfsense_backend/app/agents/new_chat/middleware/anonymous_document.py b/surfsense_backend/app/agents/new_chat/middleware/anonymous_document.py index 2893d2e11..8206ac221 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/anonymous_document.py +++ b/surfsense_backend/app/agents/new_chat/middleware/anonymous_document.py @@ -24,8 +24,8 @@ from typing import Any from langchain.agents.middleware import AgentMiddleware, AgentState from langgraph.runtime import Runtime -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT, safe_filename +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import DOCUMENTS_ROOT, safe_filename logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/new_chat/middleware/filesystem.py b/surfsense_backend/app/agents/new_chat/middleware/filesystem.py index b3801c50e..befd69da4 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/filesystem.py +++ b/surfsense_backend/app/agents/new_chat/middleware/filesystem.py @@ -47,7 +47,7 @@ from langchain_core.tools import BaseTool, StructuredTool from langgraph.types import Command from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.filesystem_state import SurfSenseFilesystemState from app.agents.new_chat.middleware.kb_postgres_backend import ( KBPostgresBackend, paginate_listing, @@ -55,8 +55,8 @@ from app.agents.new_chat.middleware.kb_postgres_backend import ( from app.agents.new_chat.middleware.multi_root_local_folder_backend import ( MultiRootLocalFolderBackend, ) -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT -from app.agents.new_chat.sandbox import ( +from app.agents.shared.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.sandbox import ( _evict_sandbox_cache, delete_sandbox, get_or_create_sandbox, diff --git a/surfsense_backend/app/agents/new_chat/middleware/kb_persistence.py b/surfsense_backend/app/agents/new_chat/middleware/kb_persistence.py index 0e3458980..bea2c4636 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/kb_persistence.py +++ b/surfsense_backend/app/agents/new_chat/middleware/kb_persistence.py @@ -47,8 +47,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.agents.shared.feature_flags import get_flags from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, parse_documents_path, safe_folder_segment, diff --git a/surfsense_backend/app/agents/new_chat/middleware/kb_postgres_backend.py b/surfsense_backend/app/agents/new_chat/middleware/kb_postgres_backend.py index 7cf3bf8cd..b63f5f2e7 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/kb_postgres_backend.py +++ b/surfsense_backend/app/agents/new_chat/middleware/kb_postgres_backend.py @@ -43,7 +43,7 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.agents.new_chat.document_xml import build_document_xml -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, build_path_index, doc_to_virtual_path, diff --git a/surfsense_backend/app/agents/new_chat/middleware/knowledge_search.py b/surfsense_backend/app/agents/new_chat/middleware/knowledge_search.py index aff8fa4ce..376581ec5 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/knowledge_search.py +++ b/surfsense_backend/app/agents/new_chat/middleware/knowledge_search.py @@ -43,8 +43,8 @@ from sqlalchemy import select from app.agents.shared.feature_flags import get_flags from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import ( PathIndex, build_path_index, doc_to_virtual_path, diff --git a/surfsense_backend/app/agents/new_chat/middleware/knowledge_tree.py b/surfsense_backend/app/agents/new_chat/middleware/knowledge_tree.py index fe69f2bc3..cea6d8835 100644 --- a/surfsense_backend/app/agents/new_chat/middleware/knowledge_tree.py +++ b/surfsense_backend/app/agents/new_chat/middleware/knowledge_tree.py @@ -34,8 +34,8 @@ from langgraph.runtime import Runtime from sqlalchemy import select from app.agents.shared.filesystem_selection import FilesystemMode -from app.agents.new_chat.filesystem_state import SurfSenseFilesystemState -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.filesystem_state import SurfSenseFilesystemState +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, PathIndex, build_path_index, diff --git a/surfsense_backend/app/agents/new_chat/filesystem_state.py b/surfsense_backend/app/agents/shared/filesystem_state.py similarity index 100% rename from surfsense_backend/app/agents/new_chat/filesystem_state.py rename to surfsense_backend/app/agents/shared/filesystem_state.py diff --git a/surfsense_backend/app/agents/new_chat/path_resolver.py b/surfsense_backend/app/agents/shared/path_resolver.py similarity index 100% rename from surfsense_backend/app/agents/new_chat/path_resolver.py rename to surfsense_backend/app/agents/shared/path_resolver.py diff --git a/surfsense_backend/app/agents/shared/receipt_command.py b/surfsense_backend/app/agents/shared/receipt_command.py index f1c269e90..f49f9183f 100644 --- a/surfsense_backend/app/agents/shared/receipt_command.py +++ b/surfsense_backend/app/agents/shared/receipt_command.py @@ -6,7 +6,7 @@ participate in the verification teaching from ``multi_agent_chat/subagents/shared/snippets/verifiable_handle.md`` those tools now also need to write a :class:`Receipt` into the parent's ``state['receipts']`` list (declared on -:class:`~app.agents.new_chat.filesystem_state.SurfSenseFilesystemState` +:class:`~app.agents.shared.filesystem_state.SurfSenseFilesystemState` and backed by the append reducer). :func:`with_receipt` wraps both behaviours: it returns the tool payload as @@ -51,7 +51,7 @@ def with_receipt( """Return a Command that ships ``payload`` as a ToolMessage AND appends ``receipt``. The append happens via the ``_list_append_reducer`` on the ``receipts`` - field of :class:`~app.agents.new_chat.filesystem_state.SurfSenseFilesystemState`, + field of :class:`~app.agents.shared.filesystem_state.SurfSenseFilesystemState`, so concurrent subagent batches (item 4 in the plan) won't clobber each other's receipts. """ diff --git a/surfsense_backend/app/agents/new_chat/sandbox.py b/surfsense_backend/app/agents/shared/sandbox.py similarity index 100% rename from surfsense_backend/app/agents/new_chat/sandbox.py rename to surfsense_backend/app/agents/shared/sandbox.py diff --git a/surfsense_backend/app/routes/documents_routes.py b/surfsense_backend/app/routes/documents_routes.py index 4501f2111..5e9f0b198 100644 --- a/surfsense_backend/app/routes/documents_routes.py +++ b/surfsense_backend/app/routes/documents_routes.py @@ -7,7 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from sqlalchemy.orm import selectinload -from app.agents.new_chat.path_resolver import virtual_path_to_doc +from app.agents.shared.path_resolver import virtual_path_to_doc from app.db import ( Chunk, Document, diff --git a/surfsense_backend/app/routes/new_chat_routes.py b/surfsense_backend/app/routes/new_chat_routes.py index 4fd2712d9..f69394cdd 100644 --- a/surfsense_backend/app/routes/new_chat_routes.py +++ b/surfsense_backend/app/routes/new_chat_routes.py @@ -476,7 +476,7 @@ async def _revert_turns_for_regenerate( def _try_delete_sandbox(thread_id: int) -> None: """Fire-and-forget sandbox + local file deletion so the HTTP response isn't blocked.""" - from app.agents.new_chat.sandbox import ( + from app.agents.shared.sandbox import ( delete_local_sandbox_files, delete_sandbox, is_sandbox_enabled, diff --git a/surfsense_backend/app/routes/sandbox_routes.py b/surfsense_backend/app/routes/sandbox_routes.py index f656e8d76..abbc85c14 100644 --- a/surfsense_backend/app/routes/sandbox_routes.py +++ b/surfsense_backend/app/routes/sandbox_routes.py @@ -51,7 +51,7 @@ async def download_sandbox_file( ): """Download a file from the Daytona sandbox associated with a chat thread.""" - from app.agents.new_chat.sandbox import get_or_create_sandbox, is_sandbox_enabled + from app.agents.shared.sandbox import get_or_create_sandbox, is_sandbox_enabled if not is_sandbox_enabled(): raise HTTPException(status_code=404, detail="Sandbox is not enabled") @@ -71,7 +71,7 @@ async def download_sandbox_file( "You don't have permission to access files in this thread", ) - from app.agents.new_chat.sandbox import get_local_sandbox_file + from app.agents.shared.sandbox import get_local_sandbox_file # Prefer locally-persisted copy (sandbox may already be deleted) local_content = get_local_sandbox_file(thread_id, path) diff --git a/surfsense_backend/app/services/revert_service.py b/surfsense_backend/app/services/revert_service.py index 60f6503aa..136afe45f 100644 --- a/surfsense_backend/app/services/revert_service.py +++ b/surfsense_backend/app/services/revert_service.py @@ -38,7 +38,7 @@ from typing import Any, Literal from sqlalchemy import delete, select from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, safe_filename, safe_folder_segment, diff --git a/surfsense_backend/app/tasks/chat/stream_new_chat.py b/surfsense_backend/app/tasks/chat/stream_new_chat.py index 97243ef60..2772fd588 100644 --- a/surfsense_backend/app/tasks/chat/stream_new_chat.py +++ b/surfsense_backend/app/tasks/chat/stream_new_chat.py @@ -2175,7 +2175,7 @@ async def stream_new_chat( # remain downloadable after the Daytona sandbox auto-deletes. if stream_result and stream_result.sandbox_files: with contextlib.suppress(Exception): - from app.agents.new_chat.sandbox import ( + from app.agents.shared.sandbox import ( is_sandbox_enabled, persist_and_delete_sandbox, ) 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 b5afc8371..984115e88 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 @@ -833,7 +833,7 @@ async def stream_new_chat( # downloadable after the Daytona sandbox auto-deletes. if stream_result and stream_result.sandbox_files: with contextlib.suppress(Exception): - from app.agents.new_chat.sandbox import ( + from app.agents.shared.sandbox import ( is_sandbox_enabled, persist_and_delete_sandbox, ) 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 1f8d35841..f7fecb00e 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 @@ -22,7 +22,7 @@ from app.agents.new_chat.mention_resolver import ( resolve_mentions, substitute_in_text, ) -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT, PathIndex +from app.agents.shared.path_resolver import DOCUMENTS_ROOT, PathIndex from app.schemas.new_chat import MentionedDocumentInfo pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_path_resolver.py b/surfsense_backend/tests/unit/agents/new_chat/test_path_resolver.py index ac6f61767..5a4e8ac64 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_path_resolver.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_path_resolver.py @@ -7,7 +7,7 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from app.agents.new_chat.path_resolver import ( +from app.agents.shared.path_resolver import ( DOCUMENTS_ROOT, PathIndex, doc_to_virtual_path, diff --git a/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py b/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py index caaec3114..741c2d980 100644 --- a/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py +++ b/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py @@ -10,7 +10,7 @@ contract cannot silently regress. from __future__ import annotations from app.agents.new_chat.middleware.knowledge_tree import KnowledgeTreeMiddleware -from app.agents.new_chat.path_resolver import DOCUMENTS_ROOT +from app.agents.shared.path_resolver import DOCUMENTS_ROOT def _compute(folder_paths: list[str], doc_paths: list[str]) -> set[str]: @@ -86,7 +86,7 @@ class TestFormatTreeRendering: folder_paths: list[str], doc_specs: list[dict], ) -> str: - from app.agents.new_chat.path_resolver import PathIndex + from app.agents.shared.path_resolver import PathIndex index = PathIndex( folder_paths={i + 1: p for i, p in enumerate(folder_paths)},