From 84b775c0ac9c369032bd34dd8a731b16c0c3d87c Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Fri, 5 Jun 2026 13:29:48 +0200 Subject: [PATCH] refactor(agents): unify permissions into one vertical-slice package Per-file verification of the slice-3 candidates showed receipts/ and date_filters.py are shared contracts (consumed by shared/state + shared middleware + subagents), so they correctly stay put. permissions was the real misfit: the rule *model* lived at shared/permissions.py while its enforcement lived at shared/middleware/permissions/. Unify them into a single self-contained subsystem: shared/permissions.py -> shared/permissions/model.py shared/middleware/permissions/{deny,ask,middleware} -> shared/permissions/{deny,ask,middleware} The package __init__ re-exports the model API + build_permission_mw, so the 32 external model consumers keep importing `from ...shared.permissions import Rule` unchanged; only the 8 internal files redirect to `.model` (cycle-safe, model loaded before middleware). --- .../main_agent/middleware/stack.py | 6 +-- .../shared/middleware/permissions/__init__.py | 11 ----- .../shared/permissions/__init__.py | 41 +++++++++++++++++++ .../permissions/ask/__init__.py | 0 .../permissions/ask/decision.py | 0 .../permissions/ask/edit/__init__.py | 0 .../permissions/ask/edit/merge.py | 0 .../permissions/ask/payload.py | 2 +- .../permissions/ask/request.py | 2 +- .../{middleware => }/permissions/deny.py | 2 +- .../permissions/middleware/__init__.py | 0 .../permissions/middleware/core.py | 2 +- .../permissions/middleware/evaluation.py | 2 +- .../permissions/middleware/factory.py | 2 +- .../middleware/pattern_resolver.py | 0 .../permissions/middleware/ruleset_view.py | 2 +- .../permissions/middleware/runtime_promote.py | 2 +- .../{permissions.py => permissions/model.py} | 0 .../knowledge_base/middleware_stack.py | 4 +- .../shared/middleware/middleware_stack.py | 6 +-- .../subagents/shared/subagent_builder.py | 4 +- ...test_parallel_self_and_middleware_gated.py | 4 +- .../shared/permissions/test_lc_hitl_wire.py | 4 +- .../test_permission_ask_mcp_context.py | 7 ++-- .../test_subagent_owned_ruleset.py | 5 ++- .../test_trusted_tool_save_on_always.py | 5 ++- .../subagents/shared/test_subagent_builder.py | 4 +- 27 files changed, 75 insertions(+), 42 deletions(-) delete mode 100644 surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/__init__.py create mode 100644 surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/__init__.py rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/__init__.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/decision.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/edit/__init__.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/edit/merge.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/payload.py (97%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/ask/request.py (96%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/deny.py (93%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/__init__.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/core.py (99%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/evaluation.py (96%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/factory.py (97%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/pattern_resolver.py (100%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/ruleset_view.py (92%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{middleware => }/permissions/middleware/runtime_promote.py (88%) rename surfsense_backend/app/agents/chat/multi_agent_chat/shared/{permissions.py => permissions/model.py} (100%) diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/stack.py b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/stack.py index d56b6c41f..f084ee863 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/stack.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/stack.py @@ -35,13 +35,13 @@ from app.agents.chat.multi_agent_chat.shared.middleware.memory import build_memo from app.agents.chat.multi_agent_chat.shared.middleware.patch_tool_calls import ( build_patch_tool_calls_mw, ) -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( - build_permission_mw, -) from app.agents.chat.multi_agent_chat.shared.middleware.resilience import ( build_resilience_middlewares, ) from app.agents.chat.multi_agent_chat.shared.middleware.todos import build_todos_mw +from app.agents.chat.multi_agent_chat.shared.permissions import ( + build_permission_mw, +) from app.agents.chat.multi_agent_chat.subagents import ( build_subagents, get_subagents_to_exclude, diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/__init__.py deleted file mode 100644 index c25c2b281..000000000 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Pattern-based allow/deny/ask middleware with HITL fallback (vertical slice). - -Public surface (one entry point only — every other symbol is an internal of -the rule engine and stays inside ``middleware/``, ``ask/``, or ``deny.py``): - -- :func:`build_permission_mw` — construction recipe shared by every stack. -""" - -from .middleware.factory import build_permission_mw - -__all__ = ["build_permission_mw"] diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/__init__.py new file mode 100644 index 000000000..cad69379b --- /dev/null +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/__init__.py @@ -0,0 +1,41 @@ +"""Permissions vertical slice: rule model + allow/deny/ask enforcement. + +Self-contained subsystem combining the permission rule engine (:mod:`.model`) +with the pattern-based allow/deny/ask middleware and its HITL fallback +(:mod:`.middleware`, :mod:`.ask`, :mod:`.deny`). + +Public surface: +- rule model: ``Rule``, ``Ruleset``, ``RuleAction`` and the ``evaluate`` / + ``evaluate_many`` / ``aggregate_action`` / ``wildcard_match`` helpers. +- middleware: ``build_permission_mw`` — the construction recipe shared by + every agent stack. +""" + +# isort: off +# Import order matters: the rule model must be bound on this package before the +# middleware loads, because the middleware transitively imports consumers (e.g. +# app.services.user_tool_allowlist) that re-import ``Rule``/``Ruleset`` from this +# package root. Loading ``.model`` first avoids a partially-initialized cycle. +from .model import ( + Rule, + RuleAction, + Ruleset, + aggregate_action, + evaluate, + evaluate_many, + wildcard_match, +) +from .middleware.factory import build_permission_mw + +# isort: on + +__all__ = [ + "Rule", + "RuleAction", + "Ruleset", + "aggregate_action", + "build_permission_mw", + "evaluate", + "evaluate_many", + "wildcard_match", +] diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/__init__.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/__init__.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/__init__.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/decision.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/decision.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/decision.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/decision.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/edit/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/edit/__init__.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/edit/__init__.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/edit/__init__.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/edit/merge.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/edit/merge.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/edit/merge.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/edit/merge.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/payload.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/payload.py similarity index 97% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/payload.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/payload.py index 38c1f419b..c16b9072a 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/payload.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/payload.py @@ -6,7 +6,7 @@ from typing import Any from langchain_core.tools import BaseTool -from app.agents.chat.multi_agent_chat.shared.permissions import Rule +from app.agents.chat.multi_agent_chat.shared.permissions.model import Rule from app.agents.chat.multi_agent_chat.subagents.shared.hitl.wire import ( LC_DECISION_APPROVE, LC_DECISION_EDIT, diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/request.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/request.py similarity index 96% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/request.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/request.py index 58e81f1b7..7dc1e0a3c 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/ask/request.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/ask/request.py @@ -16,7 +16,7 @@ from typing import Any from langchain_core.tools import BaseTool from langgraph.types import interrupt -from app.agents.chat.multi_agent_chat.shared.permissions import Rule +from app.agents.chat.multi_agent_chat.shared.permissions.model import Rule from app.observability import metrics as ot_metrics, otel as ot from .decision import normalize_permission_decision diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/deny.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/deny.py similarity index 93% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/deny.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/deny.py index 4997e1716..83677b4ca 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/deny.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/deny.py @@ -11,7 +11,7 @@ from typing import Any from langchain_core.messages import ToolMessage -from app.agents.chat.multi_agent_chat.shared.permissions import Rule +from app.agents.chat.multi_agent_chat.shared.permissions.model import Rule from app.agents.chat.runtime.errors import StreamingError diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/__init__.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/__init__.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/__init__.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/__init__.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/core.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/core.py similarity index 99% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/core.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/core.py index dc25c94c6..a97e32379 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/core.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/core.py @@ -26,7 +26,7 @@ from langchain_core.messages import AIMessage, ToolMessage from langchain_core.tools import BaseTool from langgraph.runtime import Runtime -from app.agents.chat.multi_agent_chat.shared.permissions import Ruleset +from app.agents.chat.multi_agent_chat.shared.permissions.model import Ruleset from app.agents.chat.runtime.errors import CorrectedError, RejectedError from app.services.user_tool_allowlist import TrustedToolSaver diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/evaluation.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/evaluation.py similarity index 96% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/evaluation.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/evaluation.py index 5a0d3396a..745c1d727 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/evaluation.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/evaluation.py @@ -16,7 +16,7 @@ from __future__ import annotations import logging from typing import Any -from app.agents.chat.multi_agent_chat.shared.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions.model import ( Rule, RuleAction, Ruleset, diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/factory.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/factory.py similarity index 97% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/factory.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/factory.py index d3017d381..7f143d640 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/factory.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/factory.py @@ -28,7 +28,7 @@ from collections.abc import Sequence from langchain_core.tools import BaseTool from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset +from app.agents.chat.multi_agent_chat.shared.permissions.model import Rule, Ruleset from app.services.user_tool_allowlist import TrustedToolSaver from .core import PermissionMiddleware diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/pattern_resolver.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/pattern_resolver.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/pattern_resolver.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/pattern_resolver.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/ruleset_view.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/ruleset_view.py similarity index 92% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/ruleset_view.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/ruleset_view.py index b3b16fbbd..da089114e 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/ruleset_view.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/ruleset_view.py @@ -9,7 +9,7 @@ newly-promoted rules apply to subsequent calls. from __future__ import annotations -from app.agents.chat.multi_agent_chat.shared.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions.model import ( Ruleset, aggregate_action, evaluate_many, diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/runtime_promote.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/runtime_promote.py similarity index 88% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/runtime_promote.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/runtime_promote.py index 062065a35..2ae38db50 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/permissions/middleware/runtime_promote.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/middleware/runtime_promote.py @@ -7,7 +7,7 @@ is the streaming layer's job — this module keeps the in-memory copy only. from __future__ import annotations -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset +from app.agents.chat.multi_agent_chat.shared.permissions.model import Rule, Ruleset def persist_always( diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions.py b/surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/model.py similarity index 100% rename from surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions.py rename to surfsense_backend/app/agents/chat/multi_agent_chat/shared/permissions/model.py diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py index e5d8a0d25..1407a4d65 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/knowledge_base/middleware_stack.py @@ -27,10 +27,10 @@ from app.agents.chat.multi_agent_chat.shared.middleware.kb_context_projection im from app.agents.chat.multi_agent_chat.shared.middleware.patch_tool_calls import ( build_patch_tool_calls_mw, ) -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions import ( + Ruleset, build_permission_mw, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Ruleset def _kb_user_allowlist( diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/middleware/middleware_stack.py b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/middleware/middleware_stack.py index 25edf838a..124ccf704 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/middleware/middleware_stack.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/middleware/middleware_stack.py @@ -15,13 +15,13 @@ from __future__ import annotations from typing import Any from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( - build_permission_mw, -) from app.agents.chat.multi_agent_chat.shared.middleware.resilience import ( ResilienceMiddlewares, ) from app.agents.chat.multi_agent_chat.shared.middleware.todos import build_todos_mw +from app.agents.chat.multi_agent_chat.shared.permissions import ( + build_permission_mw, +) def build_subagent_middleware_stack( diff --git a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/subagent_builder.py b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/subagent_builder.py index afdc1815d..d03e86685 100644 --- a/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/subagent_builder.py +++ b/surfsense_backend/app/agents/chat/multi_agent_chat/subagents/shared/subagent_builder.py @@ -11,10 +11,10 @@ from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware from langchain_core.language_models import BaseChatModel from langchain_core.tools import BaseTool -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions import ( + Ruleset, build_permission_mw, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Ruleset from app.agents.chat.multi_agent_chat.subagents.shared.md_file_reader import ( read_shared_snippet, ) diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_parallel_self_and_middleware_gated.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_parallel_self_and_middleware_gated.py index 4e2f88847..2c098ef8a 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_parallel_self_and_middleware_gated.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_parallel_self_and_middleware_gated.py @@ -43,10 +43,10 @@ from app.agents.chat.multi_agent_chat.main_agent.middleware.checkpointed_subagen from app.agents.chat.multi_agent_chat.main_agent.middleware.checkpointed_subagent_middleware.task_tool import ( build_task_tool_with_parent_config, ) -from app.agents.chat.multi_agent_chat.shared.middleware.permissions.ask.request import ( +from app.agents.chat.multi_agent_chat.shared.permissions import Rule +from app.agents.chat.multi_agent_chat.shared.permissions.ask.request import ( request_permission_decision, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule from app.agents.chat.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( request_approval, ) diff --git a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_lc_hitl_wire.py b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_lc_hitl_wire.py index 2a6c1a5b1..3f89a9707 100644 --- a/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_lc_hitl_wire.py +++ b/surfsense_backend/tests/unit/agents/multi_agent_chat/middleware/shared/permissions/test_lc_hitl_wire.py @@ -16,10 +16,10 @@ from langgraph.graph import END, START, StateGraph from langgraph.types import Command from typing_extensions import TypedDict -from app.agents.chat.multi_agent_chat.shared.middleware.permissions.ask.request import ( +from app.agents.chat.multi_agent_chat.shared.permissions import Rule +from app.agents.chat.multi_agent_chat.shared.permissions.ask.request import ( request_permission_decision, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule class _State(TypedDict, total=False): 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 1a2b40391..33256c2ff 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 @@ -14,13 +14,14 @@ from pydantic import BaseModel from typing_extensions import TypedDict from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions import ( + Rule, + Ruleset, build_permission_mw, ) -from app.agents.chat.multi_agent_chat.shared.middleware.permissions.ask.payload import ( +from app.agents.chat.multi_agent_chat.shared.permissions.ask.payload import ( build_permission_ask_payload, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset 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 d2351c105..66dec22b0 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 @@ -24,10 +24,11 @@ from langgraph.types import Command from typing_extensions import TypedDict from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions import ( + Rule, + Ruleset, build_permission_mw, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset 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 575f31369..479d607f7 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 @@ -15,10 +15,11 @@ from pydantic import BaseModel from typing_extensions import TypedDict from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.permissions import ( +from app.agents.chat.multi_agent_chat.shared.permissions import ( + Rule, + Ruleset, build_permission_mw, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset 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 ffe5b5c86..2f3553a27 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 @@ -20,10 +20,10 @@ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from langchain_core.outputs import ChatGeneration, ChatResult from app.agents.chat.multi_agent_chat.shared.feature_flags import AgentFeatureFlags -from app.agents.chat.multi_agent_chat.shared.middleware.permissions.middleware.core import ( +from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset, evaluate +from app.agents.chat.multi_agent_chat.shared.permissions.middleware.core import ( PermissionMiddleware, ) -from app.agents.chat.multi_agent_chat.shared.permissions import Rule, Ruleset, evaluate from app.agents.chat.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, )