import { isXgridsHostFailureDiagnostic, type XgridsHostDiagnosticCode, type XgridsHostDiagnosticAction, type XgridsHostDiagnosticDomain, type XgridsHostDiagnosticImpact, type XgridsHostFailureDiagnostic, type XgridsOperation, } from "./api"; const CODE_LABELS: Record = { "host.bluetooth.permission-denied": "macOS не разрешила Mission Core использовать Bluetooth.", "host.bluetooth.adapter-powered-off": "Bluetooth на этом Mac выключен.", "host.bluetooth.adapter-unavailable": "Системный Bluetooth-адаптер сейчас недоступен.", "host.bluetooth.runtime-unavailable": "Локальный Bluetooth runtime не готов к новой операции.", "host.bluetooth.operation-timeout": "Bluetooth-операция не завершилась за ограниченное время.", "host.wifi.permission-denied": "macOS не разрешила Mission Core читать состояние Wi‑Fi.", "host.wifi.adapter-powered-off": "Wi‑Fi на этом Mac выключен.", "host.wifi.interface-unavailable": "Системный Wi‑Fi-интерфейс сейчас недоступен.", "host.wifi.ssid-unavailable": "macOS не сообщила имя текущей Wi‑Fi-сети.", "host.wifi.operation-timeout": "Операция с Wi‑Fi не завершилась за ограниченное время.", "host.wifi.association-failed": "Mac не подтвердил подключение к ожидаемой Wi‑Fi-сети.", "host.keychain.interaction-required": "Связка ключей требует явного подтверждения оператора.", "host.keychain.permission-denied": "macOS запретила чтение профиля подключения.", "host.keychain.unavailable": "Профиль подключения сейчас недоступен в связке ключей.", "host.route.unavailable": "Прямой локальный маршрут к адресу подключения не найден.", "host.tcp.connection-refused": "Управляющий TCP endpoint отклонил соединение.", "host.tcp.connection-timeout": "Управляющий TCP endpoint не ответил за ограниченное время.", "host.tcp.endpoint-unavailable": "Управляющий TCP endpoint недоступен из текущей сети.", "host.mqtt.connection-timeout": "Управляющий MQTT-канал не открылся за ограниченное время.", "host.mqtt.connection-refused": "Управляющий MQTT-канал отклонил соединение.", "host.mqtt.transport-unavailable": "Транспорт управляющего MQTT-канала недоступен.", "host.filesystem.permission-denied": "Mission Core не может записать обязательные данные операции в локальное хранилище.", "host.filesystem.ledger-unavailable": "Журнал безопасного результата операции недоступен или не подтверждён.", }; const DOMAIN_LABELS: Record = { corebluetooth: "Bluetooth macOS", corewlan: "Wi‑Fi macOS", keychain: "Связка ключей macOS", route: "Локальный сетевой маршрут", tcp: "Управляющий TCP endpoint", mqtt: "Управляющий канал MQTT", filesystem: "Локальное хранилище Mission Core", }; const IMPACT_LABELS: Record = { discovery: "Поиск Bluetooth сейчас недоступен.", "host-network": "Сетевой путь между этим компьютером и локальным контуром недоступен.", control: "Управляющая связь не установлена; команды не повторяются автоматически.", "durable-safety": "Надёжная фиксация результата операции недоступна; новая команда заблокирована.", }; const ACTION_LABELS: Record = { "grant-bluetooth-permission": "Разрешите Mission Core доступ к Bluetooth в системных настройках macOS, затем повторите действие вручную.", "power-on-bluetooth": "Включите Bluetooth на этом Mac и запустите новый поиск вручную.", "restore-bluetooth-adapter": "Восстановите доступность Bluetooth-адаптера macOS и перезапустите локальный сервис перед новой попыткой.", "grant-wifi-permission": "Разрешите Mission Core доступ к данным Wi‑Fi в системных настройках macOS, затем повторите действие вручную.", "power-on-wifi": "Включите Wi‑Fi на этом Mac и заново выберите требуемый способ подключения.", "restore-wifi-interface": "Восстановите системный Wi‑Fi-интерфейс macOS перед новой попыткой подключения.", "unlock-or-authorize-keychain": "Разблокируйте связку ключей macOS и подтвердите доступ Mission Core к профилю подключения.", "review-keychain-access": "Разрешите Mission Core чтение профиля подключения в связке ключей macOS.", "join-expected-network": "Установите связь этого Mac с ожидаемой локальной сетью и повторите действие.", "inspect-host-route": "Восстановите прямой локальный маршрут к адресу подключения.", "verify-broker-endpoint": "Восстановите доступность управляющего endpoint из текущей сети; команда автоматически не повторяется.", "inspect-local-storage": "Освободите место и восстановите доступ к локальному хранилищу Mission Core до следующей операции.", "restart-local-service": "Перезапустите канонический локальный сервис Mission Core и после загрузки обновите состояние.", "explicit-retry": "После устранения причины повторите действие отдельным нажатием; автоматического повтора нет.", }; export interface HostFailureDiagnosticPresentation { codeLabel: string; domainLabel: string; impactLabel: string; operatorActionLabel: string; } export function hostFailureDiagnosticPresentation( value: unknown, ): HostFailureDiagnosticPresentation | null { if (!isXgridsHostFailureDiagnostic(value)) return null; return { codeLabel: CODE_LABELS[value.code], domainLabel: DOMAIN_LABELS[value.domain], impactLabel: IMPACT_LABELS[value.impact], operatorActionLabel: ACTION_LABELS[value.operator_action], }; } export function operationHostFailureDiagnostic( operation: XgridsOperation | null | undefined, ): XgridsHostFailureDiagnostic | null { const diagnostic = operation?.error?.host_diagnostic; return isXgridsHostFailureDiagnostic(diagnostic) ? diagnostic : null; }