Ctrl K
ComunidadGuías…

butler/gateway/error_cards.py

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

Archivo original ↗Preguntar a KiBot
"""Structured error messages for WeChat — doom_loop, permission, timeout."""

from __future__ import annotations

import logging
from typing import Any, cast

logger = logging.getLogger(__name__)


def format_error_card(event_type: str, **kwargs: Any) -> str | None:
    """Return a structured WeChat error notification, or None if not applicable."""
    if event_type == "doom_loop":
        tool = kwargs.get("tool", "unknown")
        count = kwargs.get("count", 0)
        from butler.core.approval_cards import format_approval_card

        return cast(
            str,
            format_approval_card(
                reason=f"检测到重复操作 {tool}(已连续 {count} 次)",
                approve_command="/批准一次",
                extra="或 /始终允许 doom_loop 解除限制",
            ),
        )

    if event_type == "permission_deny":
        tool = kwargs.get("tool", "unknown")
        reason = kwargs.get("reason", "")
        from butler.core.approval_cards import format_permission_once_card

        return cast(str, format_permission_once_card(tool=tool)) + (
            f"\n详情: {reason}" if reason else ""
        )

    if event_type == "delegate_timeout":
        role = kwargs.get("role", "unknown")
        elapsed = kwargs.get("elapsed", 0)
        return (
            f"[超时] 委派 {role} 已运行 {elapsed}s\n"
            "可发 /health 查看状态,或 /停止 中断"
        )

    if event_type == "tool_error":
        tool = kwargs.get("tool", "unknown")
        error = kwargs.get("error", "")
        return (
            f"[错误] {tool} 执行失败\n"
            f"{error[:200]}\n"
            "可发 /详细 查看完整信息"
        )

    return None