@64mb/freelens-power 2.1.0 → 2.2.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 (106) hide show
  1. package/README.md +4 -4
  2. package/out/main/common/power-logs.js.map +1 -1
  3. package/out/main/common/resource-search.js.map +1 -1
  4. package/out/main/power-logs-child.js +3 -3
  5. package/out/main/power-logs-child.js.map +1 -1
  6. package/out/main/power-logs-database.js +165 -7
  7. package/out/main/power-logs-database.js.map +1 -1
  8. package/out/main/power-logs-ipc.js +12 -3
  9. package/out/main/power-logs-ipc.js.map +1 -1
  10. package/out/main/power-logs-worker.js +29 -7
  11. package/out/main/power-logs-worker.js.map +1 -1
  12. package/out/main/resource-search-database.js +3 -2
  13. package/out/main/resource-search-database.js.map +1 -1
  14. package/out/main/resource-search.js +2 -1
  15. package/out/main/resource-search.js.map +1 -1
  16. package/out/renderer/_virtual/_global-external_react.js +2 -1
  17. package/out/renderer/ai-context-mutations.js +14 -0
  18. package/out/renderer/ai-context-mutations.js.map +1 -0
  19. package/out/renderer/ai-copy-answer.js +18 -15
  20. package/out/renderer/ai-copy-answer.js.map +1 -1
  21. package/out/renderer/ai-diagnostic-handoff.js +2 -2
  22. package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
  23. package/out/renderer/ai-extras.js +41 -38
  24. package/out/renderer/ai-extras.js.map +1 -1
  25. package/out/renderer/ai-message.js +50 -39
  26. package/out/renderer/ai-message.js.map +1 -1
  27. package/out/renderer/ai-provider-icon.js +39 -32
  28. package/out/renderer/ai-provider-icon.js.map +1 -1
  29. package/out/renderer/ai-resize.js +40 -37
  30. package/out/renderer/ai-resize.js.map +1 -1
  31. package/out/renderer/ai-shortcuts.js +20 -17
  32. package/out/renderer/ai-shortcuts.js.map +1 -1
  33. package/out/renderer/ai-terminal-context.js +42 -48
  34. package/out/renderer/ai-terminal-context.js.map +1 -1
  35. package/out/renderer/ai.js +137 -111
  36. package/out/renderer/ai.js.map +1 -1
  37. package/out/renderer/cluster-icon-colors.js +10 -7
  38. package/out/renderer/cluster-icon-colors.js.map +1 -1
  39. package/out/renderer/cluster-icons.js +47 -40
  40. package/out/renderer/cluster-icons.js.map +1 -1
  41. package/out/renderer/details/service-diagnostics-details.js +25 -23
  42. package/out/renderer/details/service-diagnostics-details.js.map +1 -1
  43. package/out/renderer/diagnostic-explain-button.js +7 -4
  44. package/out/renderer/diagnostic-explain-button.js.map +1 -1
  45. package/out/renderer/diagnostics-screen-finding.js +51 -0
  46. package/out/renderer/diagnostics-screen-finding.js.map +1 -0
  47. package/out/renderer/diagnostics.css.js +1 -1
  48. package/out/renderer/diagnostics.css.js.map +1 -1
  49. package/out/renderer/diagnostics.js +146 -107
  50. package/out/renderer/diagnostics.js.map +1 -1
  51. package/out/renderer/incident-copy-button.js +24 -21
  52. package/out/renderer/incident-copy-button.js.map +1 -1
  53. package/out/renderer/index.js +2 -0
  54. package/out/renderer/index.js.map +1 -1
  55. package/out/renderer/monitoring.js +19 -22
  56. package/out/renderer/monitoring.js.map +1 -1
  57. package/out/renderer/native-tooltip.js +22 -0
  58. package/out/renderer/native-tooltip.js.map +1 -0
  59. package/out/renderer/pod-details-enhancements.js +106 -0
  60. package/out/renderer/pod-details-enhancements.js.map +1 -0
  61. package/out/renderer/power-log-json-cell.js +44 -38
  62. package/out/renderer/power-log-json-cell.js.map +1 -1
  63. package/out/renderer/power-log-json.js +17 -10
  64. package/out/renderer/power-log-json.js.map +1 -1
  65. package/out/renderer/power-log-sql-editor.js +31 -2
  66. package/out/renderer/power-log-sql-editor.js.map +1 -1
  67. package/out/renderer/power-logs-client.js +5 -0
  68. package/out/renderer/power-logs-client.js.map +1 -1
  69. package/out/renderer/power-logs-entrypoints.js +10 -36
  70. package/out/renderer/power-logs-entrypoints.js.map +1 -1
  71. package/out/renderer/power-logs.css.js +9 -2
  72. package/out/renderer/power-logs.css.js.map +1 -1
  73. package/out/renderer/power-logs.js +376 -214
  74. package/out/renderer/power-logs.js.map +1 -1
  75. package/out/renderer/preferences/dashboard-preferences.js +42 -35
  76. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  77. package/out/renderer/preferences/logs-preferences.js +1 -1
  78. package/out/renderer/preferences/logs-preferences.js.map +1 -1
  79. package/out/renderer/preferences/monitoring-preferences.js +7 -4
  80. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  81. package/out/renderer/preferences/preferences.js +2 -2
  82. package/out/renderer/preferences/preferences.js.map +1 -1
  83. package/out/renderer/preferences/settings-icon-action.js +12 -11
  84. package/out/renderer/preferences/settings-icon-action.js.map +1 -1
  85. package/out/renderer/relationship-map-finding.js +53 -0
  86. package/out/renderer/relationship-map-finding.js.map +1 -0
  87. package/out/renderer/resource-relationships.css.js +6 -0
  88. package/out/renderer/resource-relationships.css.js.map +1 -1
  89. package/out/renderer/resource-relationships.js +94 -47
  90. package/out/renderer/resource-relationships.js.map +1 -1
  91. package/out/renderer/resource-search-client.js.map +1 -1
  92. package/out/renderer/resource-search.js +88 -35
  93. package/out/renderer/resource-search.js.map +1 -1
  94. package/out/renderer/src/common/gateway-relationships.js +8 -7
  95. package/out/renderer/src/common/gateway-relationships.js.map +1 -1
  96. package/out/renderer/src/common/power-log-json-filter-sql.js +12 -0
  97. package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -1
  98. package/out/renderer/src/common/power-log-json-preset.js +2 -2
  99. package/out/renderer/src/common/power-log-json-preset.js.map +1 -1
  100. package/out/renderer/src/common/power-logs.js.map +1 -1
  101. package/out/renderer/src/common/resource-relationships.js +10 -8
  102. package/out/renderer/src/common/resource-relationships.js.map +1 -1
  103. package/out/renderer/src/common/resource-search.js.map +1 -1
  104. package/out/renderer/welcome.js +16 -1
  105. package/out/renderer/welcome.js.map +1 -1
  106. package/package.json +1 -1
