From d68280113b92e898db7fd81a1fc2328475b69f2c Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Thu, 14 May 2026 17:40:59 +0200 Subject: [PATCH] multi_agent_chat/connectors+builtins: adopt symmetric self_gated_tool_permission_row helper --- .../subagents/builtins/deliverables/agent.py | 12 +++++++----- .../builtins/deliverables/tools/index.py | 15 +++++++++------ .../subagents/builtins/memory/agent.py | 12 +++++++----- .../subagents/builtins/memory/tools/index.py | 9 ++++++--- .../subagents/builtins/research/agent.py | 12 +++++++----- .../subagents/builtins/research/tools/index.py | 11 +++++++---- .../subagents/connectors/airtable/agent.py | 12 +++++++----- .../connectors/airtable/tools/index.py | 2 +- .../subagents/connectors/calendar/agent.py | 12 +++++++----- .../connectors/calendar/tools/create_event.py | 4 +++- .../connectors/calendar/tools/delete_event.py | 4 +++- .../connectors/calendar/tools/index.py | 13 ++++++++----- .../connectors/calendar/tools/update_event.py | 4 +++- .../subagents/connectors/clickup/agent.py | 12 +++++++----- .../subagents/connectors/clickup/tools/index.py | 2 +- .../subagents/connectors/confluence/agent.py | 12 +++++++----- .../connectors/confluence/tools/create_page.py | 4 +++- .../connectors/confluence/tools/delete_page.py | 4 +++- .../connectors/confluence/tools/index.py | 11 +++++++---- .../connectors/confluence/tools/update_page.py | 4 +++- .../subagents/connectors/discord/agent.py | 12 +++++++----- .../subagents/connectors/discord/tools/index.py | 11 +++++++---- .../connectors/discord/tools/send_message.py | 4 +++- .../subagents/connectors/dropbox/agent.py | 12 +++++++----- .../connectors/dropbox/tools/create_file.py | 4 +++- .../subagents/connectors/dropbox/tools/index.py | 9 ++++++--- .../connectors/dropbox/tools/trash_file.py | 4 +++- .../subagents/connectors/gmail/agent.py | 12 +++++++----- .../connectors/gmail/tools/create_draft.py | 4 +++- .../subagents/connectors/gmail/tools/index.py | 17 ++++++++++------- .../connectors/gmail/tools/send_email.py | 4 +++- .../connectors/gmail/tools/trash_email.py | 4 +++- .../connectors/gmail/tools/update_draft.py | 4 +++- .../subagents/connectors/google_drive/agent.py | 12 +++++++----- .../google_drive/tools/create_file.py | 4 +++- .../connectors/google_drive/tools/index.py | 9 ++++++--- .../connectors/google_drive/tools/trash_file.py | 4 +++- .../subagents/connectors/jira/agent.py | 12 +++++++----- .../subagents/connectors/jira/tools/index.py | 2 +- .../subagents/connectors/linear/agent.py | 12 +++++++----- .../subagents/connectors/linear/tools/index.py | 2 +- .../subagents/connectors/luma/agent.py | 12 +++++++----- .../connectors/luma/tools/create_event.py | 4 +++- .../subagents/connectors/luma/tools/index.py | 11 +++++++---- .../subagents/connectors/notion/agent.py | 12 +++++++----- .../connectors/notion/tools/create_page.py | 4 +++- .../connectors/notion/tools/delete_page.py | 4 +++- .../subagents/connectors/notion/tools/index.py | 11 +++++++---- .../connectors/notion/tools/update_page.py | 4 +++- .../subagents/connectors/onedrive/agent.py | 12 +++++++----- .../connectors/onedrive/tools/create_file.py | 4 +++- .../connectors/onedrive/tools/index.py | 9 ++++++--- .../connectors/onedrive/tools/trash_file.py | 4 +++- .../subagents/connectors/slack/agent.py | 12 +++++++----- .../subagents/connectors/slack/tools/index.py | 2 +- .../subagents/connectors/teams/agent.py | 12 +++++++----- .../subagents/connectors/teams/tools/index.py | 11 +++++++---- .../connectors/teams/tools/send_message.py | 4 +++- 58 files changed, 290 insertions(+), 171 deletions(-) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/agent.py index 0baa6714f..d57480958 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/tools/index.py index 938e73bd4..3b5f1acab 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/deliverables/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -44,11 +47,11 @@ def load_tools( ) return { "allow": [ - {"name": getattr(podcast, "name", "") or "", "tool": podcast}, - {"name": getattr(video, "name", "") or "", "tool": video}, - {"name": getattr(report, "name", "") or "", "tool": report}, - {"name": getattr(resume, "name", "") or "", "tool": resume}, - {"name": getattr(image, "name", "") or "", "tool": image}, + self_gated_tool_permission_row(podcast), + self_gated_tool_permission_row(video), + self_gated_tool_permission_row(report), + self_gated_tool_permission_row(resume), + self_gated_tool_permission_row(image), ], "ask": [], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/agent.py index 2cd9e70a1..f84546ca0 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/tools/index.py index 6c65b2cee..e70bb8366 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/memory/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) from app.db import ChatVisibility @@ -21,7 +24,7 @@ def load_tools( llm=resolved_dependencies.get("llm"), ) return { - "allow": [{"name": getattr(mem, "name", "") or "", "tool": mem}], + "allow": [self_gated_tool_permission_row(mem)], "ask": [], } mem = create_update_memory_tool( @@ -29,4 +32,4 @@ def load_tools( db_session=resolved_dependencies["db_session"], llm=resolved_dependencies.get("llm"), ) - return {"allow": [{"name": getattr(mem, "name", "") or "", "tool": mem}], "ask": []} + return {"allow": [self_gated_tool_permission_row(mem)], "ask": []} diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/agent.py index d38ab2af3..715bc34fd 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/tools/index.py index 3546d4d01..4500fbdf8 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/builtins/research/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -27,9 +30,9 @@ def load_tools( ) return { "allow": [ - {"name": getattr(web, "name", "") or "", "tool": web}, - {"name": getattr(scrape, "name", "") or "", "tool": scrape}, - {"name": getattr(docs, "name", "") or "", "tool": docs}, + self_gated_tool_permission_row(web), + self_gated_tool_permission_row(scrape), + self_gated_tool_permission_row(docs), ], "ask": [], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/agent.py index c186684ab..3a8cd8c96 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/tools/index.py index 08b0e005e..b7556771b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/airtable/tools/index.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/agent.py index 0f00c68e8..3e62a5646 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/create_event.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/create_event.py index a8183314a..e5262bd43 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/create_event.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/create_event.py @@ -8,7 +8,9 @@ from googleapiclient.discovery import build from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.google_calendar import GoogleCalendarToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/delete_event.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/delete_event.py index 3d160e669..2f907e746 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/delete_event.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/delete_event.py @@ -8,7 +8,9 @@ from googleapiclient.discovery import build from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.google_calendar import GoogleCalendarToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/index.py index 2538a494b..28d871ef8 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -26,10 +29,10 @@ def load_tools( update = create_update_calendar_event_tool(**session_dependencies) delete = create_delete_calendar_event_tool(**session_dependencies) return { - "allow": [{"name": getattr(search, "name", "") or "", "tool": search}], + "allow": [self_gated_tool_permission_row(search)], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(update, "name", "") or "", "tool": update}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(update), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/update_event.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/update_event.py index a74979484..e6f9f098e 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/update_event.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/calendar/tools/update_event.py @@ -8,7 +8,9 @@ from googleapiclient.discovery import build from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.google_calendar import GoogleCalendarToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/agent.py index fb34aa938..2d09eda2b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/tools/index.py index 08b0e005e..b7556771b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/clickup/tools/index.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/agent.py index 044fd7dc1..01c9e25f1 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/create_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/create_page.py index 095413bdb..f33dc8e23 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/create_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/create_page.py @@ -5,7 +5,9 @@ from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm.attributes import flag_modified -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.confluence_history import ConfluenceHistoryConnector from app.services.confluence import ConfluenceToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/delete_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/delete_page.py index 7c03c2760..7a3a4f2c7 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/delete_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/delete_page.py @@ -5,7 +5,9 @@ from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm.attributes import flag_modified -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.confluence_history import ConfluenceHistoryConnector from app.services.confluence import ConfluenceToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/index.py index 28c4ee6ee..63fa5feb1 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -27,8 +30,8 @@ def load_tools( return { "allow": [], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(update, "name", "") or "", "tool": update}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(update), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/update_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/update_page.py index 791d0d8c5..7a8207a00 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/update_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/confluence/tools/update_page.py @@ -5,7 +5,9 @@ from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm.attributes import flag_modified -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.confluence_history import ConfluenceHistoryConnector from app.services.confluence import ConfluenceToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/agent.py index d2cb3a9b1..d4c936ff4 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/index.py index c0a3bf3c9..578d5b663 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -25,8 +28,8 @@ def load_tools( send = create_send_discord_message_tool(**common) return { "allow": [ - {"name": getattr(list_ch, "name", "") or "", "tool": list_ch}, - {"name": getattr(read_msg, "name", "") or "", "tool": read_msg}, + self_gated_tool_permission_row(list_ch), + self_gated_tool_permission_row(read_msg), ], - "ask": [{"name": getattr(send, "name", "") or "", "tool": send}], + "ask": [self_gated_tool_permission_row(send)], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/send_message.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/send_message.py index 236cd017a..95890ed10 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/send_message.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/discord/tools/send_message.py @@ -5,7 +5,9 @@ import httpx from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from ._auth import DISCORD_API, get_bot_token, get_discord_connector diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/agent.py index b9743c9d6..e310454bc 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/create_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/create_file.py index 22d8a8a27..2de7c301f 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/create_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/create_file.py @@ -8,7 +8,9 @@ from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.dropbox.client import DropboxClient from app.db import SearchSourceConnector, SearchSourceConnectorType diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/index.py index 5864ae972..6355ddae6 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -24,7 +27,7 @@ def load_tools( return { "allow": [], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/trash_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/trash_file.py index 12559b57a..7cb652d5d 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/trash_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/dropbox/tools/trash_file.py @@ -6,7 +6,9 @@ from sqlalchemy import String, and_, cast, func from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.dropbox.client import DropboxClient from app.db import ( Document, diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/agent.py index bd4bbc929..39aacc872 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/create_draft.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/create_draft.py index 59e471097..fb1461d7c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/create_draft.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/create_draft.py @@ -8,7 +8,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.gmail import GmailToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/index.py index 09082d091..e7c877e40 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -31,13 +34,13 @@ def load_tools( updraft = create_update_gmail_draft_tool(**common) return { "allow": [ - {"name": getattr(search, "name", "") or "", "tool": search}, - {"name": getattr(read, "name", "") or "", "tool": read}, + self_gated_tool_permission_row(search), + self_gated_tool_permission_row(read), ], "ask": [ - {"name": getattr(draft, "name", "") or "", "tool": draft}, - {"name": getattr(send, "name", "") or "", "tool": send}, - {"name": getattr(trash, "name", "") or "", "tool": trash}, - {"name": getattr(updraft, "name", "") or "", "tool": updraft}, + self_gated_tool_permission_row(draft), + self_gated_tool_permission_row(send), + self_gated_tool_permission_row(trash), + self_gated_tool_permission_row(updraft), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/send_email.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/send_email.py index d5de24b62..578233b57 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/send_email.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/send_email.py @@ -8,7 +8,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.gmail import GmailToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/trash_email.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/trash_email.py index b78f88934..b24e9ebe4 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/trash_email.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/trash_email.py @@ -6,7 +6,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.gmail import GmailToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/update_draft.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/update_draft.py index b6688ac53..1ab9d30cf 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/update_draft.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/gmail/tools/update_draft.py @@ -8,7 +8,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.services.gmail import GmailToolMetadataService logger = logging.getLogger(__name__) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/agent.py index 31d270b22..93844e879 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/create_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/create_file.py index 9e9a30429..70f5eea74 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/create_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/create_file.py @@ -5,7 +5,9 @@ from googleapiclient.errors import HttpError from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.google_drive.client import GoogleDriveClient from app.connectors.google_drive.file_types import GOOGLE_DOC, GOOGLE_SHEET from app.services.google_drive import GoogleDriveToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/index.py index 7dbee87a0..fc2195623 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -24,7 +27,7 @@ def load_tools( return { "allow": [], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/trash_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/trash_file.py index f7531cf3d..7fbcd74a3 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/trash_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/google_drive/tools/trash_file.py @@ -5,7 +5,9 @@ from googleapiclient.errors import HttpError from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.google_drive.client import GoogleDriveClient from app.services.google_drive import GoogleDriveToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/agent.py index ae6573e4b..0ac52ac83 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/tools/index.py index 08b0e005e..b7556771b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/jira/tools/index.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/agent.py index f93d15b3c..a50f1bd68 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/tools/index.py index 08b0e005e..b7556771b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/linear/tools/index.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/agent.py index afd5787ef..807ecaca7 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/create_event.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/create_event.py index 0a24a988f..e3e1126fd 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/create_event.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/create_event.py @@ -5,7 +5,9 @@ import httpx from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from ._auth import LUMA_API, get_api_key, get_luma_connector, luma_headers diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/index.py index 47b303295..92e372120 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/luma/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -25,8 +28,8 @@ def load_tools( create = create_create_luma_event_tool(**common) return { "allow": [ - {"name": getattr(list_ev, "name", "") or "", "tool": list_ev}, - {"name": getattr(read_ev, "name", "") or "", "tool": read_ev}, + self_gated_tool_permission_row(list_ev), + self_gated_tool_permission_row(read_ev), ], - "ask": [{"name": getattr(create, "name", "") or "", "tool": create}], + "ask": [self_gated_tool_permission_row(create)], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/agent.py index 7910eb450..cb3c3f52c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/create_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/create_page.py index 6efffe960..20862eb56 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/create_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/create_page.py @@ -4,7 +4,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.notion_history import NotionAPIError, NotionHistoryConnector from app.services.notion import NotionToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/delete_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/delete_page.py index 07f7583d2..85d0ef22e 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/delete_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/delete_page.py @@ -4,7 +4,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.notion_history import NotionAPIError, NotionHistoryConnector from app.services.notion.tool_metadata_service import NotionToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/index.py index c78f630a1..175a5bcd1 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -26,8 +29,8 @@ def load_tools( return { "allow": [], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(update, "name", "") or "", "tool": update}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(update), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/update_page.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/update_page.py index 85c08177c..2b9ce3a6c 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/update_page.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/notion/tools/update_page.py @@ -4,7 +4,9 @@ from typing import Any from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.notion_history import NotionAPIError, NotionHistoryConnector from app.services.notion import NotionToolMetadataService diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/agent.py index 521c45958..1e446efbb 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/create_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/create_file.py index 21272e01d..41fa65787 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/create_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/create_file.py @@ -8,7 +8,9 @@ from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.onedrive.client import OneDriveClient from app.db import SearchSourceConnector, SearchSourceConnectorType diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/index.py index 9a2dadd36..777560112 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -24,7 +27,7 @@ def load_tools( return { "allow": [], "ask": [ - {"name": getattr(create, "name", "") or "", "tool": create}, - {"name": getattr(delete, "name", "") or "", "tool": delete}, + self_gated_tool_permission_row(create), + self_gated_tool_permission_row(delete), ], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/trash_file.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/trash_file.py index a7f13b5df..1f7c51ac5 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/trash_file.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/onedrive/tools/trash_file.py @@ -6,7 +6,9 @@ from sqlalchemy import String, and_, cast, func from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from app.connectors.onedrive.client import OneDriveClient from app.db import ( Document, diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/agent.py index 552070961..a1f108d62 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/tools/index.py index 08b0e005e..b7556771b 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/slack/tools/index.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/agent.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/agent.py index 0f7f7e2bc..05f3ab3af 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/agent.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/agent.py @@ -7,17 +7,19 @@ from typing import Any from deepagents import SubAgent from langchain_core.language_models import BaseChatModel +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.middleware_gated import ( + middleware_gated_interrupt_on, +) from app.agents.multi_agent_chat.subagents.shared.md_file_reader import ( read_md_file, ) -from app.agents.multi_agent_chat.subagents.shared.permissions import ( - ToolsPermissions, - merge_tools_permissions, - middleware_gated_interrupt_on, -) from app.agents.multi_agent_chat.subagents.shared.subagent_builder import ( pack_subagent, ) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( + ToolsPermissions, + merge_tools_permissions, +) from .tools.index import load_tools diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/index.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/index.py index cbe76b040..59a751ec2 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/index.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/index.py @@ -2,7 +2,10 @@ from __future__ import annotations from typing import Any -from app.agents.multi_agent_chat.subagents.shared.permissions import ( +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + self_gated_tool_permission_row, +) +from app.agents.multi_agent_chat.subagents.shared.tool_kinds import ( ToolsPermissions, ) @@ -25,8 +28,8 @@ def load_tools( send = create_send_teams_message_tool(**common) return { "allow": [ - {"name": getattr(list_ch, "name", "") or "", "tool": list_ch}, - {"name": getattr(read_msg, "name", "") or "", "tool": read_msg}, + self_gated_tool_permission_row(list_ch), + self_gated_tool_permission_row(read_msg), ], - "ask": [{"name": getattr(send, "name", "") or "", "tool": send}], + "ask": [self_gated_tool_permission_row(send)], } diff --git a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/send_message.py b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/send_message.py index fd8d00870..f1469e3e1 100644 --- a/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/send_message.py +++ b/surfsense_backend/app/agents/multi_agent_chat/subagents/connectors/teams/tools/send_message.py @@ -5,7 +5,9 @@ import httpx from langchain_core.tools import tool from sqlalchemy.ext.asyncio import AsyncSession -from app.agents.new_chat.tools.hitl import request_approval +from app.agents.multi_agent_chat.subagents.shared.hitl.approvals.self_gated import ( + request_approval, +) from ._auth import GRAPH_API, get_access_token, get_teams_connector