@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.
- package/package.json +4 -4
- package/src/components/gitops/GitOpsGraphFilterRail.tsx +2 -2
- package/src/components/gitops/insights/ArgoResourceDiff.test.tsx +27 -0
- package/src/components/gitops/insights/GitOpsInsightViews.tsx +16 -10
- package/src/components/gitops/insights/insights-helpers.test.ts +18 -0
- package/src/components/gitops/insights/insights-helpers.ts +7 -0
- package/src/components/gitops/tree/GitOpsTreeGraph.test.ts +73 -9
- package/src/components/gitops/tree/GitOpsTreeGraph.tsx +45 -28
- package/src/components/gitops/tree/tree-helpers.test.ts +6 -0
- package/src/components/gitops/tree/tree-helpers.ts +5 -1
- package/src/components/issues/IssuesView.tsx +4 -1
- package/src/components/issues/ResourceIssuesSection.tsx +5 -2
- package/src/components/issues/diagnostic.ts +2 -0
- package/src/components/issues/index.ts +1 -1
- package/src/components/issues/issues.test.ts +26 -0
- package/src/components/issues/severity.ts +9 -2
- package/src/components/issues/types.ts +32 -4
- package/src/components/logs/LogCore.theme.test.tsx +126 -1
- package/src/components/logs/LogCore.tsx +159 -40
- package/src/components/logs/LogsViewer.test.tsx +80 -2
- package/src/components/logs/LogsViewer.tsx +21 -4
- package/src/components/logs/StructuredLogLine.tsx +1 -1
- package/src/components/logs/WorkloadLogsViewer.tsx +7 -1
- package/src/components/logs/useLogBuffer.reading.test.tsx +149 -0
- package/src/components/logs/useLogBuffer.ts +48 -18
- package/src/components/logs/useLogSearch.ts +3 -1
- package/src/components/resources/ColumnPickerList.test.tsx +46 -0
- package/src/components/resources/ColumnPickerList.tsx +174 -0
- package/src/components/resources/ResourcesView.kind-view.test.tsx +149 -2
- package/src/components/resources/ResourcesView.tsx +93 -75
- package/src/components/resources/column-order.test.ts +104 -0
- package/src/components/resources/column-order.ts +64 -0
- package/src/components/resources/renderers/ArgoApplicationRenderer.test.tsx +15 -0
- package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +4 -1
- package/src/components/resources/renderers/CronJobRenderer.test.tsx +31 -0
- package/src/components/resources/renderers/CronJobRenderer.tsx +28 -20
- package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +22 -9
- package/src/components/resources/renderers/PodRenderer.sidecar-terminal.test.tsx +200 -0
- package/src/components/resources/renderers/PodRenderer.tsx +40 -11
- package/src/components/resources/resource-utils.ts +15 -2
- package/src/components/resources/summarize-scheduler-message.test.ts +1 -0
- package/src/components/shared/DrainPlanDialog.test.tsx +7 -0
- package/src/components/shared/DrainPlanDialog.tsx +6 -2
- package/src/components/shared/ResourceActionsBar.tsx +3 -3
- package/src/components/shared/ResourceRendererDispatch.tsx +3 -1
- package/src/components/timeline/DiffViewer.test.tsx +69 -0
- package/src/components/timeline/DiffViewer.tsx +113 -4
- package/src/components/timeline/shared.test.tsx +48 -0
- package/src/components/timeline/shared.tsx +14 -19
- package/src/components/ui/Toast.tsx +15 -4
- package/src/components/ui/index.ts +1 -1
- package/src/components/workload/WorkloadView.tsx +14 -8
- package/src/types/core.ts +25 -1
- package/src/types/gitops-insights.ts +1 -0
- 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?.({
|
|
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
|
package/src/types/gitops-tree.ts
CHANGED
|
@@ -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
|