@@ -3,6 +3,7 @@ const require__global_external_mobx = require("./_virtual/_global-external_mobx.
3
3
  const require__global_external_react = require("./_virtual/_global-external_react.js");
4
4
  const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
5
5
  const require_ai_icon = require("./ai-icon.js");
6
+ const require_native_tooltip = require("./native-tooltip.js");
6
7
  const require_ai_diagnostic_handoff = require("./ai-diagnostic-handoff.js");
7
8
  const require_date_time = require("./src/common/date-time.js");
8
9
  const require_monitoring_collector = require("./monitoring-collector.js");
@@ -10,6 +11,7 @@ const require_resource_diagnostics = require("./src/common/resource-diagnostics.
10
11
  const require_timeline_groups = require("./src/common/timeline-groups.js");
11
12
  const require_diagnostic_explain_button = require("./diagnostic-explain-button.js");
12
13
  const require_diagnostics_css = require("./diagnostics.css.js");
14
+ const require_diagnostics_screen_finding = require("./diagnostics-screen-finding.js");
13
15
  const require_diagnostics_state = require("./diagnostics-state.js");
14
16
  const require_incident_copy_button = require("./incident-copy-button.js");
15
17
  //#region src/renderer/diagnostics.tsx
@@ -47,34 +49,40 @@ function ResourceCell({ summary, metric }) {
47
49
  className: "resource-request",
48
50
  children: [/* @__PURE__ */ require_jsx_runtime.jsx("small", { children: summary.unknownRequestPods ? "Known requests" : "Requests" }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: resourceText(summary.requests, metric) })]
49
51
  }),
