@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
@@ -47,12 +47,6 @@ function openPowerLogs(target, container) {
47
47
  } }));
48
48
  require_extensions.Renderer.Navigation.hideDetails();
49
49
  }
50
- function cachedWorkloadPods(target) {
51
- const owners = /* @__PURE__ */ new Set([target.uid]);
52
- const intermediates = target.kind === "Deployment" ? require_extensions.Renderer.K8sApi.replicaSetStore?.items : target.kind === "CronJob" ? require_extensions.Renderer.K8sApi.jobStore?.items : [];
53
- for (const object of intermediates ?? []) if (object.metadata.namespace === target.namespace && object.metadata.uid && object.metadata.ownerReferences?.some((owner) => owner.controller === true && owner.uid === target.uid)) owners.add(object.metadata.uid);
54
- return require_extensions.Renderer.K8sApi.podsStore.items.filter((pod) => pod.metadata.namespace === target.namespace && pod.metadata.ownerReferences?.some((owner) => owner.controller === true && owners.has(owner.uid)));
55
- }
56
50
  function containerStatusClass(container, status) {
57
51
  const state = Object.keys(status.state ?? {})[0] ?? "";
58
52
  const lastState = Object.keys(status.lastState ?? {})[0];
@@ -72,12 +66,12 @@ var PowerLogsMenu = require__global_external_mobx_react.observer(({ object, tool
72
66
  if (!target) return null;
73
67
  const containers = target.kind === "Pod" ? object.getAllContainersWithType() : [];
74
68
  const statuses = target.kind === "Pod" ? object.getContainerStatuses?.() ?? [] : [];
75
- const pods = target.kind === "Pod" ? [] : cachedWorkloadPods(target);
76
69
  const open = (event, container) => {
77
70
  event.stopPropagation();
78
71
  openPowerLogs(target, container);
79
72
  };
80
73
  return /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.MenuItem, {
74
+ className: "power-logs-entry-menu",
81
75
  onClick: (event) => open(event),
82
76
  children: [
83
77
  /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
@@ -90,37 +84,17 @@ var PowerLogsMenu = require__global_external_mobx_react.observer(({ object, tool
90
84
  [marker]: JSON.stringify(target),
91
85
  children: "Logs"
92
86
  }),
93
- (containers.length > 0 || pods.length > 0) && /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
87
+ containers.length > 0 && /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
94
88
  className: "arrow",
95
89
  material: "keyboard_arrow_right"
96
- }), /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.SubMenu, { children: [
97
- /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.MenuItem, {
98
- onClick: (event) => open(event),
99
- children: /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: target.kind === "Pod" ? "All containers" : "All pods" })
100
- }),
101
- containers.map((container) => /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.MenuItem, {
102
- onClick: (event) => open(event, container.name),
103
- children: [statuses.filter((status) => status.name === container.name).map((status) => /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.StatusBrick, { className: containerStatusClass(container, status) }, status.name)), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: container.name })]
104
- }, container.name)),
105
- pods.map((pod) => {
106
- const status = pod.getStatus();
107
- return /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.MenuItem, {
108
- onClick: (event) => {
109
- event.stopPropagation();
110
- openPowerLogs({
111
- kind: "Pod",
112
- name: pod.getName(),
113
- namespace: pod.getNs(),
114
- uid: pod.metadata.uid ?? ""
115
- });
116
- },
117
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.StatusBrick, {
118
- tooltip: status,
119
- className: status.toLowerCase().replaceAll(" ", "-")
120
- }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: pod.getName() })]
121
- }, pod.metadata.uid);
122
- })
123
- ] })] })
90
+ }), /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.SubMenu, { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.MenuItem, {
91
+ onClick: (event) => open(event),
92
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "All containers" })
93
+ }), containers.map((container) => /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.MenuItem, {
94
+ onClick: (event) => open(event, container.name),
95
+ children: [statuses.filter((status) => status.name === container.name).map((status) => /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.StatusBrick, { className: containerStatusClass(container, status) }, status.name)), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: container.name })]
96
+ }, container.name))] })] }),
97
+ /* @__PURE__ */ require_jsx_runtime.jsx("style", { children: `.power-logs-entry-menu .SubMenu .MenuItem:hover { background-color:var(--primary)!important; }` })
124
98
  ]
125
99
  });
126
100
  });
