@skyhook-io/k8s-ui 1.17.1 → 1.18.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 (55) hide show
  1. package/package.json +4 -4
  2. package/src/components/gitops/GitOpsGraphFilterRail.tsx +2 -2
  3. package/src/components/gitops/insights/ArgoResourceDiff.test.tsx +27 -0
  4. package/src/components/gitops/insights/GitOpsInsightViews.tsx +16 -10
  5. package/src/components/gitops/insights/insights-helpers.test.ts +18 -0
  6. package/src/components/gitops/insights/insights-helpers.ts +7 -0
  7. package/src/components/gitops/tree/GitOpsTreeGraph.test.ts +73 -9
  8. package/src/components/gitops/tree/GitOpsTreeGraph.tsx +45 -28
  9. package/src/components/gitops/tree/tree-helpers.test.ts +6 -0
  10. package/src/components/gitops/tree/tree-helpers.ts +5 -1
  11. package/src/components/issues/IssuesView.tsx +4 -1
  12. package/src/components/issues/ResourceIssuesSection.tsx +5 -2
  13. package/src/components/issues/diagnostic.ts +2 -0
  14. package/src/components/issues/index.ts +1 -1
  15. package/src/components/issues/issues.test.ts +26 -0
  16. package/src/components/issues/severity.ts +9 -2
  17. package/src/components/issues/types.ts +32 -4
  18. package/src/components/logs/LogCore.theme.test.tsx +126 -1
  19. package/src/components/logs/LogCore.tsx +159 -40
  20. package/src/components/logs/LogsViewer.test.tsx +80 -2
  21. package/src/components/logs/LogsViewer.tsx +21 -4
  22. package/src/components/logs/StructuredLogLine.tsx +1 -1
  23. package/src/components/logs/WorkloadLogsViewer.tsx +7 -1
  24. package/src/components/logs/useLogBuffer.reading.test.tsx +149 -0
  25. package/src/components/logs/useLogBuffer.ts +48 -18
  26. package/src/components/logs/useLogSearch.ts +3 -1
  27. package/src/components/resources/ColumnPickerList.test.tsx +46 -0
  28. package/src/components/resources/ColumnPickerList.tsx +174 -0
  29. package/src/components/resources/ResourcesView.kind-view.test.tsx +149 -2
  30. package/src/components/resources/ResourcesView.tsx +93 -75
  31. package/src/components/resources/column-order.test.ts +104 -0
  32. package/src/components/resources/column-order.ts +64 -0
  33. package/src/components/resources/renderers/ArgoApplicationRenderer.test.tsx +15 -0
  34. package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +4 -1
  35. package/src/components/resources/renderers/CronJobRenderer.test.tsx +31 -0
  36. package/src/components/resources/renderers/CronJobRenderer.tsx +28 -20
  37. package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +22 -9
  38. package/src/components/resources/renderers/PodRenderer.sidecar-terminal.test.tsx +200 -0
  39. package/src/components/resources/renderers/PodRenderer.tsx +40 -11
  40. package/src/components/resources/resource-utils.ts +15 -2
  41. package/src/components/resources/summarize-scheduler-message.test.ts +1 -0
  42. package/src/components/shared/DrainPlanDialog.test.tsx +7 -0
  43. package/src/components/shared/DrainPlanDialog.tsx +6 -2
  44. package/src/components/shared/ResourceActionsBar.tsx +3 -3
  45. package/src/components/shared/ResourceRendererDispatch.tsx +3 -1
  46. package/src/components/timeline/DiffViewer.test.tsx +69 -0
  47. package/src/components/timeline/DiffViewer.tsx +113 -4
  48. package/src/components/timeline/shared.test.tsx +48 -0
  49. package/src/components/timeline/shared.tsx +14 -19
  50. package/src/components/ui/Toast.tsx +15 -4
  51. package/src/components/ui/index.ts +1 -1
  52. package/src/components/workload/WorkloadView.tsx +14 -8
  53. package/src/types/core.ts +25 -1
  54. package/src/types/gitops-insights.ts +1 -0
  55. package/src/types/gitops-tree.ts +2 -0
@@ -353,6 +353,8 @@ interface WorkloadViewProps {
353
353
  namespace: string
354
354
  name: string
355
355
  resource: any
356
+ /** Place resource notices within the replacement layout's content area. */
357
+ leadContent?: ReactNode
356
358
  }) => ReactNode
