@openchoreo/backstage-plugin-openchoreo-observability 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +22 -0
  3. package/dist/api/FinOpsAgentApi.esm.js +43 -0
  4. package/dist/api/FinOpsAgentApi.esm.js.map +1 -0
  5. package/dist/api/ObservabilityApi.esm.js +568 -0
  6. package/dist/api/ObservabilityApi.esm.js.map +1 -0
  7. package/dist/api/ObserverUrlCache.esm.js +59 -0
  8. package/dist/api/ObserverUrlCache.esm.js.map +1 -0
  9. package/dist/api/RCAAgentApi.esm.js +104 -0
  10. package/dist/api/RCAAgentApi.esm.js.map +1 -0
  11. package/dist/components/Alerts/AlertRow.esm.js +203 -0
  12. package/dist/components/Alerts/AlertRow.esm.js.map +1 -0
  13. package/dist/components/Alerts/AlertsActions.esm.js +77 -0
  14. package/dist/components/Alerts/AlertsActions.esm.js.map +1 -0
  15. package/dist/components/Alerts/AlertsFilter.esm.js +95 -0
  16. package/dist/components/Alerts/AlertsFilter.esm.js.map +1 -0
  17. package/dist/components/Alerts/AlertsTable.esm.js +63 -0
  18. package/dist/components/Alerts/AlertsTable.esm.js.map +1 -0
  19. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +251 -0
  20. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -0
  21. package/dist/components/Alerts/types.esm.js +4 -0
  22. package/dist/components/Alerts/types.esm.js.map +1 -0
  23. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +141 -0
  24. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -0
  25. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +128 -0
  26. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -0
  27. package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js +517 -0
  28. package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js.map +1 -0
  29. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +149 -0
  30. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js.map +1 -0
  31. package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js +112 -0
  32. package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js.map +1 -0
  33. package/dist/components/CostAnalysis/index.esm.js +2 -0
  34. package/dist/components/CostAnalysis/index.esm.js.map +1 -0
  35. package/dist/components/Incidents/IncidentRow.esm.js +258 -0
  36. package/dist/components/Incidents/IncidentRow.esm.js.map +1 -0
  37. package/dist/components/Incidents/IncidentsActions.esm.js +77 -0
  38. package/dist/components/Incidents/IncidentsActions.esm.js.map +1 -0
  39. package/dist/components/Incidents/IncidentsFilter.esm.js +144 -0
  40. package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -0
  41. package/dist/components/Incidents/IncidentsTable.esm.js +68 -0
  42. package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -0
  43. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +283 -0
  44. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -0
  45. package/dist/components/Incidents/types.esm.js +8 -0
  46. package/dist/components/Incidents/types.esm.js.map +1 -0
  47. package/dist/components/Metrics/ChartTooltip.esm.js +53 -0
  48. package/dist/components/Metrics/ChartTooltip.esm.js.map +1 -0
  49. package/dist/components/Metrics/HTTPMetricsSection.esm.js +109 -0
  50. package/dist/components/Metrics/HTTPMetricsSection.esm.js.map +1 -0
  51. package/dist/components/Metrics/MetricGraphByComponent.esm.js +99 -0
  52. package/dist/components/Metrics/MetricGraphByComponent.esm.js.map +1 -0
  53. package/dist/components/Metrics/MetricsActions.esm.js +30 -0
  54. package/dist/components/Metrics/MetricsActions.esm.js.map +1 -0
  55. package/dist/components/Metrics/MetricsFilters.esm.js +49 -0
  56. package/dist/components/Metrics/MetricsFilters.esm.js.map +1 -0
  57. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +196 -0
  58. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -0
  59. package/dist/components/Metrics/styles.esm.js +55 -0
  60. package/dist/components/Metrics/styles.esm.js.map +1 -0
  61. package/dist/components/Metrics/utils.esm.js +221 -0
  62. package/dist/components/Metrics/utils.esm.js.map +1 -0
  63. package/dist/components/RCA/RCAActions.esm.js +42 -0
  64. package/dist/components/RCA/RCAActions.esm.js.map +1 -0
  65. package/dist/components/RCA/RCAFilters.esm.js +100 -0
  66. package/dist/components/RCA/RCAFilters.esm.js.map +1 -0
  67. package/dist/components/RCA/RCAPage.esm.js +137 -0
  68. package/dist/components/RCA/RCAPage.esm.js.map +1 -0
  69. package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js +9 -0
  70. package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js.map +1 -0
  71. package/dist/components/RCA/RCAReport/FormattedText.esm.js +94 -0
  72. package/dist/components/RCA/RCAReport/FormattedText.esm.js.map +1 -0
  73. package/dist/components/RCA/RCAReport/RCAReportView.esm.js +308 -0
  74. package/dist/components/RCA/RCAReport/RCAReportView.esm.js.map +1 -0
  75. package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js +113 -0
  76. package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js.map +1 -0
  77. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js +272 -0
  78. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js.map +1 -0
  79. package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js +48 -0
  80. package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js.map +1 -0
  81. package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js +205 -0
  82. package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js.map +1 -0
  83. package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js +121 -0
  84. package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js.map +1 -0
  85. package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js +593 -0
  86. package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js.map +1 -0
  87. package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js +35 -0
  88. package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js.map +1 -0
  89. package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js +54 -0
  90. package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js.map +1 -0
  91. package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js +526 -0
  92. package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js.map +1 -0
  93. package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js +70 -0
  94. package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js.map +1 -0
  95. package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js +54 -0
  96. package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js.map +1 -0
  97. package/dist/components/RCA/RCAReport/styles.esm.js +467 -0
  98. package/dist/components/RCA/RCAReport/styles.esm.js.map +1 -0
  99. package/dist/components/RCA/RCAReport.esm.js +109 -0
  100. package/dist/components/RCA/RCAReport.esm.js.map +1 -0
  101. package/dist/components/RCA/RCATable.esm.js +140 -0
  102. package/dist/components/RCA/RCATable.esm.js.map +1 -0
  103. package/dist/components/RuntimeLogs/LogEntry.esm.js +182 -0
  104. package/dist/components/RuntimeLogs/LogEntry.esm.js.map +1 -0
  105. package/dist/components/RuntimeLogs/LogsActions.esm.js +106 -0
  106. package/dist/components/RuntimeLogs/LogsActions.esm.js.map +1 -0
  107. package/dist/components/RuntimeLogs/LogsFilter.esm.js +200 -0
  108. package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -0
  109. package/dist/components/RuntimeLogs/LogsTable.esm.js +91 -0
  110. package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -0
  111. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +220 -0
  112. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -0
  113. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +222 -0
  114. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -0
  115. package/dist/components/RuntimeLogs/styles.esm.js +256 -0
  116. package/dist/components/RuntimeLogs/styles.esm.js.map +1 -0
  117. package/dist/components/RuntimeLogs/types.esm.js +16 -0
  118. package/dist/components/RuntimeLogs/types.esm.js.map +1 -0
  119. package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js +280 -0
  120. package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js.map +1 -0
  121. package/dist/components/Traces/ObservabilityTracesPage.esm.js +165 -0
  122. package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -0
  123. package/dist/components/Traces/TracesActions.esm.js +37 -0
  124. package/dist/components/Traces/TracesActions.esm.js.map +1 -0
  125. package/dist/components/Traces/TracesFilters.esm.js +121 -0
  126. package/dist/components/Traces/TracesFilters.esm.js.map +1 -0
  127. package/dist/components/Traces/TracesTable.esm.js +137 -0
  128. package/dist/components/Traces/TracesTable.esm.js.map +1 -0
  129. package/dist/components/Traces/WaterfallView.esm.js +567 -0
  130. package/dist/components/Traces/WaterfallView.esm.js.map +1 -0
  131. package/dist/components/Traces/styles.esm.js +198 -0
  132. package/dist/components/Traces/styles.esm.js.map +1 -0
  133. package/dist/components/Traces/utils.esm.js +19 -0
  134. package/dist/components/Traces/utils.esm.js.map +1 -0
  135. package/dist/hooks/useAutoSelectFirstEnvironment.esm.js +25 -0
  136. package/dist/hooks/useAutoSelectFirstEnvironment.esm.js.map +1 -0
  137. package/dist/hooks/useComponentAlerts.esm.js +80 -0
  138. package/dist/hooks/useComponentAlerts.esm.js.map +1 -0
  139. package/dist/hooks/useDataPlaneNetPolProvider.esm.js +55 -0
  140. package/dist/hooks/useDataPlaneNetPolProvider.esm.js.map +1 -0
  141. package/dist/hooks/useDebouncedSearch.esm.js +24 -0
  142. package/dist/hooks/useDebouncedSearch.esm.js.map +1 -0
  143. package/dist/hooks/useFilters.esm.js +29 -0
  144. package/dist/hooks/useFilters.esm.js.map +1 -0
  145. package/dist/hooks/useFinOpsReport.esm.js +66 -0
  146. package/dist/hooks/useFinOpsReport.esm.js.map +1 -0
  147. package/dist/hooks/useFinOpsReports.esm.js +70 -0
  148. package/dist/hooks/useFinOpsReports.esm.js.map +1 -0
  149. package/dist/hooks/useGetComponentsByProject.esm.js +57 -0
  150. package/dist/hooks/useGetComponentsByProject.esm.js.map +1 -0
  151. package/dist/hooks/useGetEnvironmentsByNamespace.esm.js +53 -0
  152. package/dist/hooks/useGetEnvironmentsByNamespace.esm.js.map +1 -0
  153. package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js +40 -0
  154. package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js.map +1 -0
  155. package/dist/hooks/useMetrics.esm.js +107 -0
  156. package/dist/hooks/useMetrics.esm.js.map +1 -0
  157. package/dist/hooks/useProjectIncidents.esm.js +111 -0
  158. package/dist/hooks/useProjectIncidents.esm.js.map +1 -0
  159. package/dist/hooks/useProjectRuntimeLogs.esm.js +185 -0
  160. package/dist/hooks/useProjectRuntimeLogs.esm.js.map +1 -0
  161. package/dist/hooks/useRCAReportByAlert.esm.js +54 -0
  162. package/dist/hooks/useRCAReportByAlert.esm.js.map +1 -0
  163. package/dist/hooks/useRCAReports.esm.js +75 -0
  164. package/dist/hooks/useRCAReports.esm.js.map +1 -0
  165. package/dist/hooks/useRuntimeLogs.esm.js +147 -0
  166. package/dist/hooks/useRuntimeLogs.esm.js.map +1 -0
  167. package/dist/hooks/useSpanDetails.esm.js +71 -0
  168. package/dist/hooks/useSpanDetails.esm.js.map +1 -0
  169. package/dist/hooks/useTraceSpans.esm.js +80 -0
  170. package/dist/hooks/useTraceSpans.esm.js.map +1 -0
  171. package/dist/hooks/useTraces.esm.js +112 -0
  172. package/dist/hooks/useTraces.esm.js.map +1 -0
  173. package/dist/hooks/useUpdateIncident.esm.js +50 -0
  174. package/dist/hooks/useUpdateIncident.esm.js.map +1 -0
  175. package/dist/hooks/useUrlFilters.esm.js +63 -0
  176. package/dist/hooks/useUrlFilters.esm.js.map +1 -0
  177. package/dist/hooks/useUrlFiltersForAlerts.esm.js +80 -0
  178. package/dist/hooks/useUrlFiltersForAlerts.esm.js.map +1 -0
  179. package/dist/hooks/useUrlFiltersForIncidents.esm.js +87 -0
  180. package/dist/hooks/useUrlFiltersForIncidents.esm.js.map +1 -0
  181. package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js +135 -0
  182. package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js.map +1 -0
  183. package/dist/index.d.ts +41 -0
  184. package/dist/index.esm.js +2 -0
  185. package/dist/index.esm.js.map +1 -0
  186. package/dist/plugin.esm.js +107 -0
  187. package/dist/plugin.esm.js.map +1 -0
  188. package/dist/routes.esm.js +8 -0
  189. package/dist/routes.esm.js.map +1 -0
  190. package/dist/types.esm.js +18 -0
  191. package/dist/types.esm.js.map +1 -0
  192. package/dist/utils/applyResourceChange.esm.js +79 -0
  193. package/dist/utils/applyResourceChange.esm.js.map +1 -0
  194. package/dist/utils/urlTimeRange.esm.js +52 -0
  195. package/dist/utils/urlTimeRange.esm.js.map +1 -0
  196. package/package.json +81 -0