50
- /* @__PURE__ */ require_jsx_runtime.jsxs("small", {
51
- className: "resource-coverage",
52
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
52
53
  title: "Coverage is per resource. Missing metrics are unavailable, never zero.",
53
- children: [
54
- summary.coveredPods,
55
- "/",
56
- summary.totalPods,
57
- " pods covered",
58
- summary.unknownRequestPods ? ` · ${summary.unknownRequestPods} requests unknown` : "",
59
- ratio ? ` · ${ratio}` : ""
60
- ]
54
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("small", {
55
+ className: "resource-coverage",
56
+ children: [
57
+ summary.coveredPods,
58
+ "/",
59
+ summary.totalPods,
60
+ " pods covered",
61
+ summary.unknownRequestPods ? ` · ${summary.unknownRequestPods} requests unknown` : "",
62
+ ratio ? ` · ${ratio}` : ""
63
+ ]
64
+ })
61
65
  }),
62
- complete && summary.usage !== void 0 && summary.requests > 0 && summary.usage > summary.requests && /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
63
- className: "request-burst",
66
+ complete && summary.usage !== void 0 && summary.requests > 0 && summary.usage > summary.requests && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
64
67
  title: "Usage exceeds configured requests. Requests are reservations, not limits; this alone does not indicate a failure.",
65
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
66
- material: "info_outline",
67
- size: 12
68
- }), "Above requests"]
68
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
69
+ className: "request-burst",
70
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
71
+ material: "info_outline",
72
+ size: 12
73
+ }), "Above requests"]
74
+ })
69
75
  })
70
76
  ]
71
77
  });
72
78
  }
73
79
  function UnscheduledCell({ cpu, memory }) {
74
- if (!(cpu.unknownRequestPods || memory.unknownRequestPods) && !cpu.unscheduledRequests && !memory.unscheduledRequests) return /* @__PURE__ */ require_jsx_runtime.jsx("span", {
75
- className: "unscheduled-empty",
80
+ if (!(cpu.unknownRequestPods || memory.unknownRequestPods) && !cpu.unscheduledRequests && !memory.unscheduledRequests) return /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
76
81
  title: "No unscheduled requests",
77
- children: "—"
82
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
83
+ className: "unscheduled-empty",
84
+ children: "—"
85
+ })
78
86
  });
79
87
  return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
80
88
  className: `unscheduled-cell${cpu.unscheduledRequests || memory.unscheduledRequests ? " has-requests" : ""}`,
@@ -465,6 +473,17 @@ function DiagnosticsPage() {
465
473
  return owner ? `${owner[1].group.namespace}/${owner[1].group.kind}/${owner[1].group.name}` : timelineResource(entry);
466
474
  }, timelineResource);
467
475
  const displayedTimeline = groupedTimeline ? timelineGroups.map((group) => group.latest) : timeline;
476
+ require__global_external_react.useEffect(() => {
477
+ if (!data || tab !== "Consumers" && tab !== "Timeline") return;
478
+ const attach = () => require_ai_diagnostic_handoff.explainDiagnosticFinding(require_diagnostics_screen_finding.diagnosticsScreenFinding(data.clusterId, tab, filtered, displayedTimeline, timelineResource));
479
+ window.addEventListener("power-ai-request-screen-context", attach);
480
+ return () => window.removeEventListener("power-ai-request-screen-context", attach);
481
+ }, [
482
+ data,
483
+ tab,
484
+ filtered,
485
+ displayedTimeline
486
+ ]);
468
487
  const pending = (data?.pods ?? []).filter((pod) => pod.status?.phase === "Pending");
