diff --git a/backend/openmlr/db/operations.py b/backend/openmlr/db/operations.py index 2ea72a1..7bafae0 100644 --- a/backend/openmlr/db/operations.py +++ b/backend/openmlr/db/operations.py @@ -385,7 +385,7 @@ async def upsert_paper_resource( async def upsert_resource( db: AsyncSession, conv_id: int, resource_id: str, title: str, resource_type: str, - content: str = None, url: str = None, + content: str | None = None, url: str | None = None, ) -> ConversationResource: """Create or update a resource by resource_id.""" existing = await get_resource_by_id(db, resource_id) @@ -478,7 +478,7 @@ async def update_job_status( # ---- User Settings ---- -async def get_user_settings(db: AsyncSession, user_id: int, category: str = None) -> dict: +async def get_user_settings(db: AsyncSession, user_id: int, category: str | None = None) -> dict: """Get user settings as a dict. Optionally filter by category.""" query = select(UserSetting).where(UserSetting.user_id == user_id) if category: diff --git a/backend/openmlr/services/session_manager.py b/backend/openmlr/services/session_manager.py index d59d7b1..825d779 100644 --- a/backend/openmlr/services/session_manager.py +++ b/backend/openmlr/services/session_manager.py @@ -86,11 +86,13 @@ async def get_or_create_session( session = Session(config=config, conversation_id=conversation_id) + # Import here (not at module level) to avoid circular imports + from ..db import operations as ops + # Determine effective compute node effective_node = None if user_id and db: try: - from ..db import operations as ops # Check conversation override conv = await ops.get_conversation_by_id(db, conversation_id) if conv and conv.extra: @@ -130,7 +132,6 @@ async def get_or_create_session( # Load MCP servers from user settings if available if user_id and db: try: - from ..db import operations as ops user_settings = await ops.get_all_settings(db, user_id, category="mcp") mcp_settings = user_settings.get("mcp", {}) mcp_servers = mcp_settings.get("servers", {}) diff --git a/backend/openmlr/tools/compute_tools.py b/backend/openmlr/tools/compute_tools.py index 2d6c0c9..7ccc6b0 100644 --- a/backend/openmlr/tools/compute_tools.py +++ b/backend/openmlr/tools/compute_tools.py @@ -67,6 +67,7 @@ async def _handle_probe(node_name: str, user_id: int = None, db=None, **kwargs): from ..compute import WorkspaceManager from ..sandbox.manager import SandboxManager + sm = None try: wm = WorkspaceManager() sm = SandboxManager(workspace_manager=wm) @@ -115,7 +116,8 @@ async def _handle_probe(node_name: str, user_id: int = None, db=None, **kwargs): except Exception as e: try: - await sm.destroy() + if sm is not None: + await sm.destroy() except Exception: pass await ops.update_compute_node( diff --git a/backend/tests/test_agent_loop.py b/backend/tests/test_agent_loop.py index dab8179..a430bf3 100644 --- a/backend/tests/test_agent_loop.py +++ b/backend/tests/test_agent_loop.py @@ -343,8 +343,6 @@ async def test_cancelled_returns_none(self, mock_session): async def mock_stream(messages, config, tools): yield "Hello" - if False: - yield with patch("openmlr.agent.loop.LLMProvider.generate_stream") as mock_str: mock_str.return_value = mock_stream(None, None, None) diff --git a/qodana.yaml b/qodana.yaml index 9a4826a..66eac95 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -4,7 +4,11 @@ version: "1.0" linter: jetbrains/qodana-python-community:2025.3 +projectJDK: "python3.12" profile: name: qodana.recommended +bootstrap: | + # Ensure Qodana uses Python 3.12+ for correct type hint inspection (PEP 604, PEP 585) + python3.12 --version 2>/dev/null || python3 --version include: - name: CheckDependencyLicenses