@@ -0,0 +1,308 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useState } from 'react';
3
+ import { Box, IconButton, Typography, Button, Grid } from '@material-ui/core';
4
+ import ArrowBackIcon from '@material-ui/icons/ArrowBack';
5
+ import ChatOutlinedIcon from '@material-ui/icons/ChatOutlined';
6
+ import AutorenewIcon from '@material-ui/icons/Autorenew';
7
+ import { InfoCard } from '@backstage/core-components';
8
+ import BugReportOutlinedIcon from '@material-ui/icons/BugReportOutlined';
9
+ import TimelineOutlinedIcon from '@material-ui/icons/TimelineOutlined';
10
+ import ExploreOutlinedIcon from '@material-ui/icons/ExploreOutlined';
11
+ import NotInterestedOutlinedIcon from '@material-ui/icons/NotInterestedOutlined';
12
+ import AssignmentTurnedInOutlinedIcon from '@material-ui/icons/AssignmentTurnedInOutlined';
13
+ import EmojiObjectsOutlinedIcon from '@material-ui/icons/EmojiObjectsOutlined';
14
+ import { SystemTimelineSection } from './sections/SystemTimelineSection.esm.js';
15
+ import { RootCausesSection } from './sections/RootCausesSection.esm.js';
16
+ import { InvestigationPathSection } from './sections/InvestigationPathSection.esm.js';
17
+ import { ExcludedCausesSection } from './sections/ExcludedCausesSection.esm.js';
18
+ import { RecommendationsSection } from './sections/RecommendationsSection.esm.js';
19
+ import { VisibilityImprovementsSection } from './sections/VisibilityImprovementsSection.esm.js';
20
+ import { IncidentOverviewSection } from './sections/IncidentOverviewSection.esm.js';
21
+ import { AssessmentSection } from './sections/AssessmentSection.esm.js';
22
+ import { ChatPanelSection } from './sections/ChatPanelSection.esm.js';
23
+ import { QuickFixesPanelSection } from './sections/QuickFixesPanelSection.esm.js';
24
+ import { allActionsResolved } from './sections/PatchTabContent.esm.js';
25
+ import { useRCAReportStyles } from './styles.esm.js';
26
+ import { EntityLinkContext } from './EntityLinkContext.esm.js';
27
+
28
+ const RCAReportView = ({
29
+ report,
30
+ reportId,
31
+ onBack,
32
+ chatContext
33
+ }) => {
34
+ const classes = useRCAReportStyles();
35
+ const revisedActions = useMemo(() => {
36
+ const result = [];
37
+ const recs = (() => {
38
+ const r = report.report?.result;
39
+ if (r?.type === "root_cause_identified") return r.recommendations;
40
+ if (r?.type === "no_root_cause_identified") return r.recommendations;
41
+ return void 0;
42
+ })();
43
+ const actions = recs?.recommended_actions;
44
+ if (actions) {
45
+ actions.forEach((action, idx) => {
46
+ if ((action.status === "revised" || action.status === "applied" || action.status === "dismissed") && action.change) {
47
+ result.push({ index: idx, action });
48
+ }
49
+ });
50
+ }
51
+ return result;
52
+ }, [report]);
53
+ const hasRevised = revisedActions.length > 0;
54
+ const [activePanel, setActivePanel] = useState(
55
+ () => {
56
+ if (!hasRevised) return null;
57
+ if (allActionsResolved(revisedActions)) return null;
58
+ return "fixes";
59
+ }
60
+ );
61
+ const formatTimestamp = (timestamp) => {
62
+ if (!timestamp) return "N/A";
63
+ try {
64
+ const date = new Date(timestamp);
65
+ return date.toLocaleString("en-US", {
66
+ month: "short",
67
+ day: "numeric",
68
+ hour: "numeric",
69
+ minute: "2-digit"
70
+ });
71
+ } catch {
72
+ return timestamp;
73
+ }
74
+ };
75
+ const namespaceValue = useMemo(
76
+ () => ({ namespace: chatContext.namespaceName }),
77
+ [chatContext.namespaceName]
78
+ );
79
+ const rcaReport = report.report;
80
+ if (!rcaReport) {
81
+ return /* @__PURE__ */ jsxs(Box, { children: [
82
+ /* @__PURE__ */ jsx(Box, { className: classes.header, children: /* @__PURE__ */ jsxs(Box, { className: classes.headerLeft, children: [
83
+ /* @__PURE__ */ jsx(
84
+ IconButton,
85
+ {
86
+ onClick: onBack,
87
+ size: "small",
88
+ className: classes.backButton,
89
+ title: "Back to RCA reports",
90
+ children: /* @__PURE__ */ jsx(ArrowBackIcon, {})
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsxs(Box, { className: classes.titleContainer, children: [
94
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", className: classes.title, children: "RCA Report" }),
95
+ report.timestamp && /* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.subtitle, children: report.reportId })
96
+ ] })
97
+ ] }) }),
98
+ /* @__PURE__ */ jsx(Box, { className: classes.content, children: /* @__PURE__ */ jsxs(Box, { className: classes.emptyState, children: [
99
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", gutterBottom: true, children: "Report content not available" }),
100
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "The RCA report analysis is not yet complete or not available." })
101
+ ] }) })
102
+ ] });
103
+ }
104
+ const isNoRootCauseIdentified = rcaReport.result?.type === "no_root_cause_identified";
105
+ const timeline = rcaReport.result?.type === "root_cause_identified" ? rcaReport.result.timeline : void 0;
106
+ const rootCauses = rcaReport.result?.type === "root_cause_identified" ? rcaReport.result.root_causes : void 0;
107
+ const excludedCauses = rcaReport.result?.type === "root_cause_identified" ? rcaReport.result.excluded_causes : void 0;
108
+ const recommendations = (() => {
109
+ if (rcaReport.result?.type === "root_cause_identified") {
110
+ return rcaReport.result.recommendations;
111
+ }
112
+ if (rcaReport.result?.type === "no_root_cause_identified") {
113
+ return rcaReport.result.recommendations;
114
+ }
115
+ return void 0;
116
+ })();
117
+ const noRootCauseResult = rcaReport.result?.type === "no_root_cause_identified" ? rcaReport.result : void 0;
118
+ const alertContext = rcaReport.alert_context;
119
+ const investigationPath = rcaReport.investigation_path;
120
+ return /* @__PURE__ */ jsx(EntityLinkContext.Provider, { value: namespaceValue, children: /* @__PURE__ */ jsxs(Box, { children: [
121
+ /* @__PURE__ */ jsxs(Box, { className: classes.header, children: [
122
+ /* @__PURE__ */ jsxs(Box, { className: classes.headerLeft, children: [
123
+ /* @__PURE__ */ jsx(
124
+ IconButton,
125
+ {
126
+ onClick: onBack,
127
+ size: "small",
128
+ className: classes.backButton,
129
+ title: "Back to RCA reports",
130
+ children: /* @__PURE__ */ jsx(ArrowBackIcon, {})
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsxs(Box, { className: classes.titleContainer, children: [
134
+ /* @__PURE__ */ jsx(Typography, { variant: "h5", className: classes.title, children: "RCA Report" }),
135
+ report.timestamp && /* @__PURE__ */ jsx(Typography, { variant: "body2", className: classes.subtitle, children: report.reportId })
136
+ ] })
137
+ ] }),
138
+ /* @__PURE__ */ jsxs(Box, { display: "flex", style: { gap: 8 }, children: [
139
+ hasRevised && /* @__PURE__ */ jsx(
140
+ Button,
141
+ {
142
+ variant: activePanel === "fixes" ? "contained" : "outlined",
143
+ color: "primary",
144
+ size: "small",
145
+ startIcon: /* @__PURE__ */ jsx(AutorenewIcon, {}),
146
+ onClick: () => setActivePanel((prev) => prev === "fixes" ? null : "fixes"),
147
+ children: "Quick Fixes"
148
+ }
149
+ ),
150
+ /* @__PURE__ */ jsx(
151
+ Button,
152
+ {
153
+ variant: activePanel === "chat" ? "contained" : "outlined",
154
+ color: "primary",
155
+ size: "small",
156
+ startIcon: /* @__PURE__ */ jsx(ChatOutlinedIcon, {}),
157
+ onClick: () => setActivePanel((prev) => prev === "chat" ? null : "chat"),
158
+ children: "Chat"
159
+ }
160
+ )
161
+ ] })
162
+ ] }),
163
+ /* @__PURE__ */ jsx(Box, { className: classes.content, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
164
+ /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, style: { flex: "0 0 62%", maxWidth: "62%" }, children: [
165
+ /* @__PURE__ */ jsx(
166
+ IncidentOverviewSection,
167
+ {
168
+ summary: rcaReport.summary || "",
169
+ alertContext,
170
+ reportId,
171
+ reportTimestamp: report.timestamp,
172
+ formatTimestamp
173
+ }
174
+ ),
175
+ isNoRootCauseIdentified && noRootCauseResult && /* @__PURE__ */ jsx(AssessmentSection, { noRootCauseResult }),
176
+ rootCauses && /* @__PURE__ */ jsx(Box, { className: classes.infoCardSpacing, children: /* @__PURE__ */ jsx(
177
+ InfoCard,
178
+ {
179
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
180
+ /* @__PURE__ */ jsx(
181
+ BugReportOutlinedIcon,
182
+ {
183
+ className: classes.cardTitleIcon
184
+ }
185
+ ),
186
+ "Likely Root Causes"
187
+ ] }),
188
+ children: /* @__PURE__ */ jsx(RootCausesSection, { rootCauses })
189
+ }
190
+ ) }),
191
+ excludedCauses && excludedCauses.length > 0 && /* @__PURE__ */ jsx(Box, { className: classes.infoCardSpacing, children: /* @__PURE__ */ jsx(
192
+ InfoCard,
193
+ {
194
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
195
+ /* @__PURE__ */ jsx(
196
+ NotInterestedOutlinedIcon,
197
+ {
198
+ className: classes.cardTitleIcon
199
+ }
200
+ ),
201
+ "Unlikely Causes"
202
+ ] }),
203
+ children: /* @__PURE__ */ jsx(ExcludedCausesSection, { excludedCauses })
204
+ }
205
+ ) }),
206
+ recommendations?.recommended_actions && recommendations.recommended_actions.length > 0 && /* @__PURE__ */ jsx(Box, { className: classes.infoCardSpacing, children: /* @__PURE__ */ jsx(
207
+ InfoCard,
208
+ {
209
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
210
+ /* @__PURE__ */ jsx(
211
+ AssignmentTurnedInOutlinedIcon,
212
+ {
213
+ className: classes.cardTitleIcon
214
+ }
215
+ ),
216
+ "Actionable Next Steps"
217
+ ] }),
218
+ children: /* @__PURE__ */ jsx(
219
+ RecommendationsSection,
220
+ {
221
+ actions: recommendations.recommended_actions
222
+ }
223
+ )
224
+ }
225
+ ) }),
226
+ recommendations?.observability_recommendations && recommendations.observability_recommendations.length > 0 && /* @__PURE__ */ jsx(
227
+ InfoCard,
228
+ {
229
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
230
+ /* @__PURE__ */ jsx(
231
+ EmojiObjectsOutlinedIcon,
232
+ {
233
+ className: classes.cardTitleIcon
234
+ }
235
+ ),
236
+ "Observability Suggestions"
237
+ ] }),
238
+ children: /* @__PURE__ */ jsx(
239
+ VisibilityImprovementsSection,
240
+ {
241
+ recommendations: recommendations.observability_recommendations
242
+ }
243
+ )
244
+ }
245
+ )
246
+ ] }),
247
+ /* @__PURE__ */ jsxs(
248
+ Grid,
249
+ {
250
+ item: true,
251
+ xs: 12,
252
+ style: { flex: "0 0 38%", maxWidth: "38%" },
253
+ className: classes.sidebarColumn,
254
+ children: [
255
+ activePanel === "chat" && /* @__PURE__ */ jsx(
256
+ ChatPanelSection,
257
+ {
258
+ reportId,
259
+ chatContext
260
+ }
261
+ ),
262
+ activePanel === "fixes" && /* @__PURE__ */ jsx(
263
+ QuickFixesPanelSection,
264
+ {
265
+ reportId,
266
+ chatContext,
267
+ revisedActions
268
+ }
269
+ ),
270
+ timeline && timeline.length > 0 && /* @__PURE__ */ jsx(Box, { className: classes.infoCardSpacing, children: /* @__PURE__ */ jsx(
271
+ InfoCard,
272
+ {
273
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
274
+ /* @__PURE__ */ jsx(
275
+ TimelineOutlinedIcon,
276
+ {
277
+ className: classes.cardTitleIcon
278
+ }
279
+ ),
280
+ "System Timeline"
281
+ ] }),
282
+ children: /* @__PURE__ */ jsx(SystemTimelineSection, { timeline })
283
+ }
284
+ ) }),
285
+ investigationPath && investigationPath.length > 0 && /* @__PURE__ */ jsx(
286
+ InfoCard,
287
+ {
288
+ title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
289
+ /* @__PURE__ */ jsx(ExploreOutlinedIcon, { className: classes.cardTitleIcon }),
290
+ "Investigation Path"
291
+ ] }),
292
+ children: /* @__PURE__ */ jsx(
293
+ InvestigationPathSection,
294
+ {
295
+ investigationPath
296
+ }
297
+ )
298
+ }
299
+ )
300
+ ]
301
+ }
302
+ )
303
+ ] }) })
304
+ ] }) });
305
+ };
306
+
307
+ export { RCAReportView };
308
+ //# sourceMappingURL=RCAReportView.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RCAReportView.esm.js","sources":["../../../../src/components/RCA/RCAReport/RCAReportView.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Typography, Grid, Box, IconButton, Button } from '@material-ui/core';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\nimport ChatOutlinedIcon from '@material-ui/icons/ChatOutlined';\nimport AutorenewIcon from '@material-ui/icons/Autorenew';\nimport { InfoCard } from '@backstage/core-components';\nimport BugReportOutlinedIcon from '@material-ui/icons/BugReportOutlined';\nimport TimelineOutlinedIcon from '@material-ui/icons/TimelineOutlined';\nimport ExploreOutlinedIcon from '@material-ui/icons/ExploreOutlined';\nimport NotInterestedOutlinedIcon from '@material-ui/icons/NotInterestedOutlined';\nimport AssignmentTurnedInOutlinedIcon from '@material-ui/icons/AssignmentTurnedInOutlined';\nimport EmojiObjectsOutlinedIcon from '@material-ui/icons/EmojiObjectsOutlined';\nimport { SystemTimelineSection } from './sections/SystemTimelineSection';\nimport { RootCausesSection } from './sections/RootCausesSection';\nimport { InvestigationPathSection } from './sections/InvestigationPathSection';\nimport { ExcludedCausesSection } from './sections/ExcludedCausesSection';\nimport { RecommendationsSection } from './sections/RecommendationsSection';\nimport { VisibilityImprovementsSection } from './sections/VisibilityImprovementsSection';\nimport { IncidentOverviewSection } from './sections/IncidentOverviewSection';\nimport { AssessmentSection } from './sections/AssessmentSection';\nimport { ChatPanelSection } from './sections/ChatPanelSection';\nimport { QuickFixesPanelSection } from './sections/QuickFixesPanelSection';\nimport { allActionsResolved } from './sections/PatchTabContent';\nimport { useRCAReportStyles } from './styles';\nimport { EntityLinkContext } from './EntityLinkContext';\nimport type { AIRCAAgentComponents } from '@openchoreo/backstage-plugin-common';\nimport type { RCAAgentApi, RecommendedAction } from '../../../api/RCAAgentApi';\n\ntype RCAReportDetailed = AIRCAAgentComponents['schemas']['RCAReportDetailed'];\n\ninterface ChatContext {\n namespaceName: string;\n environmentName: string;\n projectName: string;\n rcaAgentApi: RCAAgentApi;\n backendBaseUrl?: string;\n}\n\ninterface RCAReportViewProps {\n report: RCAReportDetailed;\n reportId: string;\n onBack: () => void;\n chatContext: ChatContext;\n}\n\nexport const RCAReportView = ({\n report,\n reportId,\n onBack,\n chatContext,\n}: RCAReportViewProps) => {\n const classes = useRCAReportStyles();\n\n // Compute revised actions from the report\n const revisedActions = useMemo(() => {\n const result: { index: number; action: RecommendedAction }[] = [];\n const recs = (() => {\n const r = report.report?.result;\n if (r?.type === 'root_cause_identified') return r.recommendations;\n if (r?.type === 'no_root_cause_identified') return r.recommendations;\n return undefined;\n })();\n const actions = recs?.recommended_actions;\n if (actions) {\n actions.forEach((action, idx) => {\n if (\n (action.status === 'revised' ||\n action.status === 'applied' ||\n action.status === 'dismissed') &&\n action.change\n ) {\n result.push({ index: idx, action });\n }\n });\n }\n return result;\n }, [report]);\n\n const hasRevised = revisedActions.length > 0;\n\n const [activePanel, setActivePanel] = useState<'chat' | 'fixes' | null>(\n () => {\n if (!hasRevised) return null;\n if (allActionsResolved(revisedActions)) return null;\n return 'fixes';\n },\n );\n\n const formatTimestamp = (timestamp?: string): string => {\n if (!timestamp) return 'N/A';\n try {\n const date = new Date(timestamp);\n return date.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n } catch {\n return timestamp;\n }\n };\n\n const namespaceValue = useMemo(\n () => ({ namespace: chatContext.namespaceName }),\n [chatContext.namespaceName],\n );\n\n const rcaReport = report.report;\n\n if (!rcaReport) {\n return (\n <Box>\n <Box className={classes.header}>\n <Box className={classes.headerLeft}>\n <IconButton\n onClick={onBack}\n size=\"small\"\n className={classes.backButton}\n title=\"Back to RCA reports\"\n >\n <ArrowBackIcon />\n </IconButton>\n <Box className={classes.titleContainer}>\n <Typography variant=\"h5\" className={classes.title}>\n RCA Report\n </Typography>\n {report.timestamp && (\n <Typography variant=\"body2\" className={classes.subtitle}>\n {report.reportId}\n </Typography>\n )}\n </Box>\n </Box>\n </Box>\n <Box className={classes.content}>\n <Box className={classes.emptyState}>\n <Typography variant=\"h6\" gutterBottom>\n Report content not available\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n The RCA report analysis is not yet complete or not available.\n </Typography>\n </Box>\n </Box>\n </Box>\n );\n }\n\n const isNoRootCauseIdentified =\n rcaReport.result?.type === 'no_root_cause_identified';\n\n const timeline =\n rcaReport.result?.type === 'root_cause_identified'\n ? rcaReport.result.timeline\n : undefined;\n\n const rootCauses =\n rcaReport.result?.type === 'root_cause_identified'\n ? rcaReport.result.root_causes\n : undefined;\n\n const excludedCauses =\n rcaReport.result?.type === 'root_cause_identified'\n ? rcaReport.result.excluded_causes\n : undefined;\n\n const recommendations = (() => {\n if (rcaReport.result?.type === 'root_cause_identified') {\n return rcaReport.result.recommendations;\n }\n if (rcaReport.result?.type === 'no_root_cause_identified') {\n return rcaReport.result.recommendations;\n }\n return undefined;\n })();\n\n const noRootCauseResult =\n rcaReport.result?.type === 'no_root_cause_identified'\n ? rcaReport.result\n : undefined;\n\n const alertContext = rcaReport.alert_context;\n\n const investigationPath = rcaReport.investigation_path;\n\n return (\n <EntityLinkContext.Provider value={namespaceValue}>\n <Box>\n <Box className={classes.header}>\n <Box className={classes.headerLeft}>\n <IconButton\n onClick={onBack}\n size=\"small\"\n className={classes.backButton}\n title=\"Back to RCA reports\"\n >\n <ArrowBackIcon />\n </IconButton>\n <Box className={classes.titleContainer}>\n <Typography variant=\"h5\" className={classes.title}>\n RCA Report\n </Typography>\n {report.timestamp && (\n <Typography variant=\"body2\" className={classes.subtitle}>\n {report.reportId}\n </Typography>\n )}\n </Box>\n </Box>\n <Box display=\"flex\" style={{ gap: 8 }}>\n {hasRevised && (\n <Button\n variant={activePanel === 'fixes' ? 'contained' : 'outlined'}\n color=\"primary\"\n size=\"small\"\n startIcon={<AutorenewIcon />}\n onClick={() =>\n setActivePanel(prev => (prev === 'fixes' ? null : 'fixes'))\n }\n >\n Quick Fixes\n </Button>\n )}\n <Button\n variant={activePanel === 'chat' ? 'contained' : 'outlined'}\n color=\"primary\"\n size=\"small\"\n startIcon={<ChatOutlinedIcon />}\n onClick={() =>\n setActivePanel(prev => (prev === 'chat' ? null : 'chat'))\n }\n >\n Chat\n </Button>\n </Box>\n </Box>\n <Box className={classes.content}>\n <Grid container spacing={1}>\n <Grid item xs={12} style={{ flex: '0 0 62%', maxWidth: '62%' }}>\n <IncidentOverviewSection\n summary={rcaReport.summary || ''}\n alertContext={alertContext}\n reportId={reportId}\n reportTimestamp={report.timestamp}\n formatTimestamp={formatTimestamp}\n />\n {isNoRootCauseIdentified && noRootCauseResult && (\n <AssessmentSection noRootCauseResult={noRootCauseResult} />\n )}\n {rootCauses && (\n <Box className={classes.infoCardSpacing}>\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <BugReportOutlinedIcon\n className={classes.cardTitleIcon}\n />\n Likely Root Causes\n </span>\n }\n >\n <RootCausesSection rootCauses={rootCauses} />\n </InfoCard>\n </Box>\n )}\n {excludedCauses && excludedCauses.length > 0 && (\n <Box className={classes.infoCardSpacing}>\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <NotInterestedOutlinedIcon\n className={classes.cardTitleIcon}\n />\n Unlikely Causes\n </span>\n }\n >\n <ExcludedCausesSection excludedCauses={excludedCauses} />\n </InfoCard>\n </Box>\n )}\n {recommendations?.recommended_actions &&\n recommendations.recommended_actions.length > 0 && (\n <Box className={classes.infoCardSpacing}>\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <AssignmentTurnedInOutlinedIcon\n className={classes.cardTitleIcon}\n />\n Actionable Next Steps\n </span>\n }\n >\n <RecommendationsSection\n actions={recommendations.recommended_actions}\n />\n </InfoCard>\n </Box>\n )}\n {recommendations?.observability_recommendations &&\n recommendations.observability_recommendations.length > 0 && (\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <EmojiObjectsOutlinedIcon\n className={classes.cardTitleIcon}\n />\n Observability Suggestions\n </span>\n }\n >\n <VisibilityImprovementsSection\n recommendations={\n recommendations.observability_recommendations\n }\n />\n </InfoCard>\n )}\n </Grid>\n\n <Grid\n item\n xs={12}\n style={{ flex: '0 0 38%', maxWidth: '38%' }}\n className={classes.sidebarColumn}\n >\n {activePanel === 'chat' && (\n <ChatPanelSection\n reportId={reportId}\n chatContext={chatContext}\n />\n )}\n {activePanel === 'fixes' && (\n <QuickFixesPanelSection\n reportId={reportId}\n chatContext={chatContext}\n revisedActions={revisedActions}\n />\n )}\n {timeline && timeline.length > 0 && (\n <Box className={classes.infoCardSpacing}>\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <TimelineOutlinedIcon\n className={classes.cardTitleIcon}\n />\n System Timeline\n </span>\n }\n >\n <SystemTimelineSection timeline={timeline} />\n </InfoCard>\n </Box>\n )}\n {investigationPath && investigationPath.length > 0 && (\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <ExploreOutlinedIcon className={classes.cardTitleIcon} />\n Investigation Path\n </span>\n }\n >\n <InvestigationPathSection\n investigationPath={investigationPath}\n />\n </InfoCard>\n )}\n </Grid>\n </Grid>\n </Box>\n </Box>\n </EntityLinkContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAGnC,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM;AACnC,IAAA,MAAM,SAAyD,EAAC;AAChE,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAM,CAAA,GAAI,OAAO,MAAA,EAAQ,MAAA;AACzB,MAAA,IAAI,CAAA,EAAG,IAAA,KAAS,uBAAA,EAAyB,OAAO,CAAA,CAAE,eAAA;AAClD,MAAA,IAAI,CAAA,EAAG,IAAA,KAAS,0BAAA,EAA4B,OAAO,CAAA,CAAE,eAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,GAAG;AACH,IAAA,MAAM,UAAU,IAAA,EAAM,mBAAA;AACtB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AAC/B,QAAA,IAAA,CACG,MAAA,CAAO,MAAA,KAAW,SAAA,IACjB,MAAA,CAAO,MAAA,KAAW,aAClB,MAAA,CAAO,MAAA,KAAW,WAAA,KACpB,MAAA,CAAO,MAAA,EACP;AACA,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAAA,QACpC;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,UAAA,GAAa,eAAe,MAAA,GAAS,CAAA;AAE3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA;AAAA,IACpC,MAAM;AACJ,MAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,MAAA,IAAI,kBAAA,CAAmB,cAAc,CAAA,EAAG,OAAO,IAAA;AAC/C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,SAAA,KAA+B;AACtD,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,MAAA,OAAO,IAAA,CAAK,eAAe,OAAA,EAAS;AAAA,QAClC,KAAA,EAAO,OAAA;AAAA,QACP,GAAA,EAAK,SAAA;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,IACrB,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,aAAA,EAAc,CAAA;AAAA,IAC9C,CAAC,YAAY,aAAa;AAAA,GAC5B;AAEA,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AAEzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,4BACG,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,MAAA,EACtB,+BAAC,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,UAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAA;AAAA,YACT,IAAA,EAAK,OAAA;AAAA,YACL,WAAW,OAAA,CAAQ,UAAA;AAAA,YACnB,KAAA,EAAM,qBAAA;AAAA,YAEN,8BAAC,aAAA,EAAA,EAAc;AAAA;AAAA,SACjB;AAAA,wBACA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,cAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,OAAO,QAAA,EAAA,YAAA,EAEnD,CAAA;AAAA,UACC,MAAA,CAAO,SAAA,oBACN,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,SAAA,EAAW,OAAA,CAAQ,QAAA,EAC5C,QAAA,EAAA,MAAA,CAAO,QAAA,EACV;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,OAAI,SAAA,EAAW,OAAA,CAAQ,SACtB,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,UAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAAC,QAAA,EAAA,8BAAA,EAEtC,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,+DAAA,EAElD;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,uBAAA,GACJ,SAAA,CAAU,MAAA,EAAQ,IAAA,KAAS,0BAAA;AAE7B,EAAA,MAAM,WACJ,SAAA,CAAU,MAAA,EAAQ,SAAS,uBAAA,GACvB,SAAA,CAAU,OAAO,QAAA,GACjB,MAAA;AAEN,EAAA,MAAM,aACJ,SAAA,CAAU,MAAA,EAAQ,SAAS,uBAAA,GACvB,SAAA,CAAU,OAAO,WAAA,GACjB,MAAA;AAEN,EAAA,MAAM,iBACJ,SAAA,CAAU,MAAA,EAAQ,SAAS,uBAAA,GACvB,SAAA,CAAU,OAAO,eAAA,GACjB,MAAA;AAEN,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,SAAA,CAAU,MAAA,EAAQ,IAAA,KAAS,uBAAA,EAAyB;AACtD,MAAA,OAAO,UAAU,MAAA,CAAO,eAAA;AAAA,IAC1B;AACA,IAAA,IAAI,SAAA,CAAU,MAAA,EAAQ,IAAA,KAAS,0BAAA,EAA4B;AACzD,MAAA,OAAO,UAAU,MAAA,CAAO,eAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,GAAG;AAEH,EAAA,MAAM,oBACJ,SAAA,CAAU,MAAA,EAAQ,IAAA,KAAS,0BAAA,GACvB,UAAU,MAAA,GACV,MAAA;AAEN,EAAA,MAAM,eAAe,SAAA,CAAU,aAAA;AAE/B,EAAA,MAAM,oBAAoB,SAAA,CAAU,kBAAA;AAEpC,EAAA,2BACG,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,cAAA,EACjC,+BAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,UAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAA;AAAA,YACT,IAAA,EAAK,OAAA;AAAA,YACL,WAAW,OAAA,CAAQ,UAAA;AAAA,YACnB,KAAA,EAAM,qBAAA;AAAA,YAEN,8BAAC,aAAA,EAAA,EAAc;AAAA;AAAA,SACjB;AAAA,wBACA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,cAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,OAAO,QAAA,EAAA,YAAA,EAEnD,CAAA;AAAA,UACC,MAAA,CAAO,SAAA,oBACN,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,SAAA,EAAW,OAAA,CAAQ,QAAA,EAC5C,QAAA,EAAA,MAAA,CAAO,QAAA,EACV;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,OAAO,EAAE,GAAA,EAAK,GAAE,EACjC,QAAA,EAAA;AAAA,QAAA,UAAA,oBACC,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA,KAAgB,OAAA,GAAU,WAAA,GAAc,UAAA;AAAA,YACjD,KAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAK,OAAA;AAAA,YACL,SAAA,sBAAY,aAAA,EAAA,EAAc,CAAA;AAAA,YAC1B,SAAS,MACP,cAAA,CAAe,UAAS,IAAA,KAAS,OAAA,GAAU,OAAO,OAAQ,CAAA;AAAA,YAE7D,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBAEF,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA,KAAgB,MAAA,GAAS,WAAA,GAAc,UAAA;AAAA,YAChD,KAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAK,OAAA;AAAA,YACL,SAAA,sBAAY,gBAAA,EAAA,EAAiB,CAAA;AAAA,YAC7B,SAAS,MACP,cAAA,CAAe,UAAS,IAAA,KAAS,MAAA,GAAS,OAAO,MAAO,CAAA;AAAA,YAE3D,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACtB,+BAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,OAAA,EAAS,CAAA,EACvB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,KAAA,EAAM,EAC3D,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,uBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,UAAU,OAAA,IAAW,EAAA;AAAA,YAC9B,YAAA;AAAA,YACA,QAAA;AAAA,YACA,iBAAiB,MAAA,CAAO,SAAA;AAAA,YACxB;AAAA;AAAA,SACF;AAAA,QACC,uBAAA,IAA2B,iBAAA,oBAC1B,GAAA,CAAC,iBAAA,EAAA,EAAkB,iBAAA,EAAsC,CAAA;AAAA,QAE1D,UAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,eAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ;AAAA;AAAA,eACrB;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,YAGF,QAAA,kBAAA,GAAA,CAAC,qBAAkB,UAAA,EAAwB;AAAA;AAAA,SAC7C,EACF,CAAA;AAAA,QAED,cAAA,IAAkB,eAAe,MAAA,GAAS,CAAA,wBACxC,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,eAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,yBAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ;AAAA;AAAA,eACrB;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,YAGF,QAAA,kBAAA,GAAA,CAAC,yBAAsB,cAAA,EAAgC;AAAA;AAAA,SACzD,EACF,CAAA;AAAA,QAED,eAAA,EAAiB,mBAAA,IAChB,eAAA,CAAgB,mBAAA,CAAoB,MAAA,GAAS,qBAC3C,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,eAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,8BAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ;AAAA;AAAA,eACrB;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,YAGF,QAAA,kBAAA,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,SAAS,eAAA,CAAgB;AAAA;AAAA;AAC3B;AAAA,SACF,EACF,CAAA;AAAA,QAEH,eAAA,EAAiB,6BAAA,IAChB,eAAA,CAAgB,6BAAA,CAA8B,SAAS,CAAA,oBACrD,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,wBAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ;AAAA;AAAA,eACrB;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,YAGF,QAAA,kBAAA,GAAA;AAAA,cAAC,6BAAA;AAAA,cAAA;AAAA,gBACC,iBACE,eAAA,CAAgB;AAAA;AAAA;AAEpB;AAAA;AACF,OAAA,EAEN,CAAA;AAAA,sBAEA,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAI,IAAA;AAAA,UACJ,EAAA,EAAI,EAAA;AAAA,UACJ,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,KAAA,EAAM;AAAA,UAC1C,WAAW,OAAA,CAAQ,aAAA;AAAA,UAElB,QAAA,EAAA;AAAA,YAAA,WAAA,KAAgB,MAAA,oBACf,GAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,QAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,YAED,gBAAgB,OAAA,oBACf,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,QAAA;AAAA,gBACA,WAAA;AAAA,gBACA;AAAA;AAAA,aACF;AAAA,YAED,QAAA,IAAY,SAAS,MAAA,GAAS,CAAA,wBAC5B,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,eAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,oBAAA;AAAA,oBAAA;AAAA,sBACC,WAAW,OAAA,CAAQ;AAAA;AAAA,mBACrB;AAAA,kBAAE;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBAGF,QAAA,kBAAA,GAAA,CAAC,yBAAsB,QAAA,EAAoB;AAAA;AAAA,aAC7C,EACF,CAAA;AAAA,YAED,iBAAA,IAAqB,iBAAA,CAAkB,MAAA,GAAS,CAAA,oBAC/C,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,SAAA,EAAW,OAAA,CAAQ,aAAA,EAAe,CAAA;AAAA,kBAAE;AAAA,iBAAA,EAE3D,CAAA;AAAA,gBAGF,QAAA,kBAAA,GAAA;AAAA,kBAAC,wBAAA;AAAA,kBAAA;AAAA,oBACC;AAAA;AAAA;AACF;AAAA;AACF;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,113 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Box, Typography } from '@material-ui/core';
3
+ import { makeStyles } from '@material-ui/core/styles';
4
+ import { InfoCard } from '@backstage/core-components';
5
+ import AssessmentOutlinedIcon from '@material-ui/icons/AssessmentOutlined';
6
+ import { FormattedText } from '../FormattedText.esm.js';
7
+ import { useRCAReportStyles } from '../styles.esm.js';
8
+
9
+ const useStyles = makeStyles((theme) => ({
10
+ propertyGrid: {
11
+ display: "flex",
12
+ flexDirection: "column",
13
+ gap: theme.spacing(1.5)
14
+ },
15
+ propertyRow: {
16
+ display: "flex",
17
+ alignItems: "baseline",
18
+ gap: theme.spacing(2)
19
+ },
20
+ propertyKey: {
21
+ fontWeight: 500,
22
+ color: theme.palette.text.secondary,
23
+ fontSize: theme.typography.body2.fontSize,
24
+ minWidth: 100,
25
+ flexShrink: 0
26
+ },
27
+ propertyValue: {
28
+ color: theme.palette.text.primary,
29
+ fontSize: theme.typography.body2.fontSize,
30
+ wordBreak: "break-word"
31
+ },
32
+ outcomeTransient: {
33
+ color: theme.palette.warning.main,
34
+ fontWeight: 500
35
+ },
36
+ outcomeNoAnomaly: {
37
+ color: theme.palette.success.main,
38
+ fontWeight: 500
39
+ },
40
+ outcomeInsufficientData: {
41
+ color: theme.palette.warning.main,
42
+ fontWeight: 500
43
+ },
44
+ outcomeExternal: {
45
+ color: theme.palette.info.main,
46
+ fontWeight: 500
47
+ }
48
+ }));
49
+ const getOutcomeClass = (outcome, classes) => {
50
+ switch (outcome) {
51
+ case "no_anomaly_detected":
52
+ return classes.outcomeNoAnomaly;
53
+ case "insufficient_data":
54
+ return classes.outcomeInsufficientData;
55
+ case "transient":
56
+ return classes.outcomeTransient;
57
+ case "external_dependency":
58
+ return classes.outcomeExternal;
59
+ default:
60
+ return "";
61
+ }
62
+ };
63
+ const getOutcomeLabel = (outcome) => {
64
+ switch (outcome) {
65
+ case "no_anomaly_detected":
66
+ return "No Anomaly Detected";
67
+ case "insufficient_data":
68
+ return "Insufficient Data";
69
+ case "transient":
70
+ return "Transient Issue";
71
+ case "external_dependency":
72
+ return "External Dependency";
73
+ default:
74
+ return outcome;
75
+ }
76
+ };
77
+ const AssessmentSection = ({
78
+ noRootCauseResult
79
+ }) => {
80
+ const sharedClasses = useRCAReportStyles();
81
+ const classes = useStyles();
82
+ return /* @__PURE__ */ jsx(Box, { className: sharedClasses.infoCardSpacing, children: /* @__PURE__ */ jsx(
83
+ InfoCard,
84
+ {
85
+ title: /* @__PURE__ */ jsxs("span", { className: sharedClasses.cardTitle, children: [
86
+ /* @__PURE__ */ jsx(AssessmentOutlinedIcon, { className: sharedClasses.cardTitleIcon }),
87
+ "Assessment"
88
+ ] }),
89
+ children: /* @__PURE__ */ jsxs(Box, { className: classes.propertyGrid, children: [
90
+ /* @__PURE__ */ jsxs(Box, { className: classes.propertyRow, children: [
91
+ /* @__PURE__ */ jsx(Typography, { className: classes.propertyKey, children: "Outcome" }),
92
+ /* @__PURE__ */ jsx(
93
+ Typography,
94
+ {
95
+ className: `${classes.propertyValue} ${getOutcomeClass(
96
+ noRootCauseResult.outcome,
97
+ classes
98
+ )}`,
99
+ children: getOutcomeLabel(noRootCauseResult.outcome)
100
+ }
101
+ )
102
+ ] }),
103
+ /* @__PURE__ */ jsxs(Box, { className: classes.propertyRow, children: [
104
+ /* @__PURE__ */ jsx(Typography, { className: classes.propertyKey, children: "Explanation" }),
105
+ /* @__PURE__ */ jsx(Typography, { className: classes.propertyValue, children: /* @__PURE__ */ jsx(FormattedText, { text: noRootCauseResult.explanation }) })
106
+ ] })
107
+ ] })
108
+ }
109
+ ) });
110
+ };
111
+
112
+ export { AssessmentSection };
113
+ //# sourceMappingURL=AssessmentSection.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssessmentSection.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/AssessmentSection.tsx"],"sourcesContent":["import { Box, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { InfoCard } from '@backstage/core-components';\nimport AssessmentOutlinedIcon from '@material-ui/icons/AssessmentOutlined';\nimport { FormattedText } from '../FormattedText';\nimport { useRCAReportStyles } from '../styles';\nimport type { AIRCAAgentComponents } from '@openchoreo/backstage-plugin-common';\n\ntype NoRootCauseIdentified =\n AIRCAAgentComponents['schemas']['NoRootCauseIdentified'];\ntype NoRootCauseOutcome = NoRootCauseIdentified['outcome'];\n\ninterface AssessmentSectionProps {\n noRootCauseResult: NoRootCauseIdentified;\n}\n\nconst useStyles = makeStyles(theme => ({\n propertyGrid: {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1.5),\n },\n propertyRow: {\n display: 'flex',\n alignItems: 'baseline',\n gap: theme.spacing(2),\n },\n propertyKey: {\n fontWeight: 500,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n minWidth: 100,\n flexShrink: 0,\n },\n propertyValue: {\n color: theme.palette.text.primary,\n fontSize: theme.typography.body2.fontSize,\n wordBreak: 'break-word',\n },\n outcomeTransient: {\n color: theme.palette.warning.main,\n fontWeight: 500,\n },\n outcomeNoAnomaly: {\n color: theme.palette.success.main,\n fontWeight: 500,\n },\n outcomeInsufficientData: {\n color: theme.palette.warning.main,\n fontWeight: 500,\n },\n outcomeExternal: {\n color: theme.palette.info.main,\n fontWeight: 500,\n },\n}));\n\nconst getOutcomeClass = (\n outcome: NoRootCauseOutcome,\n classes: ReturnType<typeof useStyles>,\n): string => {\n switch (outcome) {\n case 'no_anomaly_detected':\n return classes.outcomeNoAnomaly;\n case 'insufficient_data':\n return classes.outcomeInsufficientData;\n case 'transient':\n return classes.outcomeTransient;\n case 'external_dependency':\n return classes.outcomeExternal;\n default:\n return '';\n }\n};\n\nconst getOutcomeLabel = (outcome: NoRootCauseOutcome): string => {\n switch (outcome) {\n case 'no_anomaly_detected':\n return 'No Anomaly Detected';\n case 'insufficient_data':\n return 'Insufficient Data';\n case 'transient':\n return 'Transient Issue';\n case 'external_dependency':\n return 'External Dependency';\n default:\n return outcome;\n }\n};\n\nexport const AssessmentSection = ({\n noRootCauseResult,\n}: AssessmentSectionProps) => {\n const sharedClasses = useRCAReportStyles();\n const classes = useStyles();\n\n return (\n <Box className={sharedClasses.infoCardSpacing}>\n <InfoCard\n title={\n <span className={sharedClasses.cardTitle}>\n <AssessmentOutlinedIcon className={sharedClasses.cardTitleIcon} />\n Assessment\n </span>\n }\n >\n <Box className={classes.propertyGrid}>\n <Box className={classes.propertyRow}>\n <Typography className={classes.propertyKey}>Outcome</Typography>\n <Typography\n className={`${classes.propertyValue} ${getOutcomeClass(\n noRootCauseResult.outcome,\n classes,\n )}`}\n >\n {getOutcomeLabel(noRootCauseResult.outcome)}\n </Typography>\n </Box>\n <Box className={classes.propertyRow}>\n <Typography className={classes.propertyKey}>Explanation</Typography>\n <Typography className={classes.propertyValue}>\n <FormattedText text={noRootCauseResult.explanation} />\n </Typography>\n </Box>\n </Box>\n </InfoCard>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}