From 4c219b7f057952fecf5b060ed8644f3c49c61808 Mon Sep 17 00:00:00 2001 From: Jonathan Dobson Date: Thu, 7 Aug 2025 17:08:50 -0400 Subject: [PATCH] always return debug sessions that are <30s fresh (#3132) --- skyvern/forge/sdk/db/client.py | 22 +++++++++++++++++++ skyvern/forge/sdk/routes/agent_protocol.py | 25 ++++++++++++++++++++++ skyvern/forge/sdk/schemas/scripts.py | 0 3 files changed, 47 insertions(+) create mode 100644 skyvern/forge/sdk/schemas/scripts.py diff --git a/skyvern/forge/sdk/db/client.py b/skyvern/forge/sdk/db/client.py index 55fe401c..ea2a0742 100644 --- a/skyvern/forge/sdk/db/client.py +++ b/skyvern/forge/sdk/db/client.py @@ -3492,6 +3492,28 @@ class AgentDB: return DebugSession.model_validate(debug_session) + async def get_latest_debug_session_for_user( + self, + *, + organization_id: str, + user_id: str, + workflow_permanent_id: str, + ) -> DebugSession | None: + async with self.Session() as session: + query = ( + select(DebugSessionModel) + .filter_by(organization_id=organization_id) + .filter_by(deleted_at=None) + .filter_by(status="created") + .filter_by(user_id=user_id) + .filter_by(workflow_permanent_id=workflow_permanent_id) + .order_by(DebugSessionModel.created_at.desc()) + ) + + model = (await session.scalars(query)).first() + + return DebugSession.model_validate(model) if model else None + async def complete_debug_sessions( self, *, diff --git a/skyvern/forge/sdk/routes/agent_protocol.py b/skyvern/forge/sdk/routes/agent_protocol.py index 25b72c8e..1a5dfa16 100644 --- a/skyvern/forge/sdk/routes/agent_protocol.py +++ b/skyvern/forge/sdk/routes/agent_protocol.py @@ -1,4 +1,5 @@ import asyncio +from datetime import datetime, timedelta, timezone from enum import Enum from functools import partial from typing import Annotated, Any @@ -2100,8 +2101,32 @@ async def new_debug_session( sessions associated with those completed debug sessions. Return the new debug session. + + CAVEAT: if an existing debug session for this user is <30s old, then we + return that instead. This is to curtail damage from browser session + spamming. """ + if current_user_id: + debug_session = await app.DATABASE.get_latest_debug_session_for_user( + organization_id=current_org.organization_id, + user_id=current_user_id, + workflow_permanent_id=workflow_permanent_id, + ) + + if debug_session: + now = datetime.now(timezone.utc) + if now - debug_session.created_at < timedelta(seconds=30): + LOG.info( + "Existing debug session is less than 30s old, returning it", + debug_session_id=debug_session.debug_session_id, + browser_session_id=debug_session.browser_session_id, + organization_id=current_org.organization_id, + user_id=current_user_id, + workflow_permanent_id=workflow_permanent_id, + ) + return debug_session + completed_debug_sessions = await app.DATABASE.complete_debug_sessions( organization_id=current_org.organization_id, user_id=current_user_id, diff --git a/skyvern/forge/sdk/schemas/scripts.py b/skyvern/forge/sdk/schemas/scripts.py new file mode 100644 index 00000000..e69de29b