fix(awooop): preserve callback summary in run list response
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 1m8s
CD Pipeline / build-and-deploy (push) Successful in 3m44s
CD Pipeline / post-deploy-checks (push) Successful in 1m24s

This commit is contained in:
Your Name
2026-05-18 15:33:35 +08:00
parent be551ac761
commit 0e3c63ec15
2 changed files with 46 additions and 0 deletions

View File

@@ -52,6 +52,7 @@ class RunItem(BaseModel):
created_at: datetime
timeout_at: datetime | None
remediation_summary: dict[str, Any] | None = None
callback_reply_summary: dict[str, Any] | None = None
class ListRunsResponse(BaseModel):

View File

@@ -1,6 +1,9 @@
from datetime import datetime
from decimal import Decimal
from types import SimpleNamespace
from uuid import UUID
from src.api.v1.platform.operator_runs import ListRunsResponse
from src.services.platform_operator_service import (
_collect_run_incident_ids,
_legacy_mcp_timeline_status,
@@ -226,6 +229,48 @@ def test_run_callback_reply_summary_marks_no_callback() -> None:
assert summary["total"] == 0
def test_list_runs_response_preserves_callback_reply_summary() -> None:
run_id = UUID("5c0306e0-591a-5445-9a33-80f499426b38")
response = ListRunsResponse.model_validate({
"runs": [
{
"run_id": run_id,
"project_id": "awoooi",
"agent_id": "legacy-telegram-gateway",
"state": "completed",
"is_shadow": True,
"cost_usd": Decimal("0.0000"),
"step_count": 0,
"created_at": datetime(2026, 5, 18, 7, 31, 37),
"timeout_at": None,
"remediation_summary": None,
"callback_reply_summary": {
"schema_version": "awooop_run_callback_reply_summary_v1",
"status": "failed",
"total": 1,
"sent": 0,
"fallback_sent": 0,
"rescue_sent": 0,
"failed": 1,
"needs_human": True,
"latest_status": "callback_reply_failed",
"latest_action": "detail",
"latest_incident_id": "INC-20260513-79ED5E",
"latest_at": "2026-05-18T07:31:37",
"latest_provider_message_id": "telegram_callback_reply:failed",
},
}
],
"total": 1,
"page": 1,
"per_page": 1,
})
dumped = response.model_dump(mode="json")
assert dumped["runs"][0]["callback_reply_summary"]["status"] == "failed"
assert dumped["runs"][0]["callback_reply_summary"]["needs_human"] is True
def test_remediation_timeline_summary_surfaces_route_and_write_flags() -> None:
summary = _remediation_timeline_summary({
"incident_id": "INC-20260514-F85F21",