refactor(agents): move mac-only modules out of the cross-agent shared kernel

app/agents/shared/ is a sibling of anonymous_chat/podcaster/multi_agent_chat/
video_presentation, so it should only hold code shared across 2+ of those
agents. In practice podcaster and video_presentation import nothing from it,
and anonymous_chat needs only context + compaction + retry_after + web_search.
Everything else was multi_agent_chat-only (the boundary just passes through).

Move the multi_agent_chat-only cluster into multi_agent_chat/shared/ (files
moved verbatim via git rename; ~116 import sites rewritten):

  errors, feature_flags, filesystem_selection, path_resolver, prompt_caching,
  sandbox, llm_config, mention_resolver
  middleware/busy_mutex, middleware/kb_persistence

busy_mutex/llm_config/mention_resolver are boundary-only but import the moved
modules, so they were folded in to avoid a backwards shared -> multi_agent_chat
dependency. main_agent builders now import the impls directly; the shared
middleware barrel keeps only the genuinely-shared compaction + retry_after.

Also delete the dead leftover shared/plugins and shared/skills dirs (live
copies already live under main_agent/).

Remaining in app/agents/shared/: context, system_prompt(+prompts), checkpointer,
middleware/{compaction,retry_after,dedup_tool_calls}, tools/. checkpointer and
system_prompt are boundary-only infra pending a dedicated home decision.
This commit is contained in:
CREDO23 2026-06-05 12:30:15 +02:00
parent c0c4f57f5d
commit 82c5dc5b02
126 changed files with 238 additions and 196 deletions

View file

@ -14,9 +14,9 @@ from langgraph.types import Checkpointer
from app.agents.multi_agent_chat.main_agent.middleware.stack import (
build_main_agent_deepagent_middleware,
)
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.shared.context import SurfSenseContextSchema
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.filesystem_selection import FilesystemMode
from app.db import ChatVisibility

View file

@ -4,8 +4,8 @@ from __future__ import annotations
import logging
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import ActionLogMiddleware

View file

@ -34,7 +34,7 @@ from langchain.agents.middleware import AgentMiddleware
from langchain_core.callbacks import adispatch_custom_event
from langchain_core.messages import ToolMessage
from app.agents.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
if TYPE_CHECKING: # pragma: no cover - type-only
from langchain.agents.middleware.types import ToolCallRequest

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from .middleware import AnonymousDocumentMiddleware

View file

@ -24,10 +24,13 @@ from typing import Any
from langchain.agents.middleware import AgentMiddleware, AgentState
from langgraph.runtime import Runtime
from app.agents.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
safe_filename,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.shared.path_resolver import DOCUMENTS_ROOT, safe_filename
logger = logging.getLogger(__name__)

View file

@ -2,9 +2,8 @@
from __future__ import annotations
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.middleware import BusyMutexMiddleware
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.busy_mutex import BusyMutexMiddleware
from app.agents.multi_agent_chat.shared.middleware.flags import enabled

View file