@@ -1 +1 @@
1
- {"version":3,"file":"power-logs-entrypoints.js","names":[],"sources":["../../src/renderer/power-logs-entrypoints.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { EXTENSION_ID } from \"../common/extension-info\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\n\nimport type { LogTarget, LogWorkloadKind } from \"../common/power-logs\";\n\nconst kinds = new Set<string>([\"Pod\", \"Deployment\", \"DaemonSet\", \"StatefulSet\", \"ReplicaSet\", \"Job\", \"CronJob\"]);\nconst marker = \"data-power-logs-target\";\n\nfunction enabled(): boolean {\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n return Boolean(\n clusterId &&\n window.location.protocol === \"https:\" &&\n window.location.hostname === `${clusterId}.renderer.freelens.app` &&\n LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled &&\n PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled,\n );\n}\n\nexport function parsePowerLogsTarget(value: unknown): LogTarget | undefined {\n if (!value || typeof value !== \"object\") return;\n const target = value as LogTarget;\n if (\n !kinds.has(target.kind) ||\n ![target.name, target.namespace, target.uid].every(\n (part) => typeof part === \"string\" && part.length > 0 && part.length <= 253 && /^[a-zA-Z0-9_.-]+$/.test(part),\n )\n )\n return;\n return { kind: target.kind, namespace: target.namespace, name: target.name, uid: target.uid };\n}\n\nexport function openPowerLogs(target: LogTarget, container?: string): void {\n const valid = parsePowerLogsTarget(target);\n if (!valid || !enabled()) return;\n if (container !== undefined && !/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(container)) return;\n if (container && container.length > 63) return;\n Renderer.Navigation.navigate(\n `/extension/${EXTENSION_ID}/power-logs?target=${encodeURIComponent(JSON.stringify(valid))}${container ? `&container=${encodeURIComponent(container)}` : \"\"}`,\n );\n window.dispatchEvent(new CustomEvent(\"power-logs-target\", { detail: { ...valid, container } }));\n Renderer.Navigation.hideDetails();\n}\n\nfunction cachedWorkloadPods(target: LogTarget): Renderer.K8sApi.Pod[] {\n const owners = new Set([target.uid]);\n const intermediates =\n target.kind === \"Deployment\"\n ? Renderer.K8sApi.replicaSetStore?.items\n : target.kind === \"CronJob\"\n ? Renderer.K8sApi.jobStore?.items\n : [];\n for (const object of intermediates ?? []) {\n if (\n object.metadata.namespace === target.namespace &&\n object.metadata.uid &&\n object.metadata.ownerReferences?.some((owner) => owner.controller === true && owner.uid === target.uid)\n )\n owners.add(object.metadata.uid);\n }\n return Renderer.K8sApi.podsStore.items.filter(\n (pod) =>\n pod.metadata.namespace === target.namespace &&\n pod.metadata.ownerReferences?.some((owner) => owner.controller === true && owners.has(owner.uid)),\n );\n}\n\nfunction containerStatusClass(\n container: { type?: string },\n status: ReturnType<Renderer.K8sApi.Pod[\"getContainerStatuses\"]>[number],\n): string {\n const state = Object.keys(status.state ?? {})[0] ?? \"\";\n const lastState = Object.keys(status.lastState ?? {})[0];\n if (state === \"terminated\" || (container.type === \"ephemeralContainers\" && lastState === \"terminated\"))\n return \"terminated\";\n if (container.type === \"ephemeralContainers\") return \"container-ephemeral\";\n if (status.ready) return status.restartCount > 0 ? \"restarted\" : \"running\";\n return state === \"running\" ? \"waiting\" : state;\n}\n\nexport const PowerLogsMenu = observer(\n ({ object, toolbar }: Renderer.Component.KubeObjectMenuProps<Renderer.K8sApi.KubeObject>) => {\n if (!enabled()) return null;\n const target = parsePowerLogsTarget({\n kind: object.kind as LogWorkloadKind,\n name: object.metadata.name,\n namespace: object.metadata.namespace,\n uid: object.metadata.uid,\n });\n if (!target) return null;\n const containers = target.kind === \"Pod\" ? (object as Renderer.K8sApi.Pod).getAllContainersWithType() : [];\n const statuses = target.kind === \"Pod\" ? ((object as Renderer.K8sApi.Pod).getContainerStatuses?.() ?? []) : [];\n const pods = target.kind === \"Pod\" ? [] : cachedWorkloadPods(target);\n const open = (event: React.MouseEvent, container?: string) => {\n event.stopPropagation();\n openPowerLogs(target, container);\n };\n return (\n <Renderer.Component.MenuItem onClick={(event) => open(event)}>\n <Renderer.Component.Icon material=\"subject\" interactive={toolbar} tooltip=\"Power Logs\" />\n <span className=\"title\" {...{ [marker]: JSON.stringify(target) }}>\n Logs\n </span>\n {(containers.length > 0 || pods.length > 0) && (\n <>\n <Renderer.Component.Icon className=\"arrow\" material=\"keyboard_arrow_right\" />\n <Renderer.Component.SubMenu>\n <Renderer.Component.MenuItem onClick={(event) => open(event)}>\n <span>{target.kind === \"Pod\" ? \"All containers\" : \"All pods\"}</span>\n </Renderer.Component.MenuItem>\n {containers.map((container) => (\n <Renderer.Component.MenuItem key={container.name} onClick={(event) => open(event, container.name)}>\n {statuses\n .filter((status) => status.name === container.name)\n .map((status) => (\n <Renderer.Component.StatusBrick\n key={status.name}\n className={containerStatusClass(container, status)}\n />\n ))}\n <span>{container.name}</span>\n </Renderer.Component.MenuItem>\n ))}\n {pods.map((pod) => {\n const status = pod.getStatus();\n return (\n <Renderer.Component.MenuItem\n key={pod.metadata.uid}\n onClick={(event) => {\n event.stopPropagation();\n openPowerLogs({\n kind: \"Pod\",\n name: pod.getName(),\n namespace: pod.getNs(),\n uid: pod.metadata.uid ?? \"\",\n });\n }}\n >\n <Renderer.Component.StatusBrick\n tooltip={status}\n className={status.toLowerCase().replaceAll(\" \", \"-\")}\n />\n <span>{pod.getName()}</span>\n </Renderer.Component.MenuItem>\n );\n })}\n </Renderer.Component.SubMenu>\n </>\n )}\n </Renderer.Component.MenuItem>\n );\n },\n);\n\nexport function startPowerLogsEntrypoints(): () => void {\n const hidden = new Map<HTMLElement, { value: string; priority: string; replacement: HTMLElement }>();\n let stopped = false;\n const restore = (element: HTMLElement) => {\n const original = hidden.get(element);\n if (!original) return;\n element.style.setProperty(\"display\", original.value, original.priority);\n if (!original.value) element.style.removeProperty(\"display\");\n hidden.delete(element);\n };\n const synchronize = () => {\n const active = !stopped && enabled();\n for (const [element, state] of hidden) {\n if (!active || !state.replacement.isConnected || !element.isConnected) restore(element);\n }\n if (!active) return;\n for (const label of document.querySelectorAll<HTMLElement>(`[${marker}]`)) {\n const replacement = label.closest<HTMLElement>(\".MenuItem\");\n if (!replacement?.parentElement) continue;\n for (const sibling of replacement.parentElement.children) {\n if (\n !(sibling instanceof HTMLElement) ||\n sibling === replacement ||\n !sibling.matches(\".MenuItem\") ||\n sibling.querySelector(`[${marker}]`)\n )\n continue;\n const title = sibling.querySelector(\":scope > .title\");\n const icon = sibling.querySelector(\":scope > .Icon\");\n if (title?.textContent?.trim() !== \"Logs\" || icon?.textContent?.trim() !== \"subject\") continue;\n if (!hidden.has(sibling))\n hidden.set(sibling, {\n value: sibling.style.getPropertyValue(\"display\"),\n priority: sibling.style.getPropertyPriority(\"display\"),\n replacement,\n });\n if (sibling.style.display !== \"none\") sibling.style.setProperty(\"display\", \"none\");\n }\n }\n };\n const click = (event: MouseEvent) => {\n if (!enabled() || !(event.target instanceof Element)) return;\n const icon = event.target.closest(\".Icon\");\n if (!icon || icon.textContent?.trim() !== \"subject\" || !icon.closest(\".TableCell.logs\")) return;\n const row = icon.closest(\".TableRow\");\n if (!row || !/^\\/pods\\/?$/.test(window.location.pathname)) return;\n const name = row.querySelector(\".TableCell.name\")?.textContent?.trim();\n const namespace = row.querySelector(\".TableCell.namespace\")?.textContent?.trim();\n if (!name || !namespace) return;\n const matches = Renderer.K8sApi.podsStore.items.filter(\n (pod) => pod.getName() === name && pod.getNs() === namespace,\n );\n if (matches.length !== 1 || !matches[0].getAllContainers().length) return;\n const target = parsePowerLogsTarget({ kind: \"Pod\", name, namespace, uid: matches[0].metadata.uid });\n if (!target) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n openPowerLogs(target);\n };\n const observer = new MutationObserver(synchronize);\n observer.observe(document.body, { childList: true, subtree: true });\n document.addEventListener(\"click\", click, true);\n const stopReaction = reaction(enabled, synchronize, { fireImmediately: true });\n return () => {\n stopped = true;\n observer.disconnect();\n stopReaction();\n document.removeEventListener(\"click\", click, true);\n for (const element of hidden.keys()) restore(element);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"power-logs-entrypoints.js","names":[],"sources":["../../src/renderer/power-logs-entrypoints.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { EXTENSION_ID } from \"../common/extension-info\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\n\nimport type { LogTarget, LogWorkloadKind } from \"../common/power-logs\";\n\nconst kinds = new Set<string>([\"Pod\", \"Deployment\", \"DaemonSet\", \"StatefulSet\", \"ReplicaSet\", \"Job\", \"CronJob\"]);\nconst marker = \"data-power-logs-target\";\n\nfunction enabled(): boolean {\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n return Boolean(\n clusterId &&\n window.location.protocol === \"https:\" &&\n window.location.hostname === `${clusterId}.renderer.freelens.app` &&\n LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled &&\n PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled,\n );\n}\n\nexport function parsePowerLogsTarget(value: unknown): LogTarget | undefined {\n if (!value || typeof value !== \"object\") return;\n const target = value as LogTarget;\n if (\n !kinds.has(target.kind) ||\n ![target.name, target.namespace, target.uid].every(\n (part) => typeof part === \"string\" && part.length > 0 && part.length <= 253 && /^[a-zA-Z0-9_.-]+$/.test(part),\n )\n )\n return;\n return { kind: target.kind, namespace: target.namespace, name: target.name, uid: target.uid };\n}\n\nexport function openPowerLogs(target: LogTarget, container?: string): void {\n const valid = parsePowerLogsTarget(target);\n if (!valid || !enabled()) return;\n if (container !== undefined && !/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(container)) return;\n if (container && container.length > 63) return;\n Renderer.Navigation.navigate(\n `/extension/${EXTENSION_ID}/power-logs?target=${encodeURIComponent(JSON.stringify(valid))}${container ? `&container=${encodeURIComponent(container)}` : \"\"}`,\n );\n window.dispatchEvent(new CustomEvent(\"power-logs-target\", { detail: { ...valid, container } }));\n Renderer.Navigation.hideDetails();\n}\n\nfunction containerStatusClass(\n container: { type?: string },\n status: ReturnType<Renderer.K8sApi.Pod[\"getContainerStatuses\"]>[number],\n): string {\n const state = Object.keys(status.state ?? {})[0] ?? \"\";\n const lastState = Object.keys(status.lastState ?? {})[0];\n if (state === \"terminated\" || (container.type === \"ephemeralContainers\" && lastState === \"terminated\"))\n return \"terminated\";\n if (container.type === \"ephemeralContainers\") return \"container-ephemeral\";\n if (status.ready) return status.restartCount > 0 ? \"restarted\" : \"running\";\n return state === \"running\" ? \"waiting\" : state;\n}\n\nexport const PowerLogsMenu = observer(\n ({ object, toolbar }: Renderer.Component.KubeObjectMenuProps<Renderer.K8sApi.KubeObject>) => {\n if (!enabled()) return null;\n const target = parsePowerLogsTarget({\n kind: object.kind as LogWorkloadKind,\n name: object.metadata.name,\n namespace: object.metadata.namespace,\n uid: object.metadata.uid,\n });\n if (!target) return null;\n const containers = target.kind === \"Pod\" ? (object as Renderer.K8sApi.Pod).getAllContainersWithType() : [];\n const statuses = target.kind === \"Pod\" ? ((object as Renderer.K8sApi.Pod).getContainerStatuses?.() ?? []) : [];\n const open = (event: React.MouseEvent, container?: string) => {\n event.stopPropagation();\n openPowerLogs(target, container);\n };\n return (\n <Renderer.Component.MenuItem className=\"power-logs-entry-menu\" onClick={(event) => open(event)}>\n <Renderer.Component.Icon material=\"subject\" interactive={toolbar} tooltip=\"Power Logs\" />\n <span className=\"title\" {...{ [marker]: JSON.stringify(target) }}>\n Logs\n </span>\n {containers.length > 0 && (\n <>\n <Renderer.Component.Icon className=\"arrow\" material=\"keyboard_arrow_right\" />\n <Renderer.Component.SubMenu>\n <Renderer.Component.MenuItem onClick={(event) => open(event)}>\n <span>All containers</span>\n </Renderer.Component.MenuItem>\n {containers.map((container) => (\n <Renderer.Component.MenuItem key={container.name} onClick={(event) => open(event, container.name)}>\n {statuses\n .filter((status) => status.name === container.name)\n .map((status) => (\n <Renderer.Component.StatusBrick\n key={status.name}\n className={containerStatusClass(container, status)}\n />\n ))}\n <span>{container.name}</span>\n </Renderer.Component.MenuItem>\n ))}\n </Renderer.Component.SubMenu>\n </>\n )}\n <style>{`.power-logs-entry-menu .SubMenu .MenuItem:hover { background-color:var(--primary)!important; }`}</style>\n </Renderer.Component.MenuItem>\n );\n },\n);\n\nexport function startPowerLogsEntrypoints(): () => void {\n const hidden = new Map<HTMLElement, { value: string; priority: string; replacement: HTMLElement }>();\n let stopped = false;\n const restore = (element: HTMLElement) => {\n const original = hidden.get(element);\n if (!original) return;\n element.style.setProperty(\"display\", original.value, original.priority);\n if (!original.value) element.style.removeProperty(\"display\");\n hidden.delete(element);\n };\n const synchronize = () => {\n const active = !stopped && enabled();\n for (const [element, state] of hidden) {\n if (!active || !state.replacement.isConnected || !element.isConnected) restore(element);\n }\n if (!active) return;\n for (const label of document.querySelectorAll<HTMLElement>(`[${marker}]`)) {\n const replacement = label.closest<HTMLElement>(\".MenuItem\");\n if (!replacement?.parentElement) continue;\n for (const sibling of replacement.parentElement.children) {\n if (\n !(sibling instanceof HTMLElement) ||\n sibling === replacement ||\n !sibling.matches(\".MenuItem\") ||\n sibling.querySelector(`[${marker}]`)\n )\n continue;\n const title = sibling.querySelector(\":scope > .title\");\n const icon = sibling.querySelector(\":scope > .Icon\");\n if (title?.textContent?.trim() !== \"Logs\" || icon?.textContent?.trim() !== \"subject\") continue;\n if (!hidden.has(sibling))\n hidden.set(sibling, {\n value: sibling.style.getPropertyValue(\"display\"),\n priority: sibling.style.getPropertyPriority(\"display\"),\n replacement,\n });\n if (sibling.style.display !== \"none\") sibling.style.setProperty(\"display\", \"none\");\n }\n }\n };\n const click = (event: MouseEvent) => {\n if (!enabled() || !(event.target instanceof Element)) return;\n const icon = event.target.closest(\".Icon\");\n if (!icon || icon.textContent?.trim() !== \"subject\" || !icon.closest(\".TableCell.logs\")) return;\n const row = icon.closest(\".TableRow\");\n if (!row || !/^\\/pods\\/?$/.test(window.location.pathname)) return;\n const name = row.querySelector(\".TableCell.name\")?.textContent?.trim();\n const namespace = row.querySelector(\".TableCell.namespace\")?.textContent?.trim();\n if (!name || !namespace) return;\n const matches = Renderer.K8sApi.podsStore.items.filter(\n (pod) => pod.getName() === name && pod.getNs() === namespace,\n );\n if (matches.length !== 1 || !matches[0].getAllContainers().length) return;\n const target = parsePowerLogsTarget({ kind: \"Pod\", name, namespace, uid: matches[0].metadata.uid });\n if (!target) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n openPowerLogs(target);\n };\n const observer = new MutationObserver(synchronize);\n observer.observe(document.body, { childList: true, subtree: true });\n document.addEventListener(\"click\", click, true);\n const stopReaction = reaction(enabled, synchronize, { fireImmediately: true });\n return () => {\n stopped = true;\n observer.disconnect();\n stopReaction();\n document.removeEventListener(\"click\", click, true);\n for (const element of hidden.keys()) restore(element);\n };\n}\n"],"mappings":"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"}
@@ -31,7 +31,8 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
31
31
  .power-logs-source-option strong, .power-logs-source-option small { white-space:normal; overflow:visible; overflow-wrap:anywhere; }
