feat(api): ADR-030 Phase 4 自動執行機制
實作低風險操作自動執行策略: 1. auto_approve.py - 自動執行策略服務 - AutoApprovePolicy: 評估是否可自動執行 - 條件: LOW 風險 + 信任分數 >= 5 + Playbook 成功率 >= 95% - CRITICAL 永遠不自動執行 - 完整審計追蹤 2. trust_engine.py - 新增 singleton - get_trust_manager(): 取得全域 TrustScoreManager 3. decision_manager.py - 整合自動執行 (Tier 3 紅區) - Step 5 加入 AutoApprovePolicy 判斷 - 條件滿足時跳過 Telegram,直接執行 - _auto_execute(): 自動執行邏輯 - 失敗時 fallback 到人工審核 流程: Incident → 分析 → AutoApprovePolicy 評估 ├─ 可自動執行 → 直接執行 → 完成 └─ 需人工審核 → Telegram 通知 → 等待批准 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,7 @@ from src.core.config import settings
|
||||
from src.core.redis_client import get_redis
|
||||
from src.models.incident import Incident
|
||||
from src.models.playbook import SymptomPattern
|
||||
from src.services.auto_approve import get_auto_approve_policy
|
||||
from src.services.openclaw import get_openclaw
|
||||
from src.services.playbook_service import get_playbook_service
|
||||
|
||||
@@ -422,15 +423,89 @@ class DecisionManager:
|
||||
# 4. 儲存最終結果
|
||||
await self._save_token(token)
|
||||
|
||||
# 5. Phase 6.5: 推送到 Telegram (非阻塞)
|
||||
# 5. ADR-030 Phase 4: 自動執行判斷
|
||||
if token.state == DecisionState.READY and token.proposal_data:
|
||||
# 使用 asyncio.create_task 非阻塞執行
|
||||
# 評估是否可以自動執行
|
||||
auto_policy = get_auto_approve_policy()
|
||||
auto_decision = auto_policy.evaluate(
|
||||
proposal_data=token.proposal_data,
|
||||
playbook=token.proposal_data.get("_matched_playbook"), # 如果有
|
||||
)
|
||||
|
||||
if auto_decision.should_auto_approve:
|
||||
# 自動執行 (跳過人工審核)
|
||||
logger.info(
|
||||
"auto_approve_triggered",
|
||||
incident_id=incident.incident_id,
|
||||
reason=auto_decision.reason.value,
|
||||
detail=auto_decision.reason_detail,
|
||||
)
|
||||
token.state = DecisionState.EXECUTING
|
||||
token.proposal_data["auto_approved"] = True
|
||||
token.proposal_data["auto_approve_reason"] = auto_decision.reason_detail
|
||||
await self._save_token(token)
|
||||
|
||||
# 觸發自動執行 (非阻塞)
|
||||
asyncio.create_task(
|
||||
self._auto_execute(incident, token)
|
||||
)
|
||||
else:
|
||||
# 需人工審核: 推送到 Telegram
|
||||
asyncio.create_task(
|
||||
_push_decision_to_telegram(incident, token.proposal_data)
|
||||
)
|
||||
|
||||
return token
|
||||
|
||||
async def _auto_execute(self, incident: Incident, token: "DecisionToken") -> None:
|
||||
"""
|
||||
ADR-030 Phase 4: 自動執行已批准的操作
|
||||
|
||||
僅當 AutoApprovePolicy 判斷可自動執行時呼叫
|
||||
"""
|
||||
try:
|
||||
# 延遲導入避免循環依賴
|
||||
from src.services.approval_execution import ApprovalExecutionService
|
||||
from src.models.approval import ApprovalRequest, ApprovalStatus
|
||||
|
||||
# 建立虛擬 ApprovalRequest
|
||||
approval = ApprovalRequest(
|
||||
incident_id=incident.incident_id,
|
||||
action=token.proposal_data.get("kubectl_command", ""),
|
||||
status=ApprovalStatus.APPROVED,
|
||||
risk_level=token.proposal_data.get("risk_level", "low"),
|
||||
)
|
||||
|
||||
# 執行
|
||||
executor = ApprovalExecutionService()
|
||||
await executor.execute_approved_action(approval)
|
||||
|
||||
# 更新狀態
|
||||
token.state = DecisionState.COMPLETED
|
||||
token.proposal_data["auto_executed"] = True
|
||||
await self._save_token(token)
|
||||
|
||||
logger.info(
|
||||
"auto_execute_completed",
|
||||
incident_id=incident.incident_id,
|
||||
action=approval.action,
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
"auto_execute_failed",
|
||||
incident_id=incident.incident_id,
|
||||
error=str(e),
|
||||
)
|
||||
token.state = DecisionState.ERROR
|
||||
token.error = f"Auto-execute failed: {e}"
|
||||
await self._save_token(token)
|
||||
|
||||
# 失敗時 fallback 到人工審核
|
||||
asyncio.create_task(
|
||||
_push_decision_to_telegram(incident, token.proposal_data)
|
||||
)
|
||||
|
||||
return token
|
||||
|
||||
async def _dual_engine_analyze(
|
||||
self,
|
||||
incident: Incident,
|
||||
|
||||
Reference in New Issue
Block a user