From 82c5dc5b021ec55181f42ba52fc4e9e24274b7d5 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Fri, 5 Jun 2026 12:30:15 +0200 Subject: [PATCH] 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. --- .../main_agent/graph/compile_graph_sync.py | 4 ++-- .../middleware/action_log/builder.py | 2 +- .../middleware/action_log/middleware.py | 2 +- .../middleware/anonymous_document/builder.py | 2 +- .../anonymous_document/middleware.py | 5 ++++- .../main_agent/middleware/busy_mutex.py | 5 ++--- .../middleware/context_editing/builder.py | 2 +- .../main_agent/middleware/doom_loop/builder.py | 2 +- .../main_agent/middleware/kb_persistence.py | 6 ++++-- .../middleware/knowledge_priority.py | 2 +- .../middleware/knowledge_tree/builder.py | 2 +- .../middleware/knowledge_tree/middleware.py | 10 +++++----- .../middleware/noop_injection/builder.py | 2 +- .../main_agent/middleware/otel_span/builder.py | 2 +- .../main_agent/middleware/plugins.py | 2 +- .../main_agent/middleware/skills.py | 4 ++-- .../main_agent/middleware/stack.py | 4 ++-- .../middleware/tool_call_repair/builder.py | 2 +- .../main_agent/runtime/agent_cache.py | 4 ++-- .../main_agent/runtime/factory.py | 16 ++++++++++++---- .../{ => multi_agent_chat}/shared/errors.py | 0 .../shared/feature_flags.py | 0 .../shared/filesystem_selection.py | 0 .../shared/llm_config.py | 4 +++- .../shared/mention_resolver.py | 2 +- .../shared/middleware/busy_mutex.py | 4 ++-- .../filesystem/backends/kb_postgres.py | 2 +- .../middleware/filesystem/backends/resolver.py | 5 ++++- .../shared/middleware/filesystem/index.py | 2 +- .../filesystem/middleware/middleware.py | 4 ++-- .../middleware/filesystem/middleware/mode.py | 4 ++-- .../filesystem/middleware/namespace_policy.py | 2 +- .../filesystem/middleware/path_resolution.py | 2 +- .../filesystem/system_prompt/index.py | 2 +- .../filesystem/tools/cd/description.py | 2 +- .../middleware/filesystem/tools/cd/index.py | 2 +- .../filesystem/tools/edit_file/description.py | 2 +- .../tools/execute_code/description.py | 2 +- .../filesystem/tools/execute_code/helpers.py | 8 ++++---- .../filesystem/tools/glob/description.py | 2 +- .../filesystem/tools/grep/description.py | 2 +- .../filesystem/tools/list_tree/description.py | 2 +- .../filesystem/tools/ls/description.py | 2 +- .../filesystem/tools/mkdir/description.py | 2 +- .../middleware/filesystem/tools/mkdir/index.py | 2 +- .../filesystem/tools/move_file/description.py | 2 +- .../filesystem/tools/move_file/helpers.py | 2 +- .../filesystem/tools/pwd/description.py | 2 +- .../filesystem/tools/read_file/description.py | 2 +- .../filesystem/tools/rm/description.py | 2 +- .../middleware/filesystem/tools/rm/helpers.py | 2 +- .../filesystem/tools/rmdir/description.py | 2 +- .../filesystem/tools/rmdir/helpers.py | 2 +- .../filesystem/tools/write_file/description.py | 2 +- .../shared/middleware/flags.py | 2 +- .../shared/middleware/kb_persistence.py | 16 ++++++++-------- .../shared/middleware/knowledge_search.py | 12 ++++++------ .../shared/middleware/permissions/deny.py | 2 +- .../middleware/permissions/middleware/core.py | 2 +- .../permissions/middleware/factory.py | 2 +- .../shared/middleware/resilience/bundle.py | 2 +- .../shared/middleware/resilience/fallback.py | 2 +- .../middleware/resilience/model_call_limit.py | 2 +- .../shared/middleware/resilience/retry.py | 2 +- .../middleware/resilience/tool_call_limit.py | 2 +- .../shared/path_resolver.py | 0 .../shared/prompt_caching.py | 2 +- .../shared/receipts/receipt.py | 2 +- .../{ => multi_agent_chat}/shared/sandbox.py | 0 .../subagents/builtins/knowledge_base/agent.py | 2 +- .../knowledge_base/middleware_stack.py | 4 ++-- .../builtins/knowledge_base/prompts.py | 2 +- .../shared/middleware/middleware_stack.py | 3 +-- .../app/agents/shared/middleware/__init__.py | 8 -------- .../app/agents/shared/tools/mcp/tool.py | 2 +- .../actions/builtin/agent_task/invoke.py | 5 ++++- .../app/automations/services/model_policy.py | 4 +++- .../app/routes/agent_action_log_route.py | 2 +- .../app/routes/agent_flags_route.py | 5 ++++- .../app/routes/agent_permissions_route.py | 2 +- .../app/routes/agent_revert_route.py | 2 +- .../app/routes/anonymous_chat_routes.py | 2 +- .../app/routes/documents_routes.py | 2 +- .../app/routes/new_chat_routes.py | 6 +++--- surfsense_backend/app/routes/sandbox_routes.py | 7 +++++-- surfsense_backend/app/services/llm_service.py | 18 ++++++++++++------ .../app/services/provider_capabilities.py | 2 +- .../app/services/revert_service.py | 2 +- .../app/tasks/chat/streaming/agent/builder.py | 4 ++-- .../tasks/chat/streaming/agent/event_loop.py | 4 ++-- .../tasks/chat/streaming/errors/classifier.py | 4 ++-- .../streaming/flows/new_chat/input_state.py | 7 +++++-- .../streaming/flows/new_chat/llm_capability.py | 2 +- .../streaming/flows/new_chat/orchestrator.py | 9 ++++++--- .../chat/streaming/flows/new_chat/title_gen.py | 2 +- .../flows/resume_chat/orchestrator.py | 7 +++++-- .../chat/streaming/flows/shared/llm_bundle.py | 2 +- .../streaming/flows/shared/premium_quota.py | 2 +- .../flows/shared/rate_limit_recovery.py | 2 +- .../chat/streaming/flows/shared/stream_loop.py | 2 +- .../streaming/flows/shared/terminal_error.py | 2 +- surfsense_backend/tests/e2e/run_backend.py | 4 ++-- surfsense_backend/tests/e2e/run_celery.py | 4 ++-- .../test_kb_filesystem_cloud.py | 5 ++++- .../test_kb_filesystem_desktop.py | 10 +++++----- .../test_permission_ask_mcp_context.py | 2 +- .../permissions/test_subagent_owned_ruleset.py | 2 +- .../test_trusted_tool_save_on_always.py | 2 +- .../subagents/shared/test_subagent_builder.py | 2 +- .../unit/agents/new_chat/test_action_log.py | 2 +- .../unit/agents/new_chat/test_busy_mutex.py | 4 ++-- .../unit/agents/new_chat/test_feature_flags.py | 2 +- .../agents/new_chat/test_mention_resolver.py | 6 +++--- .../unit/agents/new_chat/test_path_resolver.py | 2 +- .../agents/new_chat/test_prompt_caching.py | 8 +++++--- .../automations/services/test_model_policy.py | 2 +- .../test_b_filesystem_path_resolution.py | 2 +- .../test_b_filesystem_rm_rmdir_cloud.py | 5 ++++- .../test_b_filesystem_system_prompt.py | 2 +- .../middleware/test_filesystem_backends.py | 12 ++++++------ .../test_kb_persistence_filesystem_parity.py | 2 +- .../test_kb_persistence_revisions.py | 2 +- .../unit/middleware/test_knowledge_tree.py | 4 ++-- .../unit/routes/test_revert_turn_route.py | 2 +- .../unit/services/test_supports_image_input.py | 6 +++--- .../test_vision_llm_api_base_defense.py | 2 +- 126 files changed, 238 insertions(+), 196 deletions(-) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/errors.py (100%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/feature_flags.py (100%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/filesystem_selection.py (100%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/llm_config.py (99%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/mention_resolver.py (99%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/middleware/busy_mutex.py (98%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/middleware/kb_persistence.py (99%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/path_resolver.py (100%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/prompt_caching.py (99%) rename surfsense_backend/app/agents/{ => multi_agent_chat}/shared/sandbox.py (100%) diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/graph/compile_graph_sync.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/graph/compile_graph_sync.py index f6996f2e7..001316f52 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/graph/compile_graph_sync.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/graph/compile_graph_sync.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/builder.py index 8d5220637..c6c470aad 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/middleware.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/middleware.py index 02d20d96e..1a983515e 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/middleware.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/action_log/middleware.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/builder.py index 0958c7a84..3b5477000 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/middleware.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/middleware.py index f4504bc2d..cfe8b3d83 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/middleware.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/anonymous_document/middleware.py @@ -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__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/busy_mutex.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/busy_mutex.py index 3dfc4aecc..9a66cbc9c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/busy_mutex.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/busy_mutex.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/context_editing/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/context_editing/builder.py index b5f8c233e..178633220 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/context_editing/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/context_editing/builder.py @@ -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, diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/doom_loop/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/doom_loop/builder.py index 0afb12add..4b3850545 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/doom_loop/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/doom_loop/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/kb_persistence.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/kb_persistence.py index 4b4c8a9bb..105a38e7b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/kb_persistence.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/kb_persistence.py @@ -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( diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_priority.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_priority.py index edfb5376b..55b0e08df 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_priority.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_priority.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/builder.py index d1f77774a..fb80e2ffc 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/middleware.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/middleware.py index 208c1dd4e..f9d68f064 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/middleware.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/knowledge_tree/middleware.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/noop_injection/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/noop_injection/builder.py index 5c62a9291..f02141701 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/noop_injection/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/noop_injection/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/otel_span/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/otel_span/builder.py index 09130fcb8..344aed680 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/otel_span/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/otel_span/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/plugins.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/plugins.py index 6abad6765..347ed8a42 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/plugins.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/plugins.py @@ -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 ( diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/skills.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/skills.py index c1d583d6f..a65370a8e 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/skills.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/skills.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/stack.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/stack.py index 2bdf115e2..a3a62d07d 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/stack.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/stack.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/tool_call_repair/builder.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/tool_call_repair/builder.py index 30de80387..4f8f89e4f 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/tool_call_repair/builder.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/middleware/tool_call_repair/builder.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/agent_cache.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/agent_cache.py index bed40856d..3fd370553 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/agent_cache.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/agent_cache.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/factory.py b/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/factory.py index 2280ec649..58054488d 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/factory.py +++ b/surfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/factory.py @@ -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 ( diff --git a/surfsense_backend/app/agents/shared/errors.py b/surfsense_backend/app/agents/multi_agent_chat/shared/errors.py similarity index 100% rename from surfsense_backend/app/agents/shared/errors.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/errors.py diff --git a/surfsense_backend/app/agents/shared/feature_flags.py b/surfsense_backend/app/agents/multi_agent_chat/shared/feature_flags.py similarity index 100% rename from surfsense_backend/app/agents/shared/feature_flags.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/feature_flags.py diff --git a/surfsense_backend/app/agents/shared/filesystem_selection.py b/surfsense_backend/app/agents/multi_agent_chat/shared/filesystem_selection.py similarity index 100% rename from surfsense_backend/app/agents/shared/filesystem_selection.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/filesystem_selection.py diff --git a/surfsense_backend/app/agents/shared/llm_config.py b/surfsense_backend/app/agents/multi_agent_chat/shared/llm_config.py similarity index 99% rename from surfsense_backend/app/agents/shared/llm_config.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/llm_config.py index 2e60129a9..d4228df46 100644 --- a/surfsense_backend/app/agents/shared/llm_config.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/llm_config.py @@ -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, diff --git a/surfsense_backend/app/agents/shared/mention_resolver.py b/surfsense_backend/app/agents/multi_agent_chat/shared/mention_resolver.py similarity index 99% rename from surfsense_backend/app/agents/shared/mention_resolver.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/mention_resolver.py index 6ce5a784b..908a2db04 100644 --- a/surfsense_backend/app/agents/shared/mention_resolver.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/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.shared.path_resolver import ( +from app.agents.multi_agent_chat.shared.path_resolver import ( DOCUMENTS_ROOT, build_path_index, doc_to_virtual_path, diff --git a/surfsense_backend/app/agents/shared/middleware/busy_mutex.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/busy_mutex.py similarity index 98% rename from surfsense_backend/app/agents/shared/middleware/busy_mutex.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/middleware/busy_mutex.py index 559047634..5d15b063d 100644 --- a/surfsense_backend/app/agents/shared/middleware/busy_mutex.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/busy_mutex.py @@ -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__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/kb_postgres.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/kb_postgres.py index 1111a303d..ac2d77010 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/kb_postgres.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/kb_postgres.py @@ -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, diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/resolver.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/resolver.py index d244a1820..0e4ed5150 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/resolver.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/backends/resolver.py @@ -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) diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/index.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/index.py index 8c9c2227e..179a2e170 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/index.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/middleware.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/middleware.py index 79fb82947..5dc87beab 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/middleware.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/middleware.py @@ -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 ( diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/mode.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/mode.py index 6baf0375b..a52346196 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/mode.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/mode.py @@ -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: diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/namespace_policy.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/namespace_policy.py index 01404a8ba..3a42f3edd 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/namespace_policy.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/namespace_policy.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/path_resolution.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/path_resolution.py index 64a73bc9b..f8021551a 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/path_resolution.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/middleware/path_resolution.py @@ -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, diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/system_prompt/index.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/system_prompt/index.py index 85606051c..05c41eed4 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/system_prompt/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/system_prompt/index.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/description.py index b0b45f42b..de0b1128c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/description.py @@ -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). diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/index.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/index.py index bf868f6e8..5fd8965ed 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/cd/index.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/edit_file/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/edit_file/description.py index 4cb6c9c60..c8798c2a7 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/edit_file/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/edit_file/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/description.py index eaff98194..180fe9b36 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/helpers.py index 700662175..b57fe10d2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/execute_code/helpers.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/glob/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/glob/description.py index c46553313..c1fd6f0b2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/glob/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/glob/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/grep/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/grep/description.py index 769aed80b..47c0ddb33 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/grep/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/grep/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/list_tree/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/list_tree/description.py index 75c9314aa..308032944 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/list_tree/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/list_tree/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/ls/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/ls/description.py index bdd2f666e..823e42f20 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/ls/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/ls/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/description.py index 94d9e5763..a26c8ea7e 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/description.py @@ -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/`. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/index.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/index.py index cfd00837d..d95d401fd 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/mkdir/index.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/description.py index a4dc61743..3a9bfb7f7 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/helpers.py index cca8ef630..dc824d457 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/move_file/helpers.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/pwd/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/pwd/description.py index 62e568dcb..695e1db21 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/pwd/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/pwd/description.py @@ -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.""" diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/read_file/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/read_file/description.py index 8bf8af588..4cd8b60d4 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/read_file/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/read_file/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/description.py index ffa33e778..8d814c73f 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/description.py @@ -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/`. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/helpers.py index 3b4fd8a6a..c1c9239f2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rm/helpers.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/description.py index d119c2f55..ce34597ab 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/description.py @@ -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/`. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/helpers.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/helpers.py index 080103b7e..4948c4fe0 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/helpers.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/rmdir/helpers.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/write_file/description.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/write_file/description.py index 60e88a9a1..bf29a8fa5 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/write_file/description.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/filesystem/tools/write_file/description.py @@ -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. diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/flags.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/flags.py index bf0365c45..342dbdf7c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/flags.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/flags.py @@ -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: diff --git a/surfsense_backend/app/agents/shared/middleware/kb_persistence.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/kb_persistence.py similarity index 99% rename from surfsense_backend/app/agents/shared/middleware/kb_persistence.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/middleware/kb_persistence.py index 8c1c551fa..4eab0550c 100644 --- a/surfsense_backend/app/agents/shared/middleware/kb_persistence.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/kb_persistence.py @@ -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, diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/knowledge_search.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/knowledge_search.py index 26f06f4a5..2650a38f5 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/knowledge_search.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/knowledge_search.py @@ -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, diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/deny.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/deny.py index f636e2fad..5397719ae 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/deny.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/deny.py @@ -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: diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/core.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/core.py index 7658013b1..0f0eb5f9f 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/core.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/core.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/factory.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/factory.py index ff2ca620a..b222d7f4b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/factory.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/permissions/middleware/factory.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/bundle.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/bundle.py index 6c454a8b0..74fb38d8a 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/bundle.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/bundle.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/fallback.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/fallback.py index af0649e18..4d796c61a 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/fallback.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/fallback.py @@ -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 ( diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/model_call_limit.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/model_call_limit.py index 956870efb..a7cf63a96 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/model_call_limit.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/model_call_limit.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/retry.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/retry.py index 02d15078e..f5c197183 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/retry.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/retry.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/tool_call_limit.py b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/tool_call_limit.py index 08bae40bd..699351146 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/tool_call_limit.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/middleware/resilience/tool_call_limit.py @@ -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 diff --git a/surfsense_backend/app/agents/shared/path_resolver.py b/surfsense_backend/app/agents/multi_agent_chat/shared/path_resolver.py similarity index 100% rename from surfsense_backend/app/agents/shared/path_resolver.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/path_resolver.py diff --git a/surfsense_backend/app/agents/shared/prompt_caching.py b/surfsense_backend/app/agents/multi_agent_chat/shared/prompt_caching.py similarity index 99% rename from surfsense_backend/app/agents/shared/prompt_caching.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/prompt_caching.py index d72ef22bc..ba5b150f0 100644 --- a/surfsense_backend/app/agents/shared/prompt_caching.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/prompt_caching.py @@ -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__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/shared/receipts/receipt.py b/surfsense_backend/app/agents/multi_agent_chat/shared/receipts/receipt.py index b1318fb90..18c952c39 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/shared/receipts/receipt.py +++ b/surfsense_backend/app/agents/multi_agent_chat/shared/receipts/receipt.py @@ -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. diff --git a/surfsense_backend/app/agents/shared/sandbox.py b/surfsense_backend/app/agents/multi_agent_chat/shared/sandbox.py similarity index 100% rename from surfsense_backend/app/agents/shared/sandbox.py rename to surfsense_backend/app/agents/multi_agent_chat/shared/sandbox.py diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/agent.py index fb7fb090a..3094e1c8a 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/agent.py @@ -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 diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py index d0647f92c..1e391fa08 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py @@ -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( diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/prompts.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/prompts.py index 92c5a6a7c..604a6e347 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/prompts.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/knowledge_base/prompts.py @@ -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: diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/shared/middleware/middleware_stack.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/shared/middleware/middleware_stack.py index 241a4bb9c..1c4128280 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/shared/middleware/middleware_stack.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/shared/middleware/middleware_stack.py @@ -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, ) diff --git a/surfsense_backend/app/agents/shared/middleware/__init__.py b/surfsense_backend/app/agents/shared/middleware/__init__.py index 001025ff4..b50707472 100644 --- a/surfsense_backend/app/agents/shared/middleware/__init__.py +++ b/surfsense_backend/app/agents/shared/middleware/__init__.py @@ -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", ] diff --git a/surfsense_backend/app/agents/shared/tools/mcp/tool.py b/surfsense_backend/app/agents/shared/tools/mcp/tool.py index 81367f2fd..212e94626 100644 --- a/surfsense_backend/app/agents/shared/tools/mcp/tool.py +++ b/surfsense_backend/app/agents/shared/tools/mcp/tool.py @@ -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 diff --git a/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py b/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py index de0642346..8536afc2f 100644 --- a/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py +++ b/surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py @@ -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 diff --git a/surfsense_backend/app/automations/services/model_policy.py b/surfsense_backend/app/automations/services/model_policy.py index e6ab8bde5..9c1171898 100644 --- a/surfsense_backend/app/automations/services/model_policy.py +++ b/surfsense_backend/app/automations/services/model_policy.py @@ -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": diff --git a/surfsense_backend/app/routes/agent_action_log_route.py b/surfsense_backend/app/routes/agent_action_log_route.py index 519424ba7..dfddad02a 100644 --- a/surfsense_backend/app/routes/agent_action_log_route.py +++ b/surfsense_backend/app/routes/agent_action_log_route.py @@ -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, diff --git a/surfsense_backend/app/routes/agent_flags_route.py b/surfsense_backend/app/routes/agent_flags_route.py index d23650349..b0743d52d 100644 --- a/surfsense_backend/app/routes/agent_flags_route.py +++ b/surfsense_backend/app/routes/agent_flags_route.py @@ -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 diff --git a/surfsense_backend/app/routes/agent_permissions_route.py b/surfsense_backend/app/routes/agent_permissions_route.py index 6151bb871..23e4bb1f4 100644 --- a/surfsense_backend/app/routes/agent_permissions_route.py +++ b/surfsense_backend/app/routes/agent_permissions_route.py @@ -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, diff --git a/surfsense_backend/app/routes/agent_revert_route.py b/surfsense_backend/app/routes/agent_revert_route.py index 230304087..8db9d7eb4 100644 --- a/surfsense_backend/app/routes/agent_revert_route.py +++ b/surfsense_backend/app/routes/agent_revert_route.py @@ -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, diff --git a/surfsense_backend/app/routes/anonymous_chat_routes.py b/surfsense_backend/app/routes/anonymous_chat_routes.py index bf71a0348..0adb545ee 100644 --- a/surfsense_backend/app/routes/anonymous_chat_routes.py +++ b/surfsense_backend/app/routes/anonymous_chat_routes.py @@ -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, ) diff --git a/surfsense_backend/app/routes/documents_routes.py b/surfsense_backend/app/routes/documents_routes.py index 5e9f0b198..9b05ff6f0 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.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, diff --git a/surfsense_backend/app/routes/new_chat_routes.py b/surfsense_backend/app/routes/new_chat_routes.py index 55b825f8b..31344293b 100644 --- a/surfsense_backend/app/routes/new_chat_routes.py +++ b/surfsense_backend/app/routes/new_chat_routes.py @@ -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, diff --git a/surfsense_backend/app/routes/sandbox_routes.py b/surfsense_backend/app/routes/sandbox_routes.py index abbc85c14..8c9cc1836 100644 --- a/surfsense_backend/app/routes/sandbox_routes.py +++ b/surfsense_backend/app/routes/sandbox_routes.py @@ -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) diff --git a/surfsense_backend/app/services/llm_service.py b/surfsense_backend/app/services/llm_service.py index 5ef5a530b..7293fed46 100644 --- a/surfsense_backend/app/services/llm_service.py +++ b/surfsense_backend/app/services/llm_service.py @@ -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), diff --git a/surfsense_backend/app/services/provider_capabilities.py b/surfsense_backend/app/services/provider_capabilities.py index f7eafe11d..bd96851a8 100644 --- a/surfsense_backend/app/services/provider_capabilities.py +++ b/surfsense_backend/app/services/provider_capabilities.py @@ -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 -> diff --git a/surfsense_backend/app/services/revert_service.py b/surfsense_backend/app/services/revert_service.py index 136afe45f..9251a93a7 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.shared.path_resolver import ( +from app.agents.multi_agent_chat.shared.path_resolver import ( DOCUMENTS_ROOT, safe_filename, safe_folder_segment, diff --git a/surfsense_backend/app/tasks/chat/streaming/agent/builder.py b/surfsense_backend/app/tasks/chat/streaming/agent/builder.py index b622ab7e5..27fa1334d 100644 --- a/surfsense_backend/app/tasks/chat/streaming/agent/builder.py +++ b/surfsense_backend/app/tasks/chat/streaming/agent/builder.py @@ -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 diff --git a/surfsense_backend/app/tasks/chat/streaming/agent/event_loop.py b/surfsense_backend/app/tasks/chat/streaming/agent/event_loop.py index 0cbfdc160..82e126d54 100644 --- a/surfsense_backend/app/tasks/chat/streaming/agent/event_loop.py +++ b/surfsense_backend/app/tasks/chat/streaming/agent/event_loop.py @@ -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 diff --git a/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py b/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py index 0baae627b..f7d9ea009 100644 --- a/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py +++ b/surfsense_backend/app/tasks/chat/streaming/errors/classifier.py @@ -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, ) diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py index 3ec015e4a..dee39ef9e 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/input_state.py @@ -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, diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/llm_capability.py b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/llm_capability.py index 9f921fa74..d72e351c0 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/llm_capability.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/llm_capability.py @@ -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 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 e6803f5a1..b47ea9406 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 @@ -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, ) diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/title_gen.py b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/title_gen.py index dfa82b5bf..2ca0b7f52 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/title_gen.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/new_chat/title_gen.py @@ -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 diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py b/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py index aba603ce6..4b1c0b6e0 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/resume_chat/orchestrator.py @@ -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 diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/llm_bundle.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/llm_bundle.py index b455e8fde..7b1eaea05 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/llm_bundle.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/llm_bundle.py @@ -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, diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/premium_quota.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/premium_quota.py index 1d364c84b..dfc75a633 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/premium_quota.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/premium_quota.py @@ -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: diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py index dd0f050d7..638bba0bf 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/rate_limit_recovery.py @@ -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, diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/stream_loop.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/stream_loop.py index 8161bc433..3e279815c 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/stream_loop.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/stream_loop.py @@ -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 diff --git a/surfsense_backend/app/tasks/chat/streaming/flows/shared/terminal_error.py b/surfsense_backend/app/tasks/chat/streaming/flows/shared/terminal_error.py index ca8cf49eb..09aa242f2 100644 --- a/surfsense_backend/app/tasks/chat/streaming/flows/shared/terminal_error.py +++ b/surfsense_backend/app/tasks/chat/streaming/flows/shared/terminal_error.py @@ -14,7 +14,7 @@ import traceback from collections.abc import Iterator from typing import Any, Literal -from app.agents.shared.errors import BusyError +from app.agents.multi_agent_chat.shared.errors import BusyError from app.observability import metrics as ot_metrics, otel as ot from app.services.new_streaming_service import VercelStreamingService from app.tasks.chat.streaming.errors.classifier import classify_stream_exception diff --git a/surfsense_backend/tests/e2e/run_backend.py b/surfsense_backend/tests/e2e/run_backend.py index c05783790..68dcacceb 100644 --- a/surfsense_backend/tests/e2e/run_backend.py +++ b/surfsense_backend/tests/e2e/run_backend.py @@ -239,11 +239,11 @@ def _patch_llm_bindings() -> None: chat_targets = [ ( - "app.agents.shared.llm_config.create_chat_litellm_from_agent_config", + "app.agents.multi_agent_chat.shared.llm_config.create_chat_litellm_from_agent_config", fake_create_chat_litellm_from_agent_config, ), ( - "app.agents.shared.llm_config.create_chat_litellm_from_config", + "app.agents.multi_agent_chat.shared.llm_config.create_chat_litellm_from_config", fake_create_chat_litellm_from_config, ), ( diff --git a/surfsense_backend/tests/e2e/run_celery.py b/surfsense_backend/tests/e2e/run_celery.py index 1a77bf45a..a71045185 100644 --- a/surfsense_backend/tests/e2e/run_celery.py +++ b/surfsense_backend/tests/e2e/run_celery.py @@ -212,11 +212,11 @@ def _patch_llm_bindings() -> None: chat_targets = [ ( - "app.agents.shared.llm_config.create_chat_litellm_from_agent_config", + "app.agents.multi_agent_chat.shared.llm_config.create_chat_litellm_from_agent_config", fake_create_chat_litellm_from_agent_config, ), ( - "app.agents.shared.llm_config.create_chat_litellm_from_config", + "app.agents.multi_agent_chat.shared.llm_config.create_chat_litellm_from_config", fake_create_chat_litellm_from_config, ), ( diff --git a/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_cloud.py b/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_cloud.py index a592e99dc..1b08d4562 100644 --- a/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_cloud.py +++ b/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_cloud.py @@ -20,13 +20,16 @@ from langchain.agents import create_agent from langchain_core.messages import HumanMessage, ToolMessage from langgraph.checkpoint.memory import InMemorySaver +from app.agents.multi_agent_chat.shared.filesystem_selection import ( + FilesystemMode, + FilesystemSelection, +) from app.agents.multi_agent_chat.shared.middleware.filesystem import ( build_filesystem_mw, ) 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 tests.integration.harness import ScriptedTurn, build_scripted_harness pytestmark = [pytest.mark.integration, pytest.mark.asyncio] diff --git a/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_desktop.py b/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_desktop.py index 3c43969ac..033766763 100644 --- a/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_desktop.py +++ b/surfsense_backend/tests/integration/agents/multi_agent_chat/test_kb_filesystem_desktop.py @@ -23,17 +23,17 @@ from langchain.agents import create_agent from langchain_core.messages import HumanMessage, ToolMessage from langgraph.checkpoint.memory import InMemorySaver +from app.agents.multi_agent_chat.shared.filesystem_selection import ( + FilesystemMode, + FilesystemSelection, + LocalFilesystemMount, +) from app.agents.multi_agent_chat.shared.middleware.filesystem import ( build_filesystem_mw, ) from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver import ( build_backend_resolver, ) -from app.agents.shared.filesystem_selection import ( - FilesystemMode, - FilesystemSelection, - LocalFilesystemMount, -) from tests.integration.harness import ScriptedTurn, build_scripted_harness pytestmark = [pytest.mark.integration, pytest.mark.asyncio] diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_permission_ask_mcp_context.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_permission_ask_mcp_context.py index 0de5e5b51..3889217ba 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_permission_ask_mcp_context.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_permission_ask_mcp_context.py @@ -13,6 +13,7 @@ from langgraph.graph.message import add_messages from pydantic import BaseModel from typing_extensions import TypedDict +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags from app.agents.multi_agent_chat.shared.middleware.permissions import ( build_permission_mw, ) @@ -20,7 +21,6 @@ from app.agents.multi_agent_chat.shared.middleware.permissions.ask.payload impor build_permission_ask_payload, ) from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset -from app.agents.shared.feature_flags import AgentFeatureFlags class _NoArgs(BaseModel): diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_subagent_owned_ruleset.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_subagent_owned_ruleset.py index f90d60d1d..7acee99b7 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_subagent_owned_ruleset.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_subagent_owned_ruleset.py @@ -23,11 +23,11 @@ from langgraph.graph.message import add_messages from langgraph.types import Command from typing_extensions import TypedDict +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags from app.agents.multi_agent_chat.shared.middleware.permissions import ( build_permission_mw, ) from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset -from app.agents.shared.feature_flags import AgentFeatureFlags def _kb_style_ruleset() -> Ruleset: diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_trusted_tool_save_on_always.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_trusted_tool_save_on_always.py index ab8811bbb..3ff304b51 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_trusted_tool_save_on_always.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_trusted_tool_save_on_always.py @@ -14,11 +14,11 @@ from langgraph.types import Command from pydantic import BaseModel from typing_extensions import TypedDict +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags from app.agents.multi_agent_chat.shared.middleware.permissions import ( build_permission_mw, ) from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset -from app.agents.shared.feature_flags import AgentFeatureFlags class _NoArgs(BaseModel): diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/subagents/shared/test_subagent_builder.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/subagents/shared/test_subagent_builder.py index db0ae1051..0fb9bd4dc 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/subagents/shared/test_subagent_builder.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/subagents/shared/test_subagent_builder.py @@ -19,6 +19,7 @@ from langchain_core.language_models.fake_chat_models import ( from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from langchain_core.outputs import ChatGeneration, ChatResult +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags from app.agents.multi_agent_chat.shared.middleware.permissions.middleware.core import ( PermissionMiddleware, ) @@ -26,7 +27,6 @@ from app.agents.multi_agent_chat.shared.permissions import Rule, Ruleset, evalua from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) -from app.agents.shared.feature_flags import AgentFeatureFlags class RateLimitError(Exception): diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_action_log.py b/surfsense_backend/tests/unit/agents/new_chat/test_action_log.py index bed1b5578..4fcbbdb2f 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_action_log.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_action_log.py @@ -14,7 +14,7 @@ from app.agents.multi_agent_chat.main_agent.middleware.action_log.middleware imp ActionLogMiddleware, ToolDefinition, ) -from app.agents.shared.feature_flags import AgentFeatureFlags +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags @dataclass diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py b/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py index b460c3e65..aaf28e3be 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_busy_mutex.py @@ -4,8 +4,8 @@ from __future__ import annotations import pytest -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 ( BusyMutexMiddleware, end_turn, get_cancel_event, diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_feature_flags.py b/surfsense_backend/tests/unit/agents/new_chat/test_feature_flags.py index 404831f06..16c39cf27 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_feature_flags.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_feature_flags.py @@ -4,7 +4,7 @@ from __future__ import annotations import pytest -from app.agents.shared.feature_flags import ( +from app.agents.multi_agent_chat.shared.feature_flags import ( AgentFeatureFlags, reload_for_tests, ) 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 755431ce0..5600dc7d4 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_mention_resolver.py @@ -15,14 +15,14 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from app.agents.shared import mention_resolver -from app.agents.shared.mention_resolver import ( +from app.agents.multi_agent_chat.shared.mention_resolver import ( ResolvedMention, ResolvedMentionSet, resolve_mentions, substitute_in_text, ) -from app.agents.shared.path_resolver import DOCUMENTS_ROOT, PathIndex +from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT, PathIndex +from app.agents.multi_agent_chat.shared import mention_resolver 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 5a4e8ac64..be65b0a5e 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.shared.path_resolver import ( +from app.agents.multi_agent_chat.shared.path_resolver import ( DOCUMENTS_ROOT, PathIndex, doc_to_virtual_path, diff --git a/surfsense_backend/tests/unit/agents/new_chat/test_prompt_caching.py b/surfsense_backend/tests/unit/agents/new_chat/test_prompt_caching.py index f5452e62e..39f2b81fb 100644 --- a/surfsense_backend/tests/unit/agents/new_chat/test_prompt_caching.py +++ b/surfsense_backend/tests/unit/agents/new_chat/test_prompt_caching.py @@ -1,5 +1,5 @@ r"""Tests for ``apply_litellm_prompt_caching`` in -:mod:`app.agents.shared.prompt_caching`. +:mod:`app.agents.multi_agent_chat.shared.prompt_caching`. The helper replaces the legacy ``AnthropicPromptCachingMiddleware`` (which never activated for our LiteLLM stack) with LiteLLM-native multi-provider @@ -34,8 +34,10 @@ from typing import Any import pytest -from app.agents.shared.llm_config import AgentConfig -from app.agents.shared.prompt_caching import apply_litellm_prompt_caching +from app.agents.multi_agent_chat.shared.llm_config import AgentConfig +from app.agents.multi_agent_chat.shared.prompt_caching import ( + apply_litellm_prompt_caching, +) pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/automations/services/test_model_policy.py b/surfsense_backend/tests/unit/automations/services/test_model_policy.py index 2c5b8895f..0be509e21 100644 --- a/surfsense_backend/tests/unit/automations/services/test_model_policy.py +++ b/surfsense_backend/tests/unit/automations/services/test_model_policy.py @@ -44,7 +44,7 @@ def patched_globals(monkeypatch: pytest.MonkeyPatch): -2: {"id": -2, "billing_tier": "free"}, } monkeypatch.setattr( - "app.agents.shared.llm_config.load_global_llm_config_by_id", + "app.agents.multi_agent_chat.shared.llm_config.load_global_llm_config_by_id", lambda cid: llm_configs.get(cid), ) diff --git a/surfsense_backend/tests/unit/middleware/test_b_filesystem_path_resolution.py b/surfsense_backend/tests/unit/middleware/test_b_filesystem_path_resolution.py index 799ce8fc8..9c9308e41 100644 --- a/surfsense_backend/tests/unit/middleware/test_b_filesystem_path_resolution.py +++ b/surfsense_backend/tests/unit/middleware/test_b_filesystem_path_resolution.py @@ -20,6 +20,7 @@ from types import SimpleNamespace import pytest +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, ) @@ -35,7 +36,6 @@ from app.agents.multi_agent_chat.shared.middleware.filesystem.middleware.path_re normalize_local_mount_path, resolve_relative, ) -from app.agents.shared.filesystem_selection import FilesystemMode pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/middleware/test_b_filesystem_rm_rmdir_cloud.py b/surfsense_backend/tests/unit/middleware/test_b_filesystem_rm_rmdir_cloud.py index 4b43ef3be..aa0428510 100644 --- a/surfsense_backend/tests/unit/middleware/test_b_filesystem_rm_rmdir_cloud.py +++ b/surfsense_backend/tests/unit/middleware/test_b_filesystem_rm_rmdir_cloud.py @@ -19,6 +19,10 @@ from unittest.mock import AsyncMock import pytest +from app.agents.multi_agent_chat.shared.filesystem_selection import ( + FilesystemMode, + FilesystemSelection, +) from app.agents.multi_agent_chat.shared.middleware.filesystem import ( build_filesystem_mw, ) @@ -29,7 +33,6 @@ from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.resolver build_backend_resolver, ) from app.agents.multi_agent_chat.shared.state.reducers import _CLEAR -from app.agents.shared.filesystem_selection import FilesystemMode, FilesystemSelection pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/middleware/test_b_filesystem_system_prompt.py b/surfsense_backend/tests/unit/middleware/test_b_filesystem_system_prompt.py index 36e5f6b61..3207a3099 100644 --- a/surfsense_backend/tests/unit/middleware/test_b_filesystem_system_prompt.py +++ b/surfsense_backend/tests/unit/middleware/test_b_filesystem_system_prompt.py @@ -18,10 +18,10 @@ from __future__ import annotations import pytest +from app.agents.multi_agent_chat.shared.filesystem_selection import FilesystemMode from app.agents.multi_agent_chat.shared.middleware.filesystem.system_prompt import ( build_system_prompt, ) -from app.agents.shared.filesystem_selection import FilesystemMode pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/middleware/test_filesystem_backends.py b/surfsense_backend/tests/unit/middleware/test_filesystem_backends.py index cafef3a83..6bd7a10fa 100644 --- a/surfsense_backend/tests/unit/middleware/test_filesystem_backends.py +++ b/surfsense_backend/tests/unit/middleware/test_filesystem_backends.py @@ -2,18 +2,18 @@ from pathlib import Path import pytest +from app.agents.multi_agent_chat.shared.filesystem_selection import ( + ClientPlatform, + FilesystemMode, + FilesystemSelection, + LocalFilesystemMount, +) 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 ( - ClientPlatform, - FilesystemMode, - FilesystemSelection, - LocalFilesystemMount, -) pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/middleware/test_kb_persistence_filesystem_parity.py b/surfsense_backend/tests/unit/middleware/test_kb_persistence_filesystem_parity.py index 907f5080b..1b3f0ba43 100644 --- a/surfsense_backend/tests/unit/middleware/test_kb_persistence_filesystem_parity.py +++ b/surfsense_backend/tests/unit/middleware/test_kb_persistence_filesystem_parity.py @@ -15,7 +15,7 @@ from unittest.mock import AsyncMock import numpy as np import pytest -from app.agents.shared.middleware import kb_persistence +from app.agents.multi_agent_chat.shared.middleware import kb_persistence from app.db import Document diff --git a/surfsense_backend/tests/unit/middleware/test_kb_persistence_revisions.py b/surfsense_backend/tests/unit/middleware/test_kb_persistence_revisions.py index 99abd7baa..0dbcf0211 100644 --- a/surfsense_backend/tests/unit/middleware/test_kb_persistence_revisions.py +++ b/surfsense_backend/tests/unit/middleware/test_kb_persistence_revisions.py @@ -21,7 +21,7 @@ from unittest.mock import AsyncMock, MagicMock import pytest -from app.agents.shared.middleware import kb_persistence +from app.agents.multi_agent_chat.shared.middleware import kb_persistence pytestmark = pytest.mark.unit diff --git a/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py b/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py index 1d0f40259..6d251a3a1 100644 --- a/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py +++ b/surfsense_backend/tests/unit/middleware/test_knowledge_tree.py @@ -12,7 +12,7 @@ from __future__ import annotations from app.agents.multi_agent_chat.main_agent.middleware.knowledge_tree.middleware import ( KnowledgeTreeMiddleware, ) -from app.agents.shared.path_resolver import DOCUMENTS_ROOT +from app.agents.multi_agent_chat.shared.path_resolver import DOCUMENTS_ROOT def _compute(folder_paths: list[str], doc_paths: list[str]) -> set[str]: @@ -88,7 +88,7 @@ class TestFormatTreeRendering: folder_paths: list[str], doc_specs: list[dict], ) -> str: - from app.agents.shared.path_resolver import PathIndex + from app.agents.multi_agent_chat.shared.path_resolver import PathIndex index = PathIndex( folder_paths={i + 1: p for i, p in enumerate(folder_paths)}, diff --git a/surfsense_backend/tests/unit/routes/test_revert_turn_route.py b/surfsense_backend/tests/unit/routes/test_revert_turn_route.py index 35ba2b088..ed61967e4 100644 --- a/surfsense_backend/tests/unit/routes/test_revert_turn_route.py +++ b/surfsense_backend/tests/unit/routes/test_revert_turn_route.py @@ -18,7 +18,7 @@ from unittest.mock import AsyncMock, patch import pytest -from app.agents.shared.feature_flags import AgentFeatureFlags +from app.agents.multi_agent_chat.shared.feature_flags import AgentFeatureFlags from app.routes import agent_revert_route from app.services.revert_service import RevertOutcome diff --git a/surfsense_backend/tests/unit/services/test_supports_image_input.py b/surfsense_backend/tests/unit/services/test_supports_image_input.py index ffd0f4bf0..5ec470e2a 100644 --- a/surfsense_backend/tests/unit/services/test_supports_image_input.py +++ b/surfsense_backend/tests/unit/services/test_supports_image_input.py @@ -227,7 +227,7 @@ global_llm_configs: def test_agent_config_from_yaml_explicit_overrides_resolver(): - from app.agents.shared.llm_config import AgentConfig + from app.agents.multi_agent_chat.shared.llm_config import AgentConfig cfg_text_only = AgentConfig.from_yaml_config( { @@ -256,7 +256,7 @@ def test_agent_config_from_yaml_explicit_overrides_resolver(): def test_agent_config_from_yaml_unannotated_uses_resolver(): """Without an explicit YAML key, AgentConfig defers to the catalog resolver — for ``gpt-4o`` LiteLLM's map says supports_vision=True.""" - from app.agents.shared.llm_config import AgentConfig + from app.agents.multi_agent_chat.shared.llm_config import AgentConfig cfg = AgentConfig.from_yaml_config( { @@ -275,7 +275,7 @@ def test_agent_config_auto_mode_supports_image_input(): so users can keep their selection on Auto with a vision-capable deployment somewhere in the pool. The router's own `allowed_fails` handles non-vision deployments via fallback.""" - from app.agents.shared.llm_config import AgentConfig + from app.agents.multi_agent_chat.shared.llm_config import AgentConfig auto = AgentConfig.from_auto_mode() assert auto.supports_image_input is True diff --git a/surfsense_backend/tests/unit/services/test_vision_llm_api_base_defense.py b/surfsense_backend/tests/unit/services/test_vision_llm_api_base_defense.py index 8703dcb66..458e638a1 100644 --- a/surfsense_backend/tests/unit/services/test_vision_llm_api_base_defense.py +++ b/surfsense_backend/tests/unit/services/test_vision_llm_api_base_defense.py @@ -61,7 +61,7 @@ async def test_get_vision_llm_global_openrouter_sets_api_base(): return_value=cfg, ), patch( - "app.agents.shared.llm_config.SanitizedChatLiteLLM", + "app.agents.multi_agent_chat.shared.llm_config.SanitizedChatLiteLLM", new=FakeSanitized, ), ):