@openchoreo/backstage-plugin-openchoreo-observability 1.2.0-m.1 → 1.2.0-rc.2

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 (140) hide show
  1. package/CHANGELOG.md +225 -0
  2. package/dist/alpha/LogRowActionBlueprint.esm.js +22 -0
  3. package/dist/alpha/LogRowActionBlueprint.esm.js.map +1 -0
  4. package/dist/alpha.d.ts +522 -0
  5. package/dist/alpha.esm.js +182 -0
  6. package/dist/alpha.esm.js.map +1 -0
  7. package/dist/api/LogRowActionRendererApi.esm.js +20 -0
  8. package/dist/api/LogRowActionRendererApi.esm.js.map +1 -0
  9. package/dist/api/ObservabilityApi.esm.js +1 -0
  10. package/dist/api/ObservabilityApi.esm.js.map +1 -1
  11. package/dist/components/Alerts/AlertsTable.esm.js +2 -9
  12. package/dist/components/Alerts/AlertsTable.esm.js.map +1 -1
  13. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js +20 -10
  14. package/dist/components/Alerts/ObservabilityAlertsPage.esm.js.map +1 -1
  15. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js +18 -5
  16. package/dist/components/CostAnalysis/CostAnalysisPage.esm.js.map +1 -1
  17. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js +21 -16
  18. package/dist/components/CostAnalysis/CostAnalysisReport.esm.js.map +1 -1
  19. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js +13 -4
  20. package/dist/components/CostAnalysis/CostAnalysisTable.esm.js.map +1 -1
  21. package/dist/components/Incidents/IncidentsFilter.esm.js +1 -1
  22. package/dist/components/Incidents/IncidentsFilter.esm.js.map +1 -1
  23. package/dist/components/Incidents/IncidentsTable.esm.js +2 -10
  24. package/dist/components/Incidents/IncidentsTable.esm.js.map +1 -1
  25. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js +20 -11
  26. package/dist/components/Incidents/ObservabilityProjectIncidentsPage.esm.js.map +1 -1
  27. package/dist/components/Metrics/HTTPMetricsSection.esm.js +8 -26
  28. package/dist/components/Metrics/HTTPMetricsSection.esm.js.map +1 -1
  29. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js +26 -20
  30. package/dist/components/Metrics/ObservabilityMetricsPage.esm.js.map +1 -1
  31. package/dist/components/RCA/RCAPage.esm.js +17 -6
  32. package/dist/components/RCA/RCAPage.esm.js.map +1 -1
  33. package/dist/components/RCA/RCAReport/RCAReportView.esm.js +29 -41
  34. package/dist/components/RCA/RCAReport/RCAReportView.esm.js.map +1 -1
  35. package/dist/components/RCA/RCAReport/sections/RCAChatDrawer.esm.js +416 -0
  36. package/dist/components/RCA/RCAReport/sections/RCAChatDrawer.esm.js.map +1 -0
  37. package/dist/components/RCA/RCAReport.esm.js +19 -14
  38. package/dist/components/RCA/RCAReport.esm.js.map +1 -1
  39. package/dist/components/RCA/RCATable.esm.js +13 -4
  40. package/dist/components/RCA/RCATable.esm.js.map +1 -1
  41. package/dist/components/RuntimeEvents/EventEntry.esm.js +92 -66
  42. package/dist/components/RuntimeEvents/EventEntry.esm.js.map +1 -1
  43. package/dist/components/RuntimeEvents/EventsTable.esm.js +89 -72
  44. package/dist/components/RuntimeEvents/EventsTable.esm.js.map +1 -1
  45. package/dist/components/RuntimeEvents/ObservabilityRuntimeEventsPage.esm.js +44 -22
  46. package/dist/components/RuntimeEvents/ObservabilityRuntimeEventsPage.esm.js.map +1 -1
  47. package/dist/components/RuntimeEvents/columns.esm.js +12 -0
  48. package/dist/components/RuntimeEvents/columns.esm.js.map +1 -0
  49. package/dist/components/RuntimeEvents/styles.esm.js +38 -18
  50. package/dist/components/RuntimeEvents/styles.esm.js.map +1 -1
  51. package/dist/components/RuntimeLogs/LogEntry.esm.js +87 -69
  52. package/dist/components/RuntimeLogs/LogEntry.esm.js.map +1 -1
  53. package/dist/components/RuntimeLogs/LogsFilter.esm.js +1 -1
  54. package/dist/components/RuntimeLogs/LogsFilter.esm.js.map +1 -1
  55. package/dist/components/RuntimeLogs/LogsTable.esm.js +91 -76
  56. package/dist/components/RuntimeLogs/LogsTable.esm.js.map +1 -1
  57. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js +45 -27
  58. package/dist/components/RuntimeLogs/ObservabilityProjectRuntimeLogsPage.esm.js.map +1 -1
  59. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js +51 -33
  60. package/dist/components/RuntimeLogs/ObservabilityRuntimeLogsPage.esm.js.map +1 -1
  61. package/dist/components/RuntimeLogs/columns.esm.js +11 -0
  62. package/dist/components/RuntimeLogs/columns.esm.js.map +1 -0
  63. package/dist/components/RuntimeLogs/styles.esm.js +60 -4
  64. package/dist/components/RuntimeLogs/styles.esm.js.map +1 -1
  65. package/dist/components/Traces/ObservabilityTracesPage.esm.js +21 -8
  66. package/dist/components/Traces/ObservabilityTracesPage.esm.js.map +1 -1
  67. package/dist/components/Traces/TracesFilters.esm.js +1 -1
  68. package/dist/components/Traces/TracesFilters.esm.js.map +1 -1
  69. package/dist/components/Traces/TracesTable.esm.js +128 -88
  70. package/dist/components/Traces/TracesTable.esm.js.map +1 -1
  71. package/dist/components/Traces/WaterfallView.esm.js +14 -44
  72. package/dist/components/Traces/WaterfallView.esm.js.map +1 -1
  73. package/dist/components/Traces/columns.esm.js +13 -0
  74. package/dist/components/Traces/columns.esm.js.map +1 -0
  75. package/dist/components/Traces/styles.esm.js +43 -35
  76. package/dist/components/Traces/styles.esm.js.map +1 -1
  77. package/dist/components/Traces/utils.esm.js +7 -1
  78. package/dist/components/Traces/utils.esm.js.map +1 -1
  79. package/dist/components/Wirelogs/ObservabilityWirelogsPage.esm.js +42 -8
  80. package/dist/components/Wirelogs/ObservabilityWirelogsPage.esm.js.map +1 -1
  81. package/dist/components/Wirelogs/WirelogsStreamTimeoutDialog.esm.js +86 -0
  82. package/dist/components/Wirelogs/WirelogsStreamTimeoutDialog.esm.js.map +1 -0
  83. package/dist/components/Wirelogs/WirelogsTable.esm.js +98 -70
  84. package/dist/components/Wirelogs/WirelogsTable.esm.js.map +1 -1
  85. package/dist/components/Wirelogs/columns.esm.js +13 -0
  86. package/dist/components/Wirelogs/columns.esm.js.map +1 -0
  87. package/dist/components/Wirelogs/styles.esm.js +34 -22
  88. package/dist/components/Wirelogs/styles.esm.js.map +1 -1
  89. package/dist/components/Wirelogs/useWirelogsStream.esm.js +46 -9
  90. package/dist/components/Wirelogs/useWirelogsStream.esm.js.map +1 -1
  91. package/dist/components/common/EnvironmentsStatusNotice.esm.js +42 -0
  92. package/dist/components/common/EnvironmentsStatusNotice.esm.js.map +1 -0
  93. package/dist/hooks/useComponentAlerts.esm.js +40 -60
  94. package/dist/hooks/useComponentAlerts.esm.js.map +1 -1
  95. package/dist/hooks/useComponentHasAnyCiliumEnabledEnvironment.esm.js +11 -0
  96. package/dist/hooks/useComponentHasAnyCiliumEnabledEnvironment.esm.js.map +1 -0
  97. package/dist/hooks/useDataPlaneNetPolProvider.esm.js +31 -42
  98. package/dist/hooks/useDataPlaneNetPolProvider.esm.js.map +1 -1
  99. package/dist/hooks/useFinOpsReport.esm.js +16 -47
  100. package/dist/hooks/useFinOpsReport.esm.js.map +1 -1
  101. package/dist/hooks/useFinOpsReports.esm.js +21 -43
  102. package/dist/hooks/useFinOpsReports.esm.js.map +1 -1
  103. package/dist/hooks/useGetComponentsByProject.esm.js +32 -45
  104. package/dist/hooks/useGetComponentsByProject.esm.js.map +1 -1
  105. package/dist/hooks/useMetrics.esm.js +35 -55
  106. package/dist/hooks/useMetrics.esm.js.map +1 -1
  107. package/dist/hooks/useProjectIncidents.esm.js +58 -86
  108. package/dist/hooks/useProjectIncidents.esm.js.map +1 -1
  109. package/dist/hooks/useProjectRuntimeLogs.esm.js +104 -154
  110. package/dist/hooks/useProjectRuntimeLogs.esm.js.map +1 -1
  111. package/dist/hooks/useRCAReport.esm.js +26 -0
  112. package/dist/hooks/useRCAReport.esm.js.map +1 -0
  113. package/dist/hooks/useRCAReports.esm.js +23 -45
  114. package/dist/hooks/useRCAReports.esm.js.map +1 -1
  115. package/dist/hooks/useRuntimeEvents.esm.js +56 -123
  116. package/dist/hooks/useRuntimeEvents.esm.js.map +1 -1
  117. package/dist/hooks/useRuntimeLogs.esm.js +68 -125
  118. package/dist/hooks/useRuntimeLogs.esm.js.map +1 -1
  119. package/dist/hooks/useSpanDetails.esm.js +26 -13
  120. package/dist/hooks/useSpanDetails.esm.js.map +1 -1
  121. package/dist/hooks/useTraceSpans.esm.js +30 -24
  122. package/dist/hooks/useTraceSpans.esm.js.map +1 -1
  123. package/dist/hooks/useTraces.esm.js +31 -62
  124. package/dist/hooks/useTraces.esm.js.map +1 -1
  125. package/dist/hooks/useUpdateIncident.esm.js +21 -31
  126. package/dist/hooks/useUpdateIncident.esm.js.map +1 -1
  127. package/dist/hooks/useWirelogsEnvironments.esm.js +69 -72
  128. package/dist/hooks/useWirelogsEnvironments.esm.js.map +1 -1
  129. package/dist/index.d.ts +37 -28
  130. package/dist/index.esm.js +12 -0
  131. package/dist/index.esm.js.map +1 -1
  132. package/dist/plugin.esm.js +40 -75
  133. package/dist/plugin.esm.js.map +1 -1
  134. package/dist/types/LogRowActionRendererApi.d-Bo-O9vHp.d.ts +39 -0
  135. package/dist/types.esm.js.map +1 -1
  136. package/package.json +38 -14
  137. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js +0 -272
  138. package/dist/components/RCA/RCAReport/sections/ChatPanelSection.esm.js.map +0 -1
  139. package/dist/hooks/useRCAReportByAlert.esm.js +0 -54
  140. package/dist/hooks/useRCAReportByAlert.esm.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,230 @@