357
359
  /** Render the metrics tab content */
358
360
  renderMetricsTab?: (props: { kind: string; namespace: string; name: string }) => ReactNode
@@ -398,6 +400,8 @@ interface WorkloadViewProps {
398
400
  * live issues for this resource). Avoids showing the same failure twice.
399
401
  * Also gates the `renderOverviewLead` wrapper (see above). */
400
402
  hasOperationalIssues?: boolean
403
+ /** Also show the lead for neutral context without suppressing renderer problems. */
404
+ hasOverviewLead?: boolean
401
405
  /** True while the live-issues fetch is still pending. Renderers suppress their
402
406
  * banners during this window too — a banner whose failure the pipeline covers
403
407
  * would otherwise flash on first paint before the issues arrive and hide it. */
@@ -518,6 +522,7 @@ export function WorkloadView({
518
522
  renderOverviewIntro,
519
523
  renderOverviewLead,
520
524
  hasOperationalIssues,
525
+ hasOverviewLead,
521
526
  operationalIssuesPending,
522
527
  // Actions bar
523
528
  actionsBarProps,
@@ -930,7 +935,12 @@ export function WorkloadView({
930
935
  useEffect(() => {
931
936
  if (shouldCommitFallback && activeTab !== 'overview') onTabChange?.('overview', { replace: true })
932
937
  }, [activeTab, onTabChange, shouldCommitFallback])
933
- const expandedOverview = expanded ? renderExpandedOverview?.({ kind, apiKind, namespace, name, resource }) : null
938
+ const expandedOverview = expanded ? renderExpandedOverview?.({
939
+ kind, apiKind, namespace, name, resource,
940
+ leadContent: (hasOverviewLead ?? hasOperationalIssues) && renderOverviewLeadForState
941
+ ? renderOverviewLeadForState({ kind, namespace, name })
942
+ : undefined,
943
+ }) : null
934
944
  const overviewIntro = renderOverviewIntro?.({ kind, namespace, name })
935
945
 
936
946
  // ── Collapsed (drawer) mode ──────────────────────────────────────────────
@@ -1090,11 +1100,12 @@ export function WorkloadView({
1090
1100
  drawerSummary
1091
1101
  ) : (
1092
1102
  <>
1093
- {renderOverviewLeadForState && hasOperationalIssues && (
1103
+ {renderOverviewLeadForState && (hasOverviewLead ?? hasOperationalIssues) && (
1094
1104
  <div className="px-4 pt-4">
1095
1105
  {renderOverviewLeadForState({ kind, namespace, name })}
1096
1106
  </div>
1097
1107
  )}
1108
+ {overviewIntro && <div className="px-4 pt-4">{overviewIntro}</div>}
1098
1109
  <ResourceRendererDispatch
1099
1110
  resource={selectedResource}
1100
1111
  data={resource}
@@ -1303,11 +1314,6 @@ export function WorkloadView({
1303
1314
  <div className="h-full min-h-0 overflow-y-auto">{expandedSummary}</div>
1304
1315
  ) : effectiveTab === 'overview' && expandedOverview ? (
1305
1316
  <div className="h-full min-h-0">
1306
- {hasOperationalIssues && renderOverviewLeadForState && (
1307
- <div className="px-4 pt-4">
1308
- {renderOverviewLeadForState({ kind, namespace, name })}
1309
- </div>
1310
- )}
1311
1317
  {expandedOverview}
1312
1318
  </div>
1313
1319
  ) : effectiveTab === 'spec' && specTab?.render && !resourceGone ? (
@@ -1350,7 +1356,7 @@ export function WorkloadView({
1350
1356
  // A host's spec lead replaces the operational issues there: its Overview already leads with them.
1351
1357
  effectiveTab === 'spec' && specTab?.lead
1352
1358
  ? specTab.lead
1353
- : hasOperationalIssues && renderOverviewLeadForState
1359
+ : (hasOverviewLead ?? hasOperationalIssues) && renderOverviewLeadForState
1354
1360
  ? renderOverviewLeadForState({ kind, namespace, name })
1355
1361
  : undefined
1356
1362
  }
package/src/types/core.ts CHANGED
@@ -126,6 +126,7 @@ export interface Capabilities {
126
126
  helmWrite: boolean // Helm write operations (install, upgrade, rollback, uninstall, apply values)
127
127
  nodeWrite: boolean // Node write operations (cordon, uncordon, drain)
128
128
  workloadWrites?: WorkloadWritePermissions // Workload patch permissions (restart/scale controls)
129
+ mcpReadOnly?: boolean // Full MCP endpoint is disabled; read-only endpoints remain available
129
130
  mcpEnabled: boolean // MCP server is running
130
131
  // Karpenter discovery and NodePool read state. Optional on the wire for the
131
132
  // same newer-frontend/older-backend reason as `deployment` below — consumers
@@ -160,6 +161,7 @@ export interface CloudConnectCapability {
160
161
  }
161
162
 
162
163
  export interface FeatureCapabilities {
164
+ helmSourceIdentity?: boolean
163
165
  yamlReview?: boolean
164
166
  yamlSchemas?: boolean
165
167
  workloadImages?: boolean
@@ -1089,7 +1091,7 @@ export interface UpgradeInfo {
1089
1091
  error?: string
1090
1092
  // Machine-readable source-resolution failure, used to make the Helm drawer
1091
1093
  // explain whether tracking an OCI source can help.
1092
- sourceIssue?: 'untracked' | 'repo_index_error' | 'ambiguous_repository' | 'ambiguous_source' | 'source_unavailable'
1094
+ sourceIssue?: 'source_confirmation_required' | 'source_change_required' | 'release_changing' | 'untracked' | 'repo_index_error' | 'ambiguous_repository' | 'ambiguous_source' | 'source_unavailable'
1093
1095
  // True only when the error is a genuinely untracked source (registering a
1094
1096
  // chart source could fix it). Kept for compatibility; prefer sourceIssue.
1095
1097
  untracked?: boolean
@@ -1099,7 +1101,26 @@ export type ChartSourceCandidate =
1099
1101
  | { type: 'repository'; reference: string; url: string }
1100
1102
  | { type: 'oci'; reference: string; url?: never }
1101
1103
 
1104
+ export interface SourceUpgradeSelection {
1105
+ source: ChartSourceCandidate
1106
+ expectedRevision: number
1107
+ expectedSource: ChartSourceCandidate | null
1108
+ previewDigest?: string
1109
+ }
1110
+
1111
+ export interface ChartSourceSuggestion {
1112
+ source: ChartSourceCandidate
1113
+ current: boolean
1114
+ hasInstalledVersion: boolean
1115
+ state: 'available' | 'index_unavailable' | 'unchecked'
1116
+ }
1117
+
1102
1118
  export interface ChartSourceStatus {
1119
+ changing?: boolean
1120
+ revision?: number
1121
+ confirmed?: boolean
1122
+ sourceChangeRequired?: boolean
1123
+ suggestions?: ChartSourceSuggestion[]
1103
1124
  recorded?: ChartSourceCandidate
1104
1125
  configured: boolean
1105
1126
  available: boolean
@@ -1120,6 +1141,9 @@ export interface ApplyValuesRequest {
1120
1141
 
1121
1142
  // Response for previewing values changes
1122
1143
  export interface ValuesPreviewResponse {
1144
+ baselineSource?: ChartSourceCandidate
1145
+ previewDigest?: string
1146
+ baselineRevision?: number
1123
1147
  currentValues: Record<string, unknown>
1124
1148
  newValues: Record<string, unknown>
1125
1149
  manifestDiff: string
@@ -170,6 +170,7 @@ export interface GitOpsChange {
170
170
  hookPhase?: string
171
171
  hasDesired: boolean
172
172
  hasLive: boolean
173
+ missing?: boolean
173
174
  // Structured per-field diff between the desired state (parsed from
174
175
  // kubectl.kubernetes.io/last-applied-configuration) and the live spec.
175
176
  // Undefined when the diff couldn't be computed (no annotation, SSA-applied
@@ -24,6 +24,8 @@ export interface GitOpsTreeNode {
24
24
  tool: GitOpsTreeTool
25
25
  sync?: SyncStatus
26
26
  health?: GitOpsHealthStatus
27
+ // A local lookup confirmed NotFound; independent of controller health.
28
+ missing?: boolean
27
29
  // Who assessed `health`. 'controller' is the GitOps controller's own
28
30
  // verdict; 'radar' is Radar's read of the live object (topology status, or
29
31
  // the issues engine's finding when the controller's verdict isn't