refactor(agents): group filesystem backends under filesystem/backends/

The concrete filesystem backends are consumed only by the MAC filesystem
layer (tools, path-resolution middleware, the resolver, skills backend) and
tests -- no external app code. Group them next to the filesystem middleware
they serve:

- filesystem_backends.py            -> filesystem/backends/resolver.py
- middleware/kb_postgres_backend.py -> filesystem/backends/kb_postgres.py
- middleware/local_folder_backend.py -> filesystem/backends/local_folder.py
- middleware/multi_root_local_folder_backend.py -> .../multi_root_local_folder.py
- document_xml.py                   -> filesystem/backends/document_xml.py

Repoint all 21 importers. No behavior change; import-all + filesystem
backend/path-resolution/knowledge-search unit tests stay green (478).
This commit is contained in:
CREDO23 2026-06-05 11:02:26 +02:00
parent f615d6b530
commit 21509e7eca
24 changed files with 70 additions and 32 deletions

View file

@ -12,6 +12,9 @@ from langchain_core.tools import BaseTool
from langgraph.types import Checkpointer from langgraph.types import Checkpointer
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.multi_agent_chat.subagents import ( from app.agents.multi_agent_chat.subagents import (
get_subagents_to_exclude, get_subagents_to_exclude,
main_prompt_registry_subagent_lines, main_prompt_registry_subagent_lines,
@ -20,7 +23,6 @@ from app.agents.multi_agent_chat.subagents.mcp_tools.index import (
load_mcp_tools_by_connector, load_mcp_tools_by_connector,
) )
from app.agents.shared.feature_flags import AgentFeatureFlags, get_flags from app.agents.shared.feature_flags import AgentFeatureFlags, get_flags
from app.agents.shared.filesystem_backends import build_backend_resolver
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from app.agents.shared.llm_config import AgentConfig from app.agents.shared.llm_config import AgentConfig
from app.agents.shared.prompt_caching import apply_litellm_prompt_caching from app.agents.shared.prompt_caching import apply_litellm_prompt_caching

View file

@ -47,7 +47,9 @@ from deepagents.backends.state import StateBackend
if TYPE_CHECKING: if TYPE_CHECKING:
from langchain.tools import ToolRuntime from langchain.tools import ToolRuntime
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -308,7 +310,7 @@ def build_skills_backend_factory(
# Imported lazily to avoid a hard dependency at module import time: # Imported lazily to avoid a hard dependency at module import time:
# ``KBPostgresBackend`` pulls in DB models, which are unnecessary for # ``KBPostgresBackend`` pulls in DB models, which are unnecessary for
# the unit-tested builtin path. # the unit-tested builtin path.
from app.agents.shared.middleware.kb_postgres_backend import ( from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend, KBPostgresBackend,
) )

View file

@ -42,7 +42,9 @@ from langchain.tools import ToolRuntime
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.document_xml import build_document_xml from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.document_xml import (
build_document_xml,
)
from app.agents.shared.path_resolver import ( from app.agents.shared.path_resolver import (
DOCUMENTS_ROOT, DOCUMENTS_ROOT,
build_path_index, build_path_index,

View file

@ -15,7 +15,9 @@ from deepagents.backends.protocol import (
WriteResult, WriteResult,
) )
from app.agents.shared.middleware.local_folder_backend import LocalFolderBackend from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.local_folder import (
LocalFolderBackend,
)
_INVALID_PATH = "invalid_path" _INVALID_PATH = "invalid_path"
_FILE_NOT_FOUND = "file_not_found" _FILE_NOT_FOUND = "file_not_found"

View file

@ -9,11 +9,13 @@ from deepagents.backends.protocol import BackendProtocol
from deepagents.backends.state import StateBackend from deepagents.backends.state import StateBackend
from langgraph.prebuilt.tool_node import ToolRuntime from langgraph.prebuilt.tool_node import ToolRuntime
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend KBPostgresBackend,
from app.agents.shared.middleware.multi_root_local_folder_backend import ( )
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.multi_root_local_folder import (
MultiRootLocalFolderBackend, MultiRootLocalFolderBackend,
) )
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
@lru_cache(maxsize=64) @lru_cache(maxsize=64)

View file

@ -7,13 +7,13 @@ from typing import TYPE_CHECKING
from langchain.tools import ToolRuntime from langchain.tools import ToolRuntime
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.multi_root_local_folder import (
MultiRootLocalFolderBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.shared.filesystem_selection import FilesystemMode from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.middleware.multi_root_local_folder_backend import (
MultiRootLocalFolderBackend,
)
from ..shared.paths import ( from ..shared.paths import (
extract_mount_from_path, extract_mount_from_path,

View file

@ -11,10 +11,12 @@ from langchain_core.messages import ToolMessage
from langchain_core.tools import BaseTool, StructuredTool from langchain_core.tools import BaseTool, StructuredTool
from langgraph.types import Command from langgraph.types import Command
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from ...middleware.async_dispatch import run_async_blocking from ...middleware.async_dispatch import run_async_blocking
from ...middleware.mode import is_cloud from ...middleware.mode import is_cloud

View file

@ -9,10 +9,12 @@ from deepagents.backends.utils import validate_path
from langchain.tools import ToolRuntime from langchain.tools import ToolRuntime
from langchain_core.tools import BaseTool, StructuredTool from langchain_core.tools import BaseTool, StructuredTool
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from ...middleware.async_dispatch import run_async_blocking from ...middleware.async_dispatch import run_async_blocking
from ...middleware.path_resolution import resolve_list_target_path from ...middleware.path_resolution import resolve_list_target_path

View file

@ -8,10 +8,12 @@ from deepagents.backends.utils import validate_path
from langchain.tools import ToolRuntime from langchain.tools import ToolRuntime
from langchain_core.tools import BaseTool, StructuredTool from langchain_core.tools import BaseTool, StructuredTool
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
paginate_listing,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.shared.middleware.kb_postgres_backend import paginate_listing
from ...middleware.async_dispatch import run_async_blocking from ...middleware.async_dispatch import run_async_blocking
from ...middleware.path_resolution import resolve_list_target_path from ...middleware.path_resolution import resolve_list_target_path

View file

@ -8,11 +8,13 @@ from langchain.tools import ToolRuntime
from langchain_core.messages import ToolMessage from langchain_core.messages import ToolMessage
from langgraph.types import Command from langgraph.types import Command
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.path_resolver import DOCUMENTS_ROOT
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -10,10 +10,12 @@ from langchain_core.messages import ToolMessage
from langchain_core.tools import BaseTool, StructuredTool from langchain_core.tools import BaseTool, StructuredTool
from langgraph.types import Command from langgraph.types import Command
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from ...middleware.async_dispatch import run_async_blocking from ...middleware.async_dispatch import run_async_blocking
from ...middleware.path_resolution import resolve_relative from ...middleware.path_resolution import resolve_relative

View file

@ -12,11 +12,13 @@ from langchain.tools import ToolRuntime
from langchain_core.messages import ToolMessage from langchain_core.messages import ToolMessage
from langgraph.types import Command from langgraph.types import Command
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.path_resolver import DOCUMENTS_ROOT
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -13,11 +13,13 @@ from langchain.tools import ToolRuntime
from langchain_core.messages import ToolMessage from langchain_core.messages import ToolMessage
from langgraph.types import Command from langgraph.types import Command
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import ( from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState, SurfSenseFilesystemState,
) )
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
from app.agents.shared.path_resolver import DOCUMENTS_ROOT from app.agents.shared.path_resolver import DOCUMENTS_ROOT
from ...middleware.path_resolution import current_cwd from ...middleware.path_resolution import current_cwd

View file

@ -23,7 +23,9 @@ from langgraph.checkpoint.memory import InMemorySaver
from app.agents.multi_agent_chat.shared.middleware.filesystem import ( from app.agents.multi_agent_chat.shared.middleware.filesystem import (
build_filesystem_mw, build_filesystem_mw,
) )
from app.agents.shared.filesystem_backends import build_backend_resolver from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from tests.integration.harness import ScriptedTurn, build_scripted_harness from tests.integration.harness import ScriptedTurn, build_scripted_harness

View file

@ -26,7 +26,9 @@ from langgraph.checkpoint.memory import InMemorySaver
from app.agents.multi_agent_chat.shared.middleware.filesystem import ( from app.agents.multi_agent_chat.shared.middleware.filesystem import (
build_filesystem_mw, build_filesystem_mw,
) )
from app.agents.shared.filesystem_backends import build_backend_resolver from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.shared.filesystem_selection import ( from app.agents.shared.filesystem_selection import (
FilesystemMode, FilesystemMode,
FilesystemSelection, FilesystemSelection,

View file

@ -20,6 +20,9 @@ from types import SimpleNamespace
import pytest import pytest
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.multi_root_local_folder import (
MultiRootLocalFolderBackend,
)
from app.agents.multi_agent_chat.shared.middleware.filesystem.middleware.mode import ( from app.agents.multi_agent_chat.shared.middleware.filesystem.middleware.mode import (
default_cwd, default_cwd,
) )
@ -33,9 +36,6 @@ from app.agents.multi_agent_chat.shared.middleware.filesystem.middleware.path_re
resolve_relative, resolve_relative,
) )
from app.agents.shared.filesystem_selection import FilesystemMode from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.middleware.multi_root_local_folder_backend import (
MultiRootLocalFolderBackend,
)
pytestmark = pytest.mark.unit pytestmark = pytest.mark.unit

View file

@ -22,10 +22,14 @@ import pytest
from app.agents.multi_agent_chat.shared.middleware.filesystem import ( from app.agents.multi_agent_chat.shared.middleware.filesystem import (
build_filesystem_mw, build_filesystem_mw,
) )
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.kb_postgres import (
KBPostgresBackend,
)
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.filesystem_backends import build_backend_resolver
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from app.agents.shared.middleware.kb_postgres_backend import KBPostgresBackend
pytestmark = pytest.mark.unit pytestmark = pytest.mark.unit

View file

@ -2,16 +2,18 @@ from pathlib import Path
import pytest import pytest
from app.agents.shared.filesystem_backends import build_backend_resolver from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.multi_root_local_folder import (
MultiRootLocalFolderBackend,
)
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.shared.filesystem_selection import ( from app.agents.shared.filesystem_selection import (
ClientPlatform, ClientPlatform,
FilesystemMode, FilesystemMode,
FilesystemSelection, FilesystemSelection,
LocalFilesystemMount, LocalFilesystemMount,
) )
from app.agents.shared.middleware.multi_root_local_folder_backend import (
MultiRootLocalFolderBackend,
)
pytestmark = pytest.mark.unit pytestmark = pytest.mark.unit

View file

@ -5,7 +5,9 @@ import json
import pytest import pytest
from langchain_core.messages import AIMessage, HumanMessage from langchain_core.messages import AIMessage, HumanMessage
from app.agents.shared.document_xml import build_document_xml as _build_document_xml from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.document_xml import (
build_document_xml as _build_document_xml,
)
from app.agents.shared.middleware.knowledge_search import ( from app.agents.shared.middleware.knowledge_search import (
KBSearchPlan, KBSearchPlan,
KnowledgeBaseSearchMiddleware, KnowledgeBaseSearchMiddleware,

View file

@ -2,7 +2,9 @@ from pathlib import Path
import pytest import pytest
from app.agents.shared.middleware.local_folder_backend import LocalFolderBackend from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.local_folder import (
LocalFolderBackend,
)
pytestmark = pytest.mark.unit pytestmark = pytest.mark.unit

View file

@ -2,7 +2,7 @@ from pathlib import Path
import pytest import pytest
from app.agents.shared.middleware.multi_root_local_folder_backend import ( from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.multi_root_local_folder import (
MultiRootLocalFolderBackend, MultiRootLocalFolderBackend,
) )