@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.
- package/CHANGELOG.md +5 -0
- package/README.md +22 -0
- package/dist/api/FinOpsAgentApi.esm.js +43 -0
- package/dist/api/FinOpsAgentApi.esm.js.map +1 -0
- package/dist/api/ObservabilityApi.esm.js +568 -0
- package/dist/api/ObservabilityApi.esm.js.map +1 -0
- package/dist/api/ObserverUrlCache.esm.js +59 -0
- package/dist/api/ObserverUrlCache.esm.js.map +1 -0
- package/dist/api/RCAAgentApi.esm.js +104 -0
- package/dist/api/RCAAgentApi.esm.js.map +1 -0
- package/dist/components/Alerts/AlertRow.esm.js +203 -0
- package/dist/components/Alerts/AlertRow.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsActions.esm.js +77 -0
- package/dist/components/Alerts/AlertsActions.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsFilter.esm.js +95 -0
- package/dist/components/Alerts/AlertsFilter.esm.js.map +1 -0
- package/dist/components/Alerts/AlertsTable.esm.js +63 -0
- package/dist/components/Alerts/AlertsTable.esm.js.map +1 -0
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +251 -0
- package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -0
- package/dist/components/Alerts/types.esm.js +4 -0
- package/dist/components/Alerts/types.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +141 -0
- package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +128 -0
- package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js +517 -0
- package/dist/components/CostAnalysis/CostAnalysisReportView.esm.js.map +1 -0
- package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +149 -0
- package/dist/components/CostAnalysis/CostAnalysisTable.esm.js.map +1 -0
- package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js +112 -0
- package/dist/components/CostAnalysis/FinOpsApplyButton.esm.js.map +1 -0
- package/dist/components/CostAnalysis/index.esm.js +2 -0
- package/dist/components/CostAnalysis/index.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentRow.esm.js +258 -0
- package/dist/components/Incidents/IncidentRow.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsActions.esm.js +77 -0
- package/dist/components/Incidents/IncidentsActions.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsFilter.esm.js +144 -0
- package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -0
- package/dist/components/Incidents/IncidentsTable.esm.js +68 -0
- package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -0
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +283 -0
- package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -0
- package/dist/components/Incidents/types.esm.js +8 -0
- package/dist/components/Incidents/types.esm.js.map +1 -0
- package/dist/components/Metrics/ChartTooltip.esm.js +53 -0
- package/dist/components/Metrics/ChartTooltip.esm.js.map +1 -0
- package/dist/components/Metrics/HTTPMetricsSection.esm.js +109 -0
- package/dist/components/Metrics/HTTPMetricsSection.esm.js.map +1 -0
- package/dist/components/Metrics/MetricGraphByComponent.esm.js +99 -0
- package/dist/components/Metrics/MetricGraphByComponent.esm.js.map +1 -0
- package/dist/components/Metrics/MetricsActions.esm.js +30 -0
- package/dist/components/Metrics/MetricsActions.esm.js.map +1 -0
- package/dist/components/Metrics/MetricsFilters.esm.js +49 -0
- package/dist/components/Metrics/MetricsFilters.esm.js.map +1 -0
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +196 -0
- package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -0
- package/dist/components/Metrics/styles.esm.js +55 -0
- package/dist/components/Metrics/styles.esm.js.map +1 -0
- package/dist/components/Metrics/utils.esm.js +221 -0
- package/dist/components/Metrics/utils.esm.js.map +1 -0
- package/dist/components/RCA/RCAActions.esm.js +42 -0
- package/dist/components/RCA/RCAActions.esm.js.map +1 -0
- package/dist/components/RCA/RCAFilters.esm.js +100 -0
- package/dist/components/RCA/RCAFilters.esm.js.map +1 -0
- package/dist/components/RCA/RCAPage.esm.js +137 -0
- package/dist/components/RCA/RCAPage.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js +9 -0
- package/dist/components/RCA/RCAReport/EntityLinkContext.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/FormattedText.esm.js +94 -0
- package/dist/components/RCA/RCAReport/FormattedText.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/RCAReportView.esm.js +308 -0
- package/dist/components/RCA/RCAReport/RCAReportView.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js +113 -0
- package/dist/components/RCA/RCAReport/sections/AssessmentSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js +272 -0
- package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js +48 -0
- package/dist/components/RCA/RCAReport/sections/ExcludedCausesSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js +205 -0
- package/dist/components/RCA/RCAReport/sections/IncidentOverviewSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js +121 -0
- package/dist/components/RCA/RCAReport/sections/InvestigationPathSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js +593 -0
- package/dist/components/RCA/RCAReport/sections/PatchTabContent.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js +35 -0
- package/dist/components/RCA/RCAReport/sections/QuickFixesPanelSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js +54 -0
- package/dist/components/RCA/RCAReport/sections/RecommendationsSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js +526 -0
- package/dist/components/RCA/RCAReport/sections/RootCausesSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js +70 -0
- package/dist/components/RCA/RCAReport/sections/SystemTimelineSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js +54 -0
- package/dist/components/RCA/RCAReport/sections/VisibilityImprovementsSection.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport/styles.esm.js +467 -0
- package/dist/components/RCA/RCAReport/styles.esm.js.map +1 -0
- package/dist/components/RCA/RCAReport.esm.js +109 -0
- package/dist/components/RCA/RCAReport.esm.js.map +1 -0
- package/dist/components/RCA/RCATable.esm.js +140 -0
- package/dist/components/RCA/RCATable.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogEntry.esm.js +182 -0
- package/dist/components/RuntimeLogs/LogEntry.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsActions.esm.js +106 -0
- package/dist/components/RuntimeLogs/LogsActions.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsFilter.esm.js +200 -0
- package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/LogsTable.esm.js +91 -0
- package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +220 -0
- package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +222 -0
- package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/styles.esm.js +256 -0
- package/dist/components/RuntimeLogs/styles.esm.js.map +1 -0
- package/dist/components/RuntimeLogs/types.esm.js +16 -0
- package/dist/components/RuntimeLogs/types.esm.js.map +1 -0
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js +280 -0
- package/dist/components/TimeRangeFilter/TimeRangeFilter.esm.js.map +1 -0
- package/dist/components/Traces/ObservabilityTracesPage.esm.js +165 -0
- package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -0
- package/dist/components/Traces/TracesActions.esm.js +37 -0
- package/dist/components/Traces/TracesActions.esm.js.map +1 -0
- package/dist/components/Traces/TracesFilters.esm.js +121 -0
- package/dist/components/Traces/TracesFilters.esm.js.map +1 -0
- package/dist/components/Traces/TracesTable.esm.js +137 -0
- package/dist/components/Traces/TracesTable.esm.js.map +1 -0
- package/dist/components/Traces/WaterfallView.esm.js +567 -0
- package/dist/components/Traces/WaterfallView.esm.js.map +1 -0
- package/dist/components/Traces/styles.esm.js +198 -0
- package/dist/components/Traces/styles.esm.js.map +1 -0
- package/dist/components/Traces/utils.esm.js +19 -0
- package/dist/components/Traces/utils.esm.js.map +1 -0
- package/dist/hooks/useAutoSelectFirstEnvironment.esm.js +25 -0
- package/dist/hooks/useAutoSelectFirstEnvironment.esm.js.map +1 -0
- package/dist/hooks/useComponentAlerts.esm.js +80 -0
- package/dist/hooks/useComponentAlerts.esm.js.map +1 -0
- package/dist/hooks/useDataPlaneNetPolProvider.esm.js +55 -0
- package/dist/hooks/useDataPlaneNetPolProvider.esm.js.map +1 -0
- package/dist/hooks/useDebouncedSearch.esm.js +24 -0
- package/dist/hooks/useDebouncedSearch.esm.js.map +1 -0
- package/dist/hooks/useFilters.esm.js +29 -0
- package/dist/hooks/useFilters.esm.js.map +1 -0
- package/dist/hooks/useFinOpsReport.esm.js +66 -0
- package/dist/hooks/useFinOpsReport.esm.js.map +1 -0
- package/dist/hooks/useFinOpsReports.esm.js +70 -0
- package/dist/hooks/useFinOpsReports.esm.js.map +1 -0
- package/dist/hooks/useGetComponentsByProject.esm.js +57 -0
- package/dist/hooks/useGetComponentsByProject.esm.js.map +1 -0
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js +53 -0
- package/dist/hooks/useGetEnvironmentsByNamespace.esm.js.map +1 -0
- package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js +40 -0
- package/dist/hooks/useGetNamespaceAndProjectByEntity.esm.js.map +1 -0
- package/dist/hooks/useMetrics.esm.js +107 -0
- package/dist/hooks/useMetrics.esm.js.map +1 -0
- package/dist/hooks/useProjectIncidents.esm.js +111 -0
- package/dist/hooks/useProjectIncidents.esm.js.map +1 -0
- package/dist/hooks/useProjectRuntimeLogs.esm.js +185 -0
- package/dist/hooks/useProjectRuntimeLogs.esm.js.map +1 -0
- package/dist/hooks/useRCAReportByAlert.esm.js +54 -0
- package/dist/hooks/useRCAReportByAlert.esm.js.map +1 -0
- package/dist/hooks/useRCAReports.esm.js +75 -0
- package/dist/hooks/useRCAReports.esm.js.map +1 -0
- package/dist/hooks/useRuntimeLogs.esm.js +147 -0
- package/dist/hooks/useRuntimeLogs.esm.js.map +1 -0
- package/dist/hooks/useSpanDetails.esm.js +71 -0
- package/dist/hooks/useSpanDetails.esm.js.map +1 -0
- package/dist/hooks/useTraceSpans.esm.js +80 -0
- package/dist/hooks/useTraceSpans.esm.js.map +1 -0
- package/dist/hooks/useTraces.esm.js +112 -0
- package/dist/hooks/useTraces.esm.js.map +1 -0
- package/dist/hooks/useUpdateIncident.esm.js +50 -0
- package/dist/hooks/useUpdateIncident.esm.js.map +1 -0
- package/dist/hooks/useUrlFilters.esm.js +63 -0
- package/dist/hooks/useUrlFilters.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForAlerts.esm.js +80 -0
- package/dist/hooks/useUrlFiltersForAlerts.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForIncidents.esm.js +87 -0
- package/dist/hooks/useUrlFiltersForIncidents.esm.js.map +1 -0
- package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js +135 -0
- package/dist/hooks/useUrlFiltersForRuntimeLogs.esm.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +107 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/types.esm.js +18 -0
- package/dist/types.esm.js.map +1 -0
- package/dist/utils/applyResourceChange.esm.js +79 -0
- package/dist/utils/applyResourceChange.esm.js.map +1 -0
- package/dist/utils/urlTimeRange.esm.js +52 -0
- package/dist/utils/urlTimeRange.esm.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatchTabContent.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/PatchTabContent.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport {\n Typography,\n Box,\n Button,\n TextField,\n LinearProgress,\n Tooltip,\n} from '@material-ui/core';\nimport BuildIcon from '@material-ui/icons/Build';\nimport CheckIcon from '@material-ui/icons/Check';\nimport CloseIcon from '@material-ui/icons/Close';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport { useApi, fetchApiRef } from '@backstage/core-plugin-api';\nimport { useRcaUpdatePermission } from '@openchoreo/backstage-plugin-react';\nimport { useRCAReportStyles } from '../styles';\nimport { FormattedText } from '../FormattedText';\nimport type {\n RCAAgentApi,\n RecommendedAction,\n ResourceChange,\n EnvVarChange,\n FileChange,\n FieldChange,\n} from '../../../../api/RCAAgentApi';\nimport {\n applyJsonPointer,\n applyEnvChange,\n applyFileChange,\n} from '../../../../utils/applyResourceChange';\n\ninterface ChatContext {\n namespaceName: string;\n environmentName: string;\n projectName: string;\n rcaAgentApi: RCAAgentApi;\n backendBaseUrl?: string;\n}\n\ntype ActionStatus = 'idle' | 'applying' | 'success' | 'failed' | 'dismissed';\n\ninterface ActionState {\n status: ActionStatus;\n details?: string;\n}\n\ntype Phase = 'idle' | 'running' | 'done' | 'error';\n\ninterface PatchTabContentProps {\n reportId: string;\n chatContext: ChatContext;\n revisedActions: { index: number; action: RecommendedAction }[];\n}\n\n/** Check whether all actions in the set are resolved (applied or dismissed) */\nexport function allActionsResolved(\n actions: { action: RecommendedAction }[],\n): boolean {\n return (\n actions.length > 0 &&\n actions.every(\n ({ action }) =>\n action.status === 'applied' || action.status === 'dismissed',\n )\n );\n}\n\ntype PrimitiveValue = string | number | boolean;\n\ninterface EditableField {\n label: string;\n value: PrimitiveValue;\n fieldIdx: number;\n}\n\ninterface FileField {\n fileKey: string;\n mountPath: string;\n content: { value: string; fieldIdx: number };\n}\n\ninterface FieldNode {\n label: string | null; // null = leaf (render the field)\n field?: EditableField; // present only for leaves\n children?: FieldNode[];\n}\n\ninterface PatchSection {\n title: string;\n envVars?: EditableField[];\n files?: FileField[];\n fieldTree?: FieldNode[];\n}\n\nfunction buildFieldTree(fields: EditableField[]): FieldNode[] {\n // Group by first segment of label\n const prefixMap = new Map<string, EditableField[]>();\n const leaves: FieldNode[] = [];\n\n for (const f of fields) {\n const dot = f.label.indexOf('.');\n if (dot > 0) {\n const prefix = f.label.slice(0, dot);\n const list = prefixMap.get(prefix) ?? [];\n list.push({ ...f, label: f.label.slice(dot + 1) });\n prefixMap.set(prefix, list);\n } else {\n leaves.push({ label: null, field: f });\n }\n }\n\n const nodes: FieldNode[] = [...leaves];\n\n for (const [prefix, children] of prefixMap) {\n if (children.length === 1) {\n // Only 1 child — don't nest, restore the full label\n nodes.push({\n label: null,\n field: { ...children[0], label: `${prefix}.${children[0].label}` },\n });\n } else {\n // 2+ children — recurse\n nodes.push({ label: prefix, children: buildFieldTree(children) });\n }\n }\n\n return nodes;\n}\n\nfunction extractPatchSections(rc: ResourceChange): PatchSection[] {\n const sections: PatchSection[] = [];\n let fieldIdx = 0;\n\n // Workload overrides: env vars and files\n const envVars: EditableField[] = [];\n const files: FileField[] = [];\n\n for (const e of (rc.env ?? []) as EnvVarChange[]) {\n envVars.push({ label: e.key, value: e.value, fieldIdx: fieldIdx++ });\n }\n for (const f of (rc.files ?? []) as FileChange[]) {\n files.push({\n fileKey: f.key,\n mountPath: f.mount_path,\n content: { value: f.value, fieldIdx: fieldIdx++ },\n });\n }\n\n if (envVars.length > 0 || files.length > 0) {\n sections.push({\n title: 'Workload Overrides',\n envVars: envVars.length > 0 ? envVars : undefined,\n files: files.length > 0 ? files : undefined,\n });\n }\n\n // Group field changes by section (componentType vs trait instances)\n const componentTypeFields: EditableField[] = [];\n const traitFieldsMap = new Map<string, EditableField[]>();\n\n for (const f of (rc.fields ?? []) as FieldChange[]) {\n const parts = f.json_pointer.replace(/^\\/spec\\//, '').split('/');\n const section = parts[0];\n const label = parts\n .slice(section === 'traitEnvironmentConfigs' ? 2 : 1)\n .join('.');\n\n if (section === 'traitEnvironmentConfigs' && parts.length >= 2) {\n const traitName = parts[1];\n const list = traitFieldsMap.get(traitName) ?? [];\n list.push({ label, value: f.value, fieldIdx: fieldIdx++ });\n traitFieldsMap.set(traitName, list);\n } else {\n componentTypeFields.push({\n label,\n value: f.value,\n fieldIdx: fieldIdx++,\n });\n }\n }\n\n if (componentTypeFields.length > 0) {\n sections.push({\n title: 'Component Overrides',\n fieldTree: buildFieldTree(componentTypeFields),\n });\n }\n\n for (const [traitName, traitFields] of traitFieldsMap) {\n sections.push({\n title: `Trait: ${traitName}`,\n fieldTree: buildFieldTree(traitFields),\n });\n }\n\n return sections;\n}\n\nconst monoInputStyle = { fontFamily: 'monospace', fontSize: '0.8rem' } as const;\n\nexport const PatchTabContent = ({\n reportId,\n chatContext,\n revisedActions,\n}: PatchTabContentProps) => {\n const classes = useRCAReportStyles();\n const fetchApi = useApi(fetchApiRef);\n const {\n canUpdateRca,\n loading: permissionLoading,\n deniedTooltip,\n } = useRcaUpdatePermission();\n\n const allResolved = allActionsResolved(revisedActions);\n\n const [phase, setPhase] = useState<Phase>(allResolved ? 'done' : 'idle');\n const [actionStates, setActionStates] = useState<Map<number, ActionState>>(\n () => {\n if (!allResolved) return new Map();\n const m = new Map<number, ActionState>();\n for (const { index, action } of revisedActions) {\n m.set(index, {\n status: action.status === 'dismissed' ? 'dismissed' : 'success',\n });\n }\n return m;\n },\n );\n const [error, setError] = useState('');\n // Editable values keyed by \"actionIndex-resourceChangeIndex-fieldIndex\"\n const [editedValues, setEditedValues] = useState<Map<string, string>>(\n new Map(),\n );\n\n const getEditedValue = (\n actionIdx: number,\n rcIdx: number,\n fieldIdx: number,\n original: string | number | boolean | Record<string, never> | unknown[],\n ): string => {\n const key = `${actionIdx}-${rcIdx}-${fieldIdx}`;\n return editedValues.get(key) ?? String(original);\n };\n\n /** Return the edited value coerced back to the original primitive type, or the original if unedited. */\n const getPatchValue = (\n actionIdx: number,\n rcIdx: number,\n fieldIdx: number,\n original: PrimitiveValue,\n ): PrimitiveValue => {\n const key = `${actionIdx}-${rcIdx}-${fieldIdx}`;\n const edited = editedValues.get(key);\n if (edited === undefined) return original;\n if (typeof original === 'number') {\n const n = Number(edited);\n return Number.isNaN(n) ? edited : n;\n }\n if (typeof original === 'boolean') {\n return edited === 'true';\n }\n return edited;\n };\n\n const setEditedValue = (\n actionIdx: number,\n rcIdx: number,\n fieldIdx: number,\n value: string,\n ) => {\n setEditedValues(prev => {\n const next = new Map(prev);\n next.set(`${actionIdx}-${rcIdx}-${fieldIdx}`, value);\n return next;\n });\n };\n\n const applyFixes = useCallback(\n async (actions: { index: number; action: RecommendedAction }[]) => {\n if (!chatContext.backendBaseUrl) {\n setError('Backend URL is not available');\n setPhase('error');\n return;\n }\n\n setPhase('running');\n setError('');\n\n const initial = new Map<number, ActionState>();\n for (const { index } of actions) {\n initial.set(index, { status: 'applying' });\n }\n setActionStates(initial);\n\n const successIndices: number[] = [];\n const resultStates = new Map<number, ActionState>();\n\n try {\n // Collect all resource changes grouped by binding name so we GET/PUT each binding once\n interface BindingPatch {\n actionIndex: number;\n rcIdx: number;\n resourceChange: ResourceChange;\n }\n const bindingPatches = new Map<string, BindingPatch[]>();\n for (const { index: actionIndex, action } of actions) {\n const resourceChange = action.change as ResourceChange;\n if (!resourceChange) continue;\n const name = resourceChange.release_binding;\n const patches = bindingPatches.get(name) ?? [];\n patches.push({ actionIndex, rcIdx: 0, resourceChange });\n bindingPatches.set(name, patches);\n }\n\n // Apply patches per binding: GET once → apply all changes → PUT once\n const failedActions = new Set<number>();\n for (const [bindingName, patches] of bindingPatches) {\n const bindingUrl = `${\n chatContext.backendBaseUrl\n }/release-binding?namespaceName=${encodeURIComponent(\n chatContext.namespaceName,\n )}&bindingName=${encodeURIComponent(bindingName)}`;\n\n const getResponse = await fetchApi.fetch(bindingUrl);\n\n if (!getResponse.ok) {\n const detail =\n getResponse.status === 404\n ? `Release binding '${bindingName}' not found`\n : `Failed to get release binding: ${getResponse.statusText}`;\n for (const { actionIndex } of patches) {\n resultStates.set(actionIndex, {\n status: 'failed',\n details: detail,\n });\n failedActions.add(actionIndex);\n }\n continue;\n }\n\n const binding = await getResponse.json();\n const updated = structuredClone(binding);\n\n try {\n for (const { actionIndex, rcIdx, resourceChange } of patches) {\n let itemIdx = 0;\n\n // Apply env changes\n for (const e of (resourceChange.env ?? []) as EnvVarChange[]) {\n const editedVal = getEditedValue(\n actionIndex,\n rcIdx,\n itemIdx,\n e.value,\n );\n applyEnvChange(updated, e.key, editedVal);\n itemIdx++;\n }\n\n // Apply file changes (key + mount_path identify the mount, only value is editable)\n for (const f of (resourceChange.files ?? []) as FileChange[]) {\n const editedValue = getEditedValue(\n actionIndex,\n rcIdx,\n itemIdx++,\n f.value,\n );\n applyFileChange(updated, f.key, f.mount_path, editedValue);\n }\n\n // Apply field changes (JSON Pointers for trait/componentType overrides)\n for (const f of (resourceChange.fields ?? []) as FieldChange[]) {\n const patchVal = getPatchValue(\n actionIndex,\n rcIdx,\n itemIdx,\n f.value,\n );\n applyJsonPointer(updated, f.json_pointer, patchVal);\n itemIdx++;\n }\n }\n } catch (err) {\n for (const { actionIndex } of patches) {\n resultStates.set(actionIndex, {\n status: 'failed',\n details:\n err instanceof Error\n ? err.message\n : 'Failed to apply changes',\n });\n failedActions.add(actionIndex);\n }\n continue;\n }\n\n const putResponse = await fetchApi.fetch(bindingUrl, {\n method: 'PUT',\n body: JSON.stringify({\n metadata: updated.metadata,\n spec: updated.spec,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!putResponse.ok) {\n for (const { actionIndex } of patches) {\n resultStates.set(actionIndex, {\n status: 'failed',\n details: `Failed to update release binding: ${putResponse.statusText}`,\n });\n failedActions.add(actionIndex);\n }\n }\n }\n\n // Mark actions that had no failures as successful\n for (const { index } of actions) {\n if (!failedActions.has(index)) {\n successIndices.push(index);\n resultStates.set(index, {\n status: 'success',\n details: 'Applied successfully',\n });\n }\n }\n\n // Mark applied actions in the RCA agent backend\n if (successIndices.length > 0) {\n try {\n await chatContext.rcaAgentApi.updateActionStatuses(\n reportId,\n {\n namespaceName: chatContext.namespaceName,\n environmentName: chatContext.environmentName,\n },\n { appliedIndices: successIndices },\n );\n } catch {\n // Non-fatal: the fix was applied, state update failed\n }\n }\n\n setActionStates(resultStates);\n setPhase(successIndices.length > 0 ? 'done' : 'error');\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : 'Failed to apply fixes';\n const failed = new Map<number, ActionState>();\n for (const { index } of actions) {\n failed.set(index, { status: 'failed', details: msg });\n }\n setActionStates(failed);\n setError(msg);\n setPhase('error');\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chatContext, reportId, fetchApi, editedValues],\n );\n\n const handleApplySingle = useCallback(\n (index: number, action: RecommendedAction) => {\n applyFixes([{ index, action }]);\n },\n [applyFixes],\n );\n\n const handleDismiss = useCallback(\n async (index: number) => {\n setActionStates(prev => {\n const next = new Map(prev);\n next.set(index, { status: 'applying' });\n return next;\n });\n try {\n await chatContext.rcaAgentApi.updateActionStatuses(\n reportId,\n {\n namespaceName: chatContext.namespaceName,\n environmentName: chatContext.environmentName,\n },\n { dismissedIndices: [index] },\n );\n setActionStates(prev => {\n const next = new Map(prev);\n next.set(index, { status: 'dismissed' });\n return next;\n });\n } catch {\n setActionStates(prev => {\n const next = new Map(prev);\n next.set(index, { status: 'failed', details: 'Failed to dismiss' });\n return next;\n });\n }\n },\n [chatContext, reportId],\n );\n\n const renderActionButtons = (index: number, action: RecommendedAction) => {\n const localStatus = actionStates.get(index)?.status;\n\n if (localStatus === 'applying') {\n return (\n <Button variant=\"outlined\" size=\"small\" disabled>\n Applying...\n </Button>\n );\n }\n\n if (localStatus === 'success' || action.status === 'applied') {\n return (\n <Button\n variant=\"outlined\"\n size=\"small\"\n disabled\n startIcon={<CheckIcon />}\n >\n Applied\n </Button>\n );\n }\n\n if (localStatus === 'dismissed' || action.status === 'dismissed') {\n return (\n <Button variant=\"outlined\" size=\"small\" disabled>\n Dismissed\n </Button>\n );\n }\n\n if (localStatus === 'failed') {\n return (\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"small\"\n startIcon={<ErrorOutlineIcon />}\n disabled\n >\n Failed\n </Button>\n );\n }\n\n const busy = phase === 'running';\n const disableActions = busy || permissionLoading || !canUpdateRca;\n return (\n <Box display=\"flex\" style={{ gap: 8 }}>\n <Tooltip title={deniedTooltip}>\n <span>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<CloseIcon />}\n onClick={() => handleDismiss(index)}\n disabled={disableActions}\n >\n Dismiss\n </Button>\n </span>\n </Tooltip>\n <Tooltip title={deniedTooltip}>\n <span>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n startIcon={<BuildIcon />}\n onClick={() => handleApplySingle(index, action)}\n disabled={disableActions}\n >\n Apply Fix\n </Button>\n </span>\n </Tooltip>\n </Box>\n );\n };\n\n if (revisedActions.length === 0) {\n return (\n <Box padding={2} textAlign=\"center\">\n <Typography variant=\"body2\" color=\"textSecondary\">\n No revised actions available. The remediation agent has not yet\n proposed any concrete fixes for this report.\n </Typography>\n </Box>\n );\n }\n\n const isRunning = phase === 'running';\n\n const renderFieldNodes = (\n nodes: FieldNode[],\n actionIdx: number,\n disabled: boolean,\n depth = 0,\n ): React.ReactNode =>\n nodes.map((node, nIdx) => {\n if (node.field) {\n const f = node.field;\n return (\n <TextField\n key={`${actionIdx}-field-${f.fieldIdx}`}\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n label={f.label}\n value={getEditedValue(actionIdx, 0, f.fieldIdx, f.value)}\n onChange={e =>\n setEditedValue(actionIdx, 0, f.fieldIdx, e.target.value)\n }\n disabled={disabled}\n InputProps={{ style: monoInputStyle }}\n InputLabelProps={{ shrink: true }}\n />\n );\n }\n return (\n <Box\n key={`${actionIdx}-grp-${depth}-${nIdx}`}\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 10 }}\n >\n <Typography variant=\"caption\" color=\"textSecondary\">\n {node.label}\n </Typography>\n {node.children &&\n renderFieldNodes(node.children, actionIdx, disabled, depth + 1)}\n </Box>\n );\n });\n\n return (\n <Box>\n {revisedActions.map(({ index, action }) => {\n const rc = action.change as ResourceChange | undefined;\n const sections = rc ? extractPatchSections(rc) : [];\n const state = actionStates.get(index)?.status;\n const disabled =\n isRunning ||\n action.status === 'applied' ||\n action.status === 'dismissed' ||\n state === 'success' ||\n state === 'dismissed';\n return (\n <Box key={index} className={classes.patchActionCard}>\n {rc && (\n <Typography className={classes.patchBindingName}>\n {rc.release_binding}\n </Typography>\n )}\n <Typography\n component=\"div\"\n className={classes.patchActionDescription}\n >\n <FormattedText text={action.description} disableMarkdown />\n </Typography>\n\n {sections.length > 0 && (\n <Box display=\"flex\" flexDirection=\"column\" style={{ gap: 16 }}>\n {sections.map((section, sIdx) => (\n <Box\n key={`${index}-s-${sIdx}`}\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 10 }}\n >\n <Typography\n variant=\"caption\"\n style={{\n fontSize: '0.65rem',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n }}\n color=\"textSecondary\"\n >\n {section.title}\n </Typography>\n\n {section.envVars && (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 8 }}\n >\n <Typography\n variant=\"caption\"\n style={{ fontSize: '0.6rem' }}\n color=\"textSecondary\"\n >\n Environment Variables\n </Typography>\n {section.envVars.map(ev => (\n <TextField\n key={`${index}-env-${ev.fieldIdx}`}\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n label={ev.label}\n value={getEditedValue(\n index,\n 0,\n ev.fieldIdx,\n ev.value,\n )}\n onChange={e =>\n setEditedValue(\n index,\n 0,\n ev.fieldIdx,\n e.target.value,\n )\n }\n disabled={disabled}\n InputProps={{ style: monoInputStyle }}\n InputLabelProps={{ shrink: true }}\n />\n ))}\n </Box>\n )}\n\n {section.files && (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n style={{ gap: 8 }}\n >\n <Typography\n variant=\"caption\"\n style={{ fontSize: '0.6rem' }}\n color=\"textSecondary\"\n >\n Files\n </Typography>\n {section.files.map(file => (\n <TextField\n key={`${index}-file-${file.content.fieldIdx}`}\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n label={`${file.mountPath.replace(/\\/?$/, '/')}${\n file.fileKey\n }`}\n value={getEditedValue(\n index,\n 0,\n file.content.fieldIdx,\n file.content.value,\n )}\n onChange={e =>\n setEditedValue(\n index,\n 0,\n file.content.fieldIdx,\n e.target.value,\n )\n }\n disabled={disabled}\n multiline\n minRows={3}\n maxRows={12}\n InputProps={{ style: monoInputStyle }}\n InputLabelProps={{\n shrink: true,\n style: {\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n }}\n />\n ))}\n </Box>\n )}\n\n {section.fieldTree &&\n renderFieldNodes(section.fieldTree, index, disabled)}\n </Box>\n ))}\n </Box>\n )}\n\n {actionStates.get(index)?.status === 'applying' && (\n <LinearProgress style={{ borderRadius: 2 }} />\n )}\n\n <Box className={classes.patchActionFooter}>\n <Box />\n {renderActionButtons(index, action)}\n </Box>\n </Box>\n );\n })}\n\n {phase === 'error' && (\n <Box display=\"flex\" alignItems=\"center\" mt={1} p={1} style={{ gap: 8 }}>\n <ErrorOutlineIcon color=\"error\" fontSize=\"small\" />\n <Typography variant=\"body2\" color=\"error\">\n {error}\n </Typography>\n </Box>\n )}\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAuDO,SAAS,mBACd,OAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,MAAA,GAAS,CAAA,IACjB,OAAA,CAAQ,KAAA;AAAA,IACN,CAAC,EAAE,MAAA,EAAO,KACR,OAAO,MAAA,KAAW,SAAA,IAAa,OAAO,MAAA,KAAW;AAAA,GACrD;AAEJ;AA6BA,SAAS,eAAe,MAAA,EAAsC;AAE5D,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA6B;AACnD,EAAA,MAAM,SAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA;AACjD,MAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAqB,CAAC,GAAG,MAAM,CAAA;AAErC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,CAAA,IAAK,SAAA,EAAW;AAC1C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAEzB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,KAAA,EAAO,IAAA;AAAA,QACP,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAA,CAAE,KAAK,CAAA,CAAA;AAAG,OAClE,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,cAAA,CAAe,QAAQ,GAAG,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAqB,EAAA,EAAoC;AAChE,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AAGf,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,CAAA,IAAM,EAAA,CAAG,GAAA,IAAO,EAAC,EAAsB;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA,CAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAA,EAAY,CAAA;AAAA,EACrE;AACA,EAAA,KAAA,MAAW,CAAA,IAAM,EAAA,CAAG,KAAA,IAAS,EAAC,EAAoB;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,SAAS,CAAA,CAAE,GAAA;AAAA,MACX,WAAW,CAAA,CAAE,UAAA;AAAA,MACb,SAAS,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,UAAU,QAAA,EAAA;AAAW,KACjD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1C,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,oBAAA;AAAA,MACP,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,MACxC,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ;AAAA,KACnC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,sBAAuC,EAAC;AAC9C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAA6B;AAExD,EAAA,KAAA,MAAW,CAAA,IAAM,EAAA,CAAG,MAAA,IAAU,EAAC,EAAqB;AAClD,IAAA,MAAM,KAAA,GAAQ,EAAE,YAAA,CAAa,OAAA,CAAQ,aAAa,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,MACX,KAAA,CAAM,OAAA,KAAY,4BAA4B,CAAA,GAAI,CAAC,CAAA,CACnD,IAAA,CAAK,GAAG,CAAA;AAEX,IAAA,IAAI,OAAA,KAAY,yBAAA,IAA6B,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AAC9D,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA;AACzD,MAAA,cAAA,CAAe,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,QACvB,KAAA;AAAA,QACA,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,qBAAA;AAAA,MACP,SAAA,EAAW,eAAe,mBAAmB;AAAA,KAC9C,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,CAAA,IAAK,cAAA,EAAgB;AACrD,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA,EAAO,UAAU,SAAS,CAAA,CAAA;AAAA,MAC1B,SAAA,EAAW,eAAe,WAAW;AAAA,KACtC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,MAAM,cAAA,GAAiB,EAAE,UAAA,EAAY,WAAA,EAAa,UAAU,QAAA,EAAS;AAE9D,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAA4B;AAC1B,EAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,OAAA,EAAS,iBAAA;AAAA,IACT;AAAA,MACE,sBAAA,EAAuB;AAE3B,EAAA,MAAM,WAAA,GAAc,mBAAmB,cAAc,CAAA;AAErD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAAgB,WAAA,GAAc,SAAS,MAAM,CAAA;AACvE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC,MAAM;AACJ,MAAA,IAAI,CAAC,WAAA,EAAa,uBAAO,IAAI,GAAA,EAAI;AACjC,MAAA,MAAM,CAAA,uBAAQ,GAAA,EAAyB;AACvC,MAAA,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,EAAO,IAAK,cAAA,EAAgB;AAC9C,QAAA,CAAA,CAAE,IAAI,KAAA,EAAO;AAAA,UACX,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,WAAA,GAAc,WAAA,GAAc;AAAA,SACvD,CAAA;AAAA,MACH;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,GACF;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AAErC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,wBAClC,GAAA;AAAI,GACV;AAEA,EAAA,MAAM,cAAA,GAAiB,CACrB,SAAA,EACA,KAAA,EACA,UACA,QAAA,KACW;AACX,IAAA,MAAM,MAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,IAAI,QAAQ,CAAA,CAAA;AAC7C,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,OAAO,QAAQ,CAAA;AAAA,EACjD,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CACpB,SAAA,EACA,KAAA,EACA,UACA,QAAA,KACmB;AACnB,IAAA,MAAM,MAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,IAAI,QAAQ,CAAA,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,QAAA;AACjC,IAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,MAAA,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA;AACvB,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,GAAS,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,OAAO,aAAa,SAAA,EAAW;AACjC,MAAA,OAAO,MAAA,KAAW,MAAA;AAAA,IACpB;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CACrB,SAAA,EACA,KAAA,EACA,UACA,KAAA,KACG;AACH,IAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,QAAQ,IAAI,KAAK,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,OAAO,OAAA,KAA4D;AACjE,MAAA,IAAI,CAAC,YAAY,cAAA,EAAgB;AAC/B,QAAA,QAAA,CAAS,8BAA8B,CAAA;AACvC,QAAA,QAAA,CAAS,OAAO,CAAA;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,QAAA,CAAS,EAAE,CAAA;AAEX,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAC7C,MAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC3C;AACA,MAAA,eAAA,CAAgB,OAAO,CAAA;AAEvB,MAAA,MAAM,iBAA2B,EAAC;AAClC,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAElD,MAAA,IAAI;AAOF,QAAA,MAAM,cAAA,uBAAqB,GAAA,EAA4B;AACvD,QAAA,KAAA,MAAW,EAAE,KAAA,EAAO,WAAA,EAAa,MAAA,MAAY,OAAA,EAAS;AACpD,UAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA;AAC9B,UAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,UAAA,MAAM,OAAO,cAAA,CAAe,eAAA;AAC5B,UAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,IAAI,KAAK,EAAC;AAC7C,UAAA,OAAA,CAAQ,KAAK,EAAE,WAAA,EAAa,KAAA,EAAO,CAAA,EAAG,gBAAgB,CAAA;AACtD,UAAA,cAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,QAClC;AAGA,QAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,QAAA,KAAA,MAAW,CAAC,WAAA,EAAa,OAAO,CAAA,IAAK,cAAA,EAAgB;AACnD,UAAA,MAAM,UAAA,GAAa,CAAA,EACjB,WAAA,CAAY,cACd,CAAA,+BAAA,EAAkC,kBAAA;AAAA,YAChC,WAAA,CAAY;AAAA,WACb,CAAA,aAAA,EAAgB,kBAAA,CAAmB,WAAW,CAAC,CAAA,CAAA;AAEhD,UAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AAEnD,UAAA,IAAI,CAAC,YAAY,EAAA,EAAI;AACnB,YAAA,MAAM,MAAA,GACJ,YAAY,MAAA,KAAW,GAAA,GACnB,oBAAoB,WAAW,CAAA,WAAA,CAAA,GAC/B,CAAA,+BAAA,EAAkC,WAAA,CAAY,UAAU,CAAA,CAAA;AAC9D,YAAA,KAAA,MAAW,EAAE,WAAA,EAAY,IAAK,OAAA,EAAS;AACrC,cAAA,YAAA,CAAa,IAAI,WAAA,EAAa;AAAA,gBAC5B,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAA,EAAS;AAAA,eACV,CAAA;AACD,cAAA,aAAA,CAAc,IAAI,WAAW,CAAA;AAAA,YAC/B;AACA,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,IAAA,EAAK;AACvC,UAAA,MAAM,OAAA,GAAU,gBAAgB,OAAO,CAAA;AAEvC,UAAA,IAAI;AACF,YAAA,KAAA,MAAW,EAAE,WAAA,EAAa,KAAA,EAAO,cAAA,MAAoB,OAAA,EAAS;AAC5D,cAAA,IAAI,OAAA,GAAU,CAAA;AAGd,cAAA,KAAA,MAAW,CAAA,IAAM,cAAA,CAAe,GAAA,IAAO,EAAC,EAAsB;AAC5D,gBAAA,MAAM,SAAA,GAAY,cAAA;AAAA,kBAChB,WAAA;AAAA,kBACA,KAAA;AAAA,kBACA,OAAA;AAAA,kBACA,CAAA,CAAE;AAAA,iBACJ;AACA,gBAAA,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,GAAA,EAAK,SAAS,CAAA;AACxC,gBAAA,OAAA,EAAA;AAAA,cACF;AAGA,cAAA,KAAA,MAAW,CAAA,IAAM,cAAA,CAAe,KAAA,IAAS,EAAC,EAAoB;AAC5D,gBAAA,MAAM,WAAA,GAAc,cAAA;AAAA,kBAClB,WAAA;AAAA,kBACA,KAAA;AAAA,kBACA,OAAA,EAAA;AAAA,kBACA,CAAA,CAAE;AAAA,iBACJ;AACA,gBAAA,eAAA,CAAgB,OAAA,EAAS,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,YAAY,WAAW,CAAA;AAAA,cAC3D;AAGA,cAAA,KAAA,MAAW,CAAA,IAAM,cAAA,CAAe,MAAA,IAAU,EAAC,EAAqB;AAC9D,gBAAA,MAAM,QAAA,GAAW,aAAA;AAAA,kBACf,WAAA;AAAA,kBACA,KAAA;AAAA,kBACA,OAAA;AAAA,kBACA,CAAA,CAAE;AAAA,iBACJ;AACA,gBAAA,gBAAA,CAAiB,OAAA,EAAS,CAAA,CAAE,YAAA,EAAc,QAAQ,CAAA;AAClD,gBAAA,OAAA,EAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,KAAA,MAAW,EAAE,WAAA,EAAY,IAAK,OAAA,EAAS;AACrC,cAAA,YAAA,CAAa,IAAI,WAAA,EAAa;AAAA,gBAC5B,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAA,EACE,GAAA,YAAe,KAAA,GACX,GAAA,CAAI,OAAA,GACJ;AAAA,eACP,CAAA;AACD,cAAA,aAAA,CAAc,IAAI,WAAW,CAAA;AAAA,YAC/B;AACA,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,KAAA,CAAM,UAAA,EAAY;AAAA,YACnD,MAAA,EAAQ,KAAA;AAAA,YACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,cAClB,MAAM,OAAA,CAAQ;AAAA,aACf,CAAA;AAAA,YACD,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB;AAAA;AAClB,WACD,CAAA;AAED,UAAA,IAAI,CAAC,YAAY,EAAA,EAAI;AACnB,YAAA,KAAA,MAAW,EAAE,WAAA,EAAY,IAAK,OAAA,EAAS;AACrC,cAAA,YAAA,CAAa,IAAI,WAAA,EAAa;AAAA,gBAC5B,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAA,EAAS,CAAA,kCAAA,EAAqC,WAAA,CAAY,UAAU,CAAA;AAAA,eACrE,CAAA;AACD,cAAA,aAAA,CAAc,IAAI,WAAW,CAAA;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAGA,QAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,OAAA,EAAS;AAC/B,UAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,YAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AACzB,YAAA,YAAA,CAAa,IAAI,KAAA,EAAO;AAAA,cACtB,MAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,YAAY,WAAA,CAAY,oBAAA;AAAA,cAC5B,QAAA;AAAA,cACA;AAAA,gBACE,eAAe,WAAA,CAAY,aAAA;AAAA,gBAC3B,iBAAiB,WAAA,CAAY;AAAA,eAC/B;AAAA,cACA,EAAE,gBAAgB,cAAA;AAAe,aACnC;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,QAAA,CAAS,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,OAAO,CAAA;AAAA,MACvD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACvC,QAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,QAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,OAAA,EAAS;AAC/B,UAAA,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,QAAQ,QAAA,EAAU,OAAA,EAAS,KAAK,CAAA;AAAA,QACtD;AACA,QAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,QAAA,CAAS,OAAO,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA;AAAA,IAEA,CAAC,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,YAAY;AAAA,GAChD;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,OAAe,MAAA,KAA8B;AAC5C,MAAA,UAAA,CAAW,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,OAAO,KAAA,KAAkB;AACvB,MAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,YAAY,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,WAAA,CAAY,oBAAA;AAAA,UAC5B,QAAA;AAAA,UACA;AAAA,YACE,eAAe,WAAA,CAAY,aAAA;AAAA,YAC3B,iBAAiB,WAAA,CAAY;AAAA,WAC/B;AAAA,UACA,EAAE,gBAAA,EAAkB,CAAC,KAAK,CAAA;AAAE,SAC9B;AACA,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,UAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,aAAa,CAAA;AACvC,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,UAAA,IAAA,CAAK,IAAI,KAAA,EAAO,EAAE,QAAQ,QAAA,EAAU,OAAA,EAAS,qBAAqB,CAAA;AAClE,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACxB;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,KAAA,EAAe,MAAA,KAA8B;AACxE,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA;AAE7C,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,uBACE,GAAA,CAAC,UAAO,OAAA,EAAQ,UAAA,EAAW,MAAK,OAAA,EAAQ,QAAA,EAAQ,MAAC,QAAA,EAAA,aAAA,EAEjD,CAAA;AAAA,IAEJ;AAEA,IAAA,IAAI,WAAA,KAAgB,SAAA,IAAa,MAAA,CAAO,MAAA,KAAW,SAAA,EAAW;AAC5D,MAAA,uBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,SAAA,sBAAY,SAAA,EAAA,EAAU,CAAA;AAAA,UACvB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,IAEJ;AAEA,IAAA,IAAI,WAAA,KAAgB,WAAA,IAAe,MAAA,CAAO,MAAA,KAAW,WAAA,EAAa;AAChE,MAAA,uBACE,GAAA,CAAC,UAAO,OAAA,EAAQ,UAAA,EAAW,MAAK,OAAA,EAAQ,QAAA,EAAQ,MAAC,QAAA,EAAA,WAAA,EAEjD,CAAA;AAAA,IAEJ;AAEA,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,uBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,sBAAY,gBAAA,EAAA,EAAiB,CAAA;AAAA,UAC7B,QAAA,EAAQ,IAAA;AAAA,UACT,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,IAEJ;AAEA,IAAA,MAAM,OAAO,KAAA,KAAU,SAAA;AACvB,IAAA,MAAM,cAAA,GAAiB,IAAA,IAAQ,iBAAA,IAAqB,CAAC,YAAA;AACrD,IAAA,uBACE,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,OAAO,EAAE,GAAA,EAAK,GAAE,EAClC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,aAAA,EACd,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,sBAAY,SAAA,EAAA,EAAU,CAAA;AAAA,UACtB,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,UAClC,QAAA,EAAU,cAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,SAGH,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,aAAA,EACd,8BAAC,MAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,sBAAY,SAAA,EAAA,EAAU,CAAA;AAAA,UACtB,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAA;AAAA,UAC9C,QAAA,EAAU,cAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,SAGH,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAS,CAAA,EAAG,SAAA,EAAU,QAAA,EACzB,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAAgB,0HAGlD,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAY,KAAA,KAAU,SAAA;AAE5B,EAAA,MAAM,gBAAA,GAAmB,CACvB,KAAA,EACA,SAAA,EACA,QAAA,EACA,KAAA,GAAQ,CAAA,KAER,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,IAAA,KAAS;AACxB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,MAAA,uBACE,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,OAAA;AAAA,UACL,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,cAAA,CAAe,SAAA,EAAW,GAAG,CAAA,CAAE,QAAA,EAAU,EAAE,KAAK,CAAA;AAAA,UACvD,QAAA,EAAU,OACR,cAAA,CAAe,SAAA,EAAW,GAAG,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,UAEzD,QAAA;AAAA,UACA,UAAA,EAAY,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,UACpC,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAA;AAAK,SAAA;AAAA,QAX3B,CAAA,EAAG,SAAS,CAAA,OAAA,EAAU,CAAA,CAAE,QAAQ,CAAA;AAAA,OAYvC;AAAA,IAEJ;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAc,QAAA;AAAA,QACd,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG;AAAA,QAEjB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,eAAA,EACjC,eAAK,KAAA,EACR,CAAA;AAAA,UACC,IAAA,CAAK,YACJ,gBAAA,CAAiB,IAAA,CAAK,UAAU,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAC;AAAA;AAAA,OAAA;AAAA,MAT3D,CAAA,EAAG,SAAS,CAAA,KAAA,EAAQ,KAAK,IAAI,IAAI,CAAA;AAAA,KAUxC;AAAA,EAEJ,CAAC,CAAA;AAEH,EAAA,4BACG,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,cAAA,CAAe,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,QAAO,KAAM;AACzC,MAAA,MAAM,KAAK,MAAA,CAAO,MAAA;AAClB,MAAA,MAAM,QAAA,GAAW,EAAA,GAAK,oBAAA,CAAqB,EAAE,IAAI,EAAC;AAClD,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA;AACvC,MAAA,MAAM,QAAA,GACJ,SAAA,IACA,MAAA,CAAO,MAAA,KAAW,SAAA,IAClB,OAAO,MAAA,KAAW,WAAA,IAClB,KAAA,KAAU,SAAA,IACV,KAAA,KAAU,WAAA;AACZ,MAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAgB,SAAA,EAAW,OAAA,CAAQ,eAAA,EACjC,QAAA,EAAA;AAAA,QAAA,EAAA,wBACE,UAAA,EAAA,EAAW,SAAA,EAAW,OAAA,CAAQ,gBAAA,EAC5B,aAAG,eAAA,EACN,CAAA;AAAA,wBAEF,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,KAAA;AAAA,YACV,WAAW,OAAA,CAAQ,sBAAA;AAAA,YAEnB,8BAAC,aAAA,EAAA,EAAc,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,iBAAe,IAAA,EAAC;AAAA;AAAA,SAC3D;AAAA,QAEC,SAAS,MAAA,GAAS,CAAA,wBAChB,GAAA,EAAA,EAAI,OAAA,EAAQ,QAAO,aAAA,EAAc,QAAA,EAAS,KAAA,EAAO,EAAE,KAAK,EAAA,EAAG,EACzD,mBAAS,GAAA,CAAI,CAAC,SAAS,IAAA,qBACtB,IAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAQ,MAAA;AAAA,YACR,aAAA,EAAc,QAAA;AAAA,YACd,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG;AAAA,YAEjB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,SAAA;AAAA,kBACR,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,SAAA;AAAA,oBACV,UAAA,EAAY,GAAA;AAAA,oBACZ,aAAA,EAAe,WAAA;AAAA,oBACf,aAAA,EAAe;AAAA,mBACjB;AAAA,kBACA,KAAA,EAAM,eAAA;AAAA,kBAEL,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,eACX;AAAA,cAEC,QAAQ,OAAA,oBACP,IAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,MAAA;AAAA,kBACR,aAAA,EAAc,QAAA;AAAA,kBACd,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,kBAEhB,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,UAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,SAAA;AAAA,wBACR,KAAA,EAAO,EAAE,QAAA,EAAU,QAAA,EAAS;AAAA,wBAC5B,KAAA,EAAM,eAAA;AAAA,wBACP,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oBACC,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,qBACnB,GAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBAEC,SAAA,EAAS,IAAA;AAAA,wBACT,OAAA,EAAQ,UAAA;AAAA,wBACR,IAAA,EAAK,OAAA;AAAA,wBACL,OAAO,EAAA,CAAG,KAAA;AAAA,wBACV,KAAA,EAAO,cAAA;AAAA,0BACL,KAAA;AAAA,0BACA,CAAA;AAAA,0BACA,EAAA,CAAG,QAAA;AAAA,0BACH,EAAA,CAAG;AAAA,yBACL;AAAA,wBACA,UAAU,CAAA,CAAA,KACR,cAAA;AAAA,0BACE,KAAA;AAAA,0BACA,CAAA;AAAA,0BACA,EAAA,CAAG,QAAA;AAAA,0BACH,EAAE,MAAA,CAAO;AAAA,yBACX;AAAA,wBAEF,QAAA;AAAA,wBACA,UAAA,EAAY,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,wBACpC,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAA;AAAK,uBAAA;AAAA,sBArB3B,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,EAAA,CAAG,QAAQ,CAAA;AAAA,qBAuBnC;AAAA;AAAA;AAAA,eACH;AAAA,cAGD,QAAQ,KAAA,oBACP,IAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,MAAA;AAAA,kBACR,aAAA,EAAc,QAAA;AAAA,kBACd,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,kBAEhB,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,UAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAQ,SAAA;AAAA,wBACR,KAAA,EAAO,EAAE,QAAA,EAAU,QAAA,EAAS;AAAA,wBAC5B,KAAA,EAAM,eAAA;AAAA,wBACP,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oBACC,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,qBACjB,GAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBAEC,SAAA,EAAS,IAAA;AAAA,wBACT,OAAA,EAAQ,UAAA;AAAA,wBACR,IAAA,EAAK,OAAA;AAAA,wBACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,GAAG,CAAC,CAAA,EAC3C,IAAA,CAAK,OACP,CAAA,CAAA;AAAA,wBACA,KAAA,EAAO,cAAA;AAAA,0BACL,KAAA;AAAA,0BACA,CAAA;AAAA,0BACA,KAAK,OAAA,CAAQ,QAAA;AAAA,0BACb,KAAK,OAAA,CAAQ;AAAA,yBACf;AAAA,wBACA,UAAU,CAAA,CAAA,KACR,cAAA;AAAA,0BACE,KAAA;AAAA,0BACA,CAAA;AAAA,0BACA,KAAK,OAAA,CAAQ,QAAA;AAAA,0BACb,EAAE,MAAA,CAAO;AAAA,yBACX;AAAA,wBAEF,QAAA;AAAA,wBACA,SAAA,EAAS,IAAA;AAAA,wBACT,OAAA,EAAS,CAAA;AAAA,wBACT,OAAA,EAAS,EAAA;AAAA,wBACT,UAAA,EAAY,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,wBACpC,eAAA,EAAiB;AAAA,0BACf,MAAA,EAAQ,IAAA;AAAA,0BACR,KAAA,EAAO;AAAA,4BACL,QAAA,EAAU,MAAA;AAAA,4BACV,QAAA,EAAU,QAAA;AAAA,4BACV,YAAA,EAAc,UAAA;AAAA,4BACd,UAAA,EAAY;AAAA;AACd;AACF,uBAAA;AAAA,sBAlCK,CAAA,EAAG,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,qBAoC9C;AAAA;AAAA;AAAA,eACH;AAAA,cAGD,QAAQ,SAAA,IACP,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,OAAO,QAAQ;AAAA;AAAA,WAAA;AAAA,UApHhD,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA;AAAA,SAsH1B,CAAA,EACH,CAAA;AAAA,QAGD,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA,KAAW,UAAA,oBACnC,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,EAAE,YAAA,EAAc,CAAA,EAAE,EAAG,CAAA;AAAA,wBAG9C,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,iBAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAI,CAAA;AAAA,UACJ,mBAAA,CAAoB,OAAO,MAAM;AAAA,SAAA,EACpC;AAAA,OAAA,EAAA,EAlJQ,KAmJV,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,IAEA,UAAU,OAAA,oBACT,IAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,QAAO,UAAA,EAAW,QAAA,EAAS,EAAA,EAAI,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,GAAE,EACnE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAS,OAAA,EAAQ,CAAA;AAAA,0BAChD,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,SAC/B,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Box } from '@material-ui/core';
|
|
3
|
+
import AutorenewIcon from '@material-ui/icons/Autorenew';
|
|
4
|
+
import { InfoCard } from '@backstage/core-components';
|
|
5
|
+
import { useRCAReportStyles } from '../styles.esm.js';
|
|
6
|
+
import { PatchTabContent } from './PatchTabContent.esm.js';
|
|
7
|
+
|
|
8
|
+
const QuickFixesPanelSection = ({
|
|
9
|
+
reportId,
|
|
10
|
+
chatContext,
|
|
11
|
+
revisedActions
|
|
12
|
+
}) => {
|
|
13
|
+
const classes = useRCAReportStyles();
|
|
14
|
+
return /* @__PURE__ */ jsx(Box, { className: classes.fixesPanelWrapper, children: /* @__PURE__ */ jsx(
|
|
15
|
+
InfoCard,
|
|
16
|
+
{
|
|
17
|
+
title: /* @__PURE__ */ jsxs("span", { className: classes.cardTitle, children: [
|
|
18
|
+
/* @__PURE__ */ jsx(AutorenewIcon, { className: classes.cardTitleIcon }),
|
|
19
|
+
"Quick Fixes"
|
|
20
|
+
] }),
|
|
21
|
+
className: classes.fixesPanel,
|
|
22
|
+
children: /* @__PURE__ */ jsx(Box, { className: classes.fixesContent, children: /* @__PURE__ */ jsx(
|
|
23
|
+
PatchTabContent,
|
|
24
|
+
{
|
|
25
|
+
reportId,
|
|
26
|
+
chatContext,
|
|
27
|
+
revisedActions
|
|
28
|
+
}
|
|
29
|
+
) })
|
|
30
|
+
}
|
|
31
|
+
) });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { QuickFixesPanelSection };
|
|
35
|
+
//# sourceMappingURL=QuickFixesPanelSection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuickFixesPanelSection.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/QuickFixesPanelSection.tsx"],"sourcesContent":["import { Box } from '@material-ui/core';\nimport AutorenewIcon from '@material-ui/icons/Autorenew';\nimport { InfoCard } from '@backstage/core-components';\nimport { useRCAReportStyles } from '../styles';\nimport { PatchTabContent } from './PatchTabContent';\nimport type {\n RCAAgentApi,\n RecommendedAction,\n} from '../../../../api/RCAAgentApi';\n\ninterface ChatContext {\n namespaceName: string;\n environmentName: string;\n projectName: string;\n rcaAgentApi: RCAAgentApi;\n backendBaseUrl?: string;\n}\n\ninterface QuickFixesPanelSectionProps {\n reportId: string;\n chatContext: ChatContext;\n revisedActions: { index: number; action: RecommendedAction }[];\n}\n\nexport const QuickFixesPanelSection = ({\n reportId,\n chatContext,\n revisedActions,\n}: QuickFixesPanelSectionProps) => {\n const classes = useRCAReportStyles();\n\n return (\n <Box className={classes.fixesPanelWrapper}>\n <InfoCard\n title={\n <span className={classes.cardTitle}>\n <AutorenewIcon className={classes.cardTitleIcon} />\n Quick Fixes\n </span>\n }\n className={classes.fixesPanel}\n >\n <Box className={classes.fixesContent}>\n <PatchTabContent\n reportId={reportId}\n chatContext={chatContext}\n revisedActions={revisedActions}\n />\n </Box>\n </InfoCard>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAwBO,MAAM,yBAAyB,CAAC;AAAA,EACrC,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAmC;AACjC,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAEnC,EAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,iBAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,kBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,SAAA,EACvB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,OAAA,CAAQ,aAAA,EAAe,CAAA;AAAA,QAAE;AAAA,OAAA,EAErD,CAAA;AAAA,MAEF,WAAW,OAAA,CAAQ,UAAA;AAAA,MAEnB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,YAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA;AAAA,OACF,EACF;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
import { List, ListItem, ListItemText, Divider } from '@material-ui/core';
|
|
4
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
5
|
+
import { FormattedText } from '../FormattedText.esm.js';
|
|
6
|
+
|
|
7
|
+
const useStyles = makeStyles((theme) => ({
|
|
8
|
+
list: {
|
|
9
|
+
padding: 0,
|
|
10
|
+
margin: 0
|
|
11
|
+
},
|
|
12
|
+
listItem: {
|
|
13
|
+
padding: theme.spacing(1, 0)
|
|
14
|
+
},
|
|
15
|
+
primary: {
|
|
16
|
+
fontWeight: 500,
|
|
17
|
+
fontSize: theme.typography.body1.fontSize,
|
|
18
|
+
color: theme.palette.text.primary
|
|
19
|
+
},
|
|
20
|
+
secondary: {
|
|
21
|
+
fontSize: theme.typography.caption.fontSize
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
const RecommendationsSection = ({
|
|
25
|
+
actions
|
|
26
|
+
}) => {
|
|
27
|
+
const classes = useStyles();
|
|
28
|
+
if (!actions || actions.length === 0) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return /* @__PURE__ */ jsx(List, { className: classes.list, disablePadding: true, children: actions.map((action, idx) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(ListItem, { className: classes.listItem, disableGutters: true, children: /* @__PURE__ */ jsx(
|
|
33
|
+
ListItemText,
|
|
34
|
+
{
|
|
35
|
+
primary: /* @__PURE__ */ jsx(
|
|
36
|
+
FormattedText,
|
|
37
|
+
{
|
|
38
|
+
text: action.description || "",
|
|
39
|
+
disableMarkdown: true
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
secondary: action.rationale ? /* @__PURE__ */ jsx(FormattedText, { text: action.rationale }) : void 0,
|
|
43
|
+
classes: {
|
|
44
|
+
primary: classes.primary,
|
|
45
|
+
secondary: classes.secondary
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
) }),
|
|
49
|
+
idx < actions.length - 1 && /* @__PURE__ */ jsx(Divider, { component: "li" })
|
|
50
|
+
] }, idx)) });
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export { RecommendationsSection };
|
|
54
|
+
//# sourceMappingURL=RecommendationsSection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecommendationsSection.esm.js","sources":["../../../../../src/components/RCA/RCAReport/sections/RecommendationsSection.tsx"],"sourcesContent":["import { Fragment } from 'react';\nimport { List, ListItem, ListItemText, Divider } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { FormattedText } from '../FormattedText';\nimport type { AIRCAAgentComponents } from '@openchoreo/backstage-plugin-common';\n\ntype RecommendedAction = AIRCAAgentComponents['schemas']['RecommendedAction'];\n\ninterface RecommendationsSectionProps {\n actions?: RecommendedAction[];\n}\n\nconst useStyles = makeStyles(theme => ({\n list: {\n padding: 0,\n margin: 0,\n },\n listItem: {\n padding: theme.spacing(1, 0),\n },\n primary: {\n fontWeight: 500,\n fontSize: theme.typography.body1.fontSize,\n color: theme.palette.text.primary,\n },\n secondary: {\n fontSize: theme.typography.caption.fontSize,\n },\n}));\n\nexport const RecommendationsSection = ({\n actions,\n}: RecommendationsSectionProps) => {\n const classes = useStyles();\n\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <List className={classes.list} disablePadding>\n {actions.map((action, idx) => (\n <Fragment key={idx}>\n <ListItem className={classes.listItem} disableGutters>\n <ListItemText\n primary={\n <FormattedText\n text={action.description || ''}\n disableMarkdown\n />\n }\n secondary={\n action.rationale ? (\n <FormattedText text={action.rationale} />\n ) : undefined\n }\n classes={{\n primary: classes.primary,\n secondary: classes.secondary,\n }}\n />\n </ListItem>\n {idx < actions.length - 1 && <Divider component=\"li\" />}\n </Fragment>\n ))}\n </List>\n );\n};\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA,GAC7B;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,GAAA;AAAA,IACZ,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,QAAA;AAAA,IACjC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,GAC5B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ;AAAA;AAEvC,CAAA,CAAE,CAAA;AAEK,MAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,CAAA,KAAmC;AACjC,EAAA,MAAM,UAAU,SAAA,EAAU;AAE1B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAM,cAAA,EAAc,IAAA,EAC1C,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,GAAA,0BACnB,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,QAAA,EAAU,gBAAc,IAAA,EACnD,QAAA,kBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA,kBACE,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,OAAO,WAAA,IAAe,EAAA;AAAA,YAC5B,eAAA,EAAe;AAAA;AAAA,SACjB;AAAA,QAEF,SAAA,EACE,OAAO,SAAA,mBACL,GAAA,CAAC,iBAAc,IAAA,EAAM,MAAA,CAAO,WAAW,CAAA,GACrC,MAAA;AAAA,QAEN,OAAA,EAAS;AAAA,UACP,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAW,OAAA,CAAQ;AAAA;AACrB;AAAA,KACF,EACF,CAAA;AAAA,IACC,MAAM,OAAA,CAAQ,MAAA,GAAS,qBAAK,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,IAAA,EAAK;AAAA,GAAA,EAAA,EApBxC,GAqBf,CACD,CAAA,EACH,CAAA;AAEJ;;;;"}
|