@64mb/freelens-power 2.1.1 → 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 (60) hide show
  1. package/README.md +4 -4
  2. package/out/main/common/power-logs.js.map +1 -1
  3. package/out/main/power-logs-child.js +3 -3
  4. package/out/main/power-logs-child.js.map +1 -1
  5. package/out/main/power-logs-database.js +165 -7
  6. package/out/main/power-logs-database.js.map +1 -1
  7. package/out/main/power-logs-ipc.js +12 -3
  8. package/out/main/power-logs-ipc.js.map +1 -1
  9. package/out/main/power-logs-worker.js +29 -7
  10. package/out/main/power-logs-worker.js.map +1 -1
  11. package/out/renderer/ai-diagnostic-handoff.js +2 -2
  12. package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
  13. package/out/renderer/ai-extras.js +1 -1
  14. package/out/renderer/ai-extras.js.map +1 -1
  15. package/out/renderer/ai.js +4 -1
  16. package/out/renderer/ai.js.map +1 -1
  17. package/out/renderer/diagnostics-screen-finding.js +51 -0
  18. package/out/renderer/diagnostics-screen-finding.js.map +1 -0
  19. package/out/renderer/diagnostics.css.js +1 -1
  20. package/out/renderer/diagnostics.css.js.map +1 -1
  21. package/out/renderer/diagnostics.js +12 -0
  22. package/out/renderer/diagnostics.js.map +1 -1
  23. package/out/renderer/index.js +2 -0
  24. package/out/renderer/index.js.map +1 -1
  25. package/out/renderer/pod-details-enhancements.js +106 -0
  26. package/out/renderer/pod-details-enhancements.js.map +1 -0
  27. package/out/renderer/power-log-json-cell.js +15 -14
  28. package/out/renderer/power-log-json-cell.js.map +1 -1
  29. package/out/renderer/power-log-json.js +14 -6
  30. package/out/renderer/power-log-json.js.map +1 -1
  31. package/out/renderer/power-log-sql-editor.js +31 -2
  32. package/out/renderer/power-log-sql-editor.js.map +1 -1
  33. package/out/renderer/power-logs-client.js +5 -0
  34. package/out/renderer/power-logs-client.js.map +1 -1
  35. package/out/renderer/power-logs-entrypoints.js +10 -36
  36. package/out/renderer/power-logs-entrypoints.js.map +1 -1
  37. package/out/renderer/power-logs.css.js +9 -2
  38. package/out/renderer/power-logs.css.js.map +1 -1
  39. package/out/renderer/power-logs.js +220 -91
  40. package/out/renderer/power-logs.js.map +1 -1
  41. package/out/renderer/preferences/logs-preferences.js +1 -1
  42. package/out/renderer/preferences/logs-preferences.js.map +1 -1
  43. package/out/renderer/relationship-map-finding.js +53 -0
  44. package/out/renderer/relationship-map-finding.js.map +1 -0
  45. package/out/renderer/resource-relationships.css.js +6 -0
  46. package/out/renderer/resource-relationships.css.js.map +1 -1
  47. package/out/renderer/resource-relationships.js +50 -5
  48. package/out/renderer/resource-relationships.js.map +1 -1
  49. package/out/renderer/resource-search.js +13 -3
  50. package/out/renderer/resource-search.js.map +1 -1
  51. package/out/renderer/src/common/gateway-relationships.js +8 -7
  52. package/out/renderer/src/common/gateway-relationships.js.map +1 -1
  53. package/out/renderer/src/common/power-log-json-filter-sql.js +12 -0
  54. package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -1
  55. package/out/renderer/src/common/power-log-json-preset.js +2 -2
  56. package/out/renderer/src/common/power-log-json-preset.js.map +1 -1
  57. package/out/renderer/src/common/power-logs.js.map +1 -1
  58. package/out/renderer/src/common/resource-relationships.js +10 -8
  59. package/out/renderer/src/common/resource-relationships.js.map +1 -1
  60. package/package.json +1 -1
@@ -46,9 +46,9 @@ var levels = [
46
46
  "unknown"
47
47
  ];