32
32
  .power-logs-source-check { display:inline-flex; width:16px; flex-shrink:0; }
33
33
  .power-logs-snapshot-option > button { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; min-width:28px; min-height:28px; padding:0; border:0; border-radius:4px; background:transparent; color:inherit; cursor:pointer; }
34
- .power-logs-snapshot-option > button:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }
34
+ .power-logs-snapshot-option > button[data-capture-delete]:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }
35
+ .power-logs-snapshot-option > button[data-capture-persistent]:not(:disabled):hover, .power-logs-snapshot-option > button[aria-pressed=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,transparent); }
35
36
  .power-logs-snapshot-option > button:focus-visible { outline:2px solid var(--primary); outline-offset:-2px; }
36
37
  .power-logs-snapshot-option > button:disabled { opacity:.45; cursor:default; }
37
38
  .power-logs-level-label { color:var(--textColorSecondary); }
@@ -46,6 +47,7 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
46
47
  .power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(100px,180px) minmax(0,1fr); align-items:center; gap:8px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }
47
48
  .power-logs[data-compact=true] .power-log-row { --log-time-width:calc(8ch + 1px); --log-level-width:calc(var(--power-log-level-ch,7) * .909091ch + 1px); padding-inline:6px!important; gap:4px!important; font-size:11px!important; line-height:16px; }