469
488
  const attentionPods = new Set(groups.filter((group) => !namespaceScope || group.namespace === namespaceScope).flatMap((group) => group.pods).filter((pod) => ["warning", "error"].includes(consumerStatus([pod]).tone)).map((pod) => pod.metadata.uid ?? pod)).size;
470
489
  const AttentionCard = data?.pods ? "button" : "div";
@@ -503,16 +522,18 @@ function DiagnosticsPage() {
503
522
  "Timeline",
504
523
  "Pending",
505
524
  "Not ready"
506
- ].map((name) => /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
507
- type: "button",
525
+ ].map((name) => /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
508
526
  title: `Show ${name.toLowerCase()}`,
509
- "aria-pressed": tab === name,
510
- onClick: () => setTab(name),
511
- children: [
512
- /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: name === "Consumers" ? "account_tree" : name === "Timeline" ? "timeline" : "hourglass_empty" }),
513
- name,
514
- name === "Pending" && data?.pods ? ` (${pending.length})` : name === "Not ready" && data?.pods ? ` (${notReady.length})` : ""
515
- ]
527
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
528
+ type: "button",
529
+ "aria-pressed": tab === name,
530
+ onClick: () => setTab(name),
531
+ children: [
532
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: name === "Consumers" ? "account_tree" : name === "Timeline" ? "timeline" : "hourglass_empty" }),
533
+ name,
534
+ name === "Pending" && data?.pods ? ` (${pending.length})` : name === "Not ready" && data?.pods ? ` (${notReady.length})` : ""
535
+ ]
536
+ })
516
537
  }, name))
517
538
  }),
518
539
  error && /* @__PURE__ */ require_jsx_runtime.jsxs("p", {
@@ -871,13 +892,15 @@ function DiagnosticsPage() {
871
892
  role: "group",
872
893
  "aria-label": "Event actions",
873
894
  children: [
874
- object && data && /* @__PURE__ */ require_jsx_runtime.jsx("button", {
875
- type: "button",
876
- className: "timeline-resource-action",
877
- "aria-label": "Open resource",
895
+ object && data && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
878
896
  title: `Open ${object.kind ?? "Pod"} ${object.metadata.namespace} / ${object.metadata.name}`,
879
- onClick: (event) => openResource(object, data.clusterId, event),
880
- children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: "open_in_new" })
897
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
898
+ type: "button",
899
+ className: "timeline-resource-action",
900
+ "aria-label": "Open resource",
901
+ onClick: (event) => openResource(object, data.clusterId, event),
902
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: "open_in_new" })
903
+ })
881
904
  }),
882
905
  /* @__PURE__ */ require_jsx_runtime.jsx(require_incident_copy_button.IncidentCopyButton, {
883
906
  clusterId: data.clusterId,
@@ -1003,15 +1026,17 @@ function DiagnosticsPage() {
1003
1026
  ] }), /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1004
1027
  className: "pending-state-row",
1005
1028
  children: [/* @__PURE__ */ require_jsx_runtime.jsx("h3", { children: readinessView ? "Not ready" : diagnosis.state === "assigned-waiting" ? "Assigned and waiting" : "Unscheduled" }), consumerStatus([selectedPod]).tone === "error" && /* @__PURE__ */ require_jsx_runtime.jsx(ConsumerStatus, { pods: [selectedPod] })]
1006
- })] }), /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1007
- className: "pending-open-action",
1008
- type: "button",
1029
+ })] }), /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1009
1030
  title: "Open pod details",
1010
- onClick: (event) => openResource(selectedPod, data.clusterId, event),
1011
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1012
- material: "open_in_new",
1013
- size: 15
1014
- }), "Open pod"]
1031
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1032
+ className: "pending-open-action",
1033
+ type: "button",
1034
+ onClick: (event) => openResource(selectedPod, data.clusterId, event),
1035
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1036
+ material: "open_in_new",
1037
+ size: 15
1038
+ }), "Open pod"]
1039
+ })
1015
1040
  })]
1016
1041
  }),
1017
1042
  /* @__PURE__ */ require_jsx_runtime.jsx("p", { children: readinessView ? "The pod is running but needs attention. Check readiness conditions, container status and events." : diagnosis.state === "assigned-waiting" ? "A node is assigned. Check pod conditions and events for startup or storage issues." : "No node is assigned. Start with scheduler events, then inspect constraints." }),