48
48
  var examples = [
49
- ["Recent", "SELECT message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200"],
50
- ["Errors", "SELECT pod, container, count(*) AS errors FROM logs WHERE level IN ('error','fatal') GROUP BY pod, container ORDER BY errors DESC"],
51
- ["Timeline", "SELECT strftime('%Y-%m-%d %H:%M', timestamp / 1000, 'unixepoch') AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute"],
49
+ ["Recent", "SELECT timestamp, level, message, container, pod FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200"],
50
+ ["Errors", "SELECT message, count(*) AS occurrences FROM logs WHERE level IN ('error','fatal') GROUP BY message ORDER BY occurrences DESC LIMIT 200"],
51
+ ["Timeline", "SELECT (timestamp / 60000) * 60000 AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute"],
52
52
  ["JSON", "SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100"]
53
53
  ];
54
54
  var sqlColumnWidth = (column) => column === "message" || column === "fieldsJson" ? 360 : column === "level" ? 90 : 200;
@@ -324,7 +324,7 @@ function LogDetails({ record, jsonColumn, onClose, onFilter }) {
324
324
  ]
325
325
  });
326
326
  }
327
- var sameFieldFilter = (a, b) => a.operator === b.operator && a.path.length === b.path.length && a.path.every((part, index) => part === b.path[index]) && require_power_log_field_filters.jsonValuesEqual(a.value, b.value);
327
+ var sameFieldValue = (a, b) => a.path.length === b.path.length && a.path.every((part, index) => part === b.path[index]) && require_power_log_field_filters.jsonValuesEqual(a.value, b.value);
328
328
  var fieldFilterLabel = (filter) => `${filter.path.reduce((path, part) => `${path}[${typeof part === "number" ? part : JSON.stringify(part)}]`, "$")} ${filter.operator === "eq" ? "=" : "!="} ${JSON.stringify(filter.value)}`;