48
49
  .power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }
50
+ .power-logs[data-compact=true] .power-logs-cell { white-space:nowrap; }
49
51
  .power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
50
52
  .power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }
51
53
  .power-log-message { color:var(--textColorPrimary); }
@@ -122,11 +124,16 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
122
124
  .power-logs-snapshot-notes { max-height:100px; overflow:auto; }
123
125
  @container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }
124
126
  .Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }
125
- .Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }
127
+ .Select__option--is-selected .power-logs-snapshot-option > button[data-capture-delete]:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }
126
128
  .power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }
127
129
  .power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }
128
130
  .power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
129
131
  .power-logs-field-filters button > :last-child { flex-shrink:0; }
132
+ @keyframes power-log-json-actions-in { from { opacity:0; } to { opacity:1; } }
133
+ .power-log-json-actions button { color:inherit; }
134
+ .power-logs .power-log-json-actions button:hover, .power-logs .power-log-json-actions button:focus-visible { color:var(--primary); }
135
+ .power-log-json-actions { animation:power-log-json-actions-in 120ms ease-out; }
136
+ @media (prefers-reduced-motion:reduce) { .power-log-json-actions { animation:none; } }
130
137
  .power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }
131
138
  .power-logs .power-logs-json-cell .power-log-json { white-space:pre; }
132
139
  .power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }
