diff --git a/apps/api/src/services/decision_manager.py b/apps/api/src/services/decision_manager.py index 8a2e997f..8b9847a0 100644 --- a/apps/api/src/services/decision_manager.py +++ b/apps/api/src/services/decision_manager.py @@ -459,6 +459,33 @@ async def _push_auto_repair_result( metrics_delta_text = _format_metrics_delta(metrics_before, metrics_after) + # MCP Phase 4b: 抓 K8s Pod 狀態寫入 k8s_state_after (2026-04-11 Claude Sonnet 4.6) + try: + from src.plugins.mcp.providers.k8s_provider import K8sProvider + _k8s = K8sProvider() + if _k8s.enabled: + _service = (incident.affected_services or [""])[0] + if _service: + _k8s_result = await _k8s.execute( + "kubectl_get", + {"resource_type": "pods", "namespace": "awoooi-prod", + "label_selector": f"app={_service}"}, + ) + if _k8s_result.success and _k8s_result.data: + _k8s_state = str(_k8s_result.data)[:500] + from src.db.base import get_db_context + from src.db.models import Incident as IncidentORM + from sqlalchemy import update as _upd2 + async with get_db_context() as _db2: + await _db2.execute( + _upd2(IncidentORM) + .where(IncidentORM.incident_id == inc_id) + .values(k8s_state_after=_k8s_state) + ) + await _db2.commit() + except Exception as _k8s_err: + logger.debug("k8s_state_after_failed", incident_id=inc_id, error=str(_k8s_err)) + if success: delta_line = f"\n├ 指標: {metrics_delta_text}" if metrics_delta_text else "" status_line = (