329
329
  function FieldFilters({ filters, sql = false, disabled = false, onRemove }) {
330
330
  if (!filters.length) return null;
@@ -372,6 +372,7 @@ function Workspace({ clusterId, contextId }) {
372
372
  const [text, setText] = require__global_external_react.useState("");
373
373
  const [level, setLevel] = require__global_external_react.useState("");
374
374
  const [source, setSource] = require__global_external_react.useState(initialSource);
375
+ const [savedPoolFull, setSavedPoolFull] = require__global_external_react.useState(false);
375
376
  const [fieldFilters, setFieldFilters] = require__global_external_react.useState([]);
376
377
  const matchFields = require__global_external_react.useMemo(() => require_power_log_field_filters.compileJsonFilters(fieldFilters), [fieldFilters]);
377
378
  const parsedFields = require__global_external_react.useRef(/* @__PURE__ */ new WeakMap());
@@ -407,6 +408,7 @@ function Workspace({ clusterId, contextId }) {
407
408
  const [capturePending, setCapturePending] = require__global_external_react.useState(false);
408
409
  const [captureMinutes, setCaptureMinutes] = require__global_external_react.useState(15);
409
410
  const [previous, setPrevious] = require__global_external_react.useState(false);
411
+ const [sqlFitVersion, setSqlFitVersion] = require__global_external_react.useState(0);
410
412
  const [sql, updateSql] = require__global_external_react.useState(examples[0][1]);
411
413
  const sqlDraft = require__global_external_react.useRef(sql);
412
414
  sqlDraft.current = sql;
@@ -761,6 +763,7 @@ function Workspace({ clusterId, contextId }) {
761
763
  if (title === "Recent") {
762
764
  const query = examples[0][1];
763
765
  setSql(query);
766
+ setSqlFitVersion((version) => version + 1);
764
767
  setSelectedSqlRow(void 0);
765
768
  if (execute && captured) runQuery(captured, query);
766
769
  return;
@@ -789,6 +792,7 @@ function Workspace({ clusterId, contextId }) {
789
792
  }
790
793
  prepared = require_power_log_json_preset.buildJsonProjectionSql(keys);
791
794
  setSql(prepared);
795
+ setSqlFitVersion((version) => version + 1);
792
796
  setSelectedSqlRow(void 0);
793
797
  } catch {
794
798
  if (alive.current) setSqlError("Could not detect JSON fields for this snapshot. Try the preset again.");
@@ -805,7 +809,11 @@ function Workspace({ clusterId, contextId }) {
805
809
  setError("This JSON value is too large or unsupported for filtering");
806
810
  return;
807
811
  }
808
- if (fieldFilters.some((current) => sameFieldFilter(current, filter))) return;
812
+ const existing = fieldFilters.findIndex((current) => sameFieldValue(current, filter));
813
+ if (existing >= 0) {
814
+ if (fieldFilters[existing].operator !== filter.operator) setFieldFilters(fieldFilters.map((current, index) => index === existing ? filter : current));
815
+ return;
816
+ }
809
817
  if (fieldFilters.length >= 32) {
810
818
  setError("Up to 32 JSON filters can be combined");
811
819
  return;
@@ -842,7 +850,14 @@ function Workspace({ clusterId, contextId }) {
842
850
  return;
843
851
  }
844
852
  const filters = activeSqlFilters?.filters ?? [];
845
- if (filters.some((current) => current.column === column && sameFieldFilter(current, filter))) return;
853
+ const existing = filters.findIndex((current) => current.column === column && sameFieldValue(current, filter));
854
+ if (existing >= 0) {
855
+ if (filters[existing].operator !== filter.operator) applySqlFilters(filters.map((current, index) => index === existing ? {
856
+ ...filter,
857
+ column
858
+ } : current));
859
+ return;
860
+ }
846
861
  if (filters.length >= 32) {
847
862
  setSqlError("Up to 32 JSON filters can be combined");
848
863
  return;
@@ -959,6 +974,82 @@ function Workspace({ clusterId, contextId }) {
959
974
  if (alive.current) setDeletingCount(deleting.current.size);
960
975
  }
961
976
  };
977
+ const confirmDeleteCapture = (id) => {
978
+ const capture = captures.find((capture) => capture.id === id);
979
+ if (!capture) return;
980
+ require_extensions.Renderer.Component.ConfirmDialog.open({
981
+ message: /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [
982
+ "Delete snapshot ",
983
+ /* @__PURE__ */ require_jsx_runtime.jsx("strong", { children: capture.target.name }),
984
+ "? This cannot be undone."
985
+ ] }),
986
+ labelOk: "Delete snapshot",
987
+ ok: () => deleteCapture(id)
988
+ });
989
+ };
990
+ const confirmPersistentCapture = (capture) => {
991
+ const persistent = !capture.persistent;
992
+ require_extensions.Renderer.Component.ConfirmDialog.open({
993
+ message: persistent ? /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [
994
+ "Keep snapshot ",
995
+ /* @__PURE__ */ require_jsx_runtime.jsx("strong", { children: capture.target.name }),
996
+ " until you delete it? It will survive restarts and will not expire automatically."
997
+ ] }) : /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [
998
+ "Allow snapshot ",
999
+ /* @__PURE__ */ require_jsx_runtime.jsx("strong", { children: capture.target.name }),
1000
+ " to expire? Its retention period will start again now."
1001
+ ] }),
1002
+ labelOk: persistent ? "Keep snapshot" : "Allow expiration",
1003
+ ok: async () => {
1004
+ if (!alive.current || deleting.current.has(capture.id) || queryRef.current || captureController.current) return;
1005
+ deleting.current.add(capture.id);
1006
+ setDeletingCount(deleting.current.size);
1007
+ try {
1008
+ await drafts.flush();
1009
+ await client.setPersistent(capture.id, persistent);
1010
+ await refreshCaptures();
1011
+ } catch (error) {
1012
+ if (alive.current) {
1013
+ const full = error instanceof Error && error.message.includes("Saved snapshot limit reached");
1014
+ setSavedPoolFull(full);
1015
+ setError(full ? "Saved snapshot limit reached. Delete a saved snapshot or clear saved snapshots from all clusters." : "Could not update snapshot retention");
1016
+ }
1017
+ } finally {
1018
+ deleting.current.delete(capture.id);
1019
+ if (alive.current) setDeletingCount(deleting.current.size);
1020
+ }
1021
+ }
1022
+ });
1023
+ };
1024
+ const clearSavedSnapshots = () => require_extensions.Renderer.Component.ConfirmDialog.open({
1025
+ message: "Delete all saved snapshots from all clusters? Temporary snapshots will be kept. This cannot be undone.",
1026
+ labelOk: "Clear saved snapshots",
1027
+ ok: async () => {
1028
+ if (queryRef.current || captureController.current || deleting.current.size) return;
1029
+ deleting.current.add("clear-saved");
1030
+ setDeletingCount(deleting.current.size);
1031
+ try {
1032
+ await drafts.flush();
1033
+ await client.clearPersistent();
1034
+ const removed = captures.filter((capture) => capture.persistent);
1035
+ for (const capture of removed) drafts.forget(capture.id);
1036
+ if (removed.some((capture) => capture.id === captureSelection.current)) {
1037
+ setCaptureId("");
1038
+ setResult(void 0);
1039
+ setResultEvidence(void 0);
1040
+ setSelectedSqlRow(void 0);
1041
+ }
1042
+ setSavedPoolFull(false);
1043
+ setError("");
1044
+ await refreshCaptures();
1045
+ } catch {
1046
+ if (alive.current) setError("Could not clear saved snapshots");
1047
+ } finally {
1048
+ deleting.current.delete("clear-saved");
1049
+ if (alive.current) setDeletingCount(deleting.current.size);
1050
+ }
1051
+ }
1052
+ });
962
1053
  const native = () => {
963
1054
  const first = sources[0];
964
1055
  const pod = require_extensions.Renderer.K8sApi.podsStore.getItems().find((item) => target?.kind === "Pod" ? item.metadata.uid === target.uid : item.metadata.uid === first?.podUid);
@@ -1156,10 +1247,15 @@ function Workspace({ clusterId, contextId }) {
1156
1247
  ]
1157
1248
  })