@@ -1145,21 +1170,23 @@ function ConsumerRows({ group, clusterId, snapshotTime, expanded, toggle, usage,
1145
1170
  className: "consumer-identity-main",
1146
1171
  children: [/* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1147
1172
  className: "consumer-title-line",
1148
- children: [group.ownerResolved && resources[group.kind] && group.name !== "Unknown" ? /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1149
- className: "consumer-resource-link",
1150
- type: "button",
1173
+ children: [group.ownerResolved && resources[group.kind] && group.name !== "Unknown" ? /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1151
1174
  title: `Open ${group.kind} ${group.namespace} / ${group.name}`,
1152
- onClick: (event) => openResource({
1153
- kind: group.kind,
1154
- metadata: {
1155
- uid: group.identity,
1156
- namespace: group.namespace,
1157
- name: group.name
1158
- }
1159
- }, clusterId, event),
1160
- children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1161
- className: "consumer-link-name",
1162
- children: group.name
1175
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1176
+ className: "consumer-resource-link",
1177
+ type: "button",
1178
+ onClick: (event) => openResource({
1179
+ kind: group.kind,
1180
+ metadata: {
1181
+ uid: group.identity,
1182
+ namespace: group.namespace,
1183
+ name: group.name
1184
+ }
1185
+ }, clusterId, event),
1186
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1187
+ className: "consumer-link-name",
1188
+ children: group.name
1189
+ })
1163
1190
  })
1164
1191
  }) : /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1165
1192
  className: "consumer-identity-label",
@@ -1227,14 +1254,16 @@ function ConsumerRows({ group, clusterId, snapshotTime, expanded, toggle, usage,
1227
1254
  }),
1228
1255
  /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1229
1256
  className: "consumer-expand-slot",
1230
- children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1231
- className: "consumer-expand",
1232
- type: "button",
1257
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1233
1258
  title: expanded ? "Collapse pods" : "Expand pods",
1234
- "aria-label": `${expanded ? "Collapse" : "Expand"} pods for ${group.name}`,
1235
- "aria-expanded": expanded,
1236
- onClick: toggle,
1237
- children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: expanded ? "expand_less" : "expand_more" })
1259
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1260
+ className: "consumer-expand",
1261
+ type: "button",
1262
+ "aria-label": `${expanded ? "Collapse" : "Expand"} pods for ${group.name}`,
1263
+ "aria-expanded": expanded,
1264
+ onClick: toggle,
1265
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: expanded ? "expand_less" : "expand_more" })
1266
+ })
1238
1267
  })
1239
1268
  })
1240
1269
  ]
@@ -1272,18 +1301,20 @@ function ConsumerRows({ group, clusterId, snapshotTime, expanded, toggle, usage,
1272
1301
  className: "consumer-identity-main",
1273
1302
  children: [/* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1274
1303
  className: "consumer-title-line",
1275
- children: [/* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1276
- className: "consumer-resource-link",
1277
- type: "button",
1304
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1278
1305
  title: "Open pod details",
1279
- onClick: (event) => openResource(pod, clusterId, event),
1280
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1281
- material: "view_in_ar",
1282
- size: 14
1283
- }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1284
- className: "consumer-link-name",
1285
- children: pod.metadata.name
1286
- })]
1306
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1307
+ className: "consumer-resource-link",
1308
+ type: "button",
1309
+ onClick: (event) => openResource(pod, clusterId, event),
1310
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1311
+ material: "view_in_ar",
1312
+ size: 14
1313
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1314
+ className: "consumer-link-name",
1315
+ children: pod.metadata.name
1316
+ })]
1317
+ })
1287
1318
  }), /* @__PURE__ */ require_jsx_runtime.jsx(ConsumerStatus, { pods: [pod] })]
1288
1319
  }), /* @__PURE__ */ require_jsx_runtime.jsxs("small", {
1289
1320
  className: "consumer-subtitle",
@@ -1311,10 +1342,12 @@ function ConsumerRows({ group, clusterId, snapshotTime, expanded, toggle, usage,
1311
1342
  }),
1312
1343
  /* @__PURE__ */ require_jsx_runtime.jsx("td", {
1313
1344
  className: "numeric",
1314
- children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1315
- className: "unscheduled-empty",
1345
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1316
1346
  title: pod.spec?.nodeName ? "No unscheduled requests" : "Unscheduled requests are included in the workload total",
1317
- children: pod.spec?.nodeName ? "—" : "Included above"
1347
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1348
+ className: "unscheduled-empty",
1349
+ children: pod.spec?.nodeName ? "—" : "Included above"
1350
+ })
1318
1351
  })
