Files
ai-agent/backend/schemas/services.py
Gabriel Vidal 2119af66d5 refactor(schemas): split backend/schemas.py into a schemas/ package
One module per API area (base, files, activity, skills, conversations,
notifications, forms, search, plans, projects, services, misc, diff, cron,
agents) on a shared base.Schema; __init__.py re-exports every model so
handlers keep writing schemas.<Name>. OpenAPI output is byte-identical.
PlanSummary lives in conversations.py to keep the module graph a DAG.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 23:55:47 +02:00

120 lines
2.7 KiB
Python

"""The services catalog (``backend/svc.py``)."""
from __future__ import annotations
from typing import Literal, Optional
from .base import Schema
from .projects import GoalDetail, GoalSummary, KeyFile, ProjectCommit
__all__ = [
"ServiceSummary",
"ServiceVolume",
"ServiceContainer",
"ServiceRouter",
"TraefikService",
"ServiceTreeNode",
"HomepageMeta",
"ServiceDetail",
"ServicesResponse",
]
class ServiceSummary(Schema):
dir: str
name: str
description: str
icon: Optional[str] = None
group: Optional[str] = None
urls: list[str]
containers: list[str]
containerCount: int
images: list[str]
profiles: list[str]
auth: Optional[Literal["auth", "public", "api", "mixed"]] = None
hasCompose: bool
hasTraefik: bool
goal: Optional[GoalSummary] = None
updatedAt: Optional[str] = None
class ServiceVolume(Schema):
source: Optional[str] = None
target: Optional[str] = None
mode: Optional[str] = None
readOnly: bool
class ServiceContainer(Schema):
key: str
containerName: str
image: Optional[str] = None
build: Optional[str] = None
profiles: list[str]
restart: Optional[str] = None
networkMode: Optional[str] = None
networks: list[str]
ports: list[str]
dependsOn: list[str]
envKeys: list[str]
envFiles: list[str]
volumes: list[ServiceVolume]
hasHealthcheck: bool
composeFile: str
class ServiceRouter(Schema):
name: str
kind: Literal["http", "tcp"]
rule: str
hosts: list[str]
url: Optional[str] = None
entryPoints: list[str]
service: Optional[str] = None
middlewares: list[str]
tls: bool
priority: Optional[int] = None
class TraefikService(Schema):
name: str
servers: list[str]
class ServiceTreeNode(Schema):
name: str
path: str
type: Literal["dir", "file"]
size: Optional[int] = None
text: Optional[bool] = None
secret: Optional[bool] = None
children: Optional[list["ServiceTreeNode"]] = None
class HomepageMeta(Schema):
label: str
description: Optional[str] = None
icon: Optional[str] = None
href: Optional[str] = None
group: Optional[str] = None
class ServiceDetail(ServiceSummary):
containersDetail: list[ServiceContainer]
composeFiles: list[str]
topNetworks: list[str]
routers: list[ServiceRouter]
traefikServices: list[TraefikService]
middlewares: list[str]
envKeys: list[str]
homepage: Optional[HomepageMeta] = None
readme: Optional[str] = None
claudeMd: Optional[str] = None
goal: Optional[GoalDetail] = None
keyFiles: list[KeyFile]
commits: list[ProjectCommit]
tree: list[ServiceTreeNode]
class ServicesResponse(Schema):
services: list[ServiceSummary]