1
1
  # @openchoreo/backstage-plugin-openchoreo-observability
2
2
 
3
+ ## 1.2.0-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 56b4e95: Adapt the tracing views to the OpenTelemetry span status model. The
8
+ observability API now returns a span's `status` as a `SpanStatus` object
9
+ (`code` of `ok`/`error`/`unset` plus an optional `message`) instead of a plain
10
+ status string. The waterfall tooltip now shows the span's status code, the span
11
+ details panel gains a dedicated Status section (alongside Attributes and Resource
12
+ Attributes) that surfaces the status message, and error spans stay highlighted
13
+ based on the status code. This also prevents the span tooltip from crashing when
14
+ the status is an object.
15
+ - 56b4e95: Fix the error stripe not rendering on error rows in the traces table. The red
16
+ "contains errors" indicator was drawn by CSS targeting table cells (`td`/`th`)
17
+ that no longer exist after the table moved to a div-based virtualized layout,
18
+ and the span that did render (the tooltip's hover target) had no fill colour.
19
+ The stripe is now drawn on the rendered element, so error traces show the red
20
+ stripe again.
21
+ - Updated dependencies [b52e578]
22
+ - Updated dependencies [4d7ebff]
23
+ - @openchoreo/backstage-plugin-react@1.2.0-next.2
24
+ - @openchoreo/backstage-plugin-common@1.2.0-next.2
25
+
26
+ ## 1.2.0-next.3
27
+
28
+ ### Minor Changes
29
+
30
+ - af359bd: Add the `useComponentHasAnyCiliumEnabledEnvironment` hook, which resolves on the client whether any of a component's project environments runs Cilium — it fetches the project's environments and probes each backing DataPlane's `networkpolicyprovider` (the same source the Wirelogs page uses to enable/disable individual environments). It returns `false` until the probe confirms at least one Cilium environment.
31
+
32
+ The portal uses this to hide the component-level **Wirelogs** tab unless at least one environment runs Cilium (wirelogs are sourced from Cilium Hubble). Previously the tab was always shown and, on a core OpenChoreo setup with no Cilium DataPlanes, rendered an empty "configure Cilium" state — a dead tab with no usable content. Resolving availability at render time means no catalog-sync annotation or DataPlane event cascade is required.
33
+
34
+ ### Patch Changes
35
+
36
+ - 591df85: Show a subtle background-refresh indicator on cached views instead of swapping
37
+ data in silently.
38
+
39
+ Adds a shared `RefreshOverlay` primitive to the design system — a small
40
+ top-right spinner (or thin top bar) that overlays a positioned container while a
41
+ background revalidation runs, without shifting or blanking the cached content.
42
+ `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`;
43
+ the data hooks across the portal now thread it through, and the home dashboard,
44
+ plane cards, access-control, secrets, project, environment, workflow and
45
+ observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained
46
+ a `refreshing` prop so the home summary widgets get it for free.
47
+
48
+ - 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend
49
+ System migrations — commented-out blocks, orphaned files/components, and unused
50
+ deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`,
51
+ `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of
52
+ duplicated backend response-type wrappers. No behavioural changes.
53
+ - 7da3c7d: Convert the RCA chat to a right drawer where previously it was inbuild to the page
54
+ - 4dd5d2a: Rename RCA agent chat to Portal Assistant
55
+ - e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-<name>/alpha'` and include the plugin directly in `createApp({ features: [...] })`.
56
+
57
+ The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab).
58
+
59
+ Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper.
60
+
61
+ Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins.
62
+
63
+ Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host.
64
+
65
+ - d5eff9e: Replace the generic "No environments found. Make sure your component is properly configured." message on the observability pages (Runtime Logs, Runtime Events, Alerts, Wirelogs, Metrics, Traces, Incidents, Cost Analysis, RCA — component and project scoped) with cause-specific messaging. `useProjectEnvironments` now reports a discriminated status — `empty-pipeline` (the deployment pipeline has no environments), `forbidden` (permission to view the pipeline is denied), or `unavailable` (the pipeline is missing or couldn't be loaded) — and the pages render a cause-specific state via a shared `EnvironmentsStatusNotice` component, using the standard Backstage `EmptyState` (matching the Deploy tab). A missing `deploymentPipelineRef` now returns a clean 404 instead of a 500.
66
+ - 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and
67
+ migrate the portal's data-fetching hooks onto it, so cached data paints
68
+ instantly on remount and a background refresh no longer blanks the view.
69
+
70
+ New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so
71
+ plugins never import it directly:
72
+
73
+ - `useOpenChoreoQuery` — cached reads, returning the
74
+ `{ data, loading, isRefetching, error, refetch }` shape the loaders consume.
75
+ - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached
76
+ queries on success (replacing the hand-rolled "call verb then refetch").
77
+ - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists
78
+ (runtime logs/events).
79
+ - `useOpenChoreoCache` — imperative cache access for optimistic writes and the
80
+ lazy, dynamically-keyed hooks.
81
+
82
+ Migrated across the openchoreo, observability, CI and workflows plugins: simple
83
+ and parameterized reads, read+mutation hooks, `setInterval` pollers (now
84
+ `refetchInterval` with terminal stop conditions), lazy/conditional and
85
+ keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync`
86
+ sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`.
87
+ The provider is mounted in the app root and the cache is cleared on sign-out.
88
+
89
+ The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller
90
+ actually sets them — passing an explicit `undefined` overrides the QueryClient
91
+ default instead of inheriting it, which resolved `staleTime` to 0 and refetched
92
+ on every remount, silently defeating the shared 30s cache.
93
+
94
+ The cell-diagram and wirelogs environment hooks no longer fold `isRefetching`
95
+ into `loading`; a background refresh kept re-showing their full skeleton (the
96
+ "blank on refresh" the cache was meant to remove). They now report `loading`
97
+ for the first load only and expose `isRefetching` separately.
98
+
99
+ - 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each
100
+ OpenChoreo plugin now wraps its own extensions in a TanStack Query
101
+ `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient`
102
+ singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts
103
+ the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone
104
+ plugin pages) gets response caching with no provider wiring — previously those
105
+ surfaces would crash with "No QueryClient set" when a cached tab rendered.
106
+
107
+ Scope: this covers surfaces rendered through a plugin's own extension boundary
108
+ (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead
109
+ composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX
110
+ renders them outside the plugin wrapper, so that host still mounts its own
111
+ provider — `OpenChoreoQueryProvider` (also exported here) bundles the
112
+ `QueryClientProvider` and the user-scoping context for that case.
113
+
114
+ Cross-user isolation is structural: every cache key is namespaced by the
115
+ signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`,
116
+ `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so
117
+ a different user occupies a disjoint key space and can never read the previous
118
+ user's permission-scoped responses from the cache — no cache-clearing needed.
119
+ Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache.
120
+
121
+ - d89f030: Fix trace span details never loading from cache. The span cache key included
122
+ the filter scope and time window, whose timestamps changed every render, so the
123
+ key used to read spans (`getSpans`) no longer matched the one they were cached
124
+ under and always returned `undefined`. Spans are now keyed by trace id alone —
125
+ a trace id uniquely identifies its spans regardless of the query scope.
126
+ - c572a46: Unify portal loading states behind a shared, token-driven system so every
127
+ loader looks and behaves consistently.
128
+
129
+ **New shared components**
130
+
131
+ - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle`
132
+ with a `count` for stacked lines, backed by new `motion` timing tokens),
133
+ `Spinner` (theme-coloured circular loader with named sizes
134
+ `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for
135
+ page/route/section loads).
136
+ - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content
137
+ wrapper that keeps content on screen and overlays a spinner during a
138
+ background refetch instead of blanking) and `SkeletonRows` (table-body
139
+ skeleton helper).
140
+
141
+ **Consistency changes**
142
+
143
+ - Tables now show skeleton rows instead of a circular overlay (catalog,
144
+ Project Contents, namespace cards, observability RCA/Cost Analysis, and the
145
+ raw-MUI alert/incident/log tables).
146
+ - Overview cards and widgets render skeleton placeholders via the shared
147
+ `Skeleton` (including the home-page platform-planes section).
148
+ - Page-level loaders use the centered `PageLoader` instead of the Backstage
149
+ progress bar — including Backstage's internal route/Suspense fallback and the
150
+ app-boot loader.
151
+ - Status chips use the themed `Spinner` (removing a hardcoded spinner colour).
152
+ - The shared `ErrorState` icon is sized down to read proportionately in
153
+ section-level errors.
154
+
155
+ Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI
156
+ `Skeleton`/`CircularProgress`/`Progress` for new loading states.
157
+
158
+ - 5741d00: Limit how long a wirelogs stream can run. Wirelogs (Cilium Hubble flows) previously streamed indefinitely — there's no upstream timeout, so a forgotten tab could hold an open SSE connection for hours and degrade the browser.
159
+
160
+ The backend `/wirelogs/stream` proxy now enforces a hard cap (default 15 minutes, configurable via `openchoreo.observability.wirelogs.streamTimeoutSeconds`): it advertises the cap to the client in a `meta` SSE frame and, on hitting it, sends a `timeout` frame before closing so the UI can label the stop precisely. The wirelogs view layers graduated soft warnings over this — confirmation dialogs at roughly one-third and two-thirds of the cap let the user stop early or knowingly continue, and a toast explains when the server ends the stream (the Start button resumes a fresh session).
161
+
162
+ - Updated dependencies [591df85]
163
+ - Updated dependencies [c86de7f]
164
+ - Updated dependencies [18e51cf]
165
+ - Updated dependencies [62608f5]
166
+ - Updated dependencies [cf2203a]
167
+ - Updated dependencies [8381554]
168
+ - Updated dependencies [39d264c]
169
+ - Updated dependencies [0d2433f]
170
+ - Updated dependencies [8381554]
171
+ - Updated dependencies [e3986a9]
172
+ - Updated dependencies [383e7f6]
173
+ - Updated dependencies [d5eff9e]
174
+ - Updated dependencies [8416223]
175
+ - Updated dependencies [71f7b6c]
176
+ - Updated dependencies [2f45e83]
177
+ - Updated dependencies [14601f4]
178
+ - Updated dependencies [591df85]
179
+ - Updated dependencies [915e2e5]
180
+ - Updated dependencies [284fcd7]
181
+ - Updated dependencies [453b958]
182
+ - Updated dependencies [c572a46]
183
+ - @openchoreo/backstage-design-system@1.2.0-next.3
184
+ - @openchoreo/backstage-plugin-react@1.2.0-next.3
185
+ - @openchoreo/backstage-plugin-common@1.2.0-next.3
186
+
187
+ ## 1.2.0-next.2
188
+
189
+ ### Patch Changes
190
+
191
+ - d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive.
192
+
193
+ **New shared primitive (`@openchoreo/backstage-plugin-react`)**
194
+
195
+ `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells.
196
+
197
+ Alongside the primitive, three small hooks/utilities the consumers compose with:
198
+
199
+ - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows.
200
+ - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses.
201
+ - `makeColumnStyle<K>(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references.
202
+
203
+ **Surfaces virtualized**
204
+
205
+ - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling.
206
+ - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running.
207
+ - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner.
208
+ - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll).
209
+ - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking.
210
+ - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle.
211
+
212
+ **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)**
213
+
214
+ `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step.
215
+
216
+ **Notable behavioural notes**
217
+
218
+ - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size.
219
+ - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1).
220
+ - Per-row expanded state survives scrolling off-screen and back.
221
+ - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up.
222
+ - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger.
223
+
224
+ - Updated dependencies [d19ffcf]
225
+ - @openchoreo/backstage-plugin-react@1.2.0-next.2
226
+ - @openchoreo/backstage-plugin-common@1.2.0-next.2
227
+
3
228
  ## 1.2.0-next.0
4
229
 
5
230
  ### Minor Changes
@@ -0,0 +1,22 @@
1
+ import { createExtensionDataRef, createExtensionBlueprint } from '@backstage/frontend-plugin-api';
2
+
3
+ const logRowActionRendererExtensionDataRef = createExtensionDataRef().with({
4
+ id: "openchoreo-observability.log-row-action-renderer"
5
+ });
6
+ const LogRowActionBlueprint = createExtensionBlueprint({
7
+ kind: "log-row-action-renderer",
8
+ attachTo: {
9
+ id: "api:openchoreo-observability/log-row-action-renderer",
10
+ input: "renderers"
11
+ },
12
+ dataRefs: {
13
+ renderer: logRowActionRendererExtensionDataRef
14
+ },
15
+ output: [logRowActionRendererExtensionDataRef],
16
+ *factory(params) {
17
+ yield logRowActionRendererExtensionDataRef(params.renderer);
18
+ }
19
+ });
20
+
21
+ export { LogRowActionBlueprint };
22
+ //# sourceMappingURL=LogRowActionBlueprint.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogRowActionBlueprint.esm.js","sources":["../../src/alpha/LogRowActionBlueprint.ts"],"sourcesContent":["import {\n createExtensionBlueprint,\n createExtensionDataRef,\n} from '@backstage/frontend-plugin-api';\nimport type { RenderLogRowAction } from '../components/RuntimeLogs/LogEntry';\n\nconst logRowActionRendererExtensionDataRef =\n createExtensionDataRef<RenderLogRowAction>().with({\n id: 'openchoreo-observability.log-row-action-renderer',\n });\n\n/**\n * NFS extension blueprint that hosts use to contribute a per-row action\n * renderer to the observability runtime-logs tables.\n *\n * Mirrors upstream's `FormDecoratorBlueprint` pattern. Each blueprint\n * extension `attachTo`s the `renderers` input of\n * `api:openchoreo-observability/log-row-action-renderer`; the API's\n * factory then collects them into a single renderer that the logs\n * tables consume via `useApi(logRowActionRendererApiRef)`.\n */\nexport const LogRowActionBlueprint = createExtensionBlueprint({\n kind: 'log-row-action-renderer',\n attachTo: {\n id: 'api:openchoreo-observability/log-row-action-renderer',\n input: 'renderers',\n },\n dataRefs: {\n renderer: logRowActionRendererExtensionDataRef,\n },\n output: [logRowActionRendererExtensionDataRef],\n *factory(params: { renderer: RenderLogRowAction }) {\n yield logRowActionRendererExtensionDataRef(params.renderer);\n },\n});\n"],"names":[],"mappings":";;AAMA,MAAM,oCAAA,GACJ,sBAAA,EAA2C,CAAE,IAAA,CAAK;AAAA,EAChD,EAAA,EAAI;AACN,CAAC,CAAA;AAYI,MAAM,wBAAwB,wBAAA,CAAyB;AAAA,EAC5D,IAAA,EAAM,yBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,sDAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ,CAAC,oCAAoC,CAAA;AAAA,EAC7C,CAAC,QAAQ,MAAA,EAA0C;AACjD,IAAA,MAAM,oCAAA,CAAqC,OAAO,QAAQ,CAAA;AAAA,EAC5D;AACF,CAAC;;;;"}