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>
120 lines
2.7 KiB
Python
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]
|