@skyhook-io/k8s-ui 1.8.10 → 1.8.12

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 (168) hide show
  1. package/package.json +7 -6
  2. package/src/assets/gitops/argocd.png +0 -0
  3. package/src/assets/gitops/flux.svg +7 -0
  4. package/src/components/applications/AppChips.tsx +10 -0
  5. package/src/components/applications/ApplicationDetail.test.tsx +697 -0
  6. package/src/components/applications/ApplicationDetail.tsx +3269 -474
  7. package/src/components/applications/ApplicationsView.tsx +62 -10
  8. package/src/components/applications/applications-view.test.tsx +47 -0
  9. package/src/components/applications/index.ts +1 -1
  10. package/src/components/audit/AuditAlerts.tsx +14 -10
  11. package/src/components/checks/ChecksView.tsx +2 -3
  12. package/src/components/checks/severity.ts +14 -10
  13. package/src/components/cluster-switcher/ClusterSwitcher.tsx +2 -2
  14. package/src/components/compare/CompareResourcePicker.tsx +2 -2
  15. package/src/components/gitops/GitOpsDetailLayout.tsx +13 -3
  16. package/src/components/gitops/GitOpsGraphFilterRail.tsx +2 -1
  17. package/src/components/gitops/GitOpsTableView.tsx +13 -6
  18. package/src/components/gitops/ManagedResourcesList.tsx +8 -11
  19. package/src/components/gitops/SyncCountdown.tsx +26 -17
  20. package/src/components/gitops/SyncOptionsDialog.test.ts +48 -0
  21. package/src/components/gitops/SyncOptionsDialog.tsx +190 -46
  22. package/src/components/gitops/insights/ArgoResourceDiff.tsx +172 -0
  23. package/src/components/gitops/insights/GitOpsInsightViews.tsx +474 -121
  24. package/src/components/gitops/insights/index.ts +1 -0
  25. package/src/components/gitops/insights/insights-helpers.test.ts +102 -1
  26. package/src/components/gitops/insights/insights-helpers.ts +74 -1
  27. package/src/components/gitops/tree/GitOpsTreeGraph.tsx +10 -2
  28. package/src/components/issues/IssuesView.tsx +91 -52
  29. package/src/components/issues/ResourceIssuesSection.test.tsx +39 -6
  30. package/src/components/issues/ResourceIssuesSection.tsx +46 -144
  31. package/src/components/issues/index.ts +3 -0
  32. package/src/components/issues/issue-timing.ts +53 -0
  33. package/src/components/issues/issues.test.ts +102 -1
  34. package/src/components/issues/severity.ts +3 -0
  35. package/src/components/logs/LogCore.tsx +14 -4
  36. package/src/components/logs/WorkloadLogsViewer.tsx +31 -6
  37. package/src/components/logs/useLogStream.ts +8 -1
  38. package/src/components/namespace-switcher/NamespacePicker.tsx +86 -107
  39. package/src/components/resources/ResourcesSidebar.test.tsx +71 -0
  40. package/src/components/resources/ResourcesSidebar.tsx +46 -46
  41. package/src/components/resources/ResourcesView.selected-kind.test.ts +143 -0
  42. package/src/components/resources/ResourcesView.tsx +233 -51
  43. package/src/components/resources/renderers/AWSMachineRenderer.tsx +3 -2
  44. package/src/components/resources/renderers/AWSManagedClusterRenderer.tsx +3 -2
  45. package/src/components/resources/renderers/AWSManagedControlPlaneRenderer.tsx +3 -2
  46. package/src/components/resources/renderers/AWSManagedMachinePoolRenderer.tsx +3 -2
  47. package/src/components/resources/renderers/AzureMachineRenderer.tsx +3 -2
  48. package/src/components/resources/renderers/AzureManagedControlPlaneRenderer.tsx +3 -2
  49. package/src/components/resources/renderers/AzureManagedMachinePoolRenderer.tsx +3 -2
  50. package/src/components/resources/renderers/CAPIClusterRenderer.tsx +3 -2
  51. package/src/components/resources/renderers/CAPIKubeadmControlPlaneRenderer.tsx +3 -2
  52. package/src/components/resources/renderers/CAPIMachineDeploymentRenderer.tsx +3 -2
  53. package/src/components/resources/renderers/CAPIMachineHealthCheckRenderer.tsx +3 -2
  54. package/src/components/resources/renderers/CAPIMachinePoolRenderer.tsx +3 -2
  55. package/src/components/resources/renderers/CAPIMachineRenderer.tsx +3 -2
  56. package/src/components/resources/renderers/CAPIMachineSetRenderer.tsx +3 -2
  57. package/src/components/resources/renderers/CertificateRenderer.tsx +3 -2
  58. package/src/components/resources/renderers/CertificateRequestRenderer.tsx +3 -2
  59. package/src/components/resources/renderers/ClusterComplianceReportRenderer.tsx +2 -2
  60. package/src/components/resources/renderers/CompositeRenderer.tsx +3 -2
  61. package/src/components/resources/renderers/CronWorkflowRenderer.tsx +99 -0
  62. package/src/components/resources/renderers/ExternalSecretRenderer.tsx +3 -2
  63. package/src/components/resources/renderers/GCPMachineRenderer.tsx +3 -2
  64. package/src/components/resources/renderers/GCPManagedControlPlaneRenderer.tsx +3 -2
  65. package/src/components/resources/renderers/GCPManagedMachinePoolRenderer.tsx +3 -2
  66. package/src/components/resources/renderers/GRPCRouteRenderer.tsx +7 -3
  67. package/src/components/resources/renderers/GatewayClassRenderer.tsx +3 -2
  68. package/src/components/resources/renderers/HTTPRouteRenderer.tsx +7 -3
  69. package/src/components/resources/renderers/JobRenderer.tsx +3 -1
  70. package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +3 -2
  71. package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +3 -2
  72. package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +3 -2
  73. package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +3 -2
  74. package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +3 -2
  75. package/src/components/resources/renderers/ManagedResourceRenderer.tsx +3 -2
  76. package/src/components/resources/renderers/PVCRenderer.tsx +3 -2
  77. package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +2 -2
  78. package/src/components/resources/renderers/SbomReportRenderer.tsx +2 -2
  79. package/src/components/resources/renderers/SealedSecretRenderer.tsx +3 -2
  80. package/src/components/resources/renderers/SecretRenderer.tsx +2 -0
  81. package/src/components/resources/renderers/SecretStoreRenderer.tsx +3 -2
  82. package/src/components/resources/renderers/ServiceRenderer.tsx +58 -40
  83. package/src/components/resources/renderers/SimpleRouteRenderer.tsx +7 -3
  84. package/src/components/resources/renderers/VulnerabilityReportRenderer.tsx +2 -2
  85. package/src/components/resources/renderers/WorkflowRenderer.test.tsx +43 -0
  86. package/src/components/resources/renderers/WorkflowRenderer.tsx +60 -78
  87. package/src/components/resources/renderers/index.ts +1 -0
  88. package/src/components/resources/resource-utils-argo.test.ts +18 -1
  89. package/src/components/resources/resource-utils-argo.ts +8 -0
  90. package/src/components/resources/resource-utils-capi.ts +1 -1
  91. package/src/components/resources/resource-utils.ts +31 -0
  92. package/src/components/shared/DetailShell.tsx +2 -2
  93. package/src/components/shared/ResourceActionsBar.tsx +142 -111
  94. package/src/components/shared/ResourceRendererDispatch.tsx +33 -4
  95. package/src/components/shared/UnifiedDiff.tsx +51 -0
  96. package/src/components/shared/index.ts +1 -0
  97. package/src/components/timeline/TimelineList.tsx +375 -354
  98. package/src/components/timeline/TimelineStrip.test.tsx +194 -0
  99. package/src/components/timeline/TimelineStrip.tsx +836 -0
  100. package/src/components/timeline/TimelineSwimlanes.test.tsx +1028 -0
  101. package/src/components/timeline/TimelineSwimlanes.tsx +2498 -593
  102. package/src/components/timeline/TimelineToolbar.test.tsx +320 -0
  103. package/src/components/timeline/TimelineToolbar.tsx +759 -0
  104. package/src/components/timeline/TimelineToolbarState.test.tsx +88 -0
  105. package/src/components/timeline/index.ts +23 -0
  106. package/src/components/timeline/scrubber-math.test.ts +235 -0
  107. package/src/components/timeline/scrubber-math.ts +249 -0
  108. package/src/components/timeline/shared.test.tsx +219 -0
  109. package/src/components/timeline/shared.tsx +232 -447
  110. package/src/components/timeline/timeline-filters.test.ts +196 -0
  111. package/src/components/timeline/timeline-filters.ts +180 -0
  112. package/src/components/timeline/timeline-lane-sort.test.ts +97 -0
  113. package/src/components/timeline/timeline-lane-sort.ts +77 -0
  114. package/src/components/timeline/timeline-live.test.ts +131 -0
  115. package/src/components/timeline/timeline-live.ts +77 -0
  116. package/src/components/topology/GroupNode.tsx +9 -2
  117. package/src/components/topology/K8sResourceNode.test.ts +11 -0
  118. package/src/components/topology/K8sResourceNode.tsx +387 -243
  119. package/src/components/topology/TopologyBreadcrumb.tsx +30 -0
  120. package/src/components/topology/TopologyControls.tsx +3 -1
  121. package/src/components/topology/TopologyFilterSidebar.tsx +9 -0
  122. package/src/components/topology/TopologyGraph.tsx +149 -90
  123. package/src/components/topology/TopologyOverlayBar.tsx +30 -0
  124. package/src/components/topology/TopologySearch.tsx +25 -17
  125. package/src/components/topology/index.ts +2 -0
  126. package/src/components/topology/layout.ts +10 -2
  127. package/src/components/topology/topology.css +0 -92
  128. package/src/components/ui/Badge.tsx +6 -1
  129. package/src/components/ui/CodeViewer.tsx +2 -2
  130. package/src/components/ui/Collapse.tsx +59 -0
  131. package/src/components/ui/ConfirmDialog.tsx +7 -3
  132. package/src/components/ui/DialogPortal.tsx +31 -9
  133. package/src/components/ui/Input.tsx +24 -0
  134. package/src/components/ui/MultiSelectPicker.test.tsx +101 -0
  135. package/src/components/ui/MultiSelectPicker.tsx +167 -0
  136. package/src/components/ui/PaneLoader.tsx +10 -2
  137. package/src/components/ui/ResourceBar.tsx +68 -25
  138. package/src/components/ui/SearchBox.tsx +18 -4
  139. package/src/components/ui/SearchPillInput.tsx +2 -2
  140. package/src/components/ui/SelectMenu.tsx +81 -0
  141. package/src/components/ui/drawer-components.tsx +48 -32
  142. package/src/components/ui/index.ts +6 -0
  143. package/src/components/ui/severity-tone.ts +11 -4
  144. package/src/components/workload/ResourceDetailDrawer.tsx +6 -2
  145. package/src/components/workload/WorkloadView.tsx +2706 -475
  146. package/src/components/workload/index.ts +1 -1
  147. package/src/theme/tailwind-theme.css +1 -0
  148. package/src/theme/variables.css +2 -1
  149. package/src/types/core.ts +57 -4
  150. package/src/types/gitops-insights.ts +69 -1
  151. package/src/types/gitops.ts +3 -3
  152. package/src/utils/application-history.test.ts +538 -0
  153. package/src/utils/application-history.ts +257 -0
  154. package/src/utils/application-topology.test.ts +198 -0
  155. package/src/utils/application-topology.ts +261 -0
  156. package/src/utils/applications.test.ts +201 -1
  157. package/src/utils/applications.ts +1182 -393
  158. package/src/utils/index.ts +3 -0
  159. package/src/utils/navigation.test.ts +32 -1
  160. package/src/utils/navigation.ts +70 -0
  161. package/src/utils/resource-hierarchy.test.ts +1024 -1
  162. package/src/utils/resource-hierarchy.ts +925 -267
  163. package/src/utils/resource-icons.ts +2 -0
  164. package/src/utils/topology-neighborhood.test.ts +202 -1
  165. package/src/utils/topology-neighborhood.ts +194 -13
  166. package/src/utils/workflow-execution.test.ts +556 -0
  167. package/src/utils/workflow-execution.ts +814 -0
  168. package/src/utils/workload-colors.ts +2 -3