@ -10,8 +10,8 @@ from langchain_core.tools import BaseTool
from app.agents.multi_agent_chat.main_agent.context_prune.prune_tool_names import (
safe_exclude_tools,
)
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import (
ClearToolUsesEdit,

View file

@ -2,8 +2,8 @@
from __future__ import annotations
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import DoomLoopMiddleware

View file

@ -2,8 +2,10 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.middleware import KnowledgeBasePersistenceMiddleware
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.kb_persistence import (
KnowledgeBasePersistenceMiddleware,
)
def build_kb_persistence_mw(

View file

@ -4,10 +4,10 @@ from __future__ import annotations
from langchain_core.language_models import BaseChatModel
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.knowledge_search import (
KnowledgePriorityMiddleware,
)
from app.agents.shared.filesystem_selection import FilesystemMode
from app.services.llm_service import get_planner_llm

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from langchain_core.language_models import BaseChatModel
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from .middleware import KnowledgeTreeMiddleware

View file

@ -33,16 +33,16 @@ from langchain_core.messages import SystemMessage
from langgraph.runtime import Runtime
from sqlalchemy import select
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.path_resolver import (
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
PathIndex,
build_path_index,
doc_to_virtual_path,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.db import Document, shielded_async_session
from app.utils.perf import get_perf_logger

View file

@ -2,8 +2,8 @@
from __future__ import annotations
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import NoopInjectionMiddleware

View file

@ -2,8 +2,8 @@
from __future__ import annotations
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import OtelSpanMiddleware

View file

@ -7,8 +7,8 @@ from typing import Any
from langchain_core.language_models import BaseChatModel
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.db import ChatVisibility
from ..plugins.loader import (

View file

@ -6,9 +6,9 @@ import logging
from deepagents.middleware.skills import SkillsMiddleware
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.filesystem_selection import FilesystemMode
from ..skills.backends import build_skills_backend_factory, default_skills_sources

View file

@ -20,6 +20,8 @@ from langchain_core.language_models import BaseChatModel
from langchain_core.tools import BaseTool
from langgraph.types import Checkpointer
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.anthropic_cache import (
build_anthropic_cache_mw,
)
@ -52,8 +54,6 @@ from app.agents.multi_agent_chat.subagents.builtins.knowledge_base.ask_knowledge
from app.agents.multi_agent_chat.subagents.shared.middleware.middleware_stack import (
build_subagent_middleware_stack,
)
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.filesystem_selection import FilesystemMode
from app.db import ChatVisibility
from .action_log import build_action_log_mw

View file

@ -6,8 +6,8 @@ from collections.abc import Sequence
from langchain_core.tools import BaseTool
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.flags import enabled
from app.agents.shared.feature_flags import AgentFeatureFlags
from .middleware import ToolCallNameRepairMiddleware

View file

@ -10,8 +10,8 @@ from langchain_core.language_models import BaseChatModel
from langchain_core.tools import BaseTool
from langgraph.types import Checkpointer
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.db import ChatVisibility
from ..graph.compile_graph_sync import build_compiled_agent_graph_sync

View file

@ -12,9 +12,21 @@ from langchain_core.tools import BaseTool
from langgraph.types import Checkpointer
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.multi_agent_chat.shared.feature_flags import (
AgentFeatureFlags,
get_flags,
)
from app.agents.multi_agent_chat.shared.filesystem_selection import (
FilesystemMode,
FilesystemSelection,
)
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import (
build_backend_resolver,
)
from app.agents.multi_agent_chat.shared.prompt_caching import (
apply_litellm_prompt_caching,
)
from app.agents.multi_agent_chat.subagents import (
get_subagents_to_exclude,
main_prompt_registry_subagent_lines,
@ -22,10 +34,6 @@ from app.agents.multi_agent_chat.subagents import (
from app.agents.multi_agent_chat.subagents.mcp_tools.index import (
load_mcp_tools_by_connector,
)
from app.agents.shared.feature_flags import AgentFeatureFlags, get_flags
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from app.agents.shared.llm_config import AgentConfig
from app.agents.shared.prompt_caching import apply_litellm_prompt_caching
from app.db import ChatVisibility
from app.services.connector_service import ConnectorService
from app.services.user_tool_allowlist import (

View file

@ -27,7 +27,9 @@ from litellm import get_model_info
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.prompt_caching import apply_litellm_prompt_caching
from app.agents.multi_agent_chat.shared.prompt_caching import (
apply_litellm_prompt_caching,
)
from app.services.llm_router_service import (
AUTO_MODE_ID,
ChatLiteLLMRouter,

View file

@ -36,7 +36,7 @@ from dataclasses import dataclass, field
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.path_resolver import (
from app.agents.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
build_path_index,
doc_to_virtual_path,

View file

@ -20,7 +20,7 @@ What this provides:
tools can poll to abort cooperatively. The event is reset between
turns. Tools should check ``runtime.context.cancel_event.is_set()``
in tight inner loops.
- A typed :class:`~app.agents.shared.errors.BusyError` raised when a
- A typed :class:`~app.agents.multi_agent_chat.shared.errors.BusyError` raised when a
second turn arrives while the lock is held.
Note: SurfSense's ``stream_new_chat`` is the call site that should
@ -46,7 +46,7 @@ from langchain.agents.middleware.types import (
from langgraph.config import get_config
from langgraph.runtime import Runtime
from app.agents.shared.errors import BusyError
from app.agents.multi_agent_chat.shared.errors import BusyError
logger = logging.getLogger(__name__)

View file

@ -45,7 +45,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
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.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
build_path_index,
doc_to_virtual_path,

View file

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

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from typing import Any
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from .middleware import SurfSenseFilesystemMiddleware

View file

@ -7,11 +7,11 @@ from typing import Any
from deepagents import FilesystemMiddleware
from langchain_core.tools import BaseTool
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.sandbox import is_sandbox_enabled
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.sandbox import is_sandbox_enabled
from ..system_prompt import build_system_prompt
from ..tools import (

View file

@ -2,8 +2,8 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT
def is_cloud(mode: FilesystemMode) -> bool:

View file

@ -11,10 +11,10 @@ from typing import TYPE_CHECKING
from langchain.tools import ToolRuntime
from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.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

@ -7,13 +7,13 @@ from typing import TYPE_CHECKING
from langchain.tools import ToolRuntime
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
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 (
SurfSenseFilesystemState,
)
from app.agents.shared.filesystem_selection import FilesystemMode
from ..shared.paths import (
extract_mount_from_path,

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from .cloud import BODY as CLOUD_BODY
from .common import HEADER, SANDBOX_ADDENDUM

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_DESCRIPTION = """Changes the current working directory (cwd).

View file

@ -10,10 +10,10 @@ from langchain_core.messages import ToolMessage
from langchain_core.tools import BaseTool, StructuredTool
from langgraph.types import Command
from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.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

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Performs exact string replacements in files.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_DESCRIPTION = """Executes Python code in an isolated sandbox environment.

View file

@ -14,14 +14,14 @@ from typing import TYPE_CHECKING
from daytona.common.errors import DaytonaError
from langchain.tools import ToolRuntime
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.shared.sandbox import (
from app.agents.multi_agent_chat.shared.sandbox import (
_evict_sandbox_cache,
delete_sandbox,
get_or_create_sandbox,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
if TYPE_CHECKING:
from ...middleware import SurfSenseFilesystemMiddleware

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_DESCRIPTION = """Find files matching a glob pattern.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Search for a literal text pattern across files.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Lists files/folders recursively in a single bounded call.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Lists files and directories at the given path.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Creates a directory under `/documents/`.

View file

@ -11,10 +11,10 @@ from langchain_core.messages import ToolMessage
from langchain_core.tools import BaseTool, StructuredTool
from langgraph.types import Command
from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.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

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Moves or renames a file or folder.

View file

@ -11,11 +11,11 @@ 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.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.path_resolver import DOCUMENTS_ROOT
if TYPE_CHECKING:
from ...middleware import SurfSenseFilesystemMiddleware

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_DESCRIPTION = """Prints the current working directory."""

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_DESCRIPTION = """Reads a file from the filesystem.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Deletes a single file under `/documents/`.

View file

@ -15,11 +15,11 @@ 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.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.path_resolver import DOCUMENTS_ROOT
if TYPE_CHECKING:
from ...middleware import SurfSenseFilesystemMiddleware

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Deletes an empty directory under `/documents/`.

View file

@ -16,11 +16,11 @@ 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.path_resolver import DOCUMENTS_ROOT
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.path_resolver import DOCUMENTS_ROOT
from ...middleware.path_resolution import current_cwd
from ...shared.paths import is_ancestor_of

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
_CLOUD_DESCRIPTION = """Writes a new text file to the workspace.

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
def enabled(flags: AgentFeatureFlags, attr: str) -> bool:

View file

@ -45,19 +45,19 @@ from sqlalchemy import delete, select, update
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.multi_agent_chat.shared.receipts.receipt import Receipt, make_receipt
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.agents.shared.feature_flags import get_flags
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.path_resolver import (
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
parse_documents_path,
safe_folder_segment,
virtual_path_to_doc,
)
from app.agents.multi_agent_chat.shared.receipts.receipt import Receipt, make_receipt
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR
from app.db import (
AgentActionLog,
Chunk,

View file

@ -45,16 +45,16 @@ from app.agents.multi_agent_chat.shared.date_filters import (
parse_date_or_datetime,
resolve_date_range,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.agents.shared.feature_flags import get_flags
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.path_resolver import (
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.path_resolver import (
PathIndex,
build_path_index,
doc_to_virtual_path,
)
from app.agents.multi_agent_chat.shared.state.filesystem_state import (
SurfSenseFilesystemState,
)
from app.db import (
NATIVE_TO_LEGACY_DOCTYPE,
Chunk,

View file

@ -11,8 +11,8 @@ from typing import Any
from langchain_core.messages import ToolMessage
from app.agents.multi_agent_chat.shared.errors import StreamingError
from app.agents.multi_agent_chat.shared.permissions import Rule
from app.agents.shared.errors import StreamingError
def build_deny_message(tool_call: dict[str, Any], rule: Rule) -> ToolMessage:

View file

@ -26,8 +26,8 @@ from langchain_core.messages import AIMessage, ToolMessage
from langchain_core.tools import BaseTool
from langgraph.runtime import Runtime
from app.agents.multi_agent_chat.shared.errors import CorrectedError, RejectedError
from app.agents.multi_agent_chat.shared.permissions import Ruleset
from app.agents.shared.errors import CorrectedError, RejectedError
from app.services.user_tool_allowlist import TrustedToolSaver
from ..ask.edit import merge_edited_args

View file

@ -27,8 +27,8 @@ from collections.abc import Sequence
from langchain_core.tools import BaseTool
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.services.user_tool_allowlist import TrustedToolSaver
from .core import PermissionMiddleware

View file

@ -10,7 +10,7 @@ from langchain.agents.middleware import (
ToolCallLimitMiddleware,
)
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.middleware import RetryAfterMiddleware
from .fallback import build_fallback_mw

View file

@ -4,7 +4,7 @@ from __future__ import annotations
import logging
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from ..flags import enabled
from .scoped_model_fallback import (

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from langchain.agents.middleware import ModelCallLimitMiddleware
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from ..flags import enabled

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.middleware import RetryAfterMiddleware
from ..flags import enabled

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from langchain.agents.middleware import ToolCallLimitMiddleware
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from ..flags import enabled

View file

@ -68,7 +68,7 @@ from typing import TYPE_CHECKING, Any
from langchain_core.language_models import BaseChatModel
if TYPE_CHECKING:
from app.agents.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
logger = logging.getLogger(__name__)

View file

@ -23,7 +23,7 @@ the receipt into the parent's ``receipts`` state via the append reducer.
The KB write path is the one exception: file-tool calls cannot emit a
durable receipt because the actual DB writes happen end-of-turn inside
:class:`app.agents.shared.middleware.kb_persistence.KnowledgeBasePersistenceMiddleware`.
:class:`app.agents.multi_agent_chat.shared.middleware.kb_persistence.KnowledgeBasePersistenceMiddleware`.
KB tools therefore emit a *provisional* receipt with ``status="pending"``;
the persistence middleware flips it to ``"success"`` or ``"failed"``
before returning control to the parent.

View file

@ -13,9 +13,9 @@ from deepagents import SubAgent
from langchain_core.language_models import BaseChatModel
from langchain_core.tools import BaseTool
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset
from app.agents.multi_agent_chat.subagents.shared.spec import SurfSenseSubagentSpec
from app.agents.shared.filesystem_selection import FilesystemMode
from .middleware_stack import build_kb_middleware
from .prompts import load_description, load_readonly_system_prompt, load_system_prompt

View file

@ -10,6 +10,8 @@ from typing import Any
from langchain_core.language_models import BaseChatModel
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.anthropic_cache import (
build_anthropic_cache_mw,
)
@ -29,8 +31,6 @@ from app.agents.multi_agent_chat.shared.middleware.permissions import (
build_permission_mw,
)
from app.agents.multi_agent_chat.shared.permissions import Ruleset
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.filesystem_selection import FilesystemMode
def _kb_user_allowlist(

View file

@ -2,8 +2,8 @@
from __future__ import annotations
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.subagents.shared.md_file_reader import read_md_file
from app.agents.shared.filesystem_selection import FilesystemMode
def load_system_prompt(filesystem_mode: FilesystemMode) -> str:

View file

@ -14,8 +14,7 @@ from __future__ import annotations
from typing import Any
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags
from app.agents.multi_agent_chat.shared.middleware.permissions import (
build_permission_mw,
)

View file

@ -1,21 +1,13 @@
"""Shared middleware components for the SurfSense chat agents."""
from app.agents.shared.middleware.busy_mutex import BusyMutexMiddleware
from app.agents.shared.middleware.compaction import (
SurfSenseCompactionMiddleware,
create_surfsense_compaction_middleware,
)
from app.agents.shared.middleware.kb_persistence import (
KnowledgeBasePersistenceMiddleware,
commit_staged_filesystem_state,
)
from app.agents.shared.middleware.retry_after import RetryAfterMiddleware
__all__ = [
"BusyMutexMiddleware",
"KnowledgeBasePersistenceMiddleware",
"RetryAfterMiddleware",
"SurfSenseCompactionMiddleware",
"commit_staged_filesystem_state",
"create_surfsense_compaction_middleware",
]

View file

@ -35,12 +35,12 @@ from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.middleware.dedup_tool_calls import dedup_key_full_args
from app.agents.shared.tools.hitl import request_approval
from app.agents.shared.tools.mcp.client import MCPClient
from app.agents.shared.tools.mcp.cache import (
CachedMCPTools,
read_cached_tools,
write_cached_tools,
)
from app.agents.shared.tools.mcp.client import MCPClient
from app.db import SearchSourceConnector
from app.services.mcp_oauth.registry import MCP_SERVICES, get_service_by_connector_type
from app.utils.perf import get_perf_logger

View file

@ -11,8 +11,11 @@ from langgraph.types import Command
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.multi_agent_chat import create_multi_agent_chat_deep_agent
from app.agents.multi_agent_chat.shared.mention_resolver import (
resolve_mentions,
substitute_in_text,
)
from app.agents.shared.context import SurfSenseContextSchema
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

View file

@ -39,7 +39,9 @@ def _is_premium_global(kind: ModelKind, config_id: int) -> bool:
cfg: dict | None = None
if kind == "llm":
from app.agents.shared.llm_config import load_global_llm_config_by_id
from app.agents.multi_agent_chat.shared.llm_config import (
load_global_llm_config_by_id,
)
cfg = load_global_llm_config_by_id(config_id)
elif kind == "image":

View file

@ -28,7 +28,7 @@ from pydantic import BaseModel
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
from app.db import (
AgentActionLog,
NewChatThread,

View file

@ -22,7 +22,10 @@ from dataclasses import asdict
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from app.agents.shared.feature_flags import AgentFeatureFlags, get_flags
from app.agents.multi_agent_chat.shared.feature_flags import (
AgentFeatureFlags,
get_flags,
)
from app.config import config
from app.db import User
from app.users import current_active_user

View file

@ -30,7 +30,7 @@ from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
from app.db import (
AgentPermissionRule,
NewChatThread,

View file

@ -32,7 +32,7 @@ from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.feature_flags import get_flags
from app.agents.multi_agent_chat.shared.feature_flags import get_flags
from app.db import (
AgentActionLog,
User,

View file

@ -236,7 +236,7 @@ async def stream_anonymous_chat(
detail="No-login mode is not enabled.",
)
from app.agents.shared.llm_config import (
from app.agents.multi_agent_chat.shared.llm_config import (
AgentConfig,
create_chat_litellm_from_agent_config,
)

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.shared.path_resolver import virtual_path_to_doc
from app.agents.multi_agent_chat.shared.path_resolver import virtual_path_to_doc
from app.db import (
Chunk,
Document,

View file

@ -24,13 +24,13 @@ from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy.orm import selectinload
from app.agents.shared.filesystem_selection import (
from app.agents.multi_agent_chat.shared.filesystem_selection import (
ClientPlatform,
FilesystemMode,
FilesystemSelection,
LocalFilesystemMount,
)
from app.agents.shared.middleware.busy_mutex import (
from app.agents.multi_agent_chat.shared.middleware.busy_mutex import (
get_cancel_state,
is_cancel_requested,
manager,
@ -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.shared.sandbox import (
from app.agents.multi_agent_chat.shared.sandbox import (
delete_local_sandbox_files,
delete_sandbox,
is_sandbox_enabled,

View file

@ -51,7 +51,10 @@ async def download_sandbox_file(
):
"""Download a file from the Daytona sandbox associated with a chat thread."""
from app.agents.shared.sandbox import get_or_create_sandbox, is_sandbox_enabled
from app.agents.multi_agent_chat.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 +74,7 @@ async def download_sandbox_file(
"You don't have permission to access files in this thread",
)
from app.agents.shared.sandbox import get_local_sandbox_file
from app.agents.multi_agent_chat.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

@ -204,7 +204,7 @@ async def validate_llm_config(
if litellm_params:
litellm_kwargs.update(litellm_params)
from app.agents.shared.llm_config import SanitizedChatLiteLLM
from app.agents.multi_agent_chat.shared.llm_config import SanitizedChatLiteLLM
llm = SanitizedChatLiteLLM(**litellm_kwargs)
@ -379,7 +379,9 @@ async def get_search_space_llm_instance(
if disable_streaming:
litellm_kwargs["disable_streaming"] = True
from app.agents.shared.llm_config import SanitizedChatLiteLLM
from app.agents.multi_agent_chat.shared.llm_config import (
SanitizedChatLiteLLM,
)
return SanitizedChatLiteLLM(**litellm_kwargs)
@ -458,7 +460,7 @@ async def get_search_space_llm_instance(
if disable_streaming:
litellm_kwargs["disable_streaming"] = True
from app.agents.shared.llm_config import SanitizedChatLiteLLM
from app.agents.multi_agent_chat.shared.llm_config import SanitizedChatLiteLLM
return SanitizedChatLiteLLM(**litellm_kwargs)
@ -580,7 +582,9 @@ async def get_vision_llm(
if global_cfg.get("litellm_params"):
litellm_kwargs.update(global_cfg["litellm_params"])
from app.agents.shared.llm_config import SanitizedChatLiteLLM
from app.agents.multi_agent_chat.shared.llm_config import (
SanitizedChatLiteLLM,
)
inner_llm = SanitizedChatLiteLLM(**litellm_kwargs)
@ -634,7 +638,7 @@ async def get_vision_llm(
if vision_cfg.litellm_params:
litellm_kwargs.update(vision_cfg.litellm_params)
from app.agents.shared.llm_config import SanitizedChatLiteLLM
from app.agents.multi_agent_chat.shared.llm_config import SanitizedChatLiteLLM
return SanitizedChatLiteLLM(**litellm_kwargs)
@ -679,7 +683,9 @@ def get_planner_llm() -> ChatLiteLLM | None:
Callers MUST fall back to their chat LLM when this returns ``None`` so
deployments without a planner config keep working unchanged.
"""
from app.agents.shared.llm_config import create_chat_litellm_from_config
from app.agents.multi_agent_chat.shared.llm_config import (
create_chat_litellm_from_config,
)
planner_cfg = next(
(cfg for cfg in config.GLOBAL_LLM_CONFIGS if cfg.get("is_planner") is True),

View file

@ -53,7 +53,7 @@ logger = logging.getLogger(__name__)
#
# Owned here because ``app.services.provider_capabilities`` is the
# only edge that's safe to call from ``app.config``'s YAML loader at
# class-body init time. ``app.agents.shared.llm_config`` re-exports
# class-body init time. ``app.agents.multi_agent_chat.shared.llm_config`` re-exports
# this constant under the historical ``PROVIDER_MAP`` name; placing the
# map there directly would re-introduce the
# ``app.config -> ... -> deliverables/tools/generate_image ->

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.shared.path_resolver import (
from app.agents.multi_agent_chat.shared.path_resolver import (
DOCUMENTS_ROOT,
safe_filename,
safe_folder_segment,

View file

@ -9,8 +9,8 @@ from __future__ import annotations
from typing import Any
from app.agents.shared.filesystem_selection import FilesystemSelection
from app.agents.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemSelection
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
from app.db import ChatVisibility
from app.services.connector_service import ConnectorService

View file

@ -11,8 +11,8 @@ from __future__ import annotations
from collections.abc import AsyncGenerator
from typing import Any
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.middleware.kb_persistence import (
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.middleware.kb_persistence import (
commit_staged_filesystem_state,
)
from app.services.new_streaming_service import VercelStreamingService

View file

@ -7,8 +7,8 @@ import logging
import time
from typing import Any, Literal
from app.agents.shared.errors import BusyError
from app.agents.shared.middleware.busy_mutex import (
from app.agents.multi_agent_chat.shared.errors import BusyError
from app.agents.multi_agent_chat.shared.middleware.busy_mutex import (
get_cancel_state,
is_cancel_requested,
)

View file

@ -28,8 +28,11 @@ from langchain_core.messages import HumanMessage
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.shared.mention_resolver import resolve_mentions, substitute_in_text
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.mention_resolver import (
resolve_mentions,
substitute_in_text,
)
from app.db import (
ChatVisibility,
NewChatThread,

View file

@ -15,7 +15,7 @@ tells the user what to change.
from __future__ import annotations
from app.agents.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
from app.observability import otel as ot

View file

@ -30,8 +30,11 @@ from typing import Any, Literal
import anyio
from app.agents.multi_agent_chat import create_multi_agent_chat_deep_agent
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from app.agents.shared.middleware.busy_mutex import end_turn
from app.agents.multi_agent_chat.shared.filesystem_selection import (
FilesystemMode,
FilesystemSelection,
)
from app.agents.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
@ -826,7 +829,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.shared.sandbox import (
from app.agents.multi_agent_chat.shared.sandbox import (
is_sandbox_enabled,
persist_and_delete_sandbox,
)

View file

@ -30,7 +30,7 @@ from app.prompts import TITLE_GENERATION_PROMPT
from app.services.new_streaming_service import VercelStreamingService
if TYPE_CHECKING:
from app.agents.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
from app.services.token_tracking_service import TokenAccumulator

View file

@ -24,8 +24,11 @@ from uuid import UUID
import anyio
from app.agents.multi_agent_chat import create_multi_agent_chat_deep_agent
from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection
from app.agents.shared.middleware.busy_mutex import end_turn
from app.agents.multi_agent_chat.shared.filesystem_selection import (
FilesystemMode,
FilesystemSelection,
)
from app.agents.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

View file

@ -14,7 +14,7 @@ from typing import Any
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.llm_config import (
from app.agents.multi_agent_chat.shared.llm_config import (
AgentConfig,
create_chat_litellm_from_agent_config,
create_chat_litellm_from_config,

View file

@ -19,7 +19,7 @@ from dataclasses import dataclass
from typing import TYPE_CHECKING
from uuid import UUID
from app.agents.shared.llm_config import AgentConfig
from app.agents.multi_agent_chat.shared.llm_config import AgentConfig
from app.db import shielded_async_session
if TYPE_CHECKING:

View file

@ -17,7 +17,7 @@ from typing import Literal
from sqlalchemy.ext.asyncio import AsyncSession
from app.agents.shared.middleware.busy_mutex import end_turn
from app.agents.multi_agent_chat.shared.middleware.busy_mutex import end_turn
from app.observability import otel as ot
from app.services.auto_model_pin_service import (
mark_runtime_cooldown,

View file

@ -15,7 +15,7 @@ from __future__ import annotations
from collections.abc import AsyncGenerator, Awaitable, Callable
from typing import Any
from app.agents.shared.filesystem_selection import FilesystemMode
from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode
from app.services.new_streaming_service import VercelStreamingService
from app.tasks.chat.streaming.agent.event_loop import stream_agent_events
from app.tasks.chat.streaming.shared.stream_result import StreamResult

Some files were not shown because too many files have changed in this diff Show more