diff --git a/scout/contexts.py b/scout/contexts.py index f7db9db..17da9f2 100644 --- a/scout/contexts.py +++ b/scout/contexts.py @@ -13,8 +13,10 @@ from os import getenv from pathlib import Path +from agno.context.calendar import CalendarContextProvider from agno.context.database import DatabaseContextProvider from agno.context.gdrive import GDriveContextProvider +from agno.context.gmail import GmailContextProvider from agno.context.mcp import MCPContextProvider from agno.context.provider import ContextProvider from agno.context.slack import SlackContextProvider @@ -67,7 +69,12 @@ def create_context_providers() -> list[ContextProvider]: _create_knowledge_wiki(), _create_voice_wiki(), ] - for factory in (_create_slack_provider, _create_gdrive_provider): + for factory in ( + _create_slack_provider, + _create_gdrive_provider, + _create_gmail_provider, + _create_calendar_provider, + ): try: provider = factory() except Exception as exc: @@ -248,6 +255,32 @@ def _create_gdrive_provider() -> GDriveContextProvider | None: return GDriveContextProvider(model=default_model()) +def _create_gmail_provider() -> GmailContextProvider | None: + """Gmail context — OAuth or service account with delegation. + + For OAuth: set GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_PROJECT_ID. + For SA: set GOOGLE_SERVICE_ACCOUNT_FILE and GOOGLE_DELEGATED_USER. + """ + has_oauth = getenv("GOOGLE_CLIENT_ID") and getenv("GOOGLE_CLIENT_SECRET") + has_sa = getenv("GOOGLE_SERVICE_ACCOUNT_FILE") and getenv("GOOGLE_DELEGATED_USER") + if not (has_oauth or has_sa): + return None + return GmailContextProvider(model=default_model(), read=True, write=True) + + +def _create_calendar_provider() -> CalendarContextProvider | None: + """Calendar context — OAuth or service account (delegation optional). + + For OAuth: set GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_PROJECT_ID. + For SA: set GOOGLE_SERVICE_ACCOUNT_FILE (GOOGLE_DELEGATED_USER optional). + """ + has_oauth = getenv("GOOGLE_CLIENT_ID") and getenv("GOOGLE_CLIENT_SECRET") + has_sa = getenv("GOOGLE_SERVICE_ACCOUNT_FILE") + if not (has_oauth or has_sa): + return None + return CalendarContextProvider(model=default_model(), read=True, write=True) + + def _create_mcp_providers() -> list[MCPContextProvider]: """Registered MCP servers.