@@ -1,2 +1,2 @@
1
- export { WorkloadView, type WorkloadTabType } from './WorkloadView'
1
+ export { WorkloadView, type ResourceOwnershipContext, type ServingResourceDetail, type WorkloadTabType } from './WorkloadView'
2
2
  export { ResourceDetailDrawer } from './ResourceDetailDrawer'
@@ -20,6 +20,7 @@
20
20
  --color-theme-text-secondary: var(--text-secondary);
21
21
  --color-theme-text-tertiary: var(--text-tertiary);
22
22
  --color-theme-text-disabled: var(--text-disabled);
23
+ --color-warning-text: var(--warning-text);
23
24
 
24
25
  /* Borders */
25
26
  --color-theme-border: var(--border-default);
@@ -49,6 +49,7 @@
49
49
  --text-secondary: light-dark(#555860, #D8DAE0);
50
50
  --text-tertiary: light-dark(#6B7080, #B0B5C0);
51
51
  --text-disabled: light-dark(#A0A4AC, #6A7080);
52
+ --warning-text: light-dark(#92400E, #FBBF24);
52
53
 
53
54
  /* ── Borders (lightly blue-tinted in light mode) ── */
54
55
  --border-default: light-dark(#D8E0EE, #222840);
@@ -156,6 +157,6 @@
156
157
  --shadow-sm: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.2), 0 0 0 1px rgba(255,255,255,0.06);
157
158
  --shadow-md: 0 4px 12px -2px rgba(0,0,0,0.35), 0 2px 4px rgba(0,0,0,0.15), 0 0 0 1px rgba(255,255,255,0.06);
158
159
  --shadow-lg: 0 12px 32px -6px rgba(0,0,0,0.3), 0 4px 8px rgba(0,0,0,0.1);
159
- --shadow-drawer: -16px 0 60px rgba(0,0,0,0.6), -6px 0 20px rgba(0,0,0,0.4);
160
+ --shadow-drawer: -12px 0 36px rgba(0,0,0,0.45), -4px 0 14px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.06);
160
161
  --topology-node-shadow: 0 2px 6px rgba(0,0,0,0.2), 0 6px 16px rgba(0,0,0,0.15);
161
162
  }
package/src/types/core.ts CHANGED
@@ -11,6 +11,7 @@ export interface ResourcePermissions {
11
11
  statefulSets: boolean
12
12
  replicaSets: boolean
13
13
  ingresses: boolean
14
+ ingressClasses: boolean
14
15
  configMaps: boolean
15
16
  secrets: boolean
16
17
  events: boolean
@@ -94,7 +95,6 @@ export interface Deployment {
94
95
  // When adding a new kind here, also update:
95
96
  // - ALL_NODE_KINDS in App.tsx
96
97
  // - TopologyFilterSidebar.tsx RESOURCE_KINDS array
97
- // - index.css .topology-icon-* class
98
98
  // - K8sResourceNode.tsx NODE_DIMENSIONS
99
99
  // - resource-icons.ts KIND_ICON_MAP
100
100
  // - kindToPlural in navigation.ts (if irregular plural)
@@ -123,9 +123,17 @@ export type CoreNodeKind =
123
123
  | 'PodGroup'
124
124
  | 'ConfigMap'
125
125
  | 'Secret'
126
+ | 'ServiceAccount'
127
+ | 'SealedSecret'
128
+ | 'ServiceMonitor'
129
+ | 'PodMonitor'
126
130
  | 'HorizontalPodAutoscaler'
127
131
  | 'Job'
128
132
  | 'CronJob'
133
+ | 'Workflow'
134
+ | 'CronWorkflow'
135
+ | 'WorkflowTemplate'
136
+ | 'ClusterWorkflowTemplate'
129
137
  | 'PersistentVolumeClaim'
130
138
  | 'Node'
131
139
  | 'Namespace'
@@ -168,6 +176,10 @@ export function displayKind(kind: string): string {
168
176
  const shortNames: Record<string, string> = {
169
177
  HorizontalPodAutoscaler: 'HPA',
170
178
  PersistentVolumeClaim: 'PVC',
179
+ ServiceAccount: 'Service Account',
180
+ SealedSecret: 'Sealed Secret',
181
+ ServiceMonitor: 'Service Monitor',
182
+ PodMonitor: 'Pod Monitor',
171
183
  EC2NodeClass: 'NodeClass',
172
184
  KnativeService: 'Knative Svc',
173
185
  KnativeConfiguration: 'Knative Config',
@@ -275,6 +287,10 @@ export interface TimelineEvent {
275
287
  id: string
276
288
  timestamp: string // ISO date string
277
289
  source: EventSource // Where event originated: 'informer', 'k8s_event', 'historical'
290
+ // Store-assigned arrival number (monotonic per store instance). The delta
291
+ // cursor keys on it — arrival order, not event time, so late-arriving
292
+ // events can't slip behind a client's cursor.
293
+ seq?: number
278
294
 
279
295
  // Resource identity
280
296
  kind: string
@@ -339,6 +355,20 @@ export function isWorkloadKind(kind: string): boolean {
339
355
  ].includes(kind)
340
356
  }
341
357
 
358
+ export function isDeploymentLikeWorkloadKind(kind: string, group = ''): boolean {
359
+ switch (kind) {
360
+ case 'Deployment':
361
+ case 'ReplicaSet':
362
+ case 'StatefulSet':
363
+ case 'DaemonSet':
364
+ return group === '' || group === 'apps'
365
+ case 'Rollout':
366
+ return group === '' || group === 'argoproj.io'
367
+ default:
368
+ return false
369
+ }
370
+ }
371
+
342
372
  // Check if a resource kind is typically managed by another
343
373
  export function isManagedKind(kind: string): boolean {
344
374
  return ['ReplicaSet', 'Pod', 'Event'].includes(kind)
@@ -353,7 +383,7 @@ export interface TimelineFilters {
353
383
  timeRange: TimeRange
354
384
  }
355
385
 
356
- export type TimeRange = '5m' | '30m' | '1h' | '6h' | '24h' | 'all'
386
+ export type TimeRange = '5m' | '30m' | '1h' | '6h' | '24h' | '7d' | '30d' | 'all'
357
387
 
358
388
  // Cluster info
359
389
  export interface ClusterInfo {
@@ -445,6 +475,7 @@ export interface Relationships {
445
475
  configRefs?: ResourceRef[]
446
476
  consumers?: ResourceRef[]
447
477
  scalers?: ResourceRef[]
478
+ storageRefs?: ResourceRef[]
448
479
  scaleTarget?: ResourceRef
449
480
  pdbs?: ResourceRef[] // PodDisruptionBudgets protecting this workload
450
481
  networkPolicies?: ResourceRef[] // NetworkPolicy / CiliumNetworkPolicy / ClusterNetworkPolicy variants selecting this workload
@@ -822,9 +853,11 @@ export interface UpgradeInfo {
822
853
  // oci:// chart reference an OCI-sourced upgrade lives at (display only).
823
854
  chartRef?: string
824
855
  error?: string
856
+ // Machine-readable source-resolution failure, used to make the Helm drawer
857
+ // explain whether tracking an OCI source can help.
858
+ sourceIssue?: 'untracked' | 'repo_index_error' | 'ambiguous_repository'
825
859
  // True only when the error is a genuinely untracked source (registering a
826
- // chart source could fix it) — NOT for repo-side errors like a stale index or
827
- // classic ambiguity. Gates the "track source" affordance.
860
+ // chart source could fix it). Kept for compatibility; prefer sourceIssue.
828
861
  untracked?: boolean
829
862
  }
830
863
 
@@ -836,6 +869,8 @@ export interface BatchUpgradeInfo {
836
869
  // Request body for applying new values to a release
837
870
  export interface ApplyValuesRequest {
838
871
  values: Record<string, unknown>
872
+ version?: string
873
+ repository?: string
839
874
  }
840
875
 
841
876
  // Response for previewing values changes
@@ -1234,10 +1269,28 @@ export interface ImageMetadata {
1234
1269
  // ============================================================================
1235
1270
 
1236
1271
  // Pod info returned from workload pods endpoint
1272
+ export interface WorkloadPodContainerInfo {
1273
+ name: string
1274
+ init?: boolean
1275
+ ready: boolean
1276
+ restartCount: number
1277
+ }
1278
+
1237
1279
  export interface WorkloadPodInfo {
1238
1280
  name: string
1239
1281
  containers: string[]
1240
1282
  ready: boolean
1283
+ phase?: string
1284
+ healthLevel?: HealthStatus
1285
+ reason?: string
1286
+ message?: string
1287
+ restartCount?: number
1288
+ lastTerminationReason?: string
1289
+ createdAt?: string
1290
+ containerStatuses?: WorkloadPodContainerInfo[]
1291
+ stepID?: string
1292
+ stepName?: string
1293
+ stepPhase?: string
1241
1294
  }
1242
1295
 
1243
1296
  // SSE event types for workload log streaming
@@ -32,7 +32,13 @@ export type GitOpsCategory =
32
32
  | 'Suspended'
33
33
  | 'Unknown'
34
34
 
35
- export type GitOpsDriftSource = 'lastAppliedAnnotation'
35
+ // How a Drift's field entries were computed. `lastAppliedAnnotation` is the
36
+ // built-in path (kubectl.kubernetes.io/last-applied-configuration); `argocd-api`
37
+ // means the diff came from a connected Argo CD server's managed-resource diff.
38
+ // The `(string & {})` arm keeps the union open: a library consumer may lag the
39
+ // backend and receive a source it doesn't recognize — such values MUST render
40
+ // with the neutral fallback (no source label), never crash a switch.
41
+ export type GitOpsDriftSource = 'lastAppliedAnnotation' | 'argocd-api' | (string & {})
36
42
 
37
43
  export interface GitOpsInsightSummary {
38
44
  tool: GitOpsTool
@@ -66,6 +72,21 @@ export interface GitOpsInsightSummary {
66
72
  // Finalizers blocking deletion. When stuck, naming the finalizer points
67
73
  // the user at the controller they need to investigate.
68
74
  finalizers?: string[]
75
+ // Argo comparison-coverage disclosure: the field exclusions declared in
76
+ // spec.ignoreDifferences that suppress drift from comparison (both Argo's
77
+ // and Radar's). Undefined for Flux roots and Applications without any
78
+ // exclusions. unsupportedRuleCount counts entries Radar does NOT evaluate
79
+ // (jqPathExpressions / managedFieldsManagers rules) — the
80
+ // drift panel may surface fields Argo's own UI suppresses.
81
+ ignoredDifferences?: GitOpsIgnoredDifferences
82
+ }
83
+
84
+ export interface GitOpsIgnoredDifferences {
85
+ ruleCount: number
86
+ unsupportedRuleCount: number
87
+ // Sorted unique "Group/Kind" targets ("Kind" for core resources,
88
+ // "group/*" for a group-wide rule that omits kind).
89
+ kinds: string[]
69
90
  }
70
91
 
71
92
  export interface GitOpsInsightRef {
@@ -192,6 +213,53 @@ export interface GitOpsCapabilities {
192
213
  syncWithSource: boolean
193
214
  selectiveSync: boolean
194
215
  rollback: boolean
216
+ // True on an Argo CD Application detail when the Argo CD integration is
217
+ // connected, meaning the full Git-rendered desired-vs-live diff endpoint
218
+ // (/api/argo/applications/{ns}/{name}/resource-diff) can be called for this
219
+ // app's managed resources. Absent/false → offer only the last-applied field
220
+ // diff and (for disconnected Argo apps) the "connect Argo CD" hint.
221
+ argoDiffAvailable?: boolean
222
+ // True when the Argo CD integration has settings saved, even if the live
223
+ // connection is down / the token is rejected. Paired with argoDiffAvailable to
224
+ // tell "not set up" (offer Connect) from "set up but disconnected" (offer
225
+ // Reconnect) — instead of advertising a diff that would fail.
226
+ argoConfigured?: boolean
227
+ // True on an Argo CD Application detail when the integration is connected,
228
+ // meaning the revision-metadata endpoint can resolve Git commit details
229
+ // (author, message, signature) for this app's deployed revisions.
230
+ revisionMetadataAvailable?: boolean
195
231
  unsupportedReason?: string
196
232
  warnings?: string[]
197
233
  }
234
+
235
+ // Response of GET /api/argo/applications/{ns}/{name}/revision-metadata — the Git
236
+ // commit metadata for one deployed revision. Every field is best-effort (varies
237
+ // across Argo CD versions); signatureInfo non-empty means a signature was checked.
238
+ export interface ArgoRevisionMetadata {
239
+ author?: string
240
+ date?: string
241
+ tags?: string[]
242
+ message?: string
243
+ signatureInfo?: string
244
+ }
245
+
246
+ // Response of GET /api/argo/applications/{ns}/{name}/resource-diff. `desired`
247
+ // is the Git-rendered manifest, `live` the normalized cluster state — both YAML
248
+ // for the line-by-line view. `fieldEntries` is the same diff structured per
249
+ // path for a compact summary. `redacted` is set when Secret values were masked
250
+ // server-side; `hook` marks Argo sync-hook resources.
251
+ export interface GitOpsResourceDiff {
252
+ source: string
253
+ desired: string
254
+ live: string
255
+ fieldEntries: GitOpsResourceDiffFieldEntry[]
256
+ redacted: boolean
257
+ hook: boolean
258
+ }
259
+
260
+ export interface GitOpsResourceDiffFieldEntry {
261
+ path: string
262
+ op: 'added' | 'removed' | 'changed'
263
+ desired?: string
264
+ live?: string
265
+ }
@@ -254,7 +254,7 @@ export interface ArgoAppStatus {
254
254
  * ArgoCD status patterns:
255
255
  * - sync.status: Synced, OutOfSync, Unknown
256
256
  * - health.status: Healthy, Progressing, Degraded, Suspended, Missing, Unknown
257
- * - operationState.phase: Running, Succeeded, Failed, Error
257
+ * - operationState.phase: Running, Terminating, Succeeded, Failed, Error
258
258
  */
259
259
  export function argoStatusToGitOpsStatus(status: ArgoAppStatus): GitOpsStatus {
260
260
  const syncStatus = status.sync?.status
@@ -267,7 +267,7 @@ export function argoStatusToGitOpsStatus(status: ArgoAppStatus): GitOpsStatus {
267
267
  sync = 'Synced'
268
268
  } else if (syncStatus === 'OutOfSync') {
269
269
  sync = 'OutOfSync'
270
- } else if (opPhase === 'Running') {
270
+ } else if (opPhase === 'Running' || opPhase === 'Terminating') {
271
271
  sync = 'Reconciling'
272
272
  }
273
273
 
@@ -288,7 +288,7 @@ export function argoStatusToGitOpsStatus(status: ArgoAppStatus): GitOpsStatus {
288
288
  }
289
289
 
290
290
  // Override with operation state if active
291
- if (opPhase === 'Running') {
291
+ if (opPhase === 'Running' || opPhase === 'Terminating') {
292
292
  health = 'Progressing'
293
293
  } else if (opPhase === 'Failed' || opPhase === 'Error') {
294
294
  health = 'Degraded'