diff --git a/apps/api/src/models/playbook.py b/apps/api/src/models/playbook.py index e2a35ad7..ede4d257 100644 --- a/apps/api/src/models/playbook.py +++ b/apps/api/src/models/playbook.py @@ -47,6 +47,7 @@ class ActionType(str, Enum): KUBECTL = "kubectl" # Kubernetes 命令 SCRIPT = "script" # 腳本執行 MANUAL = "manual" # 需人工操作 + SSH_COMMAND = "ssh_command" # 2026-04-05 Claude Code: 主機層 SSH 修復 (Sprint 3) class RiskLevel(str, Enum): diff --git a/apps/api/src/services/auto_repair_service.py b/apps/api/src/services/auto_repair_service.py index ab053657..2c45b4e1 100644 --- a/apps/api/src/services/auto_repair_service.py +++ b/apps/api/src/services/auto_repair_service.py @@ -497,6 +497,20 @@ class AutoRepairService: logger.warning("action_executor_not_available") return "SKIPPED (executor not available)" + # 2026-04-05 Claude Code: SSH_COMMAND — 主機層修復 (Sprint 3 Host Auto-Repair) + if step.action_type == ActionType.SSH_COMMAND: + from src.services.host_repair_agent import HostRepairAgent + agent = HostRepairAgent() + # step.command 格式: "/" 例如 "docker-110/sentry" + try: + layer, component = step.command.split("/", 1) + except ValueError: + return f"FAILED: invalid ssh_command format '{step.command}' (expected layer/component)" + result = await agent.repair(layer=layer, component=component) + if result.success: + return f"SUCCESS: {result.output}" + return f"FAILED: {result.error}" + return "UNKNOWN_ACTION_TYPE" # === ADR-037: Tier-based Repair (2026-03-29) ===