1158
1249
  }) : /* @__PURE__ */ require_jsx_runtime.jsx(SourcePicker, {}),
1159
- error && /* @__PURE__ */ require_jsx_runtime.jsx("div", {
1250
+ error && /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1160
1251
  role: "alert",
1161
1252
  className: "power-logs-notice power-logs-error",
1162
- children: error
1253
+ children: [error, savedPoolFull && /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1254
+ type: "button",
1255
+ disabled: deletingCount > 0 || !!queryId || capturePending,
1256
+ onClick: clearSavedSnapshots,
1257
+ children: "Clear saved snapshots"
1258
+ })]
1163
1259
  }),
1164
1260
  tab === "live" ? /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [
1165
1261
  /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
@@ -1321,7 +1417,7 @@ function Workspace({ clusterId, contextId }) {
1321
1417
  if (button && !button.disabled) {
1322
1418
  event.preventDefault();
1323
1419
  event.stopPropagation();
1324
- deleteCapture(button.dataset.captureDelete);
1420
+ confirmDeleteCapture(button.dataset.captureDelete);
1325
1421
  }
1326
1422
  },
1327
1423
  renderOption: (option, context) => {
@@ -1329,43 +1425,71 @@ function Workspace({ clusterId, contextId }) {
1329
1425
  if (context !== "menu" || !item) return option.label;
1330
1426
  return /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1331
1427
  className: "power-logs-snapshot-option",
1332
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1333
- title: option.label,
1334
- children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1335
- className: "power-logs-option-text",
1336
- children: [/* @__PURE__ */ require_jsx_runtime.jsx("strong", { children: item.target.name }), /* @__PURE__ */ require_jsx_runtime.jsxs("small", { children: [
1337
- require_date_time.formatDateTime(item.createdAt),
1338
- " · ",
1339
- item.rows.toLocaleString(),
1340
- " lines ·",
1341
- " ",
1342
- item.state[0].toUpperCase(),
1343
- item.state.slice(1)
1344
- ] })]
1345
- })
1346
- }), /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1347
- title: "Delete snapshot (Alt+Delete)",
1348
- children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1349
- type: "button",
1350
- "aria-label": `Delete snapshot ${item.target.name}`,
1351
- "data-capture-delete": item.id,
1352
- onKeyDown: (event) => event.stopPropagation(),
1353
- disabled: !!queryId || capturePending || deletingCount > 0 || item.state === "collecting",
1354
- onMouseDown: (event) => {
1355
- event.preventDefault();
1356
- event.stopPropagation();
1357
- },
1358
- onClick: (event) => {
1359
- event.preventDefault();
1360
- event.stopPropagation();
1361
- deleteCapture(item.id);
1362
- },
1363
- children: /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
1364
- material: "delete_outline",
1365
- size: 16
1428
+ children: [
1429
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1430
+ title: option.label,
1431
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1432
+ className: "power-logs-option-text",
1433
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx("strong", { children: item.target.name }), /* @__PURE__ */ require_jsx_runtime.jsxs("small", { children: [
1434
+ require_date_time.formatDateTime(item.createdAt),
1435
+ " · ",
1436
+ item.rows.toLocaleString(),
1437
+ " lines ·",
1438
+ " ",
1439
+ item.state[0].toUpperCase(),
1440
+ item.state.slice(1),
1441
+ item.persistent ? " · Persistent" : ""
1442
+ ] })]
1443
+ })
1444
+ }),
1445
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1446
+ title: item.persistent ? "Allow snapshot to expire" : "Keep snapshot",
1447
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1448
+ type: "button",
1449
+ "aria-label": `${item.persistent ? "Allow expiration for" : "Keep"} snapshot ${item.target.name}`,
1450
+ "aria-pressed": Boolean(item.persistent),
1451
+ "data-capture-persistent": item.id,
1452
+ onKeyDown: (event) => event.stopPropagation(),
1453
+ disabled: !!queryId || capturePending || deletingCount > 0 || item.state === "collecting",
1454
+ onMouseDown: (event) => {
1455
+ event.preventDefault();
1456
+ event.stopPropagation();
1457
+ },
1458
+ onClick: (event) => {
1459
+ event.preventDefault();
1460
+ event.stopPropagation();
1461
+ confirmPersistentCapture(item);
1462
+ },
1463
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
1464
+ material: "push_pin",
1465
+ size: 16
1466
+ })
1467
+ })
1468
+ }),
1469
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1470
+ title: "Delete snapshot (Alt+Delete)",
1471
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("button", {
1472
+ type: "button",
1473
+ "aria-label": `Delete snapshot ${item.target.name}`,
1474
+ "data-capture-delete": item.id,
1475
+ onKeyDown: (event) => event.stopPropagation(),
1476
+ disabled: !!queryId || capturePending || deletingCount > 0 || item.state === "collecting",
1477
+ onMouseDown: (event) => {
1478
+ event.preventDefault();
1479
+ event.stopPropagation();
1480
+ },
1481
+ onClick: (event) => {
1482
+ event.preventDefault();
1483
+ event.stopPropagation();
1484
+ confirmDeleteCapture(item.id);
1485
+ },
1486
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
1487
+ material: "delete_outline",
1488
+ size: 16
1489
+ })
1366
1490
  })