1319
1352
  })
1320
1353
  ]
@@ -1358,21 +1391,23 @@ function NamespaceRows({ namespace, groups, clusterId, snapshotTime, usage, open
1358
1391
  children: [/* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1359
1392
  className: "consumer-title-line",
1360
1393
  children: [
1361
- /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1362
- type: "button",
1363
- className: "consumer-resource-link namespace-identity",
1364
- onClick: (event) => openResource({
1365
- kind: "Namespace",
1366
- metadata: { name: namespace }
1367
- }, clusterId, event),
1394
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1368
1395
  title: "Open namespace",
1369
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1370
- material: "folder_open",
1371
- size: 17
1372
- }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1373
- className: "consumer-link-name",
1374
- children: namespace
1375
- })]
1396
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1397
+ type: "button",
1398
+ className: "consumer-resource-link namespace-identity",
1399
+ onClick: (event) => openResource({
1400
+ kind: "Namespace",
1401
+ metadata: { name: namespace }
1402
+ }, clusterId, event),
1403
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
1404
+ material: "folder_open",
1405
+ size: 17
1406
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1407
+ className: "consumer-link-name",
1408
+ children: namespace
1409
+ })]
1410
+ })
1376
1411
  }),
1377
1412
  /* @__PURE__ */ require_jsx_runtime.jsx(ConsumerStatus, { pods: groups.flatMap((group) => group.pods) }),
1378
1413
  /* @__PURE__ */ require_jsx_runtime.jsxs("small", { children: [
@@ -1387,27 +1422,31 @@ function NamespaceRows({ namespace, groups, clusterId, snapshotTime, usage, open
1387
1422
  "unknown"
1388
1423
  ] })
1389
1424
  ]
1390
- }), /* @__PURE__ */ require_jsx_runtime.jsxs("small", {
1391
- className: "consumer-subtitle",
1425
+ }), /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1392
1426
  title: "Resource totals include only consumers shown by the current filters",
1393
- children: [
1394
- groups.length,
1395
- " filtered consumers",
1396
- /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "·" }),
1397
- groups.reduce((total, group) => total + group.pods.length, 0),
1398
- " pods"
1399
- ]
1427
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("small", {
1428
+ className: "consumer-subtitle",
1429
+ children: [
1430
+ groups.length,
1431
+ " filtered consumers",
1432
+ /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "·" }),
1433
+ groups.reduce((total, group) => total + group.pods.length, 0),
1434
+ " pods"
1435
+ ]
1436
+ })
1400
1437
  })]
1401
1438
  }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
1402
1439
  className: "consumer-expand-slot",
1403
- children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1404
- className: "consumer-expand",
1405
- type: "button",
1440
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1406
1441
  title: open ? "Collapse namespace workloads" : "Expand namespace workloads",
1407
- "aria-label": `${open ? "Collapse" : "Expand"} workloads in ${namespace}`,
1408
- "aria-expanded": open,
1409
- onClick: toggleNamespace,
1410
- children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: open ? "expand_less" : "expand_more" })
1442
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1443
+ className: "consumer-expand",
1444
+ type: "button",
1445
+ "aria-label": `${open ? "Collapse" : "Expand"} workloads in ${namespace}`,
1446
+ "aria-expanded": open,
1447
+ onClick: toggleNamespace,
1448
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, { material: open ? "expand_less" : "expand_more" })
1449
+ })
1411
1450
  })
1412
1451
  })]
1413
1452
  }) }),