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.
This commit is contained in:
CREDO23 2026-06-04 12:34:28 +02:00
parent 1b536b8aee
commit 3efe51e6ec
41 changed files with 55 additions and 55 deletions

View file

@ -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 (

View file

@ -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:

View file

@ -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

View file

@ -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,
)

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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__)

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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.
"""

View file

@ -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,

View file

@ -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,

View file

@ -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)

View file

@ -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,

View file

@ -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,
)

View file

@ -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,
)