refactor: reorganize models into subpackages

Move models into domain subpackages (max 4 files each):
- models/tool/ — tool_type, tool_instance, tool_definition_manifest
- models/config/ — config_profile
- models/user/ — user, user_config, ssh_key
- models/project/ — project, git_repository, workspace
- models/system/ — health_check, notification, instance_event, terminal_session

models/__init__.py continues to re-export all symbols, so consumers
using 'from src.models import X' are unaffected. Updated direct file
imports across the backend to use the new paths.

Quality gates: py_compile passed, ruff passed.
This commit is contained in:
2026-06-04 10:00:10 +02:00
parent 0127d283a6
commit 0591b00ded
62 changed files with 136 additions and 87 deletions
+1
View File
@@ -0,0 +1 @@
"""Config module."""
@@ -13,7 +13,7 @@ from typing import Any
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.config_profile import ConfigProfile, ConfigProfileInclude
from src.models import ConfigProfile, ConfigProfileInclude
logger = logging.getLogger(__name__)
+1 -1
View File
@@ -4,7 +4,7 @@ import logging
import os
from dataclasses import dataclass
from src.models.workspace import Workspace
from src.models import Workspace
logger = logging.getLogger(__name__)
+1
View File
@@ -0,0 +1 @@
"""Git module."""
+1 -1
View File
@@ -4,7 +4,7 @@ import asyncio
import logging
from dataclasses import dataclass
from src.models.workspace import Workspace
from src.models import Workspace
logger = logging.getLogger(__name__)
+2 -2
View File
@@ -10,8 +10,8 @@ from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from src.database import SessionLocal
from src.models.health_check import HealthCheck
from src.models.tool_instance import ToolInstance
from src.models import HealthCheck
from src.models import ToolInstance
from src.services.correlation import get_correlation_id
from src.services.docker import get_container_status
from src.services.tunnel import check_tunnel_health
@@ -0,0 +1 @@
"""Instance module."""
+2 -2
View File
@@ -6,8 +6,8 @@ from datetime import datetime, timezone
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.instance_event import InstanceEvent
from src.models.tool_instance import ToolInstance
from src.models import InstanceEvent
from src.models import ToolInstance
from src.services.correlation import get_correlation_id
from src.services.event_bus import InstanceEventBus, InstanceEventPayload
from src.services.notification_service import notification_service
@@ -8,7 +8,7 @@ from sqlalchemy import func, select, update
from sqlalchemy.engine import CursorResult
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.notification import Notification
from src.models import Notification
class NotificationService:
+1
View File
@@ -0,0 +1 @@
"""Shared module."""
@@ -0,0 +1 @@
"""Terminal module."""
+1 -1
View File
@@ -9,7 +9,7 @@ from fastapi import WebSocket
from sqlalchemy.dialects.postgresql import insert as pg_insert
from src.database import SessionLocal
from src.models.terminal_session import TerminalSessionModel
from src.models import TerminalSessionModel
from src.services.terminal_session import TerminalSession
logger = logging.getLogger(__name__)
+7 -7
View File
@@ -14,15 +14,15 @@ from typing import TYPE_CHECKING
from sqlalchemy import select
from src.models.workspace import Workspace
from src.models import Workspace
from src.services.git_service import GitService
from src.services.ssh_keys import _get_fernet
if TYPE_CHECKING:
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.git_repository import GitRepository
from src.models.tool_instance import ToolInstance
from src.models import GitRepository
from src.models import ToolInstance
logger = logging.getLogger(__name__)
@@ -96,7 +96,7 @@ class WorkspaceManager:
# Load SSH key if repo has one
ssh_key = None
if getattr(repo, "ssh_key_id", None) and session is not None:
from src.models.ssh_key import SSHKey
from src.models import SSHKey
result = await session.execute(
select(SSHKey).where(SSHKey.id == repo.ssh_key_id)
@@ -181,8 +181,8 @@ class WorkspaceManager:
# Load SSH key if repo has one
ssh_key = None
if session is not None:
from src.models.git_repository import GitRepository
from src.models.ssh_key import SSHKey
from src.models import GitRepository
from src.models import SSHKey
repo = await session.get(GitRepository, workspace.repo_id)
if repo and getattr(repo, "ssh_key_id", None):
@@ -241,7 +241,7 @@ class WorkspaceManager:
session: AsyncSession,
) -> list[ToolInstance]:
"""Get all tool instances associated with this workspace."""
from src.models.tool_instance import ToolInstance
from src.models import ToolInstance
result = await session.execute(
select(ToolInstance).where(ToolInstance.workspace_id == workspace.id)