"""Daemon registry CLI commands.""" from __future__ import annotations from typing import Optional import typer from app.cli.core.utils import render_output from app.services.auth_service import AuthService daemon_app = typer.Typer(help="Daemon registry management commands.") def _with_service(ctx: typer.Context, callback): app_context = ctx.obj repository = app_context.repository_factory(app_context.settings) service = AuthService(repository, app_context.settings) try: from app.cli.core.utils import execute_command return execute_command(app_context.console, callback=lambda: callback(repository, app_context)) finally: if callable(getattr(type(repository), "close", None)): repository.close() @daemon_app.command("create") def create_daemon( ctx: typer.Context, daemon_slug: str = typer.Argument(..., help="Unique daemon slug (scoped to the owner user)."), user: str = typer.Option(..., "--user", help="Username of the daemon owner."), display_name: Optional[str] = typer.Option(None, "--display-name", help="Human-readable daemon name."), ) -> None: """Create a new daemon registry entry.""" def _create(repo, app_context): owner = repo.get_user_by_username(user) if owner is None: raise ValueError(f"사용자를 찾을 수 없습니다: {user}") return repo.create_daemon(owner.id, daemon_slug=daemon_slug, display_name=display_name) result = _with_service(ctx, _create) from app.domain.models import Daemon render_output(ctx.obj.console, ctx.obj.output_format, result) @daemon_app.command("list") def list_daemons( ctx: typer.Context, user: str = typer.Option(..., "--user", help="Username to list daemons for."), ) -> None: """List all daemon registry entries for a user.""" def _list(repo, app_context): owner = repo.get_user_by_username(user) if owner is None: raise ValueError(f"사용자를 찾을 수 없습니다: {user}") return repo.list_daemons_for_user(owner.id) result = _with_service(ctx, _list) render_output(ctx.obj.console, ctx.obj.output_format, result, empty_message="No daemons found.") @daemon_app.command("update") def update_daemon( ctx: typer.Context, daemon_id: str = typer.Argument(..., help="Daemon ID to update."), display_name: Optional[str] = typer.Option(None, "--display-name", help="New display name."), deactivate: bool = typer.Option(False, "--deactivate", help="Mark daemon as inactive."), activate: bool = typer.Option(False, "--activate", help="Mark daemon as active."), ) -> None: """Update a daemon registry entry.""" def _update(repo, app_context): is_active: bool | None = None if deactivate and activate: raise ValueError("--activate와 --deactivate를 동시에 사용할 수 없습니다") if deactivate: is_active = False elif activate: is_active = True return repo.update_daemon(daemon_id, display_name=display_name, is_active=is_active) result = _with_service(ctx, _update) render_output(ctx.obj.console, ctx.obj.output_format, result)