feat(awooop): summarize callback capture in runs list
All checks were successful
CD Pipeline / tests (push) Successful in 38s
Code Review / ai-code-review (push) Successful in 12s
CD Pipeline / build-and-deploy (push) Successful in 3m49s
CD Pipeline / post-deploy-checks (push) Successful in 1m43s

This commit is contained in:
Your Name
2026-05-25 11:16:27 +08:00
parent 814a44d539
commit e1e640f5d5
5 changed files with 187 additions and 0 deletions

View File

@@ -117,6 +117,13 @@ interface CallbackReplySummary {
latest_incident_id?: string | null;
latest_at?: string | null;
latest_provider_message_id?: string | null;
capture_status?: CallbackEvidenceCaptureState | "no_callback" | string | null;
capture_captured?: number;
capture_partial?: number;
capture_not_captured?: number;
latest_capture_status?: CallbackEvidenceCaptureState | string | null;
latest_capture_missing?: string[];
latest_capture_next_action?: string | null;
}
interface CallbackEvidenceCaptureStatus {
@@ -908,8 +915,29 @@ function CallbackReplyCell({ summary }: { summary?: CallbackReplySummary | null
const status = normalizeCallbackReplyStatus(summary);
const config = CALLBACK_REPLY_CONFIG[status];
const total = summary?.total ?? 0;
const captureStatus = total > 0
? normalizeCallbackEvidenceCaptureStatus(summary?.capture_status)
: null;
const captureConfig = captureStatus
? {
captured: "text-[#17602a]",
partial: "text-[#8a5a08]",
not_captured: "text-[#9f2f25]",
observed: "text-[#1f5b9b]",
}[captureStatus]
: null;
const latestAction = summary?.latest_action ? String(summary.latest_action) : null;
const latestIncidentId = summary?.latest_incident_id ? String(summary.latest_incident_id) : null;
const captureItemLabels: Record<string, string> = {
awooop_status_chain: t("captureItems.awooopStatusChain"),
km_stale_completion_summary: t("captureItems.kmCompletionSummary"),
};
const latestCaptureMissing = Array.isArray(summary?.latest_capture_missing)
? summary.latest_capture_missing
: [];
const latestCaptureMissingText = latestCaptureMissing.length > 0
? latestCaptureMissing.map((item) => captureItemLabels[item] ?? item).join(" / ")
: null;
const countText = total > 0
? t("count", {
total,
@@ -944,6 +972,19 @@ function CallbackReplyCell({ summary }: { summary?: CallbackReplySummary | null
{latestText}
</span>
)}
{captureStatus && (
<span
className={cn("text-xs leading-5", captureConfig)}
title={latestCaptureMissingText ? t("captureMissing", { items: latestCaptureMissingText }) : undefined}
>
{t("captureLine", {
status: t(`captureStatuses.${captureStatus}` as never),
captured: summary?.capture_captured ?? 0,
partial: summary?.capture_partial ?? 0,
notCaptured: summary?.capture_not_captured ?? 0,
})}
</span>
)}
{summary?.needs_human && (
<span className="text-xs font-semibold text-[#9f2f25]">
{t("needsHuman")}