), listRiskResultsByChat (chat-level rollups), listRiskPolicies, getRiskPolicyStatus, listShadowMCPApprovals.",
+ "Never echo match_redacted values verbatim. Refer to findings by rule_id and source.",
+ ].join(" ")
+ : null;
const insightsSuggestions = [
{
@@ -377,76 +374,99 @@ function SecurityOverviewContent() {
return (
<>
-
+ {insightsContext && (
+
+ )}
-
-
-
-
+ {isOverviewLoading ? (
+
+ ) : (
+
+ )}
+ {isOverviewLoading ? (
+
+ ) : (
+
+ )}
+ {isOverviewLoading ? (
+
+ ) : (
+
+ )}
+ {isOverviewLoading ? (
+
+ ) : (
+
+ )}
- {overview.activePolicies > 0 && (
-
-
-
- }
- >
-
-
-
- }
- >
-
-
-
- }
- >
-
-
-
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ {isOverviewLoading || !overview ? (
+
+ ) : (
-
- )}
+ )}
+
>
);
}
@@ -529,21 +549,33 @@ function RiskActivitySection({ children }: { children: ReactNode }) {
function DashboardChartCard({
title,
empty,
+ loading,
children,
action,
}: {
title: string;
empty: boolean;
+ loading?: boolean;
children: ReactNode;
action?: ReactNode;
}) {
return (
- {empty ? : children}
+ {loading ? : empty ? : children}
);
}
+function SkeletonList() {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ );
+}
+
function ChartEmptyState() {
return No findings recorded
;
}