@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,526 @@
1
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
+ import { Fragment, useState } from 'react';
3
+ import { List, ListItem, Divider, Box, Typography, ButtonBase, Collapse } from '@material-ui/core';
4
+ import { makeStyles, alpha } from '@material-ui/core/styles';
5
+ import DescriptionOutlinedIcon from '@material-ui/icons/DescriptionOutlined';
6
+ import ShowChartIcon from '@material-ui/icons/ShowChart';
7
+ import AccountTreeIcon from '@material-ui/icons/AccountTree';
8
+ import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
9
+ import { FormattedText } from '../FormattedText.esm.js';
10
+
11
+ const useStyles = makeStyles((theme) => ({
12
+ list: {
13
+ padding: 0
14
+ },
15
+ listItem: {
16
+ padding: theme.spacing(1.5, 0),
17
+ display: "block"
18
+ },
19
+ rootCauseHeader: {
20
+ display: "flex",
21
+ justifyContent: "space-between",
22
+ alignItems: "flex-start",
23
+ gap: theme.spacing(2),
24
+ marginBottom: theme.spacing(1)
25
+ },
26
+ rootCauseContent: {
27
+ paddingLeft: theme.spacing(2)
28
+ },
29
+ rootCauseTitle: {
30
+ fontSize: theme.typography.body2.fontSize,
31
+ fontWeight: 500,
32
+ color: theme.palette.text.primary,
33
+ flex: 1,
34
+ lineHeight: 1.4
35
+ },
36
+ confidenceBadge: {
37
+ padding: theme.spacing(0.5, 1.5),
38
+ borderRadius: theme.shape.borderRadius,
39
+ fontWeight: 500,
40
+ fontSize: theme.typography.caption.fontSize,
41
+ textTransform: "uppercase",
42
+ letterSpacing: "0.5px"
43
+ },
44
+ highConfidence: {
45
+ backgroundColor: theme.palette.success.light,
46
+ color: theme.palette.success.dark
47
+ },
48
+ mediumConfidence: {
49
+ backgroundColor: theme.palette.warning.light,
50
+ color: theme.palette.warning.dark
51
+ },
52
+ lowConfidence: {
53
+ backgroundColor: theme.palette.error.light,
54
+ color: theme.palette.error.dark
55
+ },
56
+ analysis: {
57
+ marginTop: theme.spacing(1),
58
+ marginBottom: theme.spacing(2)
59
+ },
60
+ findingsContainer: {
61
+ marginTop: theme.spacing(2)
62
+ },
63
+ findingsHeader: {
64
+ display: "flex",
65
+ alignItems: "center",
66
+ gap: theme.spacing(1),
67
+ marginBottom: theme.spacing(1),
68
+ color: theme.palette.text.secondary,
69
+ fontSize: theme.typography.body2.fontSize,
70
+ fontWeight: 500
71
+ },
72
+ findingCard: {
73
+ marginBottom: theme.spacing(1.5),
74
+ marginTop: theme.spacing(1.5),
75
+ borderRadius: theme.shape.borderRadius,
76
+ overflow: "hidden"
77
+ },
78
+ findingHeader: {
79
+ display: "flex",
80
+ alignItems: "flex-start",
81
+ justifyContent: "space-between",
82
+ gap: theme.spacing(1),
83
+ padding: theme.spacing(1.5),
84
+ width: "100%",
85
+ textAlign: "left",
86
+ backgroundColor: "transparent",
87
+ transition: "background-color 0.15s ease",
88
+ "&:hover": {
89
+ backgroundColor: theme.palette.action.hover
90
+ }
91
+ },
92
+ findingHeaderContent: {
93
+ flex: 1,
94
+ minWidth: 0
95
+ },
96
+ findingObservation: {
97
+ fontWeight: 500,
98
+ fontSize: theme.typography.body2.fontSize,
99
+ color: theme.palette.text.primary,
100
+ marginBottom: theme.spacing(0.5),
101
+ lineHeight: 1.4
102
+ },
103
+ findingMeta: {
104
+ display: "flex",
105
+ alignItems: "center",
106
+ gap: theme.spacing(2),
107
+ flexWrap: "wrap"
108
+ },
109
+ evidenceTypeBadge: {
110
+ display: "flex",
111
+ alignItems: "center",
112
+ gap: theme.spacing(0.5),
113
+ fontSize: theme.typography.caption.fontSize,
114
+ fontWeight: 500,
115
+ color: theme.palette.text.secondary,
116
+ marginTop: theme.spacing(0.5),
117
+ "& a": {
118
+ color: theme.palette.primary.main,
119
+ fontWeight: 500
120
+ }
121
+ },
122
+ evidenceTypeBadgeIcon: {
123
+ fontSize: "0.875rem",
124
+ color: theme.palette.primary.main
125
+ },
126
+ expandIcon: {
127
+ color: theme.palette.text.secondary,
128
+ transition: "transform 0.2s ease",
129
+ flexShrink: 0,
130
+ marginTop: theme.spacing(0.25)
131
+ },
132
+ expandIconOpen: {
133
+ transform: "rotate(180deg)"
134
+ },
135
+ findingEvidenceContainer: {
136
+ padding: theme.spacing(0, 1.5, 1.5, 1.5),
137
+ borderTop: `1px solid ${theme.palette.divider}`,
138
+ backgroundColor: alpha(theme.palette.background.default, 0.5)
139
+ },
140
+ componentName: {
141
+ fontSize: theme.typography.caption.fontSize,
142
+ color: theme.palette.text.secondary,
143
+ fontWeight: 500,
144
+ marginBottom: theme.spacing(1),
145
+ marginTop: theme.spacing(1)
146
+ },
147
+ timeRange: {
148
+ fontSize: theme.typography.caption.fontSize,
149
+ color: theme.palette.text.secondary
150
+ },
151
+ evidenceCard: {
152
+ marginTop: theme.spacing(1)
153
+ },
154
+ evidenceTopRow: {
155
+ display: "flex",
156
+ justifyContent: "space-between",
157
+ alignItems: "flex-start",
158
+ marginBottom: theme.spacing(1)
159
+ },
160
+ evidenceFooter: {
161
+ display: "flex",
162
+ justifyContent: "space-between",
163
+ alignItems: "center",
164
+ marginTop: theme.spacing(1)
165
+ },
166
+ evidenceTypeLabel: {
167
+ display: "flex",
168
+ alignItems: "center",
169
+ gap: theme.spacing(0.5),
170
+ fontSize: theme.typography.caption.fontSize,
171
+ fontWeight: 500,
172
+ color: theme.palette.text.primary,
173
+ marginRight: theme.spacing(1)
174
+ },
175
+ evidenceIcon: {
176
+ fontSize: "1rem",
177
+ color: theme.palette.primary.main
178
+ },
179
+ logLine: {
180
+ fontFamily: "monospace",
181
+ fontSize: theme.typography.caption.fontSize,
182
+ marginTop: theme.spacing(0.75),
183
+ padding: theme.spacing(0.75, 1),
184
+ backgroundColor: theme.palette.type === "dark" ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.03)",
185
+ borderRadius: theme.shape.borderRadius,
186
+ borderLeft: `3px solid ${theme.palette.success.main}`
187
+ },
188
+ logLinesContainer: {
189
+ marginTop: theme.spacing(0.75)
190
+ },
191
+ logLinesScrollContainer: {
192
+ overflowX: "auto",
193
+ marginLeft: theme.spacing(-1.5),
194
+ marginRight: theme.spacing(-1.5),
195
+ paddingLeft: theme.spacing(1.5),
196
+ paddingRight: theme.spacing(1.5)
197
+ },
198
+ logLineItem: {
199
+ display: "flex",
200
+ alignItems: "center",
201
+ gap: theme.spacing(1.5),
202
+ fontFamily: "monospace",
203
+ fontSize: theme.typography.caption.fontSize,
204
+ whiteSpace: "nowrap",
205
+ padding: theme.spacing(0.5, 0)
206
+ },
207
+ logLineDivider: {
208
+ marginLeft: theme.spacing(-1.5),
209
+ marginRight: theme.spacing(-1.5)
210
+ },
211
+ timestamp: {
212
+ color: theme.palette.text.secondary,
213
+ fontSize: theme.typography.overline.fontSize
214
+ },
215
+ logLevel: {
216
+ fontSize: theme.typography.caption.fontSize,
217
+ fontWeight: 500
218
+ },
219
+ errorLevel: {
220
+ color: theme.palette.error.main
221
+ },
222
+ warnLevel: {
223
+ color: theme.palette.warning.main
224
+ },
225
+ infoLevel: {
226
+ color: theme.palette.info.main
227
+ },
228
+ debugLevel: {
229
+ color: theme.palette.text.secondary
230
+ },
231
+ logMessageText: {
232
+ flex: 1,
233
+ wordBreak: "break-word"
234
+ },
235
+ repetitionText: {
236
+ fontStyle: "italic",
237
+ color: theme.palette.text.secondary,
238
+ fontSize: theme.typography.caption.fontSize,
239
+ marginTop: theme.spacing(0.5)
240
+ },
241
+ metricLine: {
242
+ fontFamily: "monospace",
243
+ fontSize: theme.typography.caption.fontSize,
244
+ marginTop: theme.spacing(0.75),
245
+ padding: theme.spacing(0.75, 1),
246
+ backgroundColor: theme.palette.type === "dark" ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.03)",
247
+ borderRadius: theme.shape.borderRadius,
248
+ borderLeft: `3px solid ${theme.palette.success.main}`
249
+ },
250
+ metricName: {
251
+ fontWeight: 500,
252
+ fontSize: theme.typography.body2.fontSize,
253
+ color: theme.palette.text.primary
254
+ },
255
+ metricSummary: {
256
+ flex: 1,
257
+ wordBreak: "break-word"
258
+ },
259
+ tracePropertyRow: {
260
+ display: "flex",
261
+ alignItems: "baseline",
262
+ gap: theme.spacing(2),
263
+ marginBottom: theme.spacing(0.5)
264
+ },
265
+ tracePropertyKey: {
266
+ fontWeight: 500,
267
+ color: theme.palette.text.secondary,
268
+ fontSize: theme.typography.body2.fontSize,
269
+ minWidth: 50,
270
+ flexShrink: 0
271
+ },
272
+ tracePropertyValue: {
273
+ fontFamily: "monospace",
274
+ color: theme.palette.text.primary,
275
+ fontSize: theme.typography.body2.fontSize,
276
+ wordBreak: "break-word"
277
+ },
278
+ traceInfoBox: {
279
+ padding: theme.spacing(0.75, 1),
280
+ backgroundColor: alpha(theme.palette.text.primary, 0.03),
281
+ borderRadius: theme.shape.borderRadius,
282
+ borderLeft: `3px solid ${theme.palette.success.main}`
283
+ },
284
+ traceSummary: {
285
+ fontSize: theme.typography.body2.fontSize,
286
+ color: theme.palette.text.primary,
287
+ marginTop: theme.spacing(0.5)
288
+ },
289
+ traceError: {
290
+ color: theme.palette.error.main,
291
+ fontWeight: 500,
292
+ marginTop: theme.spacing(0.5)
293
+ },
294
+ spanInfo: {
295
+ fontSize: theme.typography.caption.fontSize,
296
+ color: theme.palette.text.secondary,
297
+ marginTop: theme.spacing(0.5)
298
+ }
299
+ }));
300
+ const getLogLevelColorClass = (level, classes) => {
301
+ switch (level) {
302
+ case "ERROR":
303
+ return classes.errorLevel;
304
+ case "WARN":
305
+ return classes.warnLevel;
306
+ case "INFO":
307
+ return classes.infoLevel;
308
+ case "DEBUG":
309
+ return classes.debugLevel;
310
+ default:
311
+ return "";
312
+ }
313
+ };
314
+ const getConfidenceBadgeClass = (confidence, classes) => {
315
+ const base = classes.confidenceBadge;
316
+ switch (confidence) {
317
+ case "high":
318
+ return `${base} ${classes.highConfidence}`;
319
+ case "medium":
320
+ return `${base} ${classes.mediumConfidence}`;
321
+ case "low":
322
+ return `${base} ${classes.lowConfidence}`;
323
+ default:
324
+ return base;
325
+ }
326
+ };
327
+ const formatTimestamp = (timestamp) => {
328
+ try {
329
+ const date = new Date(timestamp);
330
+ return date.toLocaleString("en-US", {
331
+ month: "short",
332
+ day: "numeric",
333
+ hour: "2-digit",
334
+ minute: "2-digit",
335
+ second: "2-digit"
336
+ });
337
+ } catch {
338
+ return timestamp;
339
+ }
340
+ };
341
+ const LogEvidenceComponent = ({
342
+ evidence,
343
+ classes
344
+ }) => /* @__PURE__ */ jsxs(Box, { className: classes.evidenceCard, children: [
345
+ /* @__PURE__ */ jsx(Box, { className: classes.logLinesScrollContainer, children: evidence.log_lines?.map((line, idx) => /* @__PURE__ */ jsxs(Fragment, { children: [
346
+ /* @__PURE__ */ jsxs(Box, { className: classes.logLineItem, children: [
347
+ /* @__PURE__ */ jsx("span", { className: classes.timestamp, children: formatTimestamp(line.timestamp) }),
348
+ /* @__PURE__ */ jsx(
349
+ "span",
350
+ {
351
+ className: `${classes.logLevel} ${getLogLevelColorClass(
352
+ line.level,
353
+ classes
354
+ )}`,
355
+ children: line.level
356
+ }
357
+ ),
358
+ /* @__PURE__ */ jsx("span", { className: classes.logMessageText, children: line.log })
359
+ ] }),
360
+ /* @__PURE__ */ jsx(Divider, { className: classes.logLineDivider })
361
+ ] }, idx)) }),
362
+ evidence.repetition && /* @__PURE__ */ jsx(Typography, { className: classes.repetitionText, children: evidence.repetition })
363
+ ] });
364
+ const MetricEvidenceComponent = ({
365
+ evidence,
366
+ classes
367
+ }) => /* @__PURE__ */ jsx(Box, { className: classes.evidenceCard, children: /* @__PURE__ */ jsx(Typography, { component: "div", className: classes.metricSummary, children: /* @__PURE__ */ jsx(FormattedText, { text: evidence.summary }) }) });
368
+ const TraceEvidenceComponent = ({
369
+ evidence,
370
+ classes
371
+ }) => /* @__PURE__ */ jsxs(Box, { className: classes.evidenceCard, children: [
372
+ /* @__PURE__ */ jsxs(Box, { className: classes.tracePropertyRow, children: [
373
+ /* @__PURE__ */ jsx("span", { className: classes.tracePropertyKey, children: "Trace" }),
374
+ /* @__PURE__ */ jsx("span", { className: classes.tracePropertyValue, children: evidence.trace_id })
375
+ ] }),
376
+ evidence.span_id && /* @__PURE__ */ jsxs(Box, { className: classes.tracePropertyRow, children: [
377
+ /* @__PURE__ */ jsx("span", { className: classes.tracePropertyKey, children: "Span" }),
378
+ /* @__PURE__ */ jsx("span", { className: classes.tracePropertyValue, children: evidence.span_id })
379
+ ] }),
380
+ /* @__PURE__ */ jsx(Typography, { component: "div", className: classes.traceSummary, children: /* @__PURE__ */ jsx(FormattedText, { text: evidence.summary }) }),
381
+ evidence.is_error && evidence.error_message && /* @__PURE__ */ jsxs(Typography, { className: classes.traceError, children: [
382
+ "Error: ",
383
+ evidence.error_message
384
+ ] }),
385
+ evidence.repetition && /* @__PURE__ */ jsxs(Fragment$1, { children: [
386
+ /* @__PURE__ */ jsx(Divider, { className: classes.logLineDivider }),
387
+ /* @__PURE__ */ jsx(Typography, { className: classes.repetitionText, children: evidence.repetition })
388
+ ] })
389
+ ] });
390
+ const getEvidenceTypeWithComponent = (type, componentUid, classes) => {
391
+ let icon = null;
392
+ let label = "";
393
+ switch (type) {
394
+ case "log":
395
+ icon = /* @__PURE__ */ jsx(DescriptionOutlinedIcon, { className: classes.evidenceTypeBadgeIcon });
396
+ label = "Logs";
397
+ break;
398
+ case "metric":
399
+ icon = /* @__PURE__ */ jsx(ShowChartIcon, { className: classes.evidenceTypeBadgeIcon });
400
+ label = "Metrics";
401
+ break;
402
+ case "trace":
403
+ icon = /* @__PURE__ */ jsx(AccountTreeIcon, { className: classes.evidenceTypeBadgeIcon });
404
+ label = "Traces";
405
+ break;
406
+ default:
407
+ return null;
408
+ }
409
+ return /* @__PURE__ */ jsxs("span", { className: classes.evidenceTypeBadge, children: [
410
+ icon,
411
+ label,
412
+ componentUid && /* @__PURE__ */ jsxs(Fragment$1, { children: [
413
+ " in ",
414
+ /* @__PURE__ */ jsx(FormattedText, { text: componentUid })
415
+ ] })
416
+ ] });
417
+ };
418
+ const FindingCard = ({
419
+ finding,
420
+ classes
421
+ }) => {
422
+ const [expanded, setExpanded] = useState(false);
423
+ const evidence = finding.evidence;
424
+ let evidenceComponent = null;
425
+ if (evidence?.type === "log") {
426
+ evidenceComponent = /* @__PURE__ */ jsx(
427
+ LogEvidenceComponent,
428
+ {
429
+ evidence,
430
+ classes
431
+ }
432
+ );
433
+ } else if (evidence?.type === "metric") {
434
+ evidenceComponent = /* @__PURE__ */ jsx(
435
+ MetricEvidenceComponent,
436
+ {
437
+ evidence,
438
+ classes
439
+ }
440
+ );
441
+ } else if (evidence?.type === "trace") {
442
+ evidenceComponent = /* @__PURE__ */ jsx(
443
+ TraceEvidenceComponent,
444
+ {
445
+ evidence,
446
+ classes
447
+ }
448
+ );
449
+ }
450
+ const hasEvidence = evidenceComponent !== null;
451
+ return /* @__PURE__ */ jsxs(Box, { className: classes.findingCard, children: [
452
+ /* @__PURE__ */ jsxs(
453
+ ButtonBase,
454
+ {
455
+ className: classes.findingHeader,
456
+ onClick: () => hasEvidence && setExpanded(!expanded),
457
+ disabled: !hasEvidence,
458
+ disableRipple: true,
459
+ children: [
460
+ /* @__PURE__ */ jsxs(Box, { className: classes.findingHeaderContent, children: [
461
+ /* @__PURE__ */ jsx(Typography, { component: "div", className: classes.findingObservation, children: /* @__PURE__ */ jsx(FormattedText, { text: finding.observation, disableMarkdown: true }) }),
462
+ evidence?.type && getEvidenceTypeWithComponent(
463
+ evidence.type,
464
+ finding.component,
465
+ classes
466
+ ),
467
+ finding.time_range && /* @__PURE__ */ jsxs("span", { className: classes.timeRange, children: [
468
+ formatTimestamp(finding.time_range.start),
469
+ " -",
470
+ " ",
471
+ formatTimestamp(finding.time_range.end)
472
+ ] })
473
+ ] }),
474
+ hasEvidence && /* @__PURE__ */ jsx(
475
+ ExpandMoreIcon,
476
+ {
477
+ className: `${classes.expandIcon} ${expanded ? classes.expandIconOpen : ""}`
478
+ }
479
+ )
480
+ ]
481
+ }
482
+ ),
483
+ hasEvidence && /* @__PURE__ */ jsx(Collapse, { in: expanded, children: /* @__PURE__ */ jsx(Box, { className: classes.findingEvidenceContainer, children: evidenceComponent }) })
484
+ ] });
485
+ };
486
+ const RootCauseItem = ({
487
+ rootCause,
488
+ classes
489
+ }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
490
+ /* @__PURE__ */ jsxs(Box, { className: classes.rootCauseHeader, children: [
491
+ /* @__PURE__ */ jsx(Typography, { className: classes.rootCauseTitle, children: /* @__PURE__ */ jsx(FormattedText, { text: rootCause.summary, disableMarkdown: true }) }),
492
+ /* @__PURE__ */ jsxs("span", { className: getConfidenceBadgeClass(rootCause.confidence, classes), children: [
493
+ rootCause.confidence,
494
+ " confidence"
495
+ ] })
496
+ ] }),
497
+ /* @__PURE__ */ jsxs(Box, { className: classes.rootCauseContent, children: [
498
+ rootCause.analysis && /* @__PURE__ */ jsx(
499
+ Typography,
500
+ {
501
+ component: "div",
502
+ variant: "body1",
503
+ color: "textSecondary",
504
+ className: classes.analysis,
505
+ children: /* @__PURE__ */ jsx(FormattedText, { text: rootCause.analysis })
506
+ }
507
+ ),
508
+ rootCause.supporting_findings && rootCause.supporting_findings.length > 0 && /* @__PURE__ */ jsxs(Box, { className: classes.findingsContainer, children: [
509
+ /* @__PURE__ */ jsx(Typography, { className: classes.findingsHeader, children: "Supporting Findings" }),
510
+ rootCause.supporting_findings.map((finding, idx) => /* @__PURE__ */ jsx(FindingCard, { finding, classes }, idx))
511
+ ] })
512
+ ] })
513
+ ] });
514
+ const RootCausesSection = ({ rootCauses }) => {
515
+ const classes = useStyles();
516
+ if (!rootCauses || rootCauses.length === 0) {
517
+ return null;
518
+ }
519
+ return /* @__PURE__ */ jsx(List, { className: classes.list, disablePadding: true, children: rootCauses.map((rootCause, idx) => /* @__PURE__ */ jsxs(Fragment, { children: [
520
+ /* @__PURE__ */ jsx(ListItem, { className: classes.listItem, disableGutters: true, children: /* @__PURE__ */ jsx(RootCauseItem, { rootCause, classes }) }),
521
+ idx < rootCauses.length - 1 && /* @__PURE__ */ jsx(Divider, { component: "li" })
522
+ ] }, idx)) });
523
+ };
524
+
525
+ export { RootCausesSection };
526
+ //# sourceMappingURL=RootCausesSection.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RootCausesSection.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/RootCausesSection.tsx"],"sourcesContent":["import { Fragment, useState } from 'react';\nimport {\n Box,\n Typography,\n Divider,\n List,\n ListItem,\n Collapse,\n ButtonBase,\n} from '@material-ui/core';\nimport { alpha, makeStyles } from '@material-ui/core/styles';\nimport DescriptionOutlinedIcon from '@material-ui/icons/DescriptionOutlined';\nimport ShowChartIcon from '@material-ui/icons/ShowChart';\nimport AccountTreeIcon from '@material-ui/icons/AccountTree';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { FormattedText } from '../FormattedText';\nimport type { AIRCAAgentComponents } from '@openchoreo/backstage-plugin-common';\n\ntype RootCause = AIRCAAgentComponents['schemas']['RootCause'];\ntype Finding = AIRCAAgentComponents['schemas']['Finding'];\ntype LogEvidence = AIRCAAgentComponents['schemas']['LogEvidence'];\ntype MetricEvidence = AIRCAAgentComponents['schemas']['MetricEvidence'];\ntype TraceEvidence = AIRCAAgentComponents['schemas']['TraceEvidence'];\n\ninterface RootCausesSectionProps {\n rootCauses?: RootCause[];\n}\n\nconst useStyles = makeStyles(theme => ({\n list: {\n padding: 0,\n },\n listItem: {\n padding: theme.spacing(1.5, 0),\n display: 'block',\n },\n rootCauseHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(1),\n },\n rootCauseContent: {\n paddingLeft: theme.spacing(2),\n },\n rootCauseTitle: {\n fontSize: theme.typography.body2.fontSize,\n fontWeight: 500,\n color: theme.palette.text.primary,\n flex: 1,\n lineHeight: 1.4,\n },\n confidenceBadge: {\n padding: theme.spacing(0.5, 1.5),\n borderRadius: theme.shape.borderRadius,\n fontWeight: 500,\n fontSize: theme.typography.caption.fontSize,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n },\n highConfidence: {\n backgroundColor: theme.palette.success.light,\n color: theme.palette.success.dark,\n },\n mediumConfidence: {\n backgroundColor: theme.palette.warning.light,\n color: theme.palette.warning.dark,\n },\n lowConfidence: {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.dark,\n },\n analysis: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(2),\n },\n findingsContainer: {\n marginTop: theme.spacing(2),\n },\n findingsHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: 500,\n },\n findingCard: {\n marginBottom: theme.spacing(1.5),\n marginTop: theme.spacing(1.5),\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n },\n findingHeader: {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(1.5),\n width: '100%',\n textAlign: 'left',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s ease',\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n },\n findingHeaderContent: {\n flex: 1,\n minWidth: 0,\n },\n findingObservation: {\n fontWeight: 500,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n marginBottom: theme.spacing(0.5),\n lineHeight: 1.4,\n },\n findingMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n flexWrap: 'wrap' as const,\n },\n evidenceTypeBadge: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n '& a': {\n color: theme.palette.primary.main,\n fontWeight: 500,\n },\n },\n evidenceTypeBadgeIcon: {\n fontSize: '0.875rem',\n color: theme.palette.primary.main,\n },\n expandIcon: {\n color: theme.palette.text.secondary,\n transition: 'transform 0.2s ease',\n flexShrink: 0,\n marginTop: theme.spacing(0.25),\n },\n expandIconOpen: {\n transform: 'rotate(180deg)',\n },\n findingEvidenceContainer: {\n padding: theme.spacing(0, 1.5, 1.5, 1.5),\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.background.default, 0.5),\n },\n componentName: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n fontWeight: 500,\n marginBottom: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n timeRange: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n },\n evidenceCard: {\n marginTop: theme.spacing(1),\n },\n evidenceTopRow: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing(1),\n },\n evidenceFooter: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: theme.spacing(1),\n },\n evidenceTypeLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n color: theme.palette.text.primary,\n marginRight: theme.spacing(1),\n },\n evidenceIcon: {\n fontSize: '1rem',\n color: theme.palette.primary.main,\n },\n logLine: {\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.75),\n padding: theme.spacing(0.75, 1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(0, 0, 0, 0.03)',\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n logLinesContainer: {\n marginTop: theme.spacing(0.75),\n },\n logLinesScrollContainer: {\n overflowX: 'auto',\n marginLeft: theme.spacing(-1.5),\n marginRight: theme.spacing(-1.5),\n paddingLeft: theme.spacing(1.5),\n paddingRight: theme.spacing(1.5),\n },\n logLineItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n whiteSpace: 'nowrap',\n padding: theme.spacing(0.5, 0),\n },\n logLineDivider: {\n marginLeft: theme.spacing(-1.5),\n marginRight: theme.spacing(-1.5),\n },\n timestamp: {\n color: theme.palette.text.secondary,\n fontSize: theme.typography.overline.fontSize,\n },\n logLevel: {\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n },\n errorLevel: {\n color: theme.palette.error.main,\n },\n warnLevel: {\n color: theme.palette.warning.main,\n },\n infoLevel: {\n color: theme.palette.info.main,\n },\n debugLevel: {\n color: theme.palette.text.secondary,\n },\n logMessageText: {\n flex: 1,\n wordBreak: 'break-word',\n },\n repetitionText: {\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.5),\n },\n metricLine: {\n fontFamily: 'monospace',\n fontSize: theme.typography.caption.fontSize,\n marginTop: theme.spacing(0.75),\n padding: theme.spacing(0.75, 1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(0, 0, 0, 0.03)',\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n metricName: {\n fontWeight: 500,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n },\n metricSummary: {\n flex: 1,\n wordBreak: 'break-word',\n },\n tracePropertyRow: {\n display: 'flex',\n alignItems: 'baseline',\n gap: theme.spacing(2),\n marginBottom: theme.spacing(0.5),\n },\n tracePropertyKey: {\n fontWeight: 500,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n minWidth: 50,\n flexShrink: 0,\n },\n tracePropertyValue: {\n fontFamily: 'monospace',\n color: theme.palette.text.primary,\n fontSize: theme.typography.body2.fontSize,\n wordBreak: 'break-word',\n },\n traceInfoBox: {\n padding: theme.spacing(0.75, 1),\n backgroundColor: alpha(theme.palette.text.primary, 0.03),\n borderRadius: theme.shape.borderRadius,\n borderLeft: `3px solid ${theme.palette.success.main}`,\n },\n traceSummary: {\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n marginTop: theme.spacing(0.5),\n },\n traceError: {\n color: theme.palette.error.main,\n fontWeight: 500,\n marginTop: theme.spacing(0.5),\n },\n spanInfo: {\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.5),\n },\n}));\n\nconst getLogLevelColorClass = (\n level: string,\n classes: ReturnType<typeof useStyles>,\n): string => {\n switch (level) {\n case 'ERROR':\n return classes.errorLevel;\n case 'WARN':\n return classes.warnLevel;\n case 'INFO':\n return classes.infoLevel;\n case 'DEBUG':\n return classes.debugLevel;\n default:\n return '';\n }\n};\n\nconst getConfidenceBadgeClass = (\n confidence: string,\n classes: ReturnType<typeof useStyles>,\n): string => {\n const base = classes.confidenceBadge;\n switch (confidence) {\n case 'high':\n return `${base} ${classes.highConfidence}`;\n case 'medium':\n return `${base} ${classes.mediumConfidence}`;\n case 'low':\n return `${base} ${classes.lowConfidence}`;\n default:\n return base;\n }\n};\n\nconst formatTimestamp = (timestamp: string): string => {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n } catch {\n return timestamp;\n }\n};\n\nconst LogEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: LogEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Box className={classes.logLinesScrollContainer}>\n {evidence.log_lines?.map((line, idx) => (\n <Fragment key={idx}>\n <Box className={classes.logLineItem}>\n <span className={classes.timestamp}>\n {formatTimestamp(line.timestamp)}\n </span>\n <span\n className={`${classes.logLevel} ${getLogLevelColorClass(\n line.level,\n classes,\n )}`}\n >\n {line.level}\n </span>\n <span className={classes.logMessageText}>{line.log}</span>\n </Box>\n <Divider className={classes.logLineDivider} />\n </Fragment>\n ))}\n </Box>\n {evidence.repetition && (\n <Typography className={classes.repetitionText}>\n {evidence.repetition}\n </Typography>\n )}\n </Box>\n);\n\nconst MetricEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: MetricEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Typography component=\"div\" className={classes.metricSummary}>\n <FormattedText text={evidence.summary} />\n </Typography>\n </Box>\n);\n\nconst TraceEvidenceComponent = ({\n evidence,\n classes,\n}: {\n evidence: TraceEvidence;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <Box className={classes.evidenceCard}>\n <Box className={classes.tracePropertyRow}>\n <span className={classes.tracePropertyKey}>Trace</span>\n <span className={classes.tracePropertyValue}>{evidence.trace_id}</span>\n </Box>\n {evidence.span_id && (\n <Box className={classes.tracePropertyRow}>\n <span className={classes.tracePropertyKey}>Span</span>\n <span className={classes.tracePropertyValue}>{evidence.span_id}</span>\n </Box>\n )}\n <Typography component=\"div\" className={classes.traceSummary}>\n <FormattedText text={evidence.summary} />\n </Typography>\n {evidence.is_error && evidence.error_message && (\n <Typography className={classes.traceError}>\n Error: {evidence.error_message}\n </Typography>\n )}\n {evidence.repetition && (\n <>\n <Divider className={classes.logLineDivider} />\n <Typography className={classes.repetitionText}>\n {evidence.repetition}\n </Typography>\n </>\n )}\n </Box>\n);\n\nconst getEvidenceTypeWithComponent = (\n type: string | undefined,\n componentUid: string | undefined,\n classes: ReturnType<typeof useStyles>,\n) => {\n let icon = null;\n let label = '';\n\n switch (type) {\n case 'log':\n icon = (\n <DescriptionOutlinedIcon className={classes.evidenceTypeBadgeIcon} />\n );\n label = 'Logs';\n break;\n case 'metric':\n icon = <ShowChartIcon className={classes.evidenceTypeBadgeIcon} />;\n label = 'Metrics';\n break;\n case 'trace':\n icon = <AccountTreeIcon className={classes.evidenceTypeBadgeIcon} />;\n label = 'Traces';\n break;\n default:\n return null;\n }\n\n return (\n <span className={classes.evidenceTypeBadge}>\n {icon}\n {label}\n {componentUid && (\n <>\n {' in '}\n <FormattedText text={componentUid} />\n </>\n )}\n </span>\n );\n};\n\nconst FindingCard = ({\n finding,\n classes,\n}: {\n finding: Finding;\n classes: ReturnType<typeof useStyles>;\n}) => {\n const [expanded, setExpanded] = useState(false);\n const evidence = finding.evidence;\n\n let evidenceComponent = null;\n if (evidence?.type === 'log') {\n evidenceComponent = (\n <LogEvidenceComponent\n evidence={evidence as LogEvidence}\n classes={classes}\n />\n );\n } else if (evidence?.type === 'metric') {\n evidenceComponent = (\n <MetricEvidenceComponent\n evidence={evidence as MetricEvidence}\n classes={classes}\n />\n );\n } else if (evidence?.type === 'trace') {\n evidenceComponent = (\n <TraceEvidenceComponent\n evidence={evidence as TraceEvidence}\n classes={classes}\n />\n );\n }\n\n const hasEvidence = evidenceComponent !== null;\n\n return (\n <Box className={classes.findingCard}>\n <ButtonBase\n className={classes.findingHeader}\n onClick={() => hasEvidence && setExpanded(!expanded)}\n disabled={!hasEvidence}\n disableRipple\n >\n <Box className={classes.findingHeaderContent}>\n <Typography component=\"div\" className={classes.findingObservation}>\n <FormattedText text={finding.observation} disableMarkdown />\n </Typography>\n {evidence?.type &&\n getEvidenceTypeWithComponent(\n evidence.type,\n finding.component,\n classes,\n )}\n {finding.time_range && (\n <span className={classes.timeRange}>\n {formatTimestamp(finding.time_range.start)} -{' '}\n {formatTimestamp(finding.time_range.end)}\n </span>\n )}\n </Box>\n {hasEvidence && (\n <ExpandMoreIcon\n className={`${classes.expandIcon} ${\n expanded ? classes.expandIconOpen : ''\n }`}\n />\n )}\n </ButtonBase>\n {hasEvidence && (\n <Collapse in={expanded}>\n <Box className={classes.findingEvidenceContainer}>\n {evidenceComponent}\n </Box>\n </Collapse>\n )}\n </Box>\n );\n};\n\nconst RootCauseItem = ({\n rootCause,\n classes,\n}: {\n rootCause: RootCause;\n classes: ReturnType<typeof useStyles>;\n}) => (\n <>\n <Box className={classes.rootCauseHeader}>\n <Typography className={classes.rootCauseTitle}>\n <FormattedText text={rootCause.summary} disableMarkdown />\n </Typography>\n <span className={getConfidenceBadgeClass(rootCause.confidence, classes)}>\n {rootCause.confidence} confidence\n </span>\n </Box>\n <Box className={classes.rootCauseContent}>\n {rootCause.analysis && (\n <Typography\n component=\"div\"\n variant=\"body1\"\n color=\"textSecondary\"\n className={classes.analysis}\n >\n <FormattedText text={rootCause.analysis} />\n </Typography>\n )}\n\n {rootCause.supporting_findings &&\n rootCause.supporting_findings.length > 0 && (\n <Box className={classes.findingsContainer}>\n <Typography className={classes.findingsHeader}>\n Supporting Findings\n </Typography>\n {rootCause.supporting_findings.map((finding, idx) => (\n <FindingCard key={idx} finding={finding} classes={classes} />\n ))}\n </Box>\n )}\n </Box>\n </>\n);\n\nexport const RootCausesSection = ({ rootCauses }: RootCausesSectionProps) => {\n const classes = useStyles();\n\n if (!rootCauses || rootCauses.length === 0) {\n return null;\n }\n\n return (\n <List className={classes.list} disablePadding>\n {rootCauses.map((rootCause, idx) => (\n <Fragment key={idx}>\n <ListItem className={classes.listItem} disableGutters>\n <RootCauseItem rootCause={rootCause} classes={classes} />\n </ListItem>\n {idx < rootCauses.length - 1 && <Divider component=\"li\" />}\n </Fragment>\n ))}\n </List>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Box, Typography } from '@material-ui/core';
3
+ import { Timeline, TimelineItem, TimelineOppositeContent, TimelineSeparator, TimelineDot, TimelineConnector, TimelineContent } from '@material-ui/lab';
4
+ import { useRCAReportStyles } from '../styles.esm.js';
5
+ import { FormattedText } from '../FormattedText.esm.js';
6
+
7
+ const formatTimelineTimestamp = (timestamp) => {
8
+ if (!timestamp) return "N/A";
9
+ try {
10
+ const date = new Date(timestamp);
11
+ return date.toLocaleString("en-US", {
12
+ month: "short",
13
+ day: "numeric",
14
+ hour: "numeric",
15
+ minute: "2-digit"
16
+ });
17
+ } catch {
18
+ return timestamp;
19
+ }
20
+ };
21
+ const SystemTimelineSection = ({
22
+ timeline
23
+ }) => {
24
+ const classes = useRCAReportStyles();
25
+ if (!timeline || timeline.length === 0) {
26
+ return null;
27
+ }
28
+ return /* @__PURE__ */ jsx(Box, { className: classes.timelineContainer, children: /* @__PURE__ */ jsx(Timeline, { style: { padding: "4px 0", margin: 0 }, children: timeline.map((event, idx) => /* @__PURE__ */ jsxs(TimelineItem, { style: { minHeight: "auto" }, children: [
29
+ /* @__PURE__ */ jsx(
30
+ TimelineOppositeContent,
31
+ {
32
+ style: {
33
+ maxWidth: 0,
34
+ padding: 0,
35
+ flex: 0
36
+ }
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsxs(TimelineSeparator, { children: [
40
+ /* @__PURE__ */ jsx(TimelineDot, { color: "primary" }),
41
+ idx < timeline.length - 1 && /* @__PURE__ */ jsx(TimelineConnector, {})
42
+ ] }),
43
+ /* @__PURE__ */ jsxs(TimelineContent, { style: { paddingRight: 0 }, children: [
44
+ /* @__PURE__ */ jsxs(Box, { className: classes.timelineHeaderRow, children: [
45
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: formatTimelineTimestamp(event.timestamp) }),
46
+ event.component && /* @__PURE__ */ jsx(
47
+ Typography,
48
+ {
49
+ variant: "caption",
50
+ color: "textSecondary",
51
+ style: { marginLeft: 8 },
52
+ children: /* @__PURE__ */ jsx(FormattedText, { text: event.component })
53
+ }
54
+ )
55
+ ] }),
56
+ /* @__PURE__ */ jsx(
57
+ Typography,
58
+ {
59
+ component: "div",
60
+ variant: "body2",
61
+ className: classes.timelineEventText,
62
+ children: /* @__PURE__ */ jsx(FormattedText, { text: event.event || "" })
63
+ }
64
+ )
65
+ ] })
66
+ ] }, idx)) }) });
67
+ };
68
+
69
+ export { SystemTimelineSection };
70
+ //# sourceMappingURL=SystemTimelineSection.esm.js.map