1367
1491
  })
1368
- })]
1492
+ ]
1369
1493
  });
1370
1494
  },
1371
1495
  value: captureId,
@@ -1382,7 +1506,7 @@ function Workspace({ clusterId, contextId }) {
1382
1506
  label: "Choose a snapshot"
1383
1507
  }, ...captures.map((item) => ({
1384
1508
  value: item.id,
1385
- label: `${item.target.name} · ${require_date_time.formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}`
1509
+ label: `${item.target.name} · ${require_date_time.formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}${item.persistent ? " · Persistent" : ""}`
1386
1510
  }))]
1387
1511
  }),
1388
1512
  /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
@@ -1401,14 +1525,6 @@ function Workspace({ clusterId, contextId }) {
1401
1525
  })
1402
1526
  ]
1403
1527
  }),
1404
- !!chosenCapture?.notes.length && /* @__PURE__ */ require_jsx_runtime.jsxs("details", {
1405
- className: "power-logs-snapshot-notes power-logs-muted",
1406
- children: [/* @__PURE__ */ require_jsx_runtime.jsxs("summary", { children: [
1407
- "Snapshot notes (",
1408
- chosenCapture.notes.length,
1409
- ")"
1410
- ] }), chosenCapture.notes.map((note) => /* @__PURE__ */ require_jsx_runtime.jsx("div", { children: note }, note))]
1411
- }),
1412
1528
  /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1413
1529
  className: "power-logs-toolbar power-logs-sql-tools",
1414
1530
  children: [
@@ -1442,7 +1558,13 @@ function Workspace({ clusterId, contextId }) {
1442
1558
  examples.map(([title, query]) => /* @__PURE__ */ require_jsx_runtime.jsxs("button", {
1443
1559
  type: "button",
1444
1560
  disabled: !!queryId || capturePending,
1445
- onClick: () => title === "JSON" || title === "Recent" ? void applyPreset(title) : setSql(query),
1561
+ onClick: () => {
1562
+ if (title === "JSON" || title === "Recent") applyPreset(title);
1563
+ else {
1564
+ setSql(query);
1565
+ setSqlFitVersion((version) => version + 1);
1566
+ }
1567
+ },
1446
1568
  children: [
1447
1569
  /* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
1448
1570
  material: title === "Recent" ? "history" : title === "Errors" ? "error_outline" : title === "Timeline" ? "timeline" : "data_object",
@@ -1464,7 +1586,8 @@ function Workspace({ clusterId, contextId }) {
1464
1586
  /* @__PURE__ */ require_jsx_runtime.jsx(require_power_log_sql_editor.SqlEditor, {
1465
1587
  id: "power-logs-sql",
1466
1588
  value: sql,
1467
- onChange: setSql
1589
+ onChange: setSql,
1590
+ fitVersion: sqlFitVersion
1468
1591
  }),
1469
1592
  sqlError && /* @__PURE__ */ require_jsx_runtime.jsx("div", {
1470
1593
  role: "alert",
@@ -1521,8 +1644,7 @@ function Workspace({ clusterId, contextId }) {
1521
1644
  value: cell === null ? null : String(cell),
1522
1645
  column: result.columns[j],
1523
1646
  rawValue: cell,
1524
- Icon,
1525
- onFilter: sqlFilteringDisabled ? void 0 : (filter) => addSqlFilter(result.columns[j], filter)
1647
+ Icon
1526
1648
  })
1527
1649
  }, j))
1528
1650
  }, i)) })
