Ctrl K
ComunidadGuías…

butler/tools/terminal_approval_ops.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Terminal approval best-effort helpers (P0-A)."""

from __future__ import annotations

import json
import logging
from pathlib import Path
from typing import Any

from butler.core.best_effort import safe_best_effort

logger = logging.getLogger(__name__)


def canonicalize_command_safe(command: str) -> str:
    def _run() -> str:
        from butler.tools.command_canonicalize import canonicalize_command_for_approval

        return str(canonicalize_command_for_approval(command) or "")

    result = safe_best_effort(
        _run,
        label="terminal_approval.canonicalize",
        default=(command or "").strip(),
    )
    return str(result or (command or "").strip())


def try_auto_review_terminal_safe(command: str) -> Any | None:
    def _run() -> Any:
        from butler.core.auto_review import try_auto_review_terminal

        return try_auto_review_terminal(command, diagnostics=None)

    return safe_best_effort(
        _run,
        label="terminal_approval.auto_review",
        default=None,
    )


def read_approval_record_safe(path: Path) -> dict[str, Any] | None:
    def _run() -> dict[str, Any]:
        data = json.loads(path.read_text(encoding="utf-8"))
        if not isinstance(data, dict):
            raise ValueError("approval record is not a dict")
        return data

    result = safe_best_effort(
        _run,
        label="terminal_approval.read_record",
        default=None,
    )
    return result if isinstance(result, dict) else None