@@ -1 +1 @@
1
- {"version":3,"file":"power-logs.css.js","names":[],"sources":["../../src/renderer/power-logs.css.ts"],"sourcesContent":["export const powerLogsStyles = `\nbody:has(.power-logs[data-testid=\"power-logs-page\"]) .power-ai-launcher { display:none; }\n.power-logs { display:flex; flex-direction:column; height:100%; min-height:0; min-width:0; box-sizing:border-box; overflow:hidden; padding:12px; gap:6px; color:var(--textColorPrimary); container-type:inline-size; }\n.power-logs header, .power-logs-toolbar, .power-logs-filters, .power-logs-source { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }\n.power-logs header h1 { margin:0; font-size:16px; display:flex; align-items:center; gap:10px; }\n.power-logs header .power-logs-actions { margin-left:auto; display:flex; gap:8px; flex-wrap:wrap; }\n.power-logs :is(button,input,select,textarea), .power-logs .power-logs-options > summary { font:inherit; color:inherit; }\n.power-logs :is(.power-logs-filters > input,textarea) { background:var(--contentColor); border:1px solid var(--borderColor); border-radius:5px; padding:4px 8px; min-width:0; }\n.power-logs-filters > input { flex:1; min-width:180px; }\n.power-logs label { display:flex; align-items:center; gap:8px; }\n.power-logs button, .power-logs .power-logs-options > summary { display:inline-flex; align-items:center; justify-content:center; gap:6px; min-height:28px; padding:3px 8px; border:1px solid var(--borderColor); border-radius:5px; background:var(--contentColor); cursor:pointer; box-shadow:none; }\n.power-logs button::before { content:none; }\n.power-logs :is(button:not(:disabled),.power-logs-options > summary):hover { color:var(--primary); border-color:var(--primary); }\n.power-logs button[aria-pressed=true], .power-logs button[aria-selected=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); border-color:var(--primary); }\n.power-logs button:disabled { opacity:.45; cursor:default; }\n.power-logs :is(button,input,select,textarea):focus-visible, .power-logs .power-logs-options > summary:focus-visible { outline:2px solid var(--primary); outline-offset:2px; }\n.power-logs .power-logs-filters > input:focus-visible, .power-logs textarea:focus-visible { outline:none; border-color:var(--primary); box-shadow:inset 0 0 0 1px var(--primary); }\n.power-logs .power-logs-muted { color:var(--textColorSecondary); font-size:12px; line-height:1.5; }\n.power-logs .power-logs-notice { padding:3px 8px; border:1px solid var(--borderColor); border-radius:4px; line-height:1.5; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex-shrink:0; }\n.power-logs .power-logs-error { color:var(--colorError,#e68b80); }\n.power-logs-tabs { display:flex; gap:4px; flex-shrink:0; }\n.power-logs header .power-logs-page-title { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\n.power-logs-snapshot-option { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-option-text { display:flex; flex-direction:column; gap:3px; min-width:0; white-space:normal; overflow-wrap:anywhere; }\n.power-logs-option-text strong { font-weight:500; }\n.power-logs-option-text small { opacity:.85; font-size:11px; }\n.power-logs-source-option { display:flex; align-items:center; gap:10px; width:100%; min-width:0; white-space:normal; line-height:1.4; }\n.power-logs-source-option > :first-child { flex-shrink:0; opacity:.75; }\n.power-logs-source-option .power-logs-option-text { flex:1; }\n.power-logs-source-option strong, .power-logs-source-option small { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-source-check { display:inline-flex; width:16px; flex-shrink:0; }\n.power-logs-snapshot-option > button { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; min-width:28px; min-height:28px; padding:0; border:0; border-radius:4px; background:transparent; color:inherit; cursor:pointer; }\n.power-logs-snapshot-option > button:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }\n.power-logs-snapshot-option > button:focus-visible { outline:2px solid var(--primary); outline-offset:-2px; }\n.power-logs-snapshot-option > button:disabled { opacity:.45; cursor:default; }\n.power-logs-level-label { color:var(--textColorSecondary); }\n.power-logs-level-label[data-level=debug] { color:var(--colorInfo); }\n.power-logs-level-label[data-level=info] { color:var(--primary); }\n.power-logs-level-label[data-level=warn] { color:var(--colorWarning); }\n.power-logs-level-label[data-level=error],.power-logs-level-label[data-level=fatal] { color:var(--colorError); }\n.Select__option--is-selected .power-logs-level-label { color:inherit; }\n.power-logs-workspace { position:relative; display:flex; flex:1; min-height:0; }\n.power-logs-viewer { display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; gap:4px; }\n.power-logs-stream { position:relative; flex:1; min-height:0; min-width:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; background:var(--contentColor); }\n.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(100px,180px) minmax(0,1fr); align-items:center; gap:8px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }\n.power-logs[data-compact=true] .power-log-row { --log-time-width:calc(8ch + 1px); --log-level-width:calc(var(--power-log-level-ch,7) * .909091ch + 1px); padding-inline:6px!important; gap:4px!important; font-size:11px!important; line-height:16px; }\n.power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }\n.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }\n.power-log-message { color:var(--textColorPrimary); }\n.power-log-message [data-log-token=http-method] { color:var(--primary); }\n.power-log-message [data-log-token=uuid] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=uuid] { color:#005a9e; }\n.power-log-row .power-log-level { font-size:10px; font-weight:600; text-transform:uppercase; }\n.power-log-row[data-level=warn] { border-left-color:var(--colorWarning,#d9a441)!important; }\n.power-log-row[data-level=error],.power-log-row[data-level=fatal] { border-left-color:var(--colorError,#d26860)!important; }\n.power-log-row[data-level=info] { border-left-color:var(--primary)!important; }\n.power-logs-detail { position:absolute; z-index:5; top:0; bottom:0; right:0; box-sizing:border-box; box-shadow:-4px 0 18px #0004; display:flex; flex-direction:column; align-items:stretch; gap:12px; width:460px; max-width:95%; padding:16px; background:var(--contentColor); border:1px solid var(--borderColor); border-radius:6px; overflow:auto; }\n.power-logs-detail header { justify-content:flex-end; }\n.power-logs-detail header > strong { margin-right:auto; }\n.power-logs-structured-heading { display:flex; align-items:center; gap:6px; }\n.power-logs .power-logs-detail-copy, .power-logs .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }\n.power-logs .power-logs-detail-copy:not(:disabled):hover, .power-logs .power-logs-detail-close:not(:disabled):hover { border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-log-json { --json-key:#9cdcfe; --json-string:#ce9178; --json-number:#b5cea8; --json-literal:#c586c0; }\n.theme-light .power-log-json { --json-key:#005a9e; --json-string:#9e2b1a; --json-number:#17642d; --json-literal:#7a288c; }\n.power-log-json [data-token=key] { color:var(--json-key); }\n.power-log-json [data-token=string] { color:var(--json-string); }\n.power-log-json [data-token=number] { color:var(--json-number); }\n.power-log-json [data-token=literal] { color:var(--json-literal); }\n.power-logs pre { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; line-height:1.6; }\n.power-logs textarea { user-select:text; box-sizing:border-box; width:100%; height:56px; min-height:48px; max-height:120px; flex-shrink:0; resize:vertical; font-family:var(--font-monospace,monospace); }\n.power-logs-results { flex:1; min-height:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; }\n.power-logs table { border-collapse:collapse; table-layout:fixed; font-size:12px; width:100%; min-width:0; }\n\n.power-logs th,.power-logs td { padding:6px 10px; text-align:left; border-bottom:1px solid var(--borderColor); max-width:400px; white-space:nowrap; vertical-align:top; }\n.power-logs .power-logs-cell { display:block; overflow:hidden; text-overflow:ellipsis; max-height:4.8em; }\n.power-logs .power-logs-json-cell { position:relative; display:flex; align-items:center; gap:4px; min-width:0; height:20px; max-height:20px; }\n.power-logs .power-logs-json-cell .power-log-json { flex:1; min-width:0; margin:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; line-height:20px; }\n.power-logs .power-logs-json-copy { display:inline-flex; align-items:center; justify-content:center; flex:0 0 20px; width:20px; height:20px; min-height:0; padding:0; border-color:transparent; background:transparent; opacity:.6; }\n.power-logs .power-logs-json-copy:hover, .power-logs .power-logs-json-copy:focus-visible { opacity:1; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-logs .power-logs-json-copy-feedback { position:absolute; left:0; top:0; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n\n.power-logs tbody tr { cursor:pointer; }\n.power-logs tbody tr:hover, .power-logs tbody tr:focus-visible { background:color-mix(in srgb,var(--primary) 10%,var(--contentColor)); outline:none; }\n.power-logs td[data-column=message] { font-family:var(--font-monospace,monospace); font-size:12px; white-space:pre-wrap; overflow-wrap:anywhere; }\n.power-logs td[data-level=error], .power-logs td[data-level=fatal] { color:var(--colorError,#d26860); }\n.power-logs td[data-level=warn] { color:var(--colorWarning,#d9a441); }\n.power-logs th { position:sticky; top:0; background:var(--contentColor); }\n.power-logs dialog { position:fixed; inset:0; margin:auto; background:var(--mainBackground); color:var(--textColorPrimary); border:1px solid var(--borderColor); border-radius:8px; padding:24px; width:min(640px,85vw); max-height:80vh; overflow:auto; }\n.power-logs dialog::backdrop { background:#0007; }\n.power-logs-empty { padding:32px; text-align:center; color:var(--textColorSecondary); }\n\n.power-logs > :not(.power-logs-workspace):not(.power-logs-results) { flex-shrink:0; }\n.power-logs-target, .power-logs-caption { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-select { display:inline-block; min-width:0; max-width:360px; flex:1; }\n.power-logs-source .power-logs-select { flex:1; max-width:none; }\n.power-logs-select > div { width:100%; min-width:0; }\n.power-logs-filters .power-logs-select { flex:0 1 180px; }\n.power-logs-filters .power-logs-select[data-source-select] { flex:1 1 260px; max-width:420px; }\n\n.power-logs-capture { display:flex; }\n.power-logs-capture > button { color:var(--primary); }\n.power-logs-options { position:relative; }\n.power-logs-options > summary { list-style:none; }\n.power-logs-options > summary::-webkit-details-marker { display:none; }\n.power-logs .power-logs-options[open] > summary { color:var(--primary); border-color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); }\n.power-logs-options > div { position:absolute; z-index:10; top:calc(100% + 6px); right:0; box-sizing:border-box; width:280px; max-width:calc(100vw - 32px); border-radius:6px; padding:12px; display:flex; flex-direction:column; gap:12px; background:var(--mainBackground); border:1px solid var(--borderColor); box-shadow:0 4px 18px #0005; }\n.power-logs-options label { white-space:nowrap; justify-content:space-between; gap:12px; }\n.power-logs-options .power-logs-select { min-width:130px; }\n.power-logs-select .Select__single-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-sql-tools button { min-height:24px; font-size:12px; }\n.power-logs-pagination { justify-content:flex-end; gap:8px; }\n.power-logs-pagination button { width:28px; padding:3px; }\n.power-logs-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-caption { flex:1; min-width:0; font-size:11px!important; }\n.power-logs .power-logs-collection-note { display:flex; align-items:center; gap:5px; min-width:0; max-width:55%; padding:1px 6px; font-size:11px; }\n.power-logs-collection-note > :first-child { color:var(--colorWarning,#d9a441); flex-shrink:0; }\n.power-logs-collection-note > :last-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\n.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-snapshot-notes { max-height:100px; overflow:auto; }\n@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }\n.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }\n.Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }\n.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }\n.power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }\n.power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-field-filters button > :last-child { flex-shrink:0; }\n.power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }\n.power-logs .power-logs-json-cell .power-log-json { white-space:pre; }\n.power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=url], .theme-light .power-log-message [data-log-token=trace-id], .theme-light .power-log-message [data-log-token=address] { color:#005a9e; }\n.power-log-message [data-log-token=duration], .power-log-message [data-status-class=\"2\"] { color:#b5cea8; }\n.theme-light .power-log-message [data-log-token=duration], .theme-light .power-log-message [data-status-class=\"2\"] { color:#17642d; }\n.power-log-message [data-status-class=\"1\"], .power-log-message [data-status-class=\"3\"] { color:#9cdcfe; }\n.theme-light .power-log-message [data-status-class=\"1\"], .theme-light .power-log-message [data-status-class=\"3\"] { color:#005a9e; }\n.power-log-message [data-status-class=\"4\"] { color:#e3b56b; }\n.theme-light .power-log-message [data-status-class=\"4\"] { color:#8a4b00; }\n.power-log-message [data-status-class=\"5\"] { color:#f19b8d; }\n.theme-light .power-log-message [data-status-class=\"5\"] { color:#9e2b1a; }\n.power-logs[data-hide-resource-name=true] .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); }\n.power-logs[data-hide-resource-name=true] .power-log-origin { display:none; }\n.power-logs .power-logs-control-label { display:block; flex:0 0 76px; width:76px; margin:0; }\n.power-logs .power-logs-query-error { font-size:12px; color:var(--colorError); }\n`;\n"],"mappings":";AAAA,IAAa,kBAAkB"}
1
+ {"version":3,"file":"power-logs.css.js","names":[],"sources":["../../src/renderer/power-logs.css.ts"],"sourcesContent":["export const powerLogsStyles = `\nbody:has(.power-logs[data-testid=\"power-logs-page\"]) .power-ai-launcher { display:none; }\n.power-logs { display:flex; flex-direction:column; height:100%; min-height:0; min-width:0; box-sizing:border-box; overflow:hidden; padding:12px; gap:6px; color:var(--textColorPrimary); container-type:inline-size; }\n.power-logs header, .power-logs-toolbar, .power-logs-filters, .power-logs-source { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }\n.power-logs header h1 { margin:0; font-size:16px; display:flex; align-items:center; gap:10px; }\n.power-logs header .power-logs-actions { margin-left:auto; display:flex; gap:8px; flex-wrap:wrap; }\n.power-logs :is(button,input,select,textarea), .power-logs .power-logs-options > summary { font:inherit; color:inherit; }\n.power-logs :is(.power-logs-filters > input,textarea) { background:var(--contentColor); border:1px solid var(--borderColor); border-radius:5px; padding:4px 8px; min-width:0; }\n.power-logs-filters > input { flex:1; min-width:180px; }\n.power-logs label { display:flex; align-items:center; gap:8px; }\n.power-logs button, .power-logs .power-logs-options > summary { display:inline-flex; align-items:center; justify-content:center; gap:6px; min-height:28px; padding:3px 8px; border:1px solid var(--borderColor); border-radius:5px; background:var(--contentColor); cursor:pointer; box-shadow:none; }\n.power-logs button::before { content:none; }\n.power-logs :is(button:not(:disabled),.power-logs-options > summary):hover { color:var(--primary); border-color:var(--primary); }\n.power-logs button[aria-pressed=true], .power-logs button[aria-selected=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); border-color:var(--primary); }\n.power-logs button:disabled { opacity:.45; cursor:default; }\n.power-logs :is(button,input,select,textarea):focus-visible, .power-logs .power-logs-options > summary:focus-visible { outline:2px solid var(--primary); outline-offset:2px; }\n.power-logs .power-logs-filters > input:focus-visible, .power-logs textarea:focus-visible { outline:none; border-color:var(--primary); box-shadow:inset 0 0 0 1px var(--primary); }\n.power-logs .power-logs-muted { color:var(--textColorSecondary); font-size:12px; line-height:1.5; }\n.power-logs .power-logs-notice { padding:3px 8px; border:1px solid var(--borderColor); border-radius:4px; line-height:1.5; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex-shrink:0; }\n.power-logs .power-logs-error { color:var(--colorError,#e68b80); }\n.power-logs-tabs { display:flex; gap:4px; flex-shrink:0; }\n.power-logs header .power-logs-page-title { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\n.power-logs-snapshot-option { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-option-text { display:flex; flex-direction:column; gap:3px; min-width:0; white-space:normal; overflow-wrap:anywhere; }\n.power-logs-option-text strong { font-weight:500; }\n.power-logs-option-text small { opacity:.85; font-size:11px; }\n.power-logs-source-option { display:flex; align-items:center; gap:10px; width:100%; min-width:0; white-space:normal; line-height:1.4; }\n.power-logs-source-option > :first-child { flex-shrink:0; opacity:.75; }\n.power-logs-source-option .power-logs-option-text { flex:1; }\n.power-logs-source-option strong, .power-logs-source-option small { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-source-check { display:inline-flex; width:16px; flex-shrink:0; }\n.power-logs-snapshot-option > button { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; min-width:28px; min-height:28px; padding:0; border:0; border-radius:4px; background:transparent; color:inherit; cursor:pointer; }\n.power-logs-snapshot-option > button[data-capture-delete]:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }\n.power-logs-snapshot-option > button[data-capture-persistent]:not(:disabled):hover, .power-logs-snapshot-option > button[aria-pressed=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,transparent); }\n.power-logs-snapshot-option > button:focus-visible { outline:2px solid var(--primary); outline-offset:-2px; }\n.power-logs-snapshot-option > button:disabled { opacity:.45; cursor:default; }\n.power-logs-level-label { color:var(--textColorSecondary); }\n.power-logs-level-label[data-level=debug] { color:var(--colorInfo); }\n.power-logs-level-label[data-level=info] { color:var(--primary); }\n.power-logs-level-label[data-level=warn] { color:var(--colorWarning); }\n.power-logs-level-label[data-level=error],.power-logs-level-label[data-level=fatal] { color:var(--colorError); }\n.Select__option--is-selected .power-logs-level-label { color:inherit; }\n.power-logs-workspace { position:relative; display:flex; flex:1; min-height:0; }\n.power-logs-viewer { display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; gap:4px; }\n.power-logs-stream { position:relative; flex:1; min-height:0; min-width:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; background:var(--contentColor); }\n.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(100px,180px) minmax(0,1fr); align-items:center; gap:8px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }\n.power-logs[data-compact=true] .power-log-row { --log-time-width:calc(8ch + 1px); --log-level-width:calc(var(--power-log-level-ch,7) * .909091ch + 1px); padding-inline:6px!important; gap:4px!important; font-size:11px!important; line-height:16px; }\n.power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }\n.power-logs[data-compact=true] .power-logs-cell { white-space:nowrap; }\n.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }\n.power-log-message { color:var(--textColorPrimary); }\n.power-log-message [data-log-token=http-method] { color:var(--primary); }\n.power-log-message [data-log-token=uuid] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=uuid] { color:#005a9e; }\n.power-log-row .power-log-level { font-size:10px; font-weight:600; text-transform:uppercase; }\n.power-log-row[data-level=warn] { border-left-color:var(--colorWarning,#d9a441)!important; }\n.power-log-row[data-level=error],.power-log-row[data-level=fatal] { border-left-color:var(--colorError,#d26860)!important; }\n.power-log-row[data-level=info] { border-left-color:var(--primary)!important; }\n.power-logs-detail { position:absolute; z-index:5; top:0; bottom:0; right:0; box-sizing:border-box; box-shadow:-4px 0 18px #0004; display:flex; flex-direction:column; align-items:stretch; gap:12px; width:460px; max-width:95%; padding:16px; background:var(--contentColor); border:1px solid var(--borderColor); border-radius:6px; overflow:auto; }\n.power-logs-detail header { justify-content:flex-end; }\n.power-logs-detail header > strong { margin-right:auto; }\n.power-logs-structured-heading { display:flex; align-items:center; gap:6px; }\n.power-logs .power-logs-detail-copy, .power-logs .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }\n.power-logs .power-logs-detail-copy:not(:disabled):hover, .power-logs .power-logs-detail-close:not(:disabled):hover { border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-log-json { --json-key:#9cdcfe; --json-string:#ce9178; --json-number:#b5cea8; --json-literal:#c586c0; }\n.theme-light .power-log-json { --json-key:#005a9e; --json-string:#9e2b1a; --json-number:#17642d; --json-literal:#7a288c; }\n.power-log-json [data-token=key] { color:var(--json-key); }\n.power-log-json [data-token=string] { color:var(--json-string); }\n.power-log-json [data-token=number] { color:var(--json-number); }\n.power-log-json [data-token=literal] { color:var(--json-literal); }\n.power-logs pre { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; line-height:1.6; }\n.power-logs textarea { user-select:text; box-sizing:border-box; width:100%; height:56px; min-height:48px; max-height:120px; flex-shrink:0; resize:vertical; font-family:var(--font-monospace,monospace); }\n.power-logs-results { flex:1; min-height:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; }\n.power-logs table { border-collapse:collapse; table-layout:fixed; font-size:12px; width:100%; min-width:0; }\n\n.power-logs th,.power-logs td { padding:6px 10px; text-align:left; border-bottom:1px solid var(--borderColor); max-width:400px; white-space:nowrap; vertical-align:top; }\n.power-logs .power-logs-cell { display:block; overflow:hidden; text-overflow:ellipsis; max-height:4.8em; }\n.power-logs .power-logs-json-cell { position:relative; display:flex; align-items:center; gap:4px; min-width:0; height:20px; max-height:20px; }\n.power-logs .power-logs-json-cell .power-log-json { flex:1; min-width:0; margin:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; line-height:20px; }\n.power-logs .power-logs-json-copy { display:inline-flex; align-items:center; justify-content:center; flex:0 0 20px; width:20px; height:20px; min-height:0; padding:0; border-color:transparent; background:transparent; opacity:.6; }\n.power-logs .power-logs-json-copy:hover, .power-logs .power-logs-json-copy:focus-visible { opacity:1; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-logs .power-logs-json-copy-feedback { position:absolute; left:0; top:0; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n\n.power-logs tbody tr { cursor:pointer; }\n.power-logs tbody tr:hover, .power-logs tbody tr:focus-visible { background:color-mix(in srgb,var(--primary) 10%,var(--contentColor)); outline:none; }\n.power-logs td[data-column=message] { font-family:var(--font-monospace,monospace); font-size:12px; white-space:pre-wrap; overflow-wrap:anywhere; }\n.power-logs td[data-level=error], .power-logs td[data-level=fatal] { color:var(--colorError,#d26860); }\n.power-logs td[data-level=warn] { color:var(--colorWarning,#d9a441); }\n.power-logs th { position:sticky; top:0; background:var(--contentColor); }\n.power-logs dialog { position:fixed; inset:0; margin:auto; background:var(--mainBackground); color:var(--textColorPrimary); border:1px solid var(--borderColor); border-radius:8px; padding:24px; width:min(640px,85vw); max-height:80vh; overflow:auto; }\n.power-logs dialog::backdrop { background:#0007; }\n.power-logs-empty { padding:32px; text-align:center; color:var(--textColorSecondary); }\n\n.power-logs > :not(.power-logs-workspace):not(.power-logs-results) { flex-shrink:0; }\n.power-logs-target, .power-logs-caption { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-select { display:inline-block; min-width:0; max-width:360px; flex:1; }\n.power-logs-source .power-logs-select { flex:1; max-width:none; }\n.power-logs-select > div { width:100%; min-width:0; }\n.power-logs-filters .power-logs-select { flex:0 1 180px; }\n.power-logs-filters .power-logs-select[data-source-select] { flex:1 1 260px; max-width:420px; }\n\n.power-logs-capture { display:flex; }\n.power-logs-capture > button { color:var(--primary); }\n.power-logs-options { position:relative; }\n.power-logs-options > summary { list-style:none; }\n.power-logs-options > summary::-webkit-details-marker { display:none; }\n.power-logs .power-logs-options[open] > summary { color:var(--primary); border-color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); }\n.power-logs-options > div { position:absolute; z-index:10; top:calc(100% + 6px); right:0; box-sizing:border-box; width:280px; max-width:calc(100vw - 32px); border-radius:6px; padding:12px; display:flex; flex-direction:column; gap:12px; background:var(--mainBackground); border:1px solid var(--borderColor); box-shadow:0 4px 18px #0005; }\n.power-logs-options label { white-space:nowrap; justify-content:space-between; gap:12px; }\n.power-logs-options .power-logs-select { min-width:130px; }\n.power-logs-select .Select__single-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-sql-tools button { min-height:24px; font-size:12px; }\n.power-logs-pagination { justify-content:flex-end; gap:8px; }\n.power-logs-pagination button { width:28px; padding:3px; }\n.power-logs-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-caption { flex:1; min-width:0; font-size:11px!important; }\n.power-logs .power-logs-collection-note { display:flex; align-items:center; gap:5px; min-width:0; max-width:55%; padding:1px 6px; font-size:11px; }\n.power-logs-collection-note > :first-child { color:var(--colorWarning,#d9a441); flex-shrink:0; }\n.power-logs-collection-note > :last-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\n.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-snapshot-notes { max-height:100px; overflow:auto; }\n@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }\n.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }\n.Select__option--is-selected .power-logs-snapshot-option > button[data-capture-delete]:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }\n.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }\n.power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }\n.power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-field-filters button > :last-child { flex-shrink:0; }\n@keyframes power-log-json-actions-in { from { opacity:0; } to { opacity:1; } }\n.power-log-json-actions button { color:inherit; }\n.power-logs .power-log-json-actions button:hover, .power-logs .power-log-json-actions button:focus-visible { color:var(--primary); }\n.power-log-json-actions { animation:power-log-json-actions-in 120ms ease-out; }\n@media (prefers-reduced-motion:reduce) { .power-log-json-actions { animation:none; } }\n.power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }\n.power-logs .power-logs-json-cell .power-log-json { white-space:pre; }\n.power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=url], .theme-light .power-log-message [data-log-token=trace-id], .theme-light .power-log-message [data-log-token=address] { color:#005a9e; }\n.power-log-message [data-log-token=duration], .power-log-message [data-status-class=\"2\"] { color:#b5cea8; }\n.theme-light .power-log-message [data-log-token=duration], .theme-light .power-log-message [data-status-class=\"2\"] { color:#17642d; }\n.power-log-message [data-status-class=\"1\"], .power-log-message [data-status-class=\"3\"] { color:#9cdcfe; }\n.theme-light .power-log-message [data-status-class=\"1\"], .theme-light .power-log-message [data-status-class=\"3\"] { color:#005a9e; }\n.power-log-message [data-status-class=\"4\"] { color:#e3b56b; }\n.theme-light .power-log-message [data-status-class=\"4\"] { color:#8a4b00; }\n.power-log-message [data-status-class=\"5\"] { color:#f19b8d; }\n.theme-light .power-log-message [data-status-class=\"5\"] { color:#9e2b1a; }\n.power-logs[data-hide-resource-name=true] .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); }\n.power-logs[data-hide-resource-name=true] .power-log-origin { display:none; }\n.power-logs .power-logs-control-label { display:block; flex:0 0 76px; width:76px; margin:0; }\n.power-logs .power-logs-query-error { font-size:12px; color:var(--colorError); }\n`;\n"],"mappings":";AAAA,IAAa,kBAAkB"}