@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 @@
1
+ {"version":3,"file":"useTraces.esm.js","sources":["../../src/hooks/useTraces.ts"],"sourcesContent":["import { useCallback, useEffect, useState, useMemo } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { observabilityApiRef } from '../api/ObservabilityApi';\nimport { Filters, Trace } from '../types';\nimport { Entity } from '@backstage/catalog-model';\nimport { CHOREO_ANNOTATIONS } from '@openchoreo/backstage-plugin-common';\nimport { calculateTimeRange } from '@openchoreo/backstage-plugin-react';\n\nconst sortByStartTime = (traceList: Trace[]): Trace[] =>\n [...traceList].sort((a, b) => {\n const aTime = a.startTime ? new Date(a.startTime).getTime() : 0;\n const bTime = b.startTime ? new Date(b.startTime).getTime() : 0;\n return bTime - aTime;\n });\n\nexport function useTraces(filters: Filters, entity: Entity) {\n const observabilityApi = useApi(observabilityApiRef);\n const [traces, setTraces] = useState<Trace[]>([]);\n const [total, setTotal] = useState<number>(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const namespace =\n entity.metadata.annotations?.[CHOREO_ANNOTATIONS.NAMESPACE] ?? '';\n const projectName = entity.metadata.name as string;\n\n // Memoize components string for dependency array\n const componentsKey = useMemo(\n () => filters.components?.join(',') || '',\n [filters.components],\n );\n\n // Memoize filtered traces based on searchQuery\n const filteredTraces = useMemo(() => {\n if (!filters.searchQuery || filters.searchQuery.trim() === '') {\n return traces;\n }\n const searchLower = filters.searchQuery.toLowerCase().trim();\n return traces.filter(trace =>\n trace.traceId.toLowerCase().includes(searchLower),\n );\n }, [traces, filters.searchQuery]);\n\n const fetchTraces = useCallback(async () => {\n if (!filters.environment || !filters.timeRange) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const { startTime, endTime } = calculateTimeRange(filters.timeRange, {\n startTime: filters.customStartTime,\n endTime: filters.customEndTime,\n });\n\n const selectedComponents = filters.components ?? [];\n\n const responses =\n selectedComponents.length > 0\n ? await Promise.all(\n selectedComponents.map(name =>\n observabilityApi.getTraces(\n namespace,\n projectName,\n filters.environment.name,\n name,\n { limit: 100, startTime, endTime, sortOrder: 'desc' },\n ),\n ),\n )\n : [\n await observabilityApi.getTraces(\n namespace,\n projectName,\n filters.environment.name,\n undefined,\n { limit: 100, startTime, endTime, sortOrder: 'desc' },\n ),\n ];\n\n // Merge and deduplicate by traceId (same trace can appear from multiple components)\n const seenIds = new Map<string, Trace>();\n responses\n .flatMap(r => r.traces)\n .forEach(trace => {\n if (!seenIds.has(trace.traceId)) seenIds.set(trace.traceId, trace);\n });\n const merged = sortByStartTime(Array.from(seenIds.values()));\n\n setTraces(merged);\n setTotal(merged.length);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch traces');\n } finally {\n setLoading(false);\n }\n }, [\n observabilityApi,\n filters.environment,\n filters.timeRange,\n filters.customStartTime,\n filters.customEndTime,\n filters.components,\n namespace,\n projectName,\n ]);\n\n // Auto-fetch traces when filters change\n useEffect(() => {\n if (filters.environment && filters.timeRange) {\n fetchTraces();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n filters.environment,\n filters.timeRange,\n filters.customStartTime,\n filters.customEndTime,\n componentsKey,\n ]);\n\n const refresh = useCallback(() => {\n setTraces([]);\n setTotal(0);\n fetchTraces();\n }, [fetchTraces]);\n\n return {\n traces: filteredTraces,\n total,\n loading,\n error,\n refresh,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { useState, useRef, useCallback } from 'react';
2
+ import { useApi } from '@backstage/core-plugin-api';
3
+ import { observabilityApiRef } from '../api/ObservabilityApi.esm.js';
4
+ import '../api/RCAAgentApi.esm.js';
5
+ import '../api/FinOpsAgentApi.esm.js';
6
+
7
+ function useUpdateIncident() {
8
+ const observabilityApi = useApi(observabilityApiRef);
9
+ const [updating, setUpdating] = useState(false);
10
+ const [error, setError] = useState(null);
11
+ const inFlightRef = useRef(false);
12
+ const updateIncident = useCallback(
13
+ async (incident, newStatus) => {
14
+ if (inFlightRef.current) {
15
+ throw new Error("An incident update is already in progress.");
16
+ }
17
+ const namespaceName = incident.namespaceName || "";
18
+ const environmentName = incident.environmentName || "";
19
+ if (!namespaceName || !environmentName) {
20
+ const msg = "Cannot update incident: missing namespace or environment.";
21
+ setError(msg);
22
+ throw new Error(msg);
23
+ }
24
+ inFlightRef.current = true;
25
+ setUpdating(true);
26
+ setError(null);
27
+ try {
28
+ await observabilityApi.updateIncidentStatus(
29
+ incident.incidentId,
30
+ newStatus,
31
+ namespaceName,
32
+ environmentName
33
+ );
34
+ } catch (err) {
35
+ const msg = err instanceof Error ? err.message : "Failed to update incident.";
36
+ setError(msg);
37
+ throw err;
38
+ } finally {
39
+ setUpdating(false);
40
+ inFlightRef.current = false;
41
+ }
42
+ },
43
+ [observabilityApi]
44
+ );
45
+ const clearError = useCallback(() => setError(null), []);
46
+ return { updateIncident, updating, error, clearError };
47
+ }
48
+
49
+ export { useUpdateIncident };
50
+ //# sourceMappingURL=useUpdateIncident.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdateIncident.esm.js","sources":["../../src/hooks/useUpdateIncident.ts"],"sourcesContent":["import { useState, useCallback, useRef } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { observabilityApiRef } from '../api';\nimport type { IncidentSummary } from '../types';\n\nexport interface UseUpdateIncidentResult {\n updateIncident: (\n incident: IncidentSummary,\n newStatus: 'acknowledged' | 'resolved',\n ) => Promise<void>;\n updating: boolean;\n error: string | null;\n clearError: () => void;\n}\n\nexport function useUpdateIncident(): UseUpdateIncidentResult {\n const observabilityApi = useApi(observabilityApiRef);\n const [updating, setUpdating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inFlightRef = useRef(false);\n\n const updateIncident = useCallback(\n async (\n incident: IncidentSummary,\n newStatus: 'acknowledged' | 'resolved',\n ): Promise<void> => {\n if (inFlightRef.current) {\n throw new Error('An incident update is already in progress.');\n }\n\n const namespaceName = incident.namespaceName || '';\n const environmentName = incident.environmentName || '';\n\n if (!namespaceName || !environmentName) {\n const msg = 'Cannot update incident: missing namespace or environment.';\n setError(msg);\n throw new Error(msg);\n }\n\n inFlightRef.current = true;\n setUpdating(true);\n setError(null);\n\n try {\n await observabilityApi.updateIncidentStatus(\n incident.incidentId,\n newStatus,\n namespaceName,\n environmentName,\n );\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : 'Failed to update incident.';\n setError(msg);\n throw err; // re-throw so the caller can skip refresh on failure\n } finally {\n setUpdating(false);\n inFlightRef.current = false;\n }\n },\n [observabilityApi],\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return { updateIncident, updating, error, clearError };\n}\n"],"names":[],"mappings":";;;;;;AAeO,SAAS,iBAAA,GAA6C;AAC3D,EAAA,MAAM,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,OACE,UACA,SAAA,KACkB;AAClB,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,EAAA;AAChD,MAAA,MAAM,eAAA,GAAkB,SAAS,eAAA,IAAmB,EAAA;AAEpD,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,eAAA,EAAiB;AACtC,QAAA,MAAM,GAAA,GAAM,2DAAA;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,MACrB;AAEA,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,CAAiB,oBAAA;AAAA,UACrB,QAAA,CAAS,UAAA;AAAA,UACT,SAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACvC,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,MAAM,GAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,MAAM,SAAS,IAAI,CAAA,EAAG,EAAE,CAAA;AAEvD,EAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW;AACvD;;;;"}
@@ -0,0 +1,63 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+ import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
4
+ import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
5
+
6
+ function useUrlFilters({ environments }) {
7
+ const [searchParams, setSearchParams] = useSearchParams();
8
+ const filters = useMemo(() => {
9
+ const envName = searchParams.get("env");
10
+ const components = searchParams.get("components")?.split(",").filter(Boolean) || [];
11
+ const searchQuery = searchParams.get("q") || "";
12
+ const environment = envName ? environments.find(
13
+ (e) => e.name === envName || e.displayName === envName || e.name.toLowerCase() === envName.toLowerCase()
14
+ ) || null : null;
15
+ return {
16
+ environment,
17
+ ...parseUrlTimeRange(searchParams),
18
+ components,
19
+ searchQuery
20
+ };
21
+ }, [searchParams, environments]);
22
+ useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
23
+ const updateFilters = useCallback(
24
+ (newFilters) => {
25
+ const newParams = new URLSearchParams(searchParams);
26
+ if (newFilters.environment !== void 0) {
27
+ if (newFilters.environment) {
28
+ newParams.set("env", newFilters.environment.name);
29
+ } else {
30
+ newParams.delete("env");
31
+ }
32
+ }
33
+ writeUrlTimeRange(newParams, newFilters);
34
+ if (newFilters.components !== void 0) {
35
+ if (newFilters.components.length > 0) {
36
+ newParams.set("components", newFilters.components.join(","));
37
+ } else {
38
+ newParams.delete("components");
39
+ }
40
+ }
41
+ if (newFilters.searchQuery !== void 0) {
42
+ if (newFilters.searchQuery) {
43
+ newParams.set("q", newFilters.searchQuery);
44
+ } else {
45
+ newParams.delete("q");
46
+ }
47
+ }
48
+ setSearchParams(newParams, { replace: true });
49
+ },
50
+ [searchParams, setSearchParams]
51
+ );
52
+ const resetFilters = useCallback(() => {
53
+ const newParams = new URLSearchParams();
54
+ if (environments.length > 0) {
55
+ newParams.set("env", environments[0].name);
56
+ }
57
+ setSearchParams(newParams, { replace: true });
58
+ }, [environments, setSearchParams]);
59
+ return { filters, updateFilters, resetFilters };
60
+ }
61
+
62
+ export { useUrlFilters };
63
+ //# sourceMappingURL=useUrlFilters.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUrlFilters.esm.js","sources":["../../src/hooks/useUrlFilters.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport type { Filters, Environment } from '../types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersOptions {\n /** Available environments to map names to objects */\n environments: Environment[];\n}\n\n/**\n * Hook for managing observability filters synced to URL query parameters.\n *\n * Query parameters:\n * - `env`: Environment name\n * - `timeRange`: Time range value (defaults to '10m')\n * - `components`: Comma-separated component IDs\n * - `q`: Search query string\n *\n * @example\n * ```tsx\n * const { filters, updateFilters, resetFilters } = useUrlFilters({\n * environments,\n * });\n *\n * // Read filter values\n * console.log(filters.environment, filters.timeRange);\n *\n * // Update filters (writes to URL)\n * updateFilters({ timeRange: '24h' });\n * ```\n */\nexport function useUrlFilters({ environments }: UseUrlFiltersOptions) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Parse filters from URL\n const filters = useMemo<Filters>(() => {\n const envName = searchParams.get('env');\n const components =\n searchParams.get('components')?.split(',').filter(Boolean) || [];\n const searchQuery = searchParams.get('q') || '';\n\n // Find environment by name\n const environment = envName\n ? environments.find(\n e =>\n e.name === envName ||\n e.displayName === envName ||\n e.name.toLowerCase() === envName.toLowerCase(),\n ) || (null as unknown as Environment)\n : (null as unknown as Environment);\n\n return {\n environment,\n ...parseUrlTimeRange(searchParams),\n components,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n // Auto-select first environment if none selected or URL has a stale env name\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n // Update URL when filters change\n const updateFilters = useCallback(\n (newFilters: Partial<Filters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment.name);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.components !== undefined) {\n if (newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('q', newFilters.searchQuery);\n } else {\n newParams.delete('q');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n // Reset filters to defaults\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+ import { ALERT_SEVERITIES } from '../components/Alerts/types.esm.js';
4
+ import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
5
+ import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
6
+
7
+ function useUrlFiltersForAlerts({
8
+ environments
9
+ }) {
10
+ const [searchParams, setSearchParams] = useSearchParams();
11
+ const filters = useMemo(() => {
12
+ const envName = searchParams.get("env");
13
+ const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
14
+ const rawSortOrder = searchParams.get("sort");
15
+ const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "desc";
16
+ const severityParam = searchParams.get("severity");
17
+ const severity = severityParam ? severityParam.split(",").filter(
18
+ (s) => Boolean(s) && ALERT_SEVERITIES.includes(s)
19
+ ) : [];
20
+ const searchQuery = searchParams.get("search") || void 0;
21
+ const environment = envName ? environments.find((e) => e.name === envName) : void 0;
22
+ return {
23
+ environment: environment?.name || "",
24
+ timeRange,
25
+ customStartTime,
26
+ customEndTime,
27
+ sortOrder,
28
+ severity: severity.length > 0 ? severity : void 0,
29
+ searchQuery
30
+ };
31
+ }, [searchParams, environments]);
32
+ useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
33
+ const updateFilters = useCallback(
34
+ (newFilters) => {
35
+ const newParams = new URLSearchParams(searchParams);
36
+ if (newFilters.environment !== void 0) {
37
+ if (newFilters.environment) {
38
+ newParams.set("env", newFilters.environment);
39
+ } else {
40
+ newParams.delete("env");
41
+ }
42
+ }
43
+ writeUrlTimeRange(newParams, newFilters);
44
+ if (newFilters.sortOrder !== void 0) {
45
+ if (newFilters.sortOrder === "desc") {
46
+ newParams.delete("sort");
47
+ } else {
48
+ newParams.set("sort", newFilters.sortOrder);
49
+ }
50
+ }
51
+ if (newFilters.severity !== void 0) {
52
+ if (newFilters.severity && newFilters.severity.length > 0) {
53
+ newParams.set("severity", newFilters.severity.join(","));
54
+ } else {
55
+ newParams.delete("severity");
56
+ }
57
+ }
58
+ if (newFilters.searchQuery !== void 0) {
59
+ if (newFilters.searchQuery) {
60
+ newParams.set("search", newFilters.searchQuery);
61
+ } else {
62
+ newParams.delete("search");
63
+ }
64
+ }
65
+ setSearchParams(newParams, { replace: true });
66
+ },
67
+ [searchParams, setSearchParams]
68
+ );
69
+ const resetFilters = useCallback(() => {
70
+ const newParams = new URLSearchParams();
71
+ if (environments.length > 0) {
72
+ newParams.set("env", environments[0].name);
73
+ }
74
+ setSearchParams(newParams, { replace: true });
75
+ }, [environments, setSearchParams]);
76
+ return { filters, updateFilters, resetFilters };
77
+ }
78
+
79
+ export { useUrlFiltersForAlerts };
80
+ //# sourceMappingURL=useUrlFiltersForAlerts.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUrlFiltersForAlerts.esm.js","sources":["../../src/hooks/useUrlFiltersForAlerts.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { type Environment } from '../types';\nimport {\n type AlertsFilters,\n ALERT_SEVERITIES,\n} from '../components/Alerts/types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForAlertsOptions {\n environments: Environment[];\n}\n\nexport function useUrlFiltersForAlerts({\n environments,\n}: UseUrlFiltersForAlertsOptions): {\n filters: AlertsFilters;\n updateFilters: (newFilters: Partial<AlertsFilters>) => void;\n resetFilters: () => void;\n} {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const filters = useMemo<AlertsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'desc';\n const severityParam = searchParams.get('severity');\n const severity = severityParam\n ? severityParam\n .split(',')\n .filter(\n s =>\n Boolean(s) && (ALERT_SEVERITIES as readonly string[]).includes(s),\n )\n : [];\n const searchQuery = searchParams.get('search') || undefined;\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n sortOrder,\n severity: severity.length > 0 ? severity : undefined,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n const updateFilters = useCallback(\n (newFilters: Partial<AlertsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'desc') {\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.severity !== undefined) {\n if (newFilters.severity && newFilters.severity.length > 0) {\n newParams.set('severity', newFilters.severity.join(','));\n } else {\n newParams.delete('severity');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":";;;;;;AAcO,SAAS,sBAAA,CAAuB;AAAA,EACrC;AACF,CAAA,EAIE;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAA,EAAgB;AAExD,EAAA,MAAM,OAAA,GAAU,QAAuB,MAAM;AAC3C,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAiB,aAAA,EAAc,GAChD,kBAAkB,YAAY,CAAA;AAChC,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC5C,IAAA,MAAM,SAAA,GACJ,YAAA,KAAiB,KAAA,IAAS,YAAA,KAAiB,SAAS,YAAA,GAAe,MAAA;AACrE,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,aAAA,GACb,aAAA,CACG,KAAA,CAAM,GAAG,CAAA,CACT,MAAA;AAAA,MACC,OACE,OAAA,CAAQ,CAAC,CAAA,IAAM,gBAAA,CAAuC,SAAS,CAAC;AAAA,QAEtE,EAAC;AACL,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AAElD,IAAA,MAAM,WAAA,GAAc,UAChB,YAAA,CAAa,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,GACzC,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAa,IAAA,IAAQ,EAAA;AAAA,MAClC,SAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MAC3C;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,6BAAA,CAA8B,YAAA,EAAc,cAAc,eAAe,CAAA;AAEzE,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,UAAA,KAAuC;AACtC,MAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,YAAY,CAAA;AAElD,MAAA,IAAI,UAAA,CAAW,gBAAgB,MAAA,EAAW;AACxC,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,UAAA,CAAW,WAAW,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,iBAAA,CAAkB,WAAW,UAAU,CAAA;AAEvC,MAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAW;AACtC,QAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAQ;AACnC,UAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,QAC5C;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,aAAa,MAAA,EAAW;AACrC,QAAA,IAAI,UAAA,CAAW,QAAA,IAAY,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AACzD,UAAA,SAAA,CAAU,IAAI,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QACzD,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,gBAAgB,MAAA,EAAW;AACxC,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,SAAA,CAAU,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,WAAW,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,cAAc,eAAe;AAAA,GAChC;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,MAAM,SAAA,GAAY,IAAI,eAAA,EAAgB;AACtC,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,YAAA,CAAa,CAAC,EAAE,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,eAAA,CAAgB,SAAA,EAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,YAAA,EAAc,eAAe,CAAC,CAAA;AAElC,EAAA,OAAO,EAAE,OAAA,EAAS,aAAA,EAAe,YAAA,EAAa;AAChD;;;;"}
@@ -0,0 +1,87 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+ import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
4
+ import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
5
+
6
+ function useUrlFiltersForIncidents({
7
+ environments
8
+ }) {
9
+ const [searchParams, setSearchParams] = useSearchParams();
10
+ const filters = useMemo(() => {
11
+ const envName = searchParams.get("env");
12
+ const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
13
+ const rawSortOrder = searchParams.get("sort");
14
+ const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "desc";
15
+ const componentsParam = searchParams.get("components");
16
+ const components = componentsParam ? componentsParam.split(",").filter(Boolean) : [];
17
+ const statusParam = searchParams.get("status");
18
+ const status = statusParam ? statusParam.split(",").filter(Boolean) : [];
19
+ const searchQuery = searchParams.get("search") || void 0;
20
+ const environment = envName ? environments.find((e) => e.name === envName) : void 0;
21
+ return {
22
+ environment: environment?.name || "",
23
+ timeRange,
24
+ customStartTime,
25
+ customEndTime,
26
+ sortOrder,
27
+ components: components.length > 0 ? components : void 0,
28
+ status: status.length > 0 ? status : void 0,
29
+ searchQuery
30
+ };
31
+ }, [searchParams, environments]);
32
+ useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
33
+ const updateFilters = useCallback(
34
+ (newFilters) => {
35
+ const newParams = new URLSearchParams(searchParams);
36
+ if (newFilters.environment !== void 0) {
37
+ if (newFilters.environment) {
38
+ newParams.set("env", newFilters.environment);
39
+ } else {
40
+ newParams.delete("env");
41
+ }
42
+ }
43
+ writeUrlTimeRange(newParams, newFilters);
44
+ if (newFilters.sortOrder !== void 0) {
45
+ if (newFilters.sortOrder === "desc") {
46
+ newParams.delete("sort");
47
+ } else {
48
+ newParams.set("sort", newFilters.sortOrder);
49
+ }
50
+ }
51
+ if (newFilters.components !== void 0) {
52
+ if (newFilters.components && newFilters.components.length > 0) {
53
+ newParams.set("components", newFilters.components.join(","));
54
+ } else {
55
+ newParams.delete("components");
56
+ }
57
+ }
58
+ if (newFilters.status !== void 0) {
59
+ if (newFilters.status && newFilters.status.length > 0) {
60
+ newParams.set("status", newFilters.status.join(","));
61
+ } else {
62
+ newParams.delete("status");
63
+ }
64
+ }
65
+ if (newFilters.searchQuery !== void 0) {
66
+ if (newFilters.searchQuery) {
67
+ newParams.set("search", newFilters.searchQuery);
68
+ } else {
69
+ newParams.delete("search");
70
+ }
71
+ }
72
+ setSearchParams(newParams, { replace: true });
73
+ },
74
+ [searchParams, setSearchParams]
75
+ );
76
+ const resetFilters = useCallback(() => {
77
+ const newParams = new URLSearchParams();
78
+ if (environments.length > 0) {
79
+ newParams.set("env", environments[0].name);
80
+ }
81
+ setSearchParams(newParams, { replace: true });
82
+ }, [environments, setSearchParams]);
83
+ return { filters, updateFilters, resetFilters };
84
+ }
85
+
86
+ export { useUrlFiltersForIncidents };
87
+ //# sourceMappingURL=useUrlFiltersForIncidents.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUrlFiltersForIncidents.esm.js","sources":["../../src/hooks/useUrlFiltersForIncidents.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport type { Environment } from '../types';\nimport type { IncidentsFilters } from '../components/Incidents/types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForIncidentsOptions {\n environments: Environment[];\n}\n\nexport function useUrlFiltersForIncidents({\n environments,\n}: UseUrlFiltersForIncidentsOptions): {\n filters: IncidentsFilters;\n updateFilters: (newFilters: Partial<IncidentsFilters>) => void;\n resetFilters: () => void;\n} {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const filters = useMemo<IncidentsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'desc';\n const componentsParam = searchParams.get('components');\n const components = componentsParam\n ? componentsParam.split(',').filter(Boolean)\n : [];\n const statusParam = searchParams.get('status');\n const status = statusParam ? statusParam.split(',').filter(Boolean) : [];\n const searchQuery = searchParams.get('search') || undefined;\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n sortOrder,\n components: components.length > 0 ? components : undefined,\n status: status.length > 0 ? status : undefined,\n searchQuery,\n };\n }, [searchParams, environments]);\n\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n const updateFilters = useCallback(\n (newFilters: Partial<IncidentsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'desc') {\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.components !== undefined) {\n if (newFilters.components && newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n if (newFilters.status !== undefined) {\n if (newFilters.status && newFilters.status.length > 0) {\n newParams.set('status', newFilters.status.join(','));\n } else {\n newParams.delete('status');\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+ import { LOG_LEVELS, LogEntryField, SELECTED_FIELDS } from '../components/RuntimeLogs/types.esm.js';
4
+ import { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment.esm.js';
5
+ import { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange.esm.js';
6
+
7
+ function useUrlFiltersForRuntimeLogs({
8
+ environments
9
+ }) {
10
+ const [searchParams, setSearchParams] = useSearchParams();
11
+ const filters = useMemo(() => {
12
+ const envName = searchParams.get("env");
13
+ const { timeRange, customStartTime, customEndTime } = parseUrlTimeRange(searchParams);
14
+ const logLevelParam = searchParams.get("logLevel");
15
+ const logLevel = logLevelParam === null ? [...LOG_LEVELS] : LOG_LEVELS.filter(
16
+ (level) => new Set(
17
+ logLevelParam.split(",").map((v) => v.trim()).filter(Boolean)
18
+ ).has(level)
19
+ );
20
+ const searchQuery = searchParams.get("search") || void 0;
21
+ const rawSortOrder = searchParams.get("sort");
22
+ const sortOrder = rawSortOrder === "asc" || rawSortOrder === "desc" ? rawSortOrder : "asc";
23
+ const isLive = searchParams.get("live") === "true";
24
+ const componentsParam = searchParams.get("components");
25
+ const components = componentsParam ? componentsParam.split(",").map((v) => v.trim()).filter(Boolean) : [];
26
+ const fieldsParam = searchParams.get("fields");
27
+ let selectedFields;
28
+ if (fieldsParam) {
29
+ selectedFields = fieldsParam.split(",").filter((f) => Object.values(LogEntryField).includes(f)).map((f) => f);
30
+ if (!selectedFields.includes(LogEntryField.Log)) {
31
+ selectedFields.push(LogEntryField.Log);
32
+ }
33
+ selectedFields = SELECTED_FIELDS.filter(
34
+ (field) => selectedFields.includes(field)
35
+ );
36
+ } else {
37
+ selectedFields = [...SELECTED_FIELDS];
38
+ }
39
+ const environment = envName ? environments.find((e) => e.name === envName) : void 0;
40
+ return {
41
+ environment: environment?.name || "",
42
+ timeRange,
43
+ customStartTime,
44
+ customEndTime,
45
+ logLevel,
46
+ selectedFields,
47
+ components,
48
+ searchQuery,
49
+ sortOrder,
50
+ isLive: isLive || false
51
+ };
52
+ }, [searchParams, environments]);
53
+ useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);
54
+ const updateFilters = useCallback(
55
+ (newFilters) => {
56
+ const newParams = new URLSearchParams(searchParams);
57
+ if (newFilters.environment !== void 0) {
58
+ if (newFilters.environment) {
59
+ newParams.set("env", newFilters.environment);
60
+ } else {
61
+ newParams.delete("env");
62
+ }
63
+ }
64
+ writeUrlTimeRange(newParams, newFilters);
65
+ if (newFilters.logLevel !== void 0) {
66
+ const isAllSelected = newFilters.logLevel.length === LOG_LEVELS.length && LOG_LEVELS.every((l) => newFilters.logLevel.includes(l));
67
+ if (isAllSelected) {
68
+ newParams.delete("logLevel");
69
+ } else if (newFilters.logLevel.length === 0) {
70
+ newParams.set("logLevel", "");
71
+ } else {
72
+ newParams.set("logLevel", newFilters.logLevel.join(","));
73
+ }
74
+ }
75
+ if (newFilters.selectedFields !== void 0) {
76
+ let fields = newFilters.selectedFields;
77
+ if (!fields.includes(LogEntryField.Log)) {
78
+ fields = [...fields, LogEntryField.Log];
79
+ }
80
+ const normalizedFields = SELECTED_FIELDS.filter(
81
+ (field) => fields.includes(field)
82
+ );
83
+ const isDefaultFields = normalizedFields.length === SELECTED_FIELDS.length && normalizedFields.every(
84
+ (field, index) => field === SELECTED_FIELDS[index]
85
+ );
86
+ if (isDefaultFields) {
87
+ newParams.delete("fields");
88
+ } else {
89
+ newParams.set("fields", normalizedFields.join(","));
90
+ }
91
+ }
92
+ if (newFilters.searchQuery !== void 0) {
93
+ if (newFilters.searchQuery) {
94
+ newParams.set("search", newFilters.searchQuery);
95
+ } else {
96
+ newParams.delete("search");
97
+ }
98
+ }
99
+ if (newFilters.sortOrder !== void 0) {
100
+ if (newFilters.sortOrder === "asc") {
101
+ newParams.delete("sort");
102
+ } else {
103
+ newParams.set("sort", newFilters.sortOrder);
104
+ }
105
+ }
106
+ if (newFilters.isLive !== void 0) {
107
+ if (newFilters.isLive) {
108
+ newParams.set("live", "true");
109
+ } else {
110
+ newParams.delete("live");
111
+ }
112
+ }
113
+ if (newFilters.components !== void 0) {
114
+ if (newFilters.components.length > 0) {
115
+ newParams.set("components", newFilters.components.join(","));
116
+ } else {
117
+ newParams.delete("components");
118
+ }
119
+ }
120
+ setSearchParams(newParams, { replace: true });
121
+ },
122
+ [searchParams, setSearchParams]
123
+ );
124
+ const resetFilters = useCallback(() => {
125
+ const newParams = new URLSearchParams();
126
+ if (environments.length > 0) {
127
+ newParams.set("env", environments[0].name);
128
+ }
129
+ setSearchParams(newParams, { replace: true });
130
+ }, [environments, setSearchParams]);
131
+ return { filters, updateFilters, resetFilters };
132
+ }
133
+
134
+ export { useUrlFiltersForRuntimeLogs };
135
+ //# sourceMappingURL=useUrlFiltersForRuntimeLogs.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUrlFiltersForRuntimeLogs.esm.js","sources":["../../src/hooks/useUrlFiltersForRuntimeLogs.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n RuntimeLogsFilters,\n LogEntryField,\n LOG_LEVELS,\n SELECTED_FIELDS,\n} from '../components/RuntimeLogs/types';\nimport type { Environment } from '../types';\nimport { useAutoSelectFirstEnvironment } from './useAutoSelectFirstEnvironment';\nimport { parseUrlTimeRange, writeUrlTimeRange } from '../utils/urlTimeRange';\n\ninterface UseUrlFiltersForRuntimeLogsOptions {\n /** Available environments to map envName from URL */\n environments: Environment[];\n}\n\n/**\n * Hook for managing runtime logs filters synced to URL query parameters.\n *\n * Query parameters:\n * - `env`: Environment name (auto-selected if not present or invalid)\n * - `timeRange`: Time range value (defaults to '10m')\n * - `logLevel`: Comma-separated log levels (empty value means none selected)\n *\n * @example\n * ```tsx\n * const { filters, updateFilters, resetFilters } = useUrlFiltersForRuntimeLogs({\n * environments,\n * });\n * ```\n */\nexport function useUrlFiltersForRuntimeLogs({\n environments,\n}: UseUrlFiltersForRuntimeLogsOptions) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Parse filters from URL\n const filters = useMemo<RuntimeLogsFilters>(() => {\n const envName = searchParams.get('env');\n const { timeRange, customStartTime, customEndTime } =\n parseUrlTimeRange(searchParams);\n const logLevelParam = searchParams.get('logLevel');\n const logLevel =\n logLevelParam === null\n ? [...LOG_LEVELS]\n : LOG_LEVELS.filter(level =>\n new Set(\n logLevelParam\n .split(',')\n .map(v => v.trim())\n .filter(Boolean),\n ).has(level),\n );\n const searchQuery = searchParams.get('search') || undefined;\n const rawSortOrder = searchParams.get('sort');\n const sortOrder: 'asc' | 'desc' =\n rawSortOrder === 'asc' || rawSortOrder === 'desc' ? rawSortOrder : 'asc';\n\n const isLive = searchParams.get('live') === 'true';\n const componentsParam = searchParams.get('components');\n const components = componentsParam\n ? componentsParam\n .split(',')\n .map(v => v.trim())\n .filter(Boolean)\n : [];\n\n // Parse selectedFields from URL\n const fieldsParam = searchParams.get('fields');\n let selectedFields: LogEntryField[];\n if (fieldsParam) {\n selectedFields = fieldsParam\n .split(',')\n .filter(f => Object.values(LogEntryField).includes(f as LogEntryField))\n .map(f => f as LogEntryField);\n // Ensure Log field is always included\n if (!selectedFields.includes(LogEntryField.Log)) {\n selectedFields.push(LogEntryField.Log);\n }\n // Sort by the order of the SELECTED_FIELDS array to maintain consistent column order\n selectedFields = SELECTED_FIELDS.filter(field =>\n selectedFields.includes(field),\n );\n } else {\n // Default to all fields\n selectedFields = [...SELECTED_FIELDS];\n }\n\n const environment = envName\n ? environments.find(e => e.name === envName)\n : undefined;\n\n return {\n environment: environment?.name || '',\n timeRange,\n customStartTime,\n customEndTime,\n logLevel,\n selectedFields,\n components,\n searchQuery,\n sortOrder,\n isLive: isLive || false,\n };\n }, [searchParams, environments]);\n\n // Auto-select first environment if none selected or URL has a stale env id\n useAutoSelectFirstEnvironment(environments, searchParams, setSearchParams);\n\n // Update URL when filters change\n const updateFilters = useCallback(\n (newFilters: Partial<RuntimeLogsFilters>) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newFilters.environment !== undefined) {\n if (newFilters.environment) {\n newParams.set('env', newFilters.environment);\n } else {\n newParams.delete('env');\n }\n }\n\n writeUrlTimeRange(newParams, newFilters);\n\n if (newFilters.logLevel !== undefined) {\n const isAllSelected =\n newFilters.logLevel.length === LOG_LEVELS.length &&\n LOG_LEVELS.every(l => newFilters.logLevel!.includes(l));\n if (isAllSelected) {\n // Default (all) - remove from URL\n newParams.delete('logLevel');\n } else if (newFilters.logLevel.length === 0) {\n // Explicitly represent none selected\n newParams.set('logLevel', '');\n } else {\n newParams.set('logLevel', newFilters.logLevel.join(','));\n }\n }\n\n if (newFilters.selectedFields !== undefined) {\n // Ensure Log field is always included\n let fields = newFilters.selectedFields;\n if (!fields.includes(LogEntryField.Log)) {\n fields = [...fields, LogEntryField.Log];\n }\n\n // Normalize order to match SELECTED_FIELDS\n const normalizedFields = SELECTED_FIELDS.filter(field =>\n fields.includes(field),\n );\n\n // Only store in URL if not the default (all fields selected)\n const isDefaultFields =\n normalizedFields.length === SELECTED_FIELDS.length &&\n normalizedFields.every(\n (field, index) => field === SELECTED_FIELDS[index],\n );\n\n if (isDefaultFields) {\n newParams.delete('fields');\n } else {\n newParams.set('fields', normalizedFields.join(','));\n }\n }\n\n if (newFilters.searchQuery !== undefined) {\n if (newFilters.searchQuery) {\n newParams.set('search', newFilters.searchQuery);\n } else {\n newParams.delete('search');\n }\n }\n\n if (newFilters.sortOrder !== undefined) {\n if (newFilters.sortOrder === 'asc') {\n // Default value - remove from URL\n newParams.delete('sort');\n } else {\n newParams.set('sort', newFilters.sortOrder);\n }\n }\n\n if (newFilters.isLive !== undefined) {\n if (newFilters.isLive) {\n newParams.set('live', 'true');\n } else {\n newParams.delete('live');\n }\n }\n\n if (newFilters.components !== undefined) {\n if (newFilters.components.length > 0) {\n newParams.set('components', newFilters.components.join(','));\n } else {\n newParams.delete('components');\n }\n }\n\n setSearchParams(newParams, { replace: true });\n },\n [searchParams, setSearchParams],\n );\n\n // Reset filters to defaults\n const resetFilters = useCallback(() => {\n const newParams = new URLSearchParams();\n if (environments.length > 0) {\n newParams.set('env', environments[0].name);\n }\n setSearchParams(newParams, { replace: true });\n }, [environments, setSearchParams]);\n\n return { filters, updateFilters, resetFilters };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { ReactNode } from 'react';
2
+ import { ComponentLogEntry } from '@openchoreo/backstage-plugin-common';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
5
+
6
+ /**
7
+ * A single component log entry as returned by POST /api/v1/logs/query.
8
+ * Fields come from the ComponentLogEntry schema (new unified API).
9
+ */
10
+ type LogEntry = ComponentLogEntry;
11
+
12
+ /**
13
+ * Render-prop slot for a per-row action button (assistant integration,
14
+ * "open in external tool", etc.). The host app supplies this from
15
+ * outside the plugin so observability stays free of cross-plugin
16
+ * coupling. When omitted, no action button is rendered.
17
+ */
18
+ type RenderLogRowAction = (log: LogEntry, getLogsSnapshot?: () => LogEntry[]) => ReactNode;
19
+
20
+ interface ObservabilityProjectRuntimeLogsPageProps {
21
+ renderRowAction?: RenderLogRowAction;
22
+ }
23
+
24
+ interface ObservabilityRuntimeLogsPageProps {
25
+ renderRowAction?: RenderLogRowAction;
26
+ }
27
+
28
+ declare const openchoreoObservabilityPlugin: _backstage_core_plugin_api.BackstagePlugin<{
29
+ root: _backstage_core_plugin_api.RouteRef<undefined>;
30
+ }, {}, {}>;
31
+ declare const ObservabilityMetrics: () => react_jsx_runtime.JSX.Element;
32
+ declare const ObservabilityTraces: () => react_jsx_runtime.JSX.Element;
33
+ declare const ObservabilityRCA: () => react_jsx_runtime.JSX.Element;
34
+ declare const ObservabilityRuntimeLogs: ({ renderRowAction, }: ObservabilityRuntimeLogsPageProps) => react_jsx_runtime.JSX.Element;
35
+ declare const ObservabilityProjectRuntimeLogs: ({ renderRowAction, }: ObservabilityProjectRuntimeLogsPageProps) => react_jsx_runtime.JSX.Element;
36
+ declare const ObservabilityAlerts: () => react_jsx_runtime.JSX.Element;
37
+ declare const ObservabilityProjectIncidents: () => react_jsx_runtime.JSX.Element;
38
+ declare const ObservabilityCostAnalysis: () => react_jsx_runtime.JSX.Element;
39
+
40
+ export { ObservabilityAlerts, ObservabilityCostAnalysis, ObservabilityMetrics, ObservabilityProjectIncidents, ObservabilityProjectRuntimeLogs, ObservabilityRCA, ObservabilityRuntimeLogs, ObservabilityTraces, openchoreoObservabilityPlugin };
41
+ export type { RenderLogRowAction };
@@ -0,0 +1,2 @@
1
+ export { ObservabilityAlerts, ObservabilityCostAnalysis, ObservabilityMetrics, ObservabilityProjectIncidents, ObservabilityProjectRuntimeLogs, ObservabilityRCA, ObservabilityRuntimeLogs, ObservabilityTraces, openchoreoObservabilityPlugin } from './plugin.esm.js';
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}