From 2727d5a9ab0ed13beff4679a4f1ff48d9dbb16eb Mon Sep 17 00:00:00 2001 From: ogt Date: Sat, 11 Jul 2026 20:26:05 +0800 Subject: [PATCH] feat(iwooos): expose security source health --- .../security-asset-control-plane-cockpit.tsx | 29 ++++++++++++++++++- .../security-asset-control-plane.test.ts | 6 ++++ .../src/lib/security-asset-control-plane.ts | 10 +++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/iwooos/security-asset-control-plane-cockpit.tsx b/apps/web/src/components/iwooos/security-asset-control-plane-cockpit.tsx index 1bd34df16..82b528967 100644 --- a/apps/web/src/components/iwooos/security-asset-control-plane-cockpit.tsx +++ b/apps/web/src/components/iwooos/security-asset-control-plane-cockpit.tsx @@ -5,6 +5,7 @@ import { Bot, Boxes, CheckCircle2, + Database, RefreshCw, Radar, ShieldAlert, @@ -41,6 +42,7 @@ type Copy = { priority: string; audit: string; aiTrace: string; + sources: string; sameRunMissing: string; unavailable: string; refresh: string; @@ -65,6 +67,7 @@ const COPY: Record<"zh" | "en", Copy> = { priority: "優先處理", audit: "稽核軌跡", aiTrace: "AI 軌跡", + sources: "資料源", sameRunMissing: "尚無同 run 閉環證據", unavailable: "Live readback 無法取得", refresh: "重新整理資安控制平面", @@ -87,6 +90,7 @@ const COPY: Record<"zh" | "en", Copy> = { priority: "Priorities", audit: "Audit trail", aiTrace: "AI trace", + sources: "Sources", sameRunMissing: "No same-run closure evidence", unavailable: "Live readback unavailable", refresh: "Refresh security control plane", @@ -388,7 +392,7 @@ export function SecurityAssetControlPlaneCockpit({
{copy.audit}
-
+
{payload.security_audit.automation_operation_count_24h} @@ -407,7 +411,30 @@ export function SecurityAssetControlPlaneCockpit({
{copy.aiTrace}
+
+
+ {payload.summary.ready_source_count}/{payload.summary.source_count} +
+
{copy.sources}
+
+ {payload.summary.unavailable_source_count > 0 ? ( +
+ {payload.source_health + .filter((source) => source.status !== "ready") + .slice(0, 4) + .map((source) => ( + + + ))} +
+ ) : null} {!payload.ai_automation.same_run_closed_loop_proven ? (