@@ -1592,41 +1714,48 @@ function Workspace({ clusterId, contextId }) {
1592
1714
  ] }),
1593
1715
  /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
1594
1716
  className: "power-logs-muted power-logs-footer",
1595
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1596
- title: `Gentle collection: ${limits.requestsPerSecond} requests/s, ${limits.bytesPerSecond / 1048576} MiB/s. Captures: ${limits.captureSourceLines.toLocaleString()} lines / ${limits.captureSourceBytes / 1048576} MiB per source, ${limits.captureBytes / 1048576} MiB total. Up to ${limits.captures} snapshots retained for ${limits.ttlMs / 6e4} minutes.`,
1597
- children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1598
- className: "power-logs-caption",
1599
- children: [
1600
- "Gentle collection · ",
1601
- limits.requestsPerSecond,
1602
- " requests/s · ",
1603
- limits.bytesPerSecond / 1048576,
1604
- " MiB/s · Captures limited to ",
1605
- limits.captureSourceLines.toLocaleString(),
1606
- " lines /",
1607
- " ",
1608
- limits.captureSourceBytes / 1048576,
1609
- " MiB per source and ",
1610
- limits.captureBytes / 1048576,
1611
- " MiB total · Up to",
1612
- " ",
1613
- limits.captures,
1614
- " temporary snapshots, retained for ",
1615
- limits.ttlMs / 6e4,
1616
- " min"
1617
- ]
1618
- })
1619
- }), collectionNotes.length > 0 && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1620
- title: collectionNotes.join("\n"),
1621
- children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1622
- role: "note",
1623
- className: "power-logs-notice power-logs-collection-note",
1624
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
1625
- material: "warning_amber",
1626
- size: 14
1627
- }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: collectionNotes.join(" · ") })]
1717
+ children: [
1718
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1719
+ title: `Gentle collection: ${limits.requestsPerSecond} requests/s, ${limits.bytesPerSecond / 1048576} MiB/s. Captures: ${limits.captureSourceLines.toLocaleString()} lines / ${limits.captureSourceBytes / 1048576} MiB per source, ${limits.captureBytes / 1048576} MiB total. Up to ${limits.captures} snapshots retained for ${limits.ttlMs / 6e4} minutes.`,
1720
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1721
+ className: "power-logs-caption",
1722
+ children: [
1723
+ "Collection · ",
1724
+ limits.requestsPerSecond,
1725
+ " req/s · ",
1726
+ limits.bytesPerSecond / 1048576,
1727
+ " MiB/s ·",
1728
+ " ",
1729
+ limits.captureBytes / 1048576,
1730
+ " MiB/snapshot · Retention ",
1731
+ limits.ttlMs / 6e4,
1732
+ " min"
1733
+ ]
1734
+ })
1735
+ }),
1736
+ tab === "live" && collectionNotes.length > 0 && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1737
+ title: collectionNotes.join("\n"),
1738
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1739
+ role: "note",
1740
+ className: "power-logs-notice power-logs-collection-note",
1741
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
1742
+ material: "warning_amber",
1743
+ size: 14
1744
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: collectionNotes.join(" · ") })]
1745
+ })
1746
+ }),
1747
+ tab === "captures" && chosenCapture && (chosenCapture.state === "partial" || chosenCapture.notes.length > 0) && /* @__PURE__ */ require_jsx_runtime.jsx(require_native_tooltip.NativeTooltip, {
1748
+ title: chosenCapture.notes.join("\n") || "Collection stopped or a source was unavailable; this snapshot may be incomplete",
1749
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
1750
+ role: "note",
1751
+ className: "power-logs-notice power-logs-collection-note",
1752
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
1753
+ material: "warning_amber",
1754
+ size: 14
1755
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Incomplete snapshot" })]
1756
+ })
1628
1757
  })
1629
- })]
1758
+ ]
1630
1759
  })
1631
1760
  ]
1632
1761
  });