@64mb/freelens-power 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_LICENSES +26 -0
- package/out/main/ai-models.js +2 -1
- package/out/main/ai-models.js.map +1 -1
- package/out/main/ai.js +13 -5
- package/out/main/ai.js.map +1 -1
- package/out/renderer/ai-extras.js +21 -16
- package/out/renderer/ai-extras.js.map +1 -1
- package/out/renderer/ai-icon.js +23 -0
- package/out/renderer/ai-icon.js.map +1 -1
- package/out/renderer/ai.js +81 -10
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/appearance.js +20 -2
- package/out/renderer/appearance.js.map +1 -1
- package/out/renderer/dashboard.js +10 -3
- package/out/renderer/dashboard.js.map +1 -1
- package/out/renderer/details/resource-health-details.js +2 -2
- package/out/renderer/details/resource-health-details.js.map +1 -1
- package/out/renderer/power-log-json-cell.js +2 -2
- package/out/renderer/power-logs.css.js +11 -2
- package/out/renderer/power-logs.css.js.map +1 -1
- package/out/renderer/power-logs.js +75 -32
- package/out/renderer/power-logs.js.map +1 -1
- package/out/renderer/preferences/ai-preferences.js +6 -3
- package/out/renderer/preferences/ai-preferences.js.map +1 -1
- package/out/renderer/preferences/monitoring-preferences.js +14 -6
- package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs.js","names":[],"sources":["../../src/renderer/power-logs.tsx"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Renderer } from \"@freelensapp/extensions\";\nimport { clipboard } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDateTime } from \"../common/date-time\";\nimport { compileJsonFilters, type JsonFieldFilter, jsonValuesEqual } from \"../common/power-log-field-filters\";\nimport { buildJsonFilterSql, type SqlJsonFieldFilter } from \"../common/power-log-json-filter-sql\";\nimport { buildJsonProjectionSql, JSON_KEY_DISCOVERY_SQL } from \"../common/power-log-json-preset\";\nimport { sqlCellLevel } from \"../common/power-log-sql-level\";\nimport {\n POWER_LOGS_LIMITS as L,\n type LogCapture,\n type LogLevel,\n type LogQueryResult,\n type LogRecord,\n type LogSource,\n type LogTarget,\n} from \"../common/power-logs\";\nimport { powerLogLineEvidence, powerLogQueryEvidence } from \"../common/power-logs-ai\";\nimport { applyPowerLogsLimits, normalizePowerLogsLimits } from \"../common/power-logs-limits\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { explainDiagnosticFinding } from \"./ai-diagnostic-handoff\";\nimport { DiagnosticExplainButton } from \"./diagnostic-explain-button\";\nimport { NativeTooltip } from \"./native-tooltip\";\nimport { LogJson } from \"./power-log-json\";\nimport { LogJsonCell } from \"./power-log-json-cell\";\nimport { formatJsonLiteral, jsonHasDuplicateKeys } from \"./power-log-json-fields\";\nimport { LogMessage } from \"./power-log-message\";\nimport { SqlEditor } from \"./power-log-sql-editor\";\nimport { powerLogsStyles } from \"./power-logs.css\";\nimport { createPowerLogsClient } from \"./power-logs-client\";\nimport { collectHistoricalLogs, type LiveLogCoverage, resolveLogSources, startLiveLogs } from \"./power-logs-collector\";\nimport { openPowerLogs, parsePowerLogsTarget } from \"./power-logs-entrypoints\";\nimport { CaptureSqlDrafts } from \"./power-logs-sql-drafts\";\nimport { sqlRowDetails } from \"./power-logs-sql-row\";\nimport { createPowerLogsTransport } from \"./power-logs-transport\";\nimport { searchContextId } from \"./resource-search-client\";\n\nconst Icon = (props: { material: string; size?: number; tooltip?: string }) => (\n <span aria-hidden=\"true\" style={{ display: \"inline-flex\" }}>\n <Renderer.Component.Icon {...props} />\n </span>\n);\nconst sourceKey = (r: Pick<LogRecord, \"pod\" | \"container\" | \"previous\">) =>\n `${r.pod} / ${r.container}${r.previous ? \" (previous)\" : \"\"}`;\nconst levels: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"];\nconst examples = [\n [\"Recent\", \"SELECT timestamp, level, message, container, pod FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\"],\n [\n \"Errors\",\n \"SELECT message, count(*) AS occurrences FROM logs WHERE level IN ('error','fatal') GROUP BY message ORDER BY occurrences DESC LIMIT 200\",\n ],\n [\n \"Timeline\",\n \"SELECT (timestamp / 60000) * 60000 AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute\",\n ],\n [\"JSON\", \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\"],\n] as const;\nconst sqlColumnWidth = (column: string) =>\n column === \"message\" || column === \"fieldsJson\" ? 360 : column === \"level\" ? 90 : 200;\ntype ViewRecord = LogRecord & { key: number; bytes: number };\n\nfunction initialTarget(): LogTarget | undefined {\n try {\n return parsePowerLogsTarget(JSON.parse(new URLSearchParams(window.location.search).get(\"target\") ?? \"null\"));\n } catch {\n return;\n }\n}\nfunction initialSource(container: unknown = new URLSearchParams(window.location.search).get(\"container\")): string {\n return typeof container === \"string\" && /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/.test(container) && container.length <= 63\n ? `container:${container}`\n : \"\";\n}\n\nfunction LogSelect({\n label,\n value,\n options,\n onChange,\n disabled = false,\n renderOption,\n onKeyDown,\n}: {\n label: string;\n value: string;\n options: { value: string; label: string }[];\n onChange(value: string): void;\n disabled?: boolean;\n onKeyDown?: (event: ReactKeyboardEvent) => void;\n renderOption?: (option: { value: string; label: string }, context: \"menu\" | \"value\") => ReactNode;\n}) {\n return (\n <span className=\"power-logs-select\" data-source-select={label === \"Container source\" || undefined}>\n <Renderer.Component.Select\n aria-label={label}\n value={value}\n options={options}\n formatOptionLabel={(option, meta) =>\n renderOption ? (\n renderOption(option, meta.context)\n ) : label === \"Log level\" && option.value ? (\n <span className=\"power-logs-level-label\" data-level={option.value}>\n {option.label}\n </span>\n ) : (\n option.label\n )\n }\n isDisabled={disabled}\n onKeyDown={onKeyDown}\n tabSelectsValue={false}\n isClearable={false}\n menuPosition=\"fixed\"\n menuPortalTarget={document.body}\n styles={{\n menu: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n menuList: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n option: (base) => (label === \"Container source\" ? { ...base, whiteSpace: \"normal\" } : base),\n menuPortal: (base) => {\n if (label !== \"Container source\" && label !== \"Capture snapshot\") return { ...base, zIndex: 10000 };\n const width = Math.min(label === \"Capture snapshot\" ? 620 : 560, window.innerWidth - 32);\n return {\n ...base,\n zIndex: 10000,\n width,\n left: Math.max(\n 16,\n Math.min(typeof base.left === \"number\" ? base.left : 16, window.innerWidth - width - 16),\n ),\n };\n },\n }}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n />\n </span>\n );\n}\n\nconst SourcePicker = observer(() => {\n const stores = [\n Renderer.K8sApi.podsStore,\n Renderer.K8sApi.deploymentStore,\n Renderer.K8sApi.daemonSetStore,\n Renderer.K8sApi.statefulSetStore,\n Renderer.K8sApi.replicaSetStore,\n Renderer.K8sApi.jobStore,\n Renderer.K8sApi.cronJobStore,\n ];\n const targets = stores.flatMap((store) =>\n store.getItems().flatMap((object) => {\n const target = parsePowerLogsTarget({ kind: object.kind, ...object.metadata });\n return target ? [target] : [];\n }),\n );\n const [value, setValue] = useState(\"\");\n const sorted = [...targets].sort((a, b) =>\n `${a.namespace}/${a.kind}/${a.name}`.localeCompare(`${b.namespace}/${b.kind}/${b.name}`),\n );\n return (\n <div className=\"power-logs-source\">\n <span className=\"power-logs-control-label\">Resource</span>\n <LogSelect\n label=\"Resource\"\n value={value}\n onChange={setValue}\n options={[\n { value: \"\", label: \"Choose a loaded pod or workload\" },\n ...sorted.map((target) => ({\n value: target.uid,\n label: `${target.namespace} / ${target.kind} / ${target.name}`,\n })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!targets.some((target) => target.uid === value)}\n onClick={() => {\n const target = targets.find((t) => t.uid === value);\n if (target) openPowerLogs(target);\n }}\n >\n <Icon material=\"subject\" size={16} /> Open logs\n </button>\n </div>\n );\n});\n\nfunction LogRows({\n records,\n loading,\n selected,\n onSelect,\n follow,\n setFollow,\n compact,\n}: {\n records: ViewRecord[];\n loading: boolean;\n selected?: number;\n onSelect(record: ViewRecord): void;\n follow: boolean;\n setFollow(value: boolean): void;\n compact: boolean;\n}) {\n const viewport = useRef<HTMLDivElement>(null);\n const [top, setTop] = useState(0);\n const [height, setHeight] = useState(400);\n useEffect(() => {\n const element = viewport.current;\n if (!element) return;\n const resize = new ResizeObserver(() => setHeight(element.clientHeight));\n resize.observe(element);\n return () => resize.disconnect();\n }, []);\n useLayoutEffect(() => {\n if (follow && viewport.current) {\n viewport.current.scrollTop = viewport.current.scrollHeight;\n setTop(viewport.current.scrollTop);\n }\n }, [records, follow, compact]);\n const levelCharacters = useMemo(\n () => records.reduce((width, record) => Math.max(width, record.level.length), 4),\n [records],\n );\n const rowHeight = compact ? 20 : 34;\n const start = Math.max(0, Math.floor(top / rowHeight) - 5);\n const visible = records.slice(start, start + Math.ceil(height / rowHeight) + 10);\n return (\n <div className=\"power-logs-viewer\">\n <div\n className=\"power-logs-stream\"\n ref={viewport}\n style={{ \"--power-log-level-ch\": levelCharacters } as CSSProperties}\n aria-label=\"Log lines\"\n aria-busy={loading}\n onScroll={(event) => {\n const el = event.currentTarget;\n setTop(el.scrollTop);\n if (el.scrollHeight - el.scrollTop - el.clientHeight > 60) setFollow(false);\n }}\n >\n {records.length === 0 ? (\n <div className=\"power-logs-empty\">{loading ? \"Loading logs…\" : \"No matching log lines\"}</div>\n ) : (\n <div style={{ height: records.length * rowHeight, position: \"relative\" }}>\n {visible.map((record, i) => (\n <button\n type=\"button\"\n className=\"power-log-row\"\n data-level={record.level}\n aria-pressed={selected === record.key}\n style={{ top: (start + i) * rowHeight, height: rowHeight }}\n key={record.key}\n onClick={() => onSelect(record)}\n >\n <NativeTooltip\n title={record.timestamp !== null ? formatDateTime(record.timestamp) : \"Timestamp unavailable\"}\n >\n <span>{record.timestamp !== null ? formatDateTime(record.timestamp).slice(-8) : \"—\"}</span>\n </NativeTooltip>\n <span className=\"power-log-level\">{record.level}</span>\n <span className=\"power-log-origin\" id={`power-log-source-${record.key}`}>\n {record.pod}\n {record.previous ? \" (previous)\" : \"\"}\n <Renderer.Component.Tooltip targetId={`power-log-source-${record.key}`}>\n {sourceKey(record)}\n </Renderer.Component.Tooltip>\n </span>\n <LogMessage text={record.message} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LogDetails({\n record,\n jsonColumn,\n onClose,\n onFilter,\n}: {\n record: LogRecord;\n jsonColumn?: string;\n onClose: () => void;\n onFilter?: (filter: JsonFieldFilter) => void;\n}) {\n const structuredFields = useMemo(() => {\n if (!record?.fieldsJson) return \"\";\n return formatJsonLiteral(record.fieldsJson);\n }, [record?.fieldsJson]);\n const fieldsEnabled = useMemo(() => !jsonHasDuplicateKeys(record.fieldsJson ?? \"\"), [record.fieldsJson]);\n const [copyFeedback, setCopyFeedback] = useState(\"\");\n useEffect(() => setCopyFeedback(\"\"), [structuredFields]);\n return (\n <aside className=\"power-logs-detail\" aria-label=\"Log line details\">\n <header>\n <strong>Line details</strong>\n <NativeTooltip title=\"Close line details\">\n <button className=\"power-logs-detail-close\" aria-label=\"Close line details\" onClick={onClose}>\n <Icon material=\"close\" size={16} />\n </button>\n </NativeTooltip>\n </header>\n <p className=\"power-logs-muted\">\n {record.pod && <>{sourceKey(record)} · </>}\n <span className=\"power-logs-level-label\" data-level={record.level}>\n {record.level.toUpperCase()}\n </span>\n </p>\n {record.message && (\n <pre>\n <LogMessage text={record.message} />\n </pre>\n )}\n {record.fieldsJson && (\n <>\n <div className=\"power-logs-structured-heading\">\n <strong>{jsonColumn ? `Structured fields · ${jsonColumn}` : \"Structured fields\"}</strong>\n <NativeTooltip title={copyFeedback || \"Copy structured JSON\"}>\n <button\n type=\"button\"\n className=\"power-logs-detail-copy\"\n aria-label=\"Copy structured JSON\"\n onClick={() => {\n try {\n clipboard.writeText(structuredFields);\n setCopyFeedback(\"Copied\");\n } catch {\n setCopyFeedback(\"Unable to copy JSON\");\n }\n }}\n >\n <Icon material={copyFeedback === \"Copied\" ? \"check\" : \"content_copy\"} size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\" aria-live=\"polite\">\n {copyFeedback}\n </span>\n </div>\n <LogJson text={structuredFields} fieldsEnabled={fieldsEnabled} Icon={Icon} onFilter={onFilter} />\n </>\n )}\n </aside>\n );\n}\n\nconst sameFieldValue = (a: JsonFieldFilter, b: JsonFieldFilter) =>\n a.path.length === b.path.length &&\n a.path.every((part, index) => part === b.path[index]) &&\n jsonValuesEqual(a.value, b.value);\nconst fieldFilterLabel = (filter: JsonFieldFilter) =>\n `${filter.path.reduce<string>((path, part) => `${path}[${typeof part === \"number\" ? part : JSON.stringify(part)}]`, \"$\")} ${filter.operator === \"eq\" ? \"=\" : \"!=\"} ${JSON.stringify(filter.value)}`;\nfunction FieldFilters({\n filters,\n sql = false,\n disabled = false,\n onRemove,\n}: {\n filters: readonly (JsonFieldFilter & { column?: string })[];\n sql?: boolean;\n disabled?: boolean;\n onRemove(index: number): void;\n}) {\n if (!filters.length) return null;\n return (\n <div className=\"power-logs-field-filters\" aria-label={sql ? \"SQL JSON filters\" : \"Live JSON filters\"}>\n <span className=\"power-logs-muted\">{sql ? \"Result filters\" : \"JSON filters\"} · AND</span>\n {filters.map((filter, index) => {\n const label = `${filter.column ? `${filter.column} ` : \"\"}${fieldFilterLabel(filter)}`;\n return (\n <NativeTooltip key={index} title={label}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove JSON filter ${label}`}\n onClick={() => onRemove(index)}\n >\n <span>{label}</span>\n <Icon material=\"close\" size={14} />\n </button>\n </NativeTooltip>\n );\n })}\n </div>\n );\n}\n\nfunction Workspace({ clusterId, contextId }: { clusterId: string; contextId: string }) {\n const client = useMemo(() => createPowerLogsClient({ clusterId, contextId }), [clusterId, contextId]);\n const drafts = useMemo(\n () =>\n new CaptureSqlDrafts(\n (id, query) => client.saveSql(id, query),\n () => setError(\"Could not save the SQL draft. Your edits remain available in this workspace.\"),\n ),\n [client],\n );\n useEffect(\n () => () => {\n void drafts.dispose();\n },\n [drafts],\n );\n const [target, setTarget] = useState(initialTarget);\n const [records, setRecords] = useState<ViewRecord[]>([]);\n const [sources, setSources] = useState<LogSource[]>([]);\n const [notes, setNotes] = useState<string[]>([]);\n const [status, setStatus] = useState(\"Choose a resource to read its logs\");\n const [error, setError] = useState(\"\");\n const [sqlError, setSqlError] = useState(\"\");\n const [tab, setTab] = useState<\"live\" | \"captures\">(\"live\");\n const [text, setText] = useState(\"\");\n const [level, setLevel] = useState(\"\");\n const [source, setSource] = useState(initialSource);\n const [savedPoolFull, setSavedPoolFull] = useState(false);\n const [fieldFilters, setFieldFilters] = useState<JsonFieldFilter[]>([]);\n const matchFields = useMemo(() => compileJsonFilters(fieldFilters), [fieldFilters]);\n const parsedFields = useRef(new WeakMap<LogRecord, unknown>());\n const [sqlFieldFilters, setSqlFieldFilters] = useState<{\n base: string;\n rendered: string;\n captureId: string;\n filters: SqlJsonFieldFilter[];\n }>();\n const preferences = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>();\n const limits = normalizePowerLogsLimits(preferences.limits);\n useEffect(() => {\n applyPowerLogsLimits(preferences.limits);\n }, [preferences.limits]);\n const [compact, setCompact] = useState(preferences.compactRows === true);\n const [hideResourceName, setHideResourceName] = useState(preferences.hideResourceNameColumn === true);\n const [selected, setSelected] = useState<ViewRecord>();\n const [selectedSqlRow, setSelectedSqlRow] = useState<\n ReturnType<typeof sqlRowDetails> & { row: LogQueryResult[\"rows\"][number] }\n >();\n const [liveCoverage, setLiveCoverage] = useState<LiveLogCoverage>();\n const [live, setLive] = useState(false);\n const [follow, setFollow] = useState(true);\n const [busy, setBusy] = useState(() => Boolean(initialTarget()));\n const [captures, setCaptures] = useState<LogCapture[]>([]);\n const [captureId, updateCaptureId] = useState(\"\");\n const captureSelection = useRef(captureId);\n captureSelection.current = captureId;\n const setCaptureId = (id: string, snapshot = captures.find((item) => item.id === id)) => {\n if (id !== captureSelection.current) void drafts.flush();\n captureSelection.current = id;\n const query = snapshot ? drafts.read(snapshot, examples[0][1]) : examples[0][1];\n sqlDraft.current = query;\n updateSql(query);\n updateCaptureId(id);\n };\n const deleting = useRef(new Set<string>());\n const [deletingCount, setDeletingCount] = useState(0);\n const [capturing, setCapturing] = useState<LogCapture>();\n const [capturePending, setCapturePending] = useState(false);\n const [captureMinutes, setCaptureMinutes] = useState(15);\n const [previous, setPrevious] = useState(false);\n const [sqlFitVersion, setSqlFitVersion] = useState(0);\n const [sql, updateSql] = useState<string>(examples[0][1]);\n const sqlDraft = useRef(sql);\n sqlDraft.current = sql;\n const setSql = (query: string) => {\n sqlDraft.current = query;\n updateSql(query);\n if (captureSelection.current) drafts.set(captureSelection.current, query);\n };\n const captureKeys = useRef(new Map<string, string[]>());\n useEffect(() => {\n setSqlFieldFilters((current) =>\n current && (current.rendered !== sql || current.captureId !== captureId) ? undefined : current,\n );\n }, [sql, captureId]);\n const [result, setResult] = useState<LogQueryResult>();\n const [resultEvidence, setResultEvidence] = useState<{ capture: LogCapture; sql: string; error?: string }>();\n const [resultPage, setResultPage] = useState(0);\n const [queryId, setQueryId] = useState(\"\");\n const captureOptions = useRef<HTMLDetailsElement>(null);\n useEffect(() => {\n const outside = (event: PointerEvent) => {\n if (\n !captureOptions.current?.contains(event.target as Node) &&\n !(event.target as Element)?.closest?.(\".Select__menu\")\n ) {\n if (captureOptions.current) captureOptions.current.open = false;\n }\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || (event.target as Element)?.closest?.(\".Select\")) return;\n if (captureOptions.current?.open) captureOptions.current.open = false;\n else {\n setSelected(undefined);\n setSelectedSqlRow(undefined);\n }\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"keydown\", escape);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"keydown\", escape);\n };\n }, []);\n const historyController = useRef<AbortController>();\n const liveController = useRef<AbortController>();\n const captureController = useRef<AbortController>();\n const queryRef = useRef(\"\");\n const epoch = useRef(0);\n const alive = useRef(true);\n const sequence = useRef(0);\n const recordsRef = useRef(records);\n recordsRef.current = records;\n const pending = useRef<LogRecord[]>([]);\n const flushTimer = useRef<ReturnType<typeof setTimeout>>();\n const refreshCaptures = () =>\n client\n .list()\n .then((value) => {\n if (alive.current) setCaptures(value);\n })\n .catch(() => {\n if (alive.current) setError(\"Temporary captures are unavailable\");\n });\n const stopLive = () => {\n liveController.current?.abort();\n liveController.current = undefined;\n setLive(false);\n };\n const flush = () => {\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n const batch = pending.current;\n pending.current = [];\n if (!batch.length || !alive.current) return;\n const next = batch.map((record) => ({\n ...record,\n key: ++sequence.current,\n bytes: Buffer.byteLength(JSON.stringify(record)),\n }));\n setRecords((current) => {\n const combined = [...current, ...next];\n let bytes = combined.reduce((sum, r) => sum + r.bytes, 0);\n let start = 0;\n while (combined.length - start > L.liveRows || bytes > L.liveBytes) bytes -= combined[start++].bytes;\n return combined.slice(start).sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0) || a.key - b.key);\n });\n };\n const appendView = (batch: LogRecord[]) => {\n if (!alive.current) return;\n pending.current.push(...batch);\n if (pending.current.length > 1000) flush();\n else flushTimer.current ??= setTimeout(flush, 80);\n };\n useEffect(() => {\n alive.current = true;\n const onTarget = (event: Event) => {\n const next = parsePowerLogsTarget((event as CustomEvent).detail);\n if (next) {\n if (queryRef.current) {\n void client.cancel(queryRef.current).catch(() => {});\n queryRef.current = \"\";\n setQueryId(\"\");\n }\n setSource(initialSource((event as CustomEvent).detail.container));\n setTarget(next);\n }\n };\n window.addEventListener(\"power-logs-target\", onTarget);\n void refreshCaptures();\n const timer = setInterval(() => void refreshCaptures(), 30000);\n return () => {\n alive.current = false;\n epoch.current++;\n clearInterval(timer);\n clearTimeout(flushTimer.current);\n historyController.current?.abort();\n liveController.current?.abort();\n captureController.current?.abort();\n if (queryRef.current) void client.cancel(queryRef.current).catch(() => {});\n window.removeEventListener(\"power-logs-target\", onTarget);\n };\n }, [client]);\n const readHistory = async () => {\n if (!target) return;\n const currentEpoch = ++epoch.current;\n historyController.current?.abort();\n stopLive();\n const controller = new AbortController();\n historyController.current = controller;\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n pending.current = [];\n setBusy(true);\n setRecords([]);\n setSelected(undefined);\n setError(\"\");\n setNotes([]);\n setStatus(\"Discovering owned containers…\");\n try {\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`Reading ${discovery.sources.length} container sources…`);\n const history = await collectHistoricalLogs(discovery.sources, transport, {\n signal: controller.signal,\n tailLines: L.historyLines,\n limitBytes: L.historyBytes,\n onRecords: (batch) => {\n if (currentEpoch === epoch.current) appendView(batch);\n },\n });\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n flush();\n setNotes([...new Set([...discovery.notes, ...history.notes])]);\n setStatus(\n `${discovery.sources.length} sources · last ${limits.historyLines.toLocaleString()} lines per container, up to ${limits.historyBytes / 1048576} MiB each`,\n );\n } catch {\n if (alive.current && currentEpoch === epoch.current)\n setError(\n controller.signal.aborted\n ? \"Log loading stopped\"\n : \"Could not read this resource's logs. Check permissions and whether it still exists.\",\n );\n } finally {\n if (alive.current && currentEpoch === epoch.current) setBusy(false);\n }\n };\n useEffect(() => {\n setText(\"\");\n setFieldFilters([]);\n setSources([]);\n setTab(\"live\");\n void readHistory();\n }, [target?.uid]);\n const toggleLive = () => {\n if (live) {\n stopLive();\n return;\n }\n setLive(true);\n };\n const sourceIdentity = sources.map((item) => `${item.podUid}/${item.container}`).join(\";\");\n useEffect(() => {\n if (!live || !sources.length) return;\n const controller = new AbortController();\n liveController.current = controller;\n const collector = startLiveLogs(sources, createPowerLogsTransport(clusterId), {\n signal: controller.signal,\n tailLines: L.historyLines,\n initialRecords: recordsRef.current,\n onRecords: appendView,\n onCoverage: (coverage) => {\n if (alive.current && liveController.current === controller)\n setLiveCoverage({ ...coverage, notes: [...coverage.notes] });\n },\n });\n setLiveCoverage({ ...collector.coverage });\n void collector.done.finally(() => {\n if (alive.current && !controller.signal.aborted && liveController.current === controller) {\n liveController.current = undefined;\n setLive(false);\n }\n });\n return () => {\n controller.abort();\n if (liveController.current === controller) liveController.current = undefined;\n };\n }, [live, sourceIdentity]);\n useEffect(() => {\n if (!live || !target) return;\n const controller = new AbortController();\n const startingEpoch = epoch.current;\n let refreshing = false;\n const timer = setInterval(() => {\n if (refreshing) return;\n refreshing = true;\n void resolveLogSources(target, createPowerLogsTransport(clusterId), controller.signal)\n .then((discovery) => {\n if (controller.signal.aborted || epoch.current !== startingEpoch) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`${discovery.sources.length} sources · ownership inventory refreshed`);\n })\n .catch(() => {\n if (!controller.signal.aborted && alive.current && epoch.current === startingEpoch) {\n stopLive();\n setNotes((current) => [\n ...new Set([\n ...current,\n \"Workload inventory changed or became unavailable. Refresh before following logs again.\",\n ]),\n ]);\n }\n })\n .finally(() => {\n refreshing = false;\n });\n }, 30000);\n return () => {\n clearInterval(timer);\n controller.abort();\n };\n }, [live, target?.uid]);\n const capture = async () => {\n if (!target || captureController.current || queryRef.current) return;\n setCapturePending(true);\n const controller = new AbortController();\n captureController.current = controller;\n let current: LogCapture | undefined;\n let partial = false;\n let captureNotes: string[] = [];\n setError(\"\");\n stopLive();\n try {\n current = await client.create(target);\n setCapturing(current);\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n captureNotes = discovery.notes;\n partial = discovery.partial;\n const captureSources = previous\n ? [...discovery.sources, ...discovery.sources.map((item) => ({ ...item, previous: true }))]\n : discovery.sources;\n const boundary = current.createdAt;\n const history = await collectHistoricalLogs(captureSources, transport, {\n signal: controller.signal,\n tailLines: L.captureSourceLines,\n sinceTime: new Date(boundary - captureMinutes * 60000).toISOString(),\n limitBytes: L.captureSourceBytes,\n onRecords: async (batch) => {\n if (batch.some((record) => record.timestamp === null)) {\n partial = true;\n captureNotes.push(\"Some records have no timestamp and their capture window cannot be verified\");\n }\n batch = batch.filter(\n (record) =>\n record.timestamp === null ||\n (record.timestamp <= boundary && record.timestamp >= boundary - captureMinutes * 60000),\n );\n for (let offset = 0; offset < batch.length; ) {\n const chunk: LogRecord[] = [];\n let bytes = 2;\n while (offset < batch.length && chunk.length < L.batchRows) {\n const record = batch[offset];\n const size = Buffer.byteLength(JSON.stringify(record)) + 1;\n if (chunk.length && bytes + size > L.batchBytes) break;\n chunk.push(record);\n bytes += size;\n offset++;\n }\n if (controller.signal.aborted) throw new Error(\"Capture stopped\");\n try {\n current = await client.append(current!.id, chunk);\n if (alive.current) setCapturing(current);\n } catch {\n controller.abort();\n throw new Error(\"Capture reached its storage limit or became unavailable\");\n }\n }\n },\n });\n partial ||= history.partial;\n captureNotes.push(...history.notes);\n } catch {\n partial = true;\n captureNotes.push(\"Collection stopped or a source was unavailable; this snapshot may be incomplete\");\n } finally {\n if (current) {\n try {\n const saved = await client.finish(\n current.id,\n partial || controller.signal.aborted,\n [...new Set(captureNotes)].slice(0, 20),\n );\n if (alive.current) {\n setCaptureId(saved.id, saved);\n setCaptures((items) => [saved, ...items.filter((item) => item.id !== saved.id)]);\n setTab(\"captures\");\n setSql(examples[0][1]);\n void applyPreset(\"Recent\", saved, true);\n }\n } catch {\n if (alive.current) setError(\"The temporary capture could not be finalized\");\n }\n } else if (alive.current)\n setError(\"Could not create a capture. Delete an old snapshot or check the log service.\");\n if (alive.current) {\n setCapturing(undefined);\n setCapturePending(false);\n void refreshCaptures();\n }\n captureController.current = undefined;\n }\n };\n const runQuery = async (selectedCapture?: LogCapture, query = sql) => {\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (!captured || captured.state === \"collecting\" || deleting.current.has(captured.id)) return;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setError(\"\");\n setResult(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n setResultEvidence({ capture: captured, sql: query });\n setResultPage(0);\n try {\n const value = await client.query(captured.id, id, query);\n if (alive.current && queryRef.current === id) {\n if (value.error) {\n setSqlError(value.error);\n setResultEvidence({ capture: captured, sql: query, error: value.error });\n } else setResult(value);\n }\n } catch {\n if (alive.current && queryRef.current === id) {\n const message =\n \"Query stopped or failed. Use one read-only SELECT or EXPLAIN; external files, networking and extensions are disabled.\";\n setSqlError(message);\n setResultEvidence({ capture: captured, sql: query, error: message });\n }\n } finally {\n if (queryRef.current === id) {\n if (alive.current) setQueryId(\"\");\n queryRef.current = \"\";\n }\n }\n };\n const applyPreset = async (title: \"Recent\" | \"JSON\", selectedCapture?: LogCapture, execute = false) => {\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n if (title === \"Recent\") {\n const query = examples[0][1];\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n if (execute && captured) void runQuery(captured, query);\n return;\n }\n if (\n queryRef.current ||\n (!selectedCapture && captureController.current) ||\n !captured ||\n captured.state === \"collecting\" ||\n deleting.current.has(captured.id)\n )\n return;\n const draft = execute ? examples[0][1] : sqlDraft.current;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setSqlError(\"\");\n let prepared: string | undefined;\n try {\n let keys = captureKeys.current.get(captured.id);\n if (!keys) {\n const schema = await client.query(captured.id, id, JSON_KEY_DISCOVERY_SQL);\n if (schema.error) throw new Error(schema.error);\n const keyColumn = schema.columns.indexOf(\"key\");\n keys = schema.truncated\n ? [\"\\0\"]\n : keyColumn < 0\n ? []\n : schema.rows.map((row) => row[keyColumn]).filter((key): key is string => typeof key === \"string\");\n captureKeys.current.set(captured.id, keys);\n if (captureKeys.current.size > 10) captureKeys.current.delete(captureKeys.current.keys().next().value!);\n }\n if (!alive.current || queryRef.current !== id || captureSelection.current !== captured.id) return;\n if (sqlDraft.current !== draft) {\n setSqlError(\"SQL draft changed while detecting JSON fields. Select the preset again to replace it.\");\n return;\n }\n prepared = buildJsonProjectionSql(keys);\n setSql(prepared);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n } catch {\n if (alive.current) setSqlError(\"Could not detect JSON fields for this snapshot. Try the preset again.\");\n } finally {\n if (queryRef.current === id) {\n queryRef.current = \"\";\n if (alive.current) setQueryId(\"\");\n }\n }\n if (prepared && execute && alive.current) void runQuery(captured, prepared);\n };\n const addLiveFilter = (filter: JsonFieldFilter) => {\n if (!jsonValuesEqual(filter.value, filter.value)) {\n setError(\"This JSON value is too large or unsupported for filtering\");\n return;\n }\n const existing = fieldFilters.findIndex((current) => sameFieldValue(current, filter));\n if (existing >= 0) {\n if (fieldFilters[existing].operator !== filter.operator) {\n setFieldFilters(fieldFilters.map((current, index) => (index === existing ? filter : current)));\n }\n return;\n }\n if (fieldFilters.length >= 32) {\n setError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n setFieldFilters([...fieldFilters, filter]);\n };\n const activeSqlFilters =\n sqlFieldFilters?.rendered === sql && sqlFieldFilters.captureId === captureId ? sqlFieldFilters : undefined;\n const sqlFilteringDisabled = Boolean(\n queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n !captures.some((capture) => capture.id === captureId && capture.state !== \"collecting\"),\n );\n const applySqlFilters = (filters: SqlJsonFieldFilter[]) => {\n if (queryRef.current || captureController.current || sqlFilteringDisabled) return;\n if (!resultEvidence || resultEvidence.sql !== sql) {\n setSqlError(\"Run the edited SQL query before filtering its results\");\n return;\n }\n try {\n const base = activeSqlFilters?.base ?? sql;\n const query = buildJsonFilterSql(base, filters);\n setSqlFieldFilters({ base, rendered: query, captureId, filters });\n setSql(query);\n void runQuery(undefined, query);\n } catch {\n setSqlError(\"This JSON filter cannot be added to the query. Check the field path and value size.\");\n }\n };\n const addSqlFilter = (column: string, filter: JsonFieldFilter) => {\n const columnNames = result?.columns.map((name) => name.replace(/[A-Z]/g, (letter) => letter.toLowerCase())) ?? [];\n if (!result?.columns.includes(column) || new Set(columnNames).size !== columnNames.length) {\n setSqlError(\"JSON filters require unique result column names, ignoring case\");\n return;\n }\n const filters = activeSqlFilters?.filters ?? [];\n const existing = filters.findIndex((current) => current.column === column && sameFieldValue(current, filter));\n if (existing >= 0) {\n if (filters[existing].operator !== filter.operator) {\n applySqlFilters(filters.map((current, index) => (index === existing ? { ...filter, column } : current)));\n }\n return;\n }\n if (filters.length >= 32) {\n setSqlError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n applySqlFilters([...filters, { ...filter, column }]);\n };\n const matchesRecordFields = (record: LogRecord) => {\n if (!fieldFilters.length) return true;\n if (!parsedFields.current.has(record)) {\n let fields: unknown;\n try {\n fields = JSON.parse(record.fieldsJson ?? \"null\");\n } catch {\n fields = undefined;\n }\n parsedFields.current.set(record, fields);\n }\n return matchFields(parsedFields.current.get(record));\n };\n const filtered = useMemo(\n () =>\n records.filter(\n (record) =>\n (!text || record.message.toLocaleLowerCase().includes(text.toLocaleLowerCase())) &&\n (!level || record.level === level) &&\n (!source ||\n (source.startsWith(\"container:\") ? record.container === source.slice(10) : sourceKey(record) === source)) &&\n matchesRecordFields(record),\n ),\n [records, text, level, source, fieldFilters, matchFields],\n );\n const chosenCapture = captures.find((item) => item.id === captureId);\n const collectionNotes = tab === \"live\" ? [...new Set([...notes, ...(live ? (liveCoverage?.notes ?? []) : [])])] : [];\n useEffect(() => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: true } }));\n return () => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: false } }));\n };\n }, []);\n useEffect(() => {\n const insert = (event: Event) => {\n const sql = (event as CustomEvent<{ sql?: unknown }>).detail?.sql;\n if (typeof sql !== \"string\" || !sql.trim() || sql.length > 65536) return;\n setTab(\"captures\");\n setSelectedSqlRow(undefined);\n if (!captureId) {\n const latest = captures.find((item) => item.state !== \"collecting\" && item.target.uid === target?.uid);\n if (latest) setCaptureId(latest.id);\n }\n setSql(sql);\n requestAnimationFrame(() => document.getElementById(\"power-logs-sql\")?.focus());\n };\n window.addEventListener(\"power-logs-sql-draft\", insert);\n return () => window.removeEventListener(\"power-logs-sql-draft\", insert);\n }, [captureId, captures, target?.uid]);\n const attachAi = () => {\n const queryEvidence =\n result ??\n (resultEvidence?.error\n ? {\n columns: [],\n rows: [],\n truncated: false,\n elapsedMs: 0,\n error: resultEvidence.error,\n }\n : undefined);\n const resource =\n tab === \"captures\"\n ? queryEvidence && resultEvidence\n ? resultEvidence.capture.target\n : (chosenCapture?.target ?? target)\n : target;\n const summary =\n tab === \"captures\" && queryEvidence && resultEvidence\n ? powerLogQueryEvidence(\n resultEvidence.capture,\n resultEvidence.sql,\n selectedSqlRow ? { ...queryEvidence, rows: [selectedSqlRow.row], truncated: false } : queryEvidence,\n )\n : tab === \"live\" && selected\n ? powerLogLineEvidence(resource, selected)\n : JSON.stringify({\n target: resource,\n ...(tab === \"captures\"\n ? { sql, rows: [], state: \"Draft query, not executed\" }\n : { status, sources: sources.length }),\n });\n if (\n !explainDiagnosticFinding({\n clusterId,\n source: \"logs\",\n title: tab === \"captures\" ? (selectedSqlRow ? \"SQL row\" : \"SQL query\") : selected ? \"Log line\" : \"Power Logs\",\n summary: summary.slice(0, 6000),\n ...(resource ? { resource: { kind: resource.kind, name: resource.name, namespace: resource.namespace } } : {}),\n })\n )\n window.dispatchEvent(new Event(\"power-ai-open-only\"));\n };\n const deleteCapture = async (id: string) => {\n if (deleting.current.has(id) || queryRef.current || captureController.current) return;\n deleting.current.add(id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.delete(id);\n drafts.forget(id);\n if (id === captureSelection.current) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n await refreshCaptures();\n } catch {\n setError(\"Could not delete capture\");\n } finally {\n deleting.current.delete(id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n };\n const confirmDeleteCapture = (id: string) => {\n const capture = captures.find((capture) => capture.id === id);\n if (!capture) return;\n Renderer.Component.ConfirmDialog.open({\n message: (\n <>\n Delete snapshot <strong>{capture.target.name}</strong>? This cannot be undone.\n </>\n ),\n labelOk: \"Delete snapshot\",\n ok: () => deleteCapture(id),\n });\n };\n const confirmPersistentCapture = (capture: LogCapture) => {\n const persistent = !capture.persistent;\n Renderer.Component.ConfirmDialog.open({\n message: persistent ? (\n <>\n Keep snapshot <strong>{capture.target.name}</strong> until you delete it? It will survive restarts and will\n not expire automatically.\n </>\n ) : (\n <>\n Allow snapshot <strong>{capture.target.name}</strong> to expire? Its retention period will start again now.\n </>\n ),\n labelOk: persistent ? \"Keep snapshot\" : \"Allow expiration\",\n ok: async () => {\n if (!alive.current || deleting.current.has(capture.id) || queryRef.current || captureController.current) return;\n deleting.current.add(capture.id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.setPersistent(capture.id, persistent);\n await refreshCaptures();\n } catch (error) {\n if (alive.current) {\n const full = error instanceof Error && error.message.includes(\"Saved snapshot limit reached\");\n setSavedPoolFull(full);\n setError(\n full\n ? \"Saved snapshot limit reached. Delete a saved snapshot or clear saved snapshots from all clusters.\"\n : \"Could not update snapshot retention\",\n );\n }\n } finally {\n deleting.current.delete(capture.id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n };\n const clearSavedSnapshots = () =>\n Renderer.Component.ConfirmDialog.open({\n message: \"Delete all saved snapshots from all clusters? Temporary snapshots will be kept. This cannot be undone.\",\n labelOk: \"Clear saved snapshots\",\n ok: async () => {\n if (queryRef.current || captureController.current || deleting.current.size) return;\n deleting.current.add(\"clear-saved\");\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.clearPersistent();\n const removed = captures.filter((capture) => capture.persistent);\n for (const capture of removed) drafts.forget(capture.id);\n if (removed.some((capture) => capture.id === captureSelection.current)) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n setSavedPoolFull(false);\n setError(\"\");\n await refreshCaptures();\n } catch {\n if (alive.current) setError(\"Could not clear saved snapshots\");\n } finally {\n deleting.current.delete(\"clear-saved\");\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n const native = () => {\n const first = sources[0];\n const pod = Renderer.K8sApi.podsStore\n .getItems()\n .find((item) =>\n target?.kind === \"Pod\" ? item.metadata.uid === target.uid : item.metadata.uid === first?.podUid,\n );\n const requested = source.startsWith(\"container:\")\n ? source.slice(10)\n : sources.find((item) => sourceKey(item) === source)?.container;\n const defaultContainer = pod?.metadata.annotations?.[\"kubectl.kubernetes.io/default-container\"];\n const container =\n pod?.getAllContainers().find((item) => item.name === (requested ?? defaultContainer)) ??\n pod?.getAllContainers()[0];\n if (pod && container)\n Renderer.Component.logTabStore.createPodTab({ selectedPod: pod, selectedContainer: container });\n else setError(\"Open the Pod in the native resource view to use its Logs action\");\n };\n return (\n <div\n className=\"power-logs\"\n data-testid=\"power-logs-page\"\n data-compact={compact || undefined}\n data-hide-resource-name={hideResourceName || undefined}\n >\n <style>{powerLogsStyles}</style>\n <header>\n <h1 className=\"power-logs-page-title\">Power Logs</h1>\n <div\n className=\"power-logs-tabs\"\n role=\"tablist\"\n aria-label=\"Log workspace\"\n onKeyDown={(event) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[role=tab]\")];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? tabs.length - 1\n : (index + (event.key === \"ArrowRight\" ? 1 : -1) + tabs.length) % tabs.length;\n tabs[next]?.focus();\n tabs[next]?.click();\n }}\n >\n <button role=\"tab\" aria-selected={tab === \"live\"} onClick={() => setTab(\"live\")}>\n <Icon material=\"subject\" size={16} /> Live view\n </button>\n <button\n role=\"tab\"\n aria-selected={tab === \"captures\"}\n onClick={() => {\n setTab(\"captures\");\n const latest = captures.find(\n (item) => item.state !== \"collecting\" && (!target || item.target.uid === target.uid),\n );\n if (!captureId && latest && !capturePending) {\n setCaptureId(latest.id);\n }\n void refreshCaptures();\n }}\n >\n <Icon material=\"code\" size={16} /> SQL\n </button>\n </div>\n\n <div className=\"power-logs-actions\">\n <div className=\"power-logs-toolbar power-logs-capture\">\n <details ref={captureOptions} className=\"power-logs-options\">\n <NativeTooltip title={`Capture window: ${captureMinutes} minutes`}>\n <summary>\n <Icon material=\"tune\" size={16} /> Options\n </summary>\n </NativeTooltip>\n <div>\n {\" \"}\n <label>\n Capture window\n <LogSelect\n label=\"Capture window\"\n value={String(captureMinutes)}\n onChange={(value) => setCaptureMinutes(Number(value))}\n options={[\n { value: \"5\", label: \"5 minutes\" },\n { value: \"15\", label: \"15 minutes\" },\n { value: \"60\", label: \"1 hour\" },\n ]}\n />\n </label>\n <Renderer.Component.Switch checked={previous} onChange={setPrevious}>\n Include previous containers\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={compact}\n onChange={(value) => {\n setCompact(value);\n preferences.compactRows = value;\n }}\n >\n Compact density\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={hideResourceName}\n onChange={(value) => {\n setHideResourceName(value);\n preferences.hideResourceNameColumn = value;\n }}\n >\n Hide resource name column\n </Renderer.Component.Switch>\n </div>\n </details>\n {tab === \"captures\" && (\n <button\n type=\"button\"\n disabled={!target || capturePending || busy || !!queryId || deletingCount > 0}\n onClick={() => void capture()}\n >\n <Icon material=\"save_alt\" size={16} /> Capture logs\n </button>\n )}\n {capturePending && (\n <>\n <span role=\"status\" className=\"power-logs-muted\">\n {capturing\n ? `${capturing.rows.toLocaleString()} lines · ${(capturing.bytes / 1048576).toFixed(1)} MiB`\n : \"Preparing capture…\"}\n </span>\n <button type=\"button\" onClick={() => captureController.current?.abort()}>\n <Icon material=\"stop\" size={16} /> Stop & keep partial\n </button>\n </>\n )}\n </div>\n\n <DiagnosticExplainButton aria-label=\"Open AI assistant\" title=\"Open AI assistant\" onClick={attachAi}>\n <Icon material=\"chat_bubble_outline\" size={16} /> AI\n </DiagnosticExplainButton>\n {tab === \"live\" && (\n <button type=\"button\" disabled={!target || busy} onClick={() => void readHistory()}>\n <Icon material=\"refresh\" size={16} /> Refresh\n </button>\n )}\n {target?.kind === \"Pod\" && (\n <NativeTooltip title=\"Native logs\">\n <button type=\"button\" aria-label=\"Native logs\" onClick={native}>\n <Renderer.Component.Icon material=\"open_in_new\" size={16} />\n </button>\n </NativeTooltip>\n )}\n </div>\n </header>\n {target ? (\n <NativeTooltip title={`${target.kind} / ${target.name} · ${target.namespace} · UID ${target.uid}`}>\n <div className=\"power-logs-target power-logs-muted\">\n <strong>\n {target.kind} / {target.name}\n </strong>{\" \"}\n · {target.namespace}\n </div>\n </NativeTooltip>\n ) : (\n <SourcePicker />\n )}\n {error && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error\">\n {error}\n {savedPoolFull && (\n <button\n type=\"button\"\n disabled={deletingCount > 0 || !!queryId || capturePending}\n onClick={clearSavedSnapshots}\n >\n Clear saved snapshots\n </button>\n )}\n </div>\n )}\n {tab === \"live\" ? (\n <>\n <div className=\"power-logs-filters\">\n <input\n aria-label=\"Search log messages\"\n placeholder=\"Search messages…\"\n value={text}\n maxLength={300}\n onChange={(event) => setText(event.target.value)}\n />\n <LogSelect\n label=\"Log level\"\n value={level}\n onChange={setLevel}\n options={[\n { value: \"\", label: \"All levels\" },\n ...levels.map((value) => ({ value, label: value.toUpperCase() })),\n ]}\n />\n <LogSelect\n label=\"Container source\"\n renderOption={(option, context) => {\n if (context !== \"menu\")\n return (\n <NativeTooltip title={option.label}>\n <span>{option.label}</span>\n </NativeTooltip>\n );\n const item = sources.find((item) => sourceKey(item) === option.value);\n return (\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-source-option\">\n <Icon material={item ? \"view_in_ar\" : \"layers\"} size={16} />\n <span className=\"power-logs-option-text\">\n <strong>{item ? item.pod : option.value ? \"All pods\" : option.label}</strong>\n <small>\n {option.value\n ? `Container · ${item?.container ?? option.value.slice(10)}`\n : \"Every pod and container\"}\n {item?.previous ? \" · Previous\" : \"\"}\n </small>\n </span>\n <span className=\"power-logs-source-check\" aria-hidden=\"true\">\n {source === option.value && <Icon material=\"check\" size={16} />}\n </span>\n </span>\n </NativeTooltip>\n );\n }}\n value={source}\n onChange={setSource}\n options={[\n { value: \"\", label: `All sources (${sources.length})` },\n ...[...new Set(sources.map((item) => item.container))].map((container) => ({\n value: `container:${container}`,\n label: `All pods / ${container}`,\n })),\n ...[...new Set(sources.map(sourceKey))].map((value) => ({ value, label: value })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!sources.length || busy || capturePending}\n aria-pressed={live}\n onClick={toggleLive}\n >\n <Icon material={live ? \"pause\" : \"play_arrow\"} size={16} /> {live ? \"Pause\" : \"Live\"}\n </button>\n <button type=\"button\" aria-pressed={follow} onClick={() => setFollow(!follow)}>\n <Icon material=\"vertical_align_bottom\" size={16} /> Follow tail\n </button>\n {busy && (\n <button onClick={() => historyController.current?.abort()} type=\"button\">\n <Icon material=\"stop\" size={16} /> Stop loading\n </button>\n )}\n </div>\n <FieldFilters\n filters={fieldFilters}\n onRemove={(index) => setFieldFilters(fieldFilters.filter((_, item) => item !== index))}\n />\n <NativeTooltip\n title={`${status} · Viewer retains up to ${limits.liveRows.toLocaleString()} lines / ${limits.liveBytes / 1048576} MiB`}\n >\n <div className=\"power-logs-muted power-logs-status\" role=\"status\">\n <span>{filtered.length.toLocaleString()} matching lines</span> · {status}\n {liveCoverage && live ? ` · ${liveCoverage.active}/${liveCoverage.total} active sources` : \"\"} · Viewer\n retains up to {limits.liveRows.toLocaleString()} lines / {limits.liveBytes / 1048576} MiB\n </div>\n </NativeTooltip>\n <div className=\"power-logs-workspace\">\n <LogRows\n records={filtered}\n loading={busy}\n selected={selected?.key}\n onSelect={setSelected}\n follow={follow}\n setFollow={setFollow}\n compact={compact}\n />\n {selected && (\n <LogDetails record={selected} onClose={() => setSelected(undefined)} onFilter={addLiveFilter} />\n )}\n </div>\n </>\n ) : (\n <>\n <div className=\"power-logs-toolbar power-logs-snapshot-bar\">\n <span className=\"power-logs-control-label\">Snapshot</span>\n <LogSelect\n label=\"Capture snapshot\"\n onKeyDown={(event) => {\n if (\n event.key !== \"Delete\" ||\n !event.altKey ||\n ((event.target as HTMLInputElement).value ?? \"\").length > 0\n )\n return;\n const button = document.querySelector<HTMLButtonElement>(\n \".Select__menu .Select__option--is-focused [data-capture-delete]\",\n );\n if (button && !button.disabled) {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(button.dataset.captureDelete!);\n }\n }}\n renderOption={(option, context) => {\n const item = captures.find((item) => item.id === option.value);\n if (context !== \"menu\" || !item) return option.label;\n return (\n <span className=\"power-logs-snapshot-option\">\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-option-text\">\n <strong>{item.target.name}</strong>\n <small>\n {formatDateTime(item.createdAt)} · {item.rows.toLocaleString()} lines ·{\" \"}\n {item.state[0].toUpperCase()}\n {item.state.slice(1)}\n {item.persistent ? \" · Persistent\" : \"\"}\n </small>\n </span>\n </NativeTooltip>\n <NativeTooltip title={item.persistent ? \"Allow snapshot to expire\" : \"Keep snapshot\"}>\n <button\n type=\"button\"\n aria-label={`${item.persistent ? \"Allow expiration for\" : \"Keep\"} snapshot ${item.target.name}`}\n aria-pressed={Boolean(item.persistent)}\n data-capture-persistent={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmPersistentCapture(item);\n }}\n >\n <Renderer.Component.Icon material=\"push_pin\" size={16} />\n </button>\n </NativeTooltip>\n <NativeTooltip title=\"Delete snapshot (Alt+Delete)\">\n <button\n type=\"button\"\n aria-label={`Delete snapshot ${item.target.name}`}\n data-capture-delete={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(item.id);\n }}\n >\n <Renderer.Component.Icon material=\"delete_outline\" size={16} />\n </button>\n </NativeTooltip>\n </span>\n );\n }}\n value={captureId}\n disabled={!!queryId || capturePending || deletingCount > 0}\n onChange={(value) => {\n setCaptureId(value);\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n }}\n options={[\n { value: \"\", label: \"Choose a snapshot\" },\n ...captures.map((item) => ({\n value: item.id,\n label: `${item.target.name} · ${formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}${item.persistent ? \" · Persistent\" : \"\"}`,\n })),\n ]}\n />\n <NativeTooltip title=\"Export JSON Lines (NDJSON)\">\n <button\n type=\"button\"\n disabled={!captureId || !!queryId || deleting.current.has(captureId)}\n onClick={() => {\n void client.export(captureId).catch(() => setError(\"Could not export capture\"));\n }}\n >\n <Icon material=\"download\" size={16} /> Export JSON\n </button>\n </NativeTooltip>\n </div>\n <div className=\"power-logs-toolbar power-logs-sql-tools\">\n <NativeTooltip\n title={`Read-only SELECT · ${limits.queryMs / 1000} s · ${limits.resultRows.toLocaleString()} rows · Schema: logs(timestamp INTEGER in milliseconds, pod, podUid, container, level, message, fieldsJson, previous INTEGER 0 or 1)`}\n >\n <label htmlFor=\"power-logs-sql\" className=\"power-logs-control-label\">\n SQL query\n </label>\n </NativeTooltip>\n <button\n type=\"button\"\n disabled={\n !chosenCapture ||\n !!queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n chosenCapture.state === \"collecting\"\n }\n onClick={() => void runQuery()}\n >\n <Icon material=\"play_arrow\" size={16} /> Run query\n </button>\n {queryId && (\n <button\n type=\"button\"\n onClick={() => {\n void client.cancel(queryId).catch(() => setError(\"Could not cancel query\"));\n }}\n >\n <Icon material=\"stop\" size={16} /> Cancel\n </button>\n )}\n {examples.map(([title, query]) => (\n <button\n type=\"button\"\n key={title}\n disabled={!!queryId || capturePending}\n onClick={() => {\n if (title === \"JSON\" || title === \"Recent\") void applyPreset(title);\n else {\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n }\n }}\n >\n <Icon\n material={\n title === \"Recent\"\n ? \"history\"\n : title === \"Errors\"\n ? \"error_outline\"\n : title === \"Timeline\"\n ? \"timeline\"\n : \"data_object\"\n }\n size={16}\n />{\" \"}\n SQL · {title}\n </button>\n ))}\n </div>\n <FieldFilters\n sql\n filters={activeSqlFilters?.filters ?? []}\n disabled={sqlFilteringDisabled}\n onRemove={(index) => applySqlFilters((activeSqlFilters?.filters ?? []).filter((_, item) => item !== index))}\n />\n <SqlEditor id=\"power-logs-sql\" value={sql} onChange={setSql} fitVersion={sqlFitVersion} />\n {sqlError && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error power-logs-query-error\">\n {sqlError}\n </div>\n )}\n {result ? (\n <>\n <div className=\"power-logs-toolbar power-logs-results-bar\">\n <span role=\"status\" className=\"power-logs-muted\">\n {result.rows.length} rows · {result.elapsedMs} ms{result.truncated ? \" · Result truncated\" : \"\"}\n </span>\n </div>\n <div className=\"power-logs-workspace\">\n <div className=\"power-logs-results\">\n <table\n style={{\n minWidth:\n result.columns.length > 3\n ? result.columns.reduce((width, column) => width + sqlColumnWidth(column), 0)\n : undefined,\n }}\n >\n <colgroup>\n {result.columns.map((column, i) => (\n <col\n key={i}\n style={{\n width: result.columns.length > 3 ? sqlColumnWidth(column) : undefined,\n }}\n />\n ))}\n </colgroup>\n <thead>\n <tr>\n {result.columns.map((column, i) => (\n <th key={i} data-column={column}>\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.slice(resultPage * 50, (resultPage + 1) * 50).map((row, i) => (\n <tr\n key={i}\n tabIndex={0}\n aria-label={`Open SQL row ${resultPage * 50 + i + 1}`}\n onClick={() => setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row })}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row });\n }\n }}\n >\n {row.map((cell, j) => (\n <td\n key={j}\n data-column={result.columns[j]}\n data-level={sqlCellLevel(result.columns[j], cell)}\n >\n <LogJsonCell\n value={cell === null ? null : String(cell)}\n column={result.columns[j]}\n rawValue={cell}\n Icon={Icon}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {result.rows.length === 0 && (\n <div className=\"power-logs-empty\">\n {chosenCapture?.rows === 0\n ? \"This snapshot contains no log lines. Try a longer capture window.\"\n : \"This query returned no rows. Adjust the query or choose SQL · Recent.\"}\n </div>\n )}\n </div>\n {selectedSqlRow && (\n <LogDetails\n record={selectedSqlRow.record}\n jsonColumn={selectedSqlRow.jsonColumn}\n onFilter={\n !sqlFilteringDisabled && selectedSqlRow.jsonColumn\n ? (filter) => addSqlFilter(selectedSqlRow.jsonColumn!, filter)\n : undefined\n }\n onClose={() => setSelectedSqlRow(undefined)}\n />\n )}\n </div>\n {result.rows.length > 50 && (\n <nav className=\"power-logs-toolbar power-logs-pagination\" aria-label=\"SQL result pages\">\n <NativeTooltip title=\"Previous page\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={resultPage === 0}\n onClick={() => {\n setResultPage(resultPage - 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_left\" size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\">\n Page {resultPage + 1} / {Math.max(1, Math.ceil(result.rows.length / 50))}\n </span>\n <NativeTooltip title=\"Next page\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={(resultPage + 1) * 50 >= result.rows.length}\n onClick={() => {\n setResultPage(resultPage + 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_right\" size={16} />\n </button>\n </NativeTooltip>\n </nav>\n )}\n </>\n ) : (\n <div className=\"power-logs-results power-logs-empty\">\n {queryId\n ? \"Running query…\"\n : captures.length === 0\n ? \"Capture logs to create a temporary snapshot for SQL.\"\n : \"Choose a snapshot to preview its logs.\"}\n </div>\n )}\n </>\n )}\n <div className=\"power-logs-muted power-logs-footer\">\n <NativeTooltip\n 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 / 60000} minutes.`}\n >\n <span className=\"power-logs-caption\">\n Collection · {limits.requestsPerSecond} req/s · {limits.bytesPerSecond / 1048576} MiB/s ·{\" \"}\n {limits.captureBytes / 1048576} MiB/snapshot · Retention {limits.ttlMs / 60000} min\n </span>\n </NativeTooltip>\n {tab === \"live\" && collectionNotes.length > 0 && (\n <NativeTooltip title={collectionNotes.join(\"\\n\")}>\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>{collectionNotes.join(\" · \")}</span>\n </span>\n </NativeTooltip>\n )}\n {tab === \"captures\" &&\n chosenCapture &&\n (chosenCapture.state === \"partial\" || chosenCapture.notes.length > 0) && (\n <NativeTooltip\n title={\n chosenCapture.notes.join(\"\\n\") ||\n \"Collection stopped or a source was unavailable; this snapshot may be incomplete\"\n }\n >\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>Incomplete snapshot</span>\n </span>\n </NativeTooltip>\n )}\n </div>\n </div>\n );\n}\n\nconst ObservedWorkspace = observer(Workspace);\n\nexport const PowerLogsPage = observer(() => {\n const enabled = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled;\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n if (!enabled || !clusterId)\n return (\n <div className=\"power-logs\">\n <style>{powerLogsStyles}</style>\n <h1>Power Logs</h1>\n <p>Enable Power Logs in Power settings and open a cluster to view logs.</p>\n </div>\n );\n const contextId = searchContextId();\n return <ObservedWorkspace key={`${clusterId}:${contextId}`} clusterId={clusterId} contextId={contextId} />;\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"power-logs.js","names":[],"sources":["../../src/renderer/power-logs.tsx"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Renderer } from \"@freelensapp/extensions\";\nimport { clipboard } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { formatDateTime } from \"../common/date-time\";\nimport { compileJsonFilters, type JsonFieldFilter, jsonValuesEqual } from \"../common/power-log-field-filters\";\nimport { buildJsonFilterSql, type SqlJsonFieldFilter } from \"../common/power-log-json-filter-sql\";\nimport { buildJsonProjectionSql, JSON_KEY_DISCOVERY_SQL } from \"../common/power-log-json-preset\";\nimport { sqlCellLevel } from \"../common/power-log-sql-level\";\nimport {\n POWER_LOGS_LIMITS as L,\n type LogCapture,\n type LogLevel,\n type LogQueryResult,\n type LogRecord,\n type LogSource,\n type LogTarget,\n} from \"../common/power-logs\";\nimport { powerLogLineEvidence, powerLogQueryEvidence } from \"../common/power-logs-ai\";\nimport { applyPowerLogsLimits, normalizePowerLogsLimits } from \"../common/power-logs-limits\";\nimport { LogsPreferencesStore } from \"../common/store/logs-preferences-store\";\nimport { explainDiagnosticFinding } from \"./ai-diagnostic-handoff\";\nimport { DiagnosticExplainButton } from \"./diagnostic-explain-button\";\nimport { NativeTooltip } from \"./native-tooltip\";\nimport { LogJson } from \"./power-log-json\";\nimport { LogJsonCell } from \"./power-log-json-cell\";\nimport { formatJsonLiteral, jsonHasDuplicateKeys } from \"./power-log-json-fields\";\nimport { LogMessage } from \"./power-log-message\";\nimport { SqlEditor } from \"./power-log-sql-editor\";\nimport { powerLogsStyles } from \"./power-logs.css\";\nimport { createPowerLogsClient } from \"./power-logs-client\";\nimport { collectHistoricalLogs, type LiveLogCoverage, resolveLogSources, startLiveLogs } from \"./power-logs-collector\";\nimport { openPowerLogs, parsePowerLogsTarget } from \"./power-logs-entrypoints\";\nimport { CaptureSqlDrafts } from \"./power-logs-sql-drafts\";\nimport { sqlRowDetails } from \"./power-logs-sql-row\";\nimport { createPowerLogsTransport } from \"./power-logs-transport\";\nimport { searchContextId } from \"./resource-search-client\";\n\nconst Icon = (props: { material: string; size?: number; tooltip?: string }) => (\n <span aria-hidden=\"true\" style={{ display: \"inline-flex\" }}>\n <Renderer.Component.Icon {...props} />\n </span>\n);\nconst sourceKey = (r: Pick<LogRecord, \"pod\" | \"container\" | \"previous\">) =>\n `${r.pod} / ${r.container}${r.previous ? \" (previous)\" : \"\"}`;\nconst levels: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"];\nconst examples = [\n [\"Recent\", \"SELECT timestamp, level, message, container, pod FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\"],\n [\n \"Errors\",\n \"SELECT message, count(*) AS occurrences FROM logs WHERE level IN ('error','fatal') GROUP BY message ORDER BY occurrences DESC LIMIT 200\",\n ],\n [\n \"Timeline\",\n \"SELECT (timestamp / 60000) * 60000 AS minute, UPPER(level) AS level, count(*) AS lines FROM logs GROUP BY minute, level ORDER BY minute\",\n ],\n [\"JSON\", \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\"],\n] as const;\nconst sqlColumnWidth = (column: string) =>\n column === \"message\" || column === \"fieldsJson\" ? 360 : column === \"level\" ? 90 : 200;\ntype ViewRecord = LogRecord & { key: number; bytes: number };\n\nfunction initialTarget(): LogTarget | undefined {\n try {\n return parsePowerLogsTarget(JSON.parse(new URLSearchParams(window.location.search).get(\"target\") ?? \"null\"));\n } catch {\n return;\n }\n}\nfunction initialSource(container: unknown = new URLSearchParams(window.location.search).get(\"container\")): string {\n return typeof container === \"string\" && /^[a-z0-9](?:[-a-z0-9]*[a-z0-9])?$/.test(container) && container.length <= 63\n ? `container:${container}`\n : \"\";\n}\n\nfunction LogSelect({\n label,\n value,\n options,\n onChange,\n disabled = false,\n renderOption,\n onKeyDown,\n}: {\n label: string;\n value: string;\n options: { value: string; label: string }[];\n onChange(value: string): void;\n disabled?: boolean;\n onKeyDown?: (event: ReactKeyboardEvent) => void;\n renderOption?: (option: { value: string; label: string }, context: \"menu\" | \"value\") => ReactNode;\n}) {\n return (\n <span className=\"power-logs-select\" data-source-select={label === \"Container source\" || undefined}>\n <Renderer.Component.Select\n aria-label={label}\n value={value}\n options={options}\n formatOptionLabel={(option, meta) =>\n renderOption ? (\n renderOption(option, meta.context)\n ) : label === \"Log level\" && option.value ? (\n <span className=\"power-logs-level-label\" data-level={option.value}>\n {option.label}\n </span>\n ) : (\n option.label\n )\n }\n isDisabled={disabled}\n onKeyDown={onKeyDown}\n tabSelectsValue={false}\n isClearable={false}\n menuPosition=\"fixed\"\n menuPortalTarget={document.body}\n styles={{\n menu: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n menuList: (base) => (label === \"Container source\" ? { ...base, width: \"100%\", maxWidth: \"100%\" } : base),\n option: (base) => (label === \"Container source\" ? { ...base, whiteSpace: \"normal\" } : base),\n menuPortal: (base) => {\n if (label !== \"Container source\" && label !== \"Capture snapshot\") return { ...base, zIndex: 10000 };\n const width = Math.min(label === \"Capture snapshot\" ? 620 : 560, window.innerWidth - 32);\n return {\n ...base,\n zIndex: 10000,\n width,\n left: Math.max(\n 16,\n Math.min(typeof base.left === \"number\" ? base.left : 16, window.innerWidth - width - 16),\n ),\n };\n },\n }}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n />\n </span>\n );\n}\n\nconst SourcePicker = observer(() => {\n const stores = [\n Renderer.K8sApi.podsStore,\n Renderer.K8sApi.deploymentStore,\n Renderer.K8sApi.daemonSetStore,\n Renderer.K8sApi.statefulSetStore,\n Renderer.K8sApi.replicaSetStore,\n Renderer.K8sApi.jobStore,\n Renderer.K8sApi.cronJobStore,\n ];\n const targets = stores.flatMap((store) =>\n store.getItems().flatMap((object) => {\n const target = parsePowerLogsTarget({ kind: object.kind, ...object.metadata });\n return target ? [target] : [];\n }),\n );\n const [value, setValue] = useState(\"\");\n const sorted = [...targets].sort((a, b) =>\n `${a.namespace}/${a.kind}/${a.name}`.localeCompare(`${b.namespace}/${b.kind}/${b.name}`),\n );\n return (\n <div className=\"power-logs-source\">\n <span className=\"power-logs-control-label\">Resource</span>\n <LogSelect\n label=\"Resource\"\n value={value}\n onChange={setValue}\n options={[\n { value: \"\", label: \"Choose a loaded pod or workload\" },\n ...sorted.map((target) => ({\n value: target.uid,\n label: `${target.namespace} / ${target.kind} / ${target.name}`,\n })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!targets.some((target) => target.uid === value)}\n onClick={() => {\n const target = targets.find((t) => t.uid === value);\n if (target) openPowerLogs(target);\n }}\n >\n <Icon material=\"subject\" size={16} /> Open logs\n </button>\n </div>\n );\n});\n\nfunction LogRows({\n records,\n loading,\n selected,\n onSelect,\n follow,\n setFollow,\n compact,\n}: {\n records: ViewRecord[];\n loading: boolean;\n selected?: number;\n onSelect(record: ViewRecord): void;\n follow: boolean;\n setFollow(value: boolean): void;\n compact: boolean;\n}) {\n const viewport = useRef<HTMLDivElement>(null);\n const [top, setTop] = useState(0);\n const [height, setHeight] = useState(400);\n useEffect(() => {\n const element = viewport.current;\n if (!element) return;\n const resize = new ResizeObserver(() => setHeight(element.clientHeight));\n resize.observe(element);\n return () => resize.disconnect();\n }, []);\n useLayoutEffect(() => {\n if (follow && viewport.current) {\n viewport.current.scrollTop = viewport.current.scrollHeight;\n setTop(viewport.current.scrollTop);\n }\n }, [records, follow, compact]);\n const levelCharacters = useMemo(\n () => records.reduce((width, record) => Math.max(width, record.level.length), 4),\n [records],\n );\n const rowHeight = compact ? 20 : 34;\n const start = Math.max(0, Math.floor(top / rowHeight) - 5);\n const visible = records.slice(start, start + Math.ceil(height / rowHeight) + 10);\n return (\n <div className=\"power-logs-viewer\">\n <div\n className=\"power-logs-stream\"\n ref={viewport}\n style={{ \"--power-log-level-ch\": levelCharacters } as CSSProperties}\n aria-label=\"Log lines\"\n aria-busy={loading}\n onScroll={(event) => {\n const el = event.currentTarget;\n setTop(el.scrollTop);\n if (el.scrollHeight - el.scrollTop - el.clientHeight > 60) setFollow(false);\n }}\n >\n {records.length === 0 ? (\n <div className=\"power-logs-empty\">{loading ? \"Loading logs…\" : \"No matching log lines\"}</div>\n ) : (\n <div style={{ height: records.length * rowHeight, position: \"relative\" }}>\n {visible.map((record, i) => (\n <button\n type=\"button\"\n className=\"power-log-row\"\n data-level={record.level}\n aria-pressed={selected === record.key}\n style={{ top: (start + i) * rowHeight, height: rowHeight }}\n key={record.key}\n onClick={() => onSelect(record)}\n >\n <NativeTooltip\n title={record.timestamp !== null ? formatDateTime(record.timestamp) : \"Timestamp unavailable\"}\n >\n <span>{record.timestamp !== null ? formatDateTime(record.timestamp).slice(-8) : \"—\"}</span>\n </NativeTooltip>\n <span className=\"power-log-level\">{record.level}</span>\n <span className=\"power-log-origin\" id={`power-log-source-${record.key}`}>\n {record.pod}\n {record.previous ? \" (previous)\" : \"\"}\n <Renderer.Component.Tooltip targetId={`power-log-source-${record.key}`}>\n {sourceKey(record)}\n </Renderer.Component.Tooltip>\n </span>\n <LogMessage text={record.message} />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction LogDetails({\n record,\n jsonColumn,\n onClose,\n onFilter,\n}: {\n record: LogRecord;\n jsonColumn?: string;\n onClose: () => void;\n onFilter?: (filter: JsonFieldFilter) => void;\n}) {\n const structuredFields = useMemo(() => {\n if (!record?.fieldsJson) return \"\";\n return formatJsonLiteral(record.fieldsJson);\n }, [record?.fieldsJson]);\n const fieldsEnabled = useMemo(() => !jsonHasDuplicateKeys(record.fieldsJson ?? \"\"), [record.fieldsJson]);\n const [copyFeedback, setCopyFeedback] = useState(\"\");\n useEffect(() => setCopyFeedback(\"\"), [structuredFields]);\n return (\n <aside className=\"power-logs-detail\" aria-label=\"Log line details\">\n <header>\n <strong>Line details</strong>\n <NativeTooltip title=\"Close line details\">\n <button className=\"power-logs-detail-close\" aria-label=\"Close line details\" onClick={onClose}>\n <Icon material=\"close\" size={16} />\n </button>\n </NativeTooltip>\n </header>\n <p className=\"power-logs-muted\">\n {record.pod && <>{sourceKey(record)} · </>}\n <span className=\"power-logs-level-label\" data-level={record.level}>\n {record.level.toUpperCase()}\n </span>\n </p>\n {record.message && (\n <pre>\n <LogMessage text={record.message} />\n </pre>\n )}\n {record.fieldsJson && (\n <>\n <div className=\"power-logs-structured-heading\">\n <strong>{jsonColumn ? `Structured fields · ${jsonColumn}` : \"Structured fields\"}</strong>\n <NativeTooltip title={copyFeedback || \"Copy structured JSON\"}>\n <button\n type=\"button\"\n className=\"power-logs-detail-copy\"\n aria-label=\"Copy structured JSON\"\n onClick={() => {\n try {\n clipboard.writeText(structuredFields);\n setCopyFeedback(\"Copied\");\n } catch {\n setCopyFeedback(\"Unable to copy JSON\");\n }\n }}\n >\n <Icon material={copyFeedback === \"Copied\" ? \"check\" : \"content_copy\"} size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\" aria-live=\"polite\">\n {copyFeedback}\n </span>\n </div>\n <LogJson text={structuredFields} fieldsEnabled={fieldsEnabled} Icon={Icon} onFilter={onFilter} />\n </>\n )}\n </aside>\n );\n}\n\nconst sameFieldValue = (a: JsonFieldFilter, b: JsonFieldFilter) =>\n a.path.length === b.path.length &&\n a.path.every((part, index) => part === b.path[index]) &&\n jsonValuesEqual(a.value, b.value);\nconst fieldFilterLabel = (filter: JsonFieldFilter) =>\n `${filter.path.reduce<string>((path, part) => `${path}[${typeof part === \"number\" ? part : JSON.stringify(part)}]`, \"$\")} ${filter.operator === \"eq\" ? \"=\" : \"!=\"} ${JSON.stringify(filter.value)}`;\nfunction FieldFilters({\n filters,\n sql = false,\n disabled = false,\n onRemove,\n}: {\n filters: readonly (JsonFieldFilter & { column?: string })[];\n sql?: boolean;\n disabled?: boolean;\n onRemove(index: number): void;\n}) {\n if (!filters.length) return null;\n return (\n <div className=\"power-logs-field-filters\" aria-label={sql ? \"SQL JSON filters\" : \"Live JSON filters\"}>\n <span className=\"power-logs-muted\">{sql ? \"Result filters\" : \"JSON filters\"} · AND</span>\n {filters.map((filter, index) => {\n const label = `${filter.column ? `${filter.column} ` : \"\"}${fieldFilterLabel(filter)}`;\n return (\n <NativeTooltip key={index} title={label}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove JSON filter ${label}`}\n onClick={() => onRemove(index)}\n >\n <span>{label}</span>\n <Icon material=\"close\" size={14} />\n </button>\n </NativeTooltip>\n );\n })}\n </div>\n );\n}\n\nfunction Workspace({ clusterId, contextId }: { clusterId: string; contextId: string }) {\n const client = useMemo(() => createPowerLogsClient({ clusterId, contextId }), [clusterId, contextId]);\n const drafts = useMemo(\n () =>\n new CaptureSqlDrafts(\n (id, query) => client.saveSql(id, query),\n () => setError(\"Could not save the SQL draft. Your edits remain available in this workspace.\"),\n ),\n [client],\n );\n useEffect(\n () => () => {\n void drafts.dispose();\n },\n [drafts],\n );\n const [target, setTarget] = useState(initialTarget);\n const [records, setRecords] = useState<ViewRecord[]>([]);\n const [sources, setSources] = useState<LogSource[]>([]);\n const [notes, setNotes] = useState<string[]>([]);\n const [status, setStatus] = useState(\"Choose a resource to read its logs\");\n const [error, setError] = useState(\"\");\n const [sqlError, setSqlError] = useState(\"\");\n const [tab, setTab] = useState<\"live\" | \"captures\">(\"live\");\n const [text, setText] = useState(\"\");\n const [level, setLevel] = useState(\"\");\n const [source, setSource] = useState(initialSource);\n const [savedPoolFull, setSavedPoolFull] = useState(false);\n const [fieldFilters, setFieldFilters] = useState<JsonFieldFilter[]>([]);\n const matchFields = useMemo(() => compileJsonFilters(fieldFilters), [fieldFilters]);\n const parsedFields = useRef(new WeakMap<LogRecord, unknown>());\n const [sqlFieldFilters, setSqlFieldFilters] = useState<{\n base: string;\n rendered: string;\n captureId: string;\n filters: SqlJsonFieldFilter[];\n }>();\n const preferences = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>();\n const limits = normalizePowerLogsLimits(preferences.limits);\n useEffect(() => {\n applyPowerLogsLimits(preferences.limits);\n }, [preferences.limits]);\n const [compact, setCompact] = useState(preferences.compactRows === true);\n const [hideResourceName, setHideResourceName] = useState(preferences.hideResourceNameColumn === true);\n const [selected, setSelected] = useState<ViewRecord>();\n const [selectedSqlRow, setSelectedSqlRow] = useState<\n ReturnType<typeof sqlRowDetails> & { row: LogQueryResult[\"rows\"][number] }\n >();\n const [liveCoverage, setLiveCoverage] = useState<LiveLogCoverage>();\n const [live, setLive] = useState(false);\n const [follow, setFollow] = useState(true);\n const [busy, setBusy] = useState(() => Boolean(initialTarget()));\n const [captures, setCaptures] = useState<LogCapture[]>([]);\n const [captureId, updateCaptureId] = useState(\"\");\n const captureSelection = useRef(captureId);\n captureSelection.current = captureId;\n const setCaptureId = (id: string, snapshot = captures.find((item) => item.id === id)) => {\n if (id !== captureSelection.current) void drafts.flush();\n captureSelection.current = id;\n const query = snapshot ? drafts.read(snapshot, examples[0][1]) : examples[0][1];\n sqlDraft.current = query;\n updateSql(query);\n updateCaptureId(id);\n };\n const deleting = useRef(new Set<string>());\n const [deletingCount, setDeletingCount] = useState(0);\n const [capturing, setCapturing] = useState<LogCapture>();\n const [capturePending, setCapturePending] = useState(false);\n const [captureMinutes, setCaptureMinutes] = useState(15);\n const [previous, setPrevious] = useState(false);\n const [sqlFitVersion, setSqlFitVersion] = useState(0);\n const [sql, updateSql] = useState<string>(examples[0][1]);\n const sqlDraft = useRef(sql);\n sqlDraft.current = sql;\n const setSql = (query: string) => {\n sqlDraft.current = query;\n updateSql(query);\n if (captureSelection.current) drafts.set(captureSelection.current, query);\n };\n const captureKeys = useRef(new Map<string, string[]>());\n useEffect(() => {\n setSqlFieldFilters((current) =>\n current && (current.rendered !== sql || current.captureId !== captureId) ? undefined : current,\n );\n }, [sql, captureId]);\n const [result, setResult] = useState<LogQueryResult>();\n const [resultEvidence, setResultEvidence] = useState<{ capture: LogCapture; sql: string; error?: string }>();\n const [resultPage, setResultPage] = useState(0);\n const [queryId, setQueryId] = useState(\"\");\n const captureOptions = useRef<HTMLDetailsElement>(null);\n useEffect(() => {\n const outside = (event: PointerEvent) => {\n if (\n !captureOptions.current?.contains(event.target as Node) &&\n !(event.target as Element)?.closest?.(\".Select__menu\")\n ) {\n if (captureOptions.current) captureOptions.current.open = false;\n }\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || (event.target as Element)?.closest?.(\".Select\")) return;\n if (captureOptions.current?.open) captureOptions.current.open = false;\n else {\n setSelected(undefined);\n setSelectedSqlRow(undefined);\n }\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"keydown\", escape);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"keydown\", escape);\n };\n }, []);\n const historyController = useRef<AbortController>();\n const liveController = useRef<AbortController>();\n const captureController = useRef<AbortController>();\n const queryRef = useRef(\"\");\n const epoch = useRef(0);\n const alive = useRef(true);\n const sequence = useRef(0);\n const recordsRef = useRef(records);\n recordsRef.current = records;\n const pending = useRef<LogRecord[]>([]);\n const flushTimer = useRef<ReturnType<typeof setTimeout>>();\n const refreshCaptures = () =>\n client\n .list()\n .then((value) => {\n if (alive.current) setCaptures(value);\n })\n .catch(() => {\n if (alive.current) setError(\"Temporary captures are unavailable\");\n });\n const stopLive = () => {\n liveController.current?.abort();\n liveController.current = undefined;\n setLive(false);\n };\n const flush = () => {\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n const batch = pending.current;\n pending.current = [];\n if (!batch.length || !alive.current) return;\n const next = batch.map((record) => ({\n ...record,\n key: ++sequence.current,\n bytes: Buffer.byteLength(JSON.stringify(record)),\n }));\n setRecords((current) => {\n const combined = [...current, ...next];\n let bytes = combined.reduce((sum, r) => sum + r.bytes, 0);\n let start = 0;\n while (combined.length - start > L.liveRows || bytes > L.liveBytes) bytes -= combined[start++].bytes;\n return combined.slice(start).sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0) || a.key - b.key);\n });\n };\n const appendView = (batch: LogRecord[]) => {\n if (!alive.current) return;\n pending.current.push(...batch);\n if (pending.current.length > 1000) flush();\n else flushTimer.current ??= setTimeout(flush, 80);\n };\n useEffect(() => {\n alive.current = true;\n const onTarget = (event: Event) => {\n const next = parsePowerLogsTarget((event as CustomEvent).detail);\n if (next) {\n if (queryRef.current) {\n void client.cancel(queryRef.current).catch(() => {});\n queryRef.current = \"\";\n setQueryId(\"\");\n }\n setSource(initialSource((event as CustomEvent).detail.container));\n setTarget(next);\n }\n };\n window.addEventListener(\"power-logs-target\", onTarget);\n void refreshCaptures();\n const timer = setInterval(() => void refreshCaptures(), 30000);\n return () => {\n alive.current = false;\n epoch.current++;\n clearInterval(timer);\n clearTimeout(flushTimer.current);\n historyController.current?.abort();\n liveController.current?.abort();\n captureController.current?.abort();\n if (queryRef.current) void client.cancel(queryRef.current).catch(() => {});\n window.removeEventListener(\"power-logs-target\", onTarget);\n };\n }, [client]);\n const readHistory = async () => {\n if (!target) return;\n const currentEpoch = ++epoch.current;\n historyController.current?.abort();\n stopLive();\n const controller = new AbortController();\n historyController.current = controller;\n clearTimeout(flushTimer.current);\n flushTimer.current = undefined;\n pending.current = [];\n setBusy(true);\n setRecords([]);\n setSelected(undefined);\n setError(\"\");\n setNotes([]);\n setStatus(\"Discovering owned containers…\");\n try {\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`Reading ${discovery.sources.length} container sources…`);\n const history = await collectHistoricalLogs(discovery.sources, transport, {\n signal: controller.signal,\n tailLines: L.historyLines,\n limitBytes: L.historyBytes,\n onRecords: (batch) => {\n if (currentEpoch === epoch.current) appendView(batch);\n },\n });\n if (controller.signal.aborted || currentEpoch !== epoch.current) return;\n flush();\n setNotes([...new Set([...discovery.notes, ...history.notes])]);\n setStatus(\n `${discovery.sources.length} sources · last ${limits.historyLines.toLocaleString()} lines per container, up to ${limits.historyBytes / 1048576} MiB each`,\n );\n } catch {\n if (alive.current && currentEpoch === epoch.current)\n setError(\n controller.signal.aborted\n ? \"Log loading stopped\"\n : \"Could not read this resource's logs. Check permissions and whether it still exists.\",\n );\n } finally {\n if (alive.current && currentEpoch === epoch.current) setBusy(false);\n }\n };\n useEffect(() => {\n setText(\"\");\n setFieldFilters([]);\n setSources([]);\n setTab(\"live\");\n void readHistory();\n }, [target?.uid]);\n const toggleLive = () => {\n if (live) {\n stopLive();\n return;\n }\n setLive(true);\n };\n const sourceIdentity = sources.map((item) => `${item.podUid}/${item.container}`).join(\";\");\n useEffect(() => {\n if (!live || !sources.length) return;\n const controller = new AbortController();\n liveController.current = controller;\n const collector = startLiveLogs(sources, createPowerLogsTransport(clusterId), {\n signal: controller.signal,\n tailLines: L.historyLines,\n initialRecords: recordsRef.current,\n onRecords: appendView,\n onCoverage: (coverage) => {\n if (alive.current && liveController.current === controller)\n setLiveCoverage({ ...coverage, notes: [...coverage.notes] });\n },\n });\n setLiveCoverage({ ...collector.coverage });\n void collector.done.finally(() => {\n if (alive.current && !controller.signal.aborted && liveController.current === controller) {\n liveController.current = undefined;\n setLive(false);\n }\n });\n return () => {\n controller.abort();\n if (liveController.current === controller) liveController.current = undefined;\n };\n }, [live, sourceIdentity]);\n useEffect(() => {\n if (!live || !target) return;\n const controller = new AbortController();\n const startingEpoch = epoch.current;\n let refreshing = false;\n const timer = setInterval(() => {\n if (refreshing) return;\n refreshing = true;\n void resolveLogSources(target, createPowerLogsTransport(clusterId), controller.signal)\n .then((discovery) => {\n if (controller.signal.aborted || epoch.current !== startingEpoch) return;\n setSources(discovery.sources);\n setNotes(discovery.notes);\n setStatus(`${discovery.sources.length} sources · ownership inventory refreshed`);\n })\n .catch(() => {\n if (!controller.signal.aborted && alive.current && epoch.current === startingEpoch) {\n stopLive();\n setNotes((current) => [\n ...new Set([\n ...current,\n \"Workload inventory changed or became unavailable. Refresh before following logs again.\",\n ]),\n ]);\n }\n })\n .finally(() => {\n refreshing = false;\n });\n }, 30000);\n return () => {\n clearInterval(timer);\n controller.abort();\n };\n }, [live, target?.uid]);\n const capture = async () => {\n if (!target || captureController.current || queryRef.current) return;\n setCapturePending(true);\n const controller = new AbortController();\n captureController.current = controller;\n let current: LogCapture | undefined;\n let partial = false;\n let captureNotes: string[] = [];\n setError(\"\");\n stopLive();\n try {\n current = await client.create(target);\n setCapturing(current);\n const transport = createPowerLogsTransport(clusterId);\n const discovery = await resolveLogSources(target, transport, controller.signal);\n captureNotes = discovery.notes;\n partial = discovery.partial;\n const captureSources = previous\n ? [...discovery.sources, ...discovery.sources.map((item) => ({ ...item, previous: true }))]\n : discovery.sources;\n const boundary = current.createdAt;\n const history = await collectHistoricalLogs(captureSources, transport, {\n signal: controller.signal,\n tailLines: L.captureSourceLines,\n sinceTime: new Date(boundary - captureMinutes * 60000).toISOString(),\n limitBytes: L.captureSourceBytes,\n onRecords: async (batch) => {\n if (batch.some((record) => record.timestamp === null)) {\n partial = true;\n captureNotes.push(\"Some records have no timestamp and their capture window cannot be verified\");\n }\n batch = batch.filter(\n (record) =>\n record.timestamp === null ||\n (record.timestamp <= boundary && record.timestamp >= boundary - captureMinutes * 60000),\n );\n for (let offset = 0; offset < batch.length; ) {\n const chunk: LogRecord[] = [];\n let bytes = 2;\n while (offset < batch.length && chunk.length < L.batchRows) {\n const record = batch[offset];\n const size = Buffer.byteLength(JSON.stringify(record)) + 1;\n if (chunk.length && bytes + size > L.batchBytes) break;\n chunk.push(record);\n bytes += size;\n offset++;\n }\n if (controller.signal.aborted) throw new Error(\"Capture stopped\");\n try {\n current = await client.append(current!.id, chunk);\n if (alive.current) setCapturing(current);\n } catch {\n controller.abort();\n throw new Error(\"Capture reached its storage limit or became unavailable\");\n }\n }\n },\n });\n partial ||= history.partial;\n captureNotes.push(...history.notes);\n } catch {\n partial = true;\n captureNotes.push(\"Collection stopped or a source was unavailable; this snapshot may be incomplete\");\n } finally {\n if (current) {\n try {\n const saved = await client.finish(\n current.id,\n partial || controller.signal.aborted,\n [...new Set(captureNotes)].slice(0, 20),\n );\n if (alive.current) {\n setCaptureId(saved.id, saved);\n setCaptures((items) => [saved, ...items.filter((item) => item.id !== saved.id)]);\n setTab(\"captures\");\n setSql(examples[0][1]);\n void applyPreset(\"Recent\", saved, true);\n }\n } catch {\n if (alive.current) setError(\"The temporary capture could not be finalized\");\n }\n } else if (alive.current)\n setError(\"Could not create a capture. Delete an old snapshot or check the log service.\");\n if (alive.current) {\n setCapturing(undefined);\n setCapturePending(false);\n void refreshCaptures();\n }\n captureController.current = undefined;\n }\n };\n const runQuery = async (selectedCapture?: LogCapture, query = sql) => {\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (!captured || captured.state === \"collecting\" || deleting.current.has(captured.id)) return;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setError(\"\");\n setResult(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n setResultEvidence({ capture: captured, sql: query });\n setResultPage(0);\n try {\n const value = await client.query(captured.id, id, query);\n if (alive.current && queryRef.current === id) {\n if (value.error) {\n setSqlError(value.error);\n setResultEvidence({ capture: captured, sql: query, error: value.error });\n } else setResult(value);\n }\n } catch {\n if (alive.current && queryRef.current === id) {\n const message =\n \"Query stopped or failed. Use one read-only SELECT or EXPLAIN; external files, networking and extensions are disabled.\";\n setSqlError(message);\n setResultEvidence({ capture: captured, sql: query, error: message });\n }\n } finally {\n if (queryRef.current === id) {\n if (alive.current) setQueryId(\"\");\n queryRef.current = \"\";\n }\n }\n };\n const applyPreset = async (title: \"Recent\" | \"JSON\", selectedCapture?: LogCapture, execute = false) => {\n const captured = selectedCapture ?? captures.find((item) => item.id === captureId);\n if (queryRef.current || (!selectedCapture && captureController.current)) return;\n if (title === \"Recent\") {\n const query = examples[0][1];\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n if (execute && captured) void runQuery(captured, query);\n return;\n }\n if (\n queryRef.current ||\n (!selectedCapture && captureController.current) ||\n !captured ||\n captured.state === \"collecting\" ||\n deleting.current.has(captured.id)\n )\n return;\n const draft = execute ? examples[0][1] : sqlDraft.current;\n const id = randomUUID();\n queryRef.current = id;\n setQueryId(id);\n setSqlError(\"\");\n let prepared: string | undefined;\n try {\n let keys = captureKeys.current.get(captured.id);\n if (!keys) {\n const schema = await client.query(captured.id, id, JSON_KEY_DISCOVERY_SQL);\n if (schema.error) throw new Error(schema.error);\n const keyColumn = schema.columns.indexOf(\"key\");\n keys = schema.truncated\n ? [\"\\0\"]\n : keyColumn < 0\n ? []\n : schema.rows.map((row) => row[keyColumn]).filter((key): key is string => typeof key === \"string\");\n captureKeys.current.set(captured.id, keys);\n if (captureKeys.current.size > 10) captureKeys.current.delete(captureKeys.current.keys().next().value!);\n }\n if (!alive.current || queryRef.current !== id || captureSelection.current !== captured.id) return;\n if (sqlDraft.current !== draft) {\n setSqlError(\"SQL draft changed while detecting JSON fields. Select the preset again to replace it.\");\n return;\n }\n prepared = buildJsonProjectionSql(keys);\n setSql(prepared);\n setSqlFitVersion((version) => version + 1);\n setSelectedSqlRow(undefined);\n } catch {\n if (alive.current) setSqlError(\"Could not detect JSON fields for this snapshot. Try the preset again.\");\n } finally {\n if (queryRef.current === id) {\n queryRef.current = \"\";\n if (alive.current) setQueryId(\"\");\n }\n }\n if (prepared && execute && alive.current) void runQuery(captured, prepared);\n };\n const addLiveFilter = (filter: JsonFieldFilter) => {\n if (!jsonValuesEqual(filter.value, filter.value)) {\n setError(\"This JSON value is too large or unsupported for filtering\");\n return;\n }\n const existing = fieldFilters.findIndex((current) => sameFieldValue(current, filter));\n if (existing >= 0) {\n if (fieldFilters[existing].operator !== filter.operator) {\n setFieldFilters(fieldFilters.map((current, index) => (index === existing ? filter : current)));\n }\n return;\n }\n if (fieldFilters.length >= 32) {\n setError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n setFieldFilters([...fieldFilters, filter]);\n };\n const activeSqlFilters =\n sqlFieldFilters?.rendered === sql && sqlFieldFilters.captureId === captureId ? sqlFieldFilters : undefined;\n const sqlFilteringDisabled = Boolean(\n queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n !captures.some((capture) => capture.id === captureId && capture.state !== \"collecting\"),\n );\n const applySqlFilters = (filters: SqlJsonFieldFilter[]) => {\n if (queryRef.current || captureController.current || sqlFilteringDisabled) return;\n if (!resultEvidence || resultEvidence.sql !== sql) {\n setSqlError(\"Run the edited SQL query before filtering its results\");\n return;\n }\n try {\n const base = activeSqlFilters?.base ?? sql;\n const query = buildJsonFilterSql(base, filters);\n setSqlFieldFilters({ base, rendered: query, captureId, filters });\n setSql(query);\n void runQuery(undefined, query);\n } catch {\n setSqlError(\"This JSON filter cannot be added to the query. Check the field path and value size.\");\n }\n };\n const addSqlFilter = (column: string, filter: JsonFieldFilter) => {\n const columnNames = result?.columns.map((name) => name.replace(/[A-Z]/g, (letter) => letter.toLowerCase())) ?? [];\n if (!result?.columns.includes(column) || new Set(columnNames).size !== columnNames.length) {\n setSqlError(\"JSON filters require unique result column names, ignoring case\");\n return;\n }\n const filters = activeSqlFilters?.filters ?? [];\n const existing = filters.findIndex((current) => current.column === column && sameFieldValue(current, filter));\n if (existing >= 0) {\n if (filters[existing].operator !== filter.operator) {\n applySqlFilters(filters.map((current, index) => (index === existing ? { ...filter, column } : current)));\n }\n return;\n }\n if (filters.length >= 32) {\n setSqlError(\"Up to 32 JSON filters can be combined\");\n return;\n }\n applySqlFilters([...filters, { ...filter, column }]);\n };\n const matchesRecordFields = (record: LogRecord) => {\n if (!fieldFilters.length) return true;\n if (!parsedFields.current.has(record)) {\n let fields: unknown;\n try {\n fields = JSON.parse(record.fieldsJson ?? \"null\");\n } catch {\n fields = undefined;\n }\n parsedFields.current.set(record, fields);\n }\n return matchFields(parsedFields.current.get(record));\n };\n const filtered = useMemo(\n () =>\n records.filter(\n (record) =>\n (!text || record.message.toLocaleLowerCase().includes(text.toLocaleLowerCase())) &&\n (!level || record.level === level) &&\n (!source ||\n (source.startsWith(\"container:\") ? record.container === source.slice(10) : sourceKey(record) === source)) &&\n matchesRecordFields(record),\n ),\n [records, text, level, source, fieldFilters, matchFields],\n );\n const chosenCapture = captures.find((item) => item.id === captureId);\n const collectionNotes = tab === \"live\" ? [...new Set([...notes, ...(live ? (liveCoverage?.notes ?? []) : [])])] : [];\n useEffect(() => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: true } }));\n return () => {\n window.dispatchEvent(new CustomEvent(\"power-logs-workspace-change\", { detail: { active: false } }));\n };\n }, []);\n useEffect(() => {\n const insert = (event: Event) => {\n const sql = (event as CustomEvent<{ sql?: unknown }>).detail?.sql;\n if (typeof sql !== \"string\" || !sql.trim() || sql.length > 65536) return;\n setTab(\"captures\");\n setSelectedSqlRow(undefined);\n if (!captureId) {\n const latest = captures.find((item) => item.state !== \"collecting\" && item.target.uid === target?.uid);\n if (latest) setCaptureId(latest.id);\n }\n setSql(sql);\n requestAnimationFrame(() => document.getElementById(\"power-logs-sql\")?.focus());\n };\n window.addEventListener(\"power-logs-sql-draft\", insert);\n return () => window.removeEventListener(\"power-logs-sql-draft\", insert);\n }, [captureId, captures, target?.uid]);\n const attachAi = () => {\n const queryEvidence =\n result ??\n (resultEvidence?.error\n ? {\n columns: [],\n rows: [],\n truncated: false,\n elapsedMs: 0,\n error: resultEvidence.error,\n }\n : undefined);\n const resource =\n tab === \"captures\"\n ? queryEvidence && resultEvidence\n ? resultEvidence.capture.target\n : (chosenCapture?.target ?? target)\n : target;\n const summary =\n tab === \"captures\" && queryEvidence && resultEvidence\n ? powerLogQueryEvidence(\n resultEvidence.capture,\n resultEvidence.sql,\n selectedSqlRow ? { ...queryEvidence, rows: [selectedSqlRow.row], truncated: false } : queryEvidence,\n )\n : tab === \"live\" && selected\n ? powerLogLineEvidence(resource, selected)\n : JSON.stringify({\n target: resource,\n ...(tab === \"captures\"\n ? { sql, rows: [], state: \"Draft query, not executed\" }\n : { status, sources: sources.length }),\n });\n if (\n !explainDiagnosticFinding({\n clusterId,\n source: \"logs\",\n title: tab === \"captures\" ? (selectedSqlRow ? \"SQL row\" : \"SQL query\") : selected ? \"Log line\" : \"Power Logs\",\n summary: summary.slice(0, 6000),\n ...(resource ? { resource: { kind: resource.kind, name: resource.name, namespace: resource.namespace } } : {}),\n })\n )\n window.dispatchEvent(new Event(\"power-ai-open-only\"));\n };\n const deleteCapture = async (id: string) => {\n if (deleting.current.has(id) || queryRef.current || captureController.current) return;\n deleting.current.add(id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.delete(id);\n drafts.forget(id);\n if (id === captureSelection.current) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n await refreshCaptures();\n } catch {\n setError(\"Could not delete capture\");\n } finally {\n deleting.current.delete(id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n };\n const confirmDeleteCapture = (id: string) => {\n const capture = captures.find((capture) => capture.id === id);\n if (!capture) return;\n Renderer.Component.ConfirmDialog.open({\n message: (\n <div className=\"power-logs-confirmation\">\n Delete snapshot <strong>{capture.target.name}</strong>? This cannot be undone.\n </div>\n ),\n labelOk: (\n <span className=\"power-logs-confirm-label\">\n <span aria-hidden=\"true\">\n <Renderer.Component.Icon material=\"delete_outline\" size={16} />\n </span>\n Delete snapshot\n </span>\n ),\n okButtonProps: { className: \"ok power-logs-confirm-delete\" },\n ok: () => deleteCapture(id),\n });\n };\n const confirmPersistentCapture = (capture: LogCapture) => {\n const persistent = !capture.persistent;\n Renderer.Component.ConfirmDialog.open({\n message: persistent ? (\n <div className=\"power-logs-confirmation\">\n Keep snapshot <strong>{capture.target.name}</strong> until you delete it? It will survive restarts and will\n not expire automatically.\n </div>\n ) : (\n <div className=\"power-logs-confirmation\">\n Allow snapshot <strong>{capture.target.name}</strong> to expire? Its retention period will start again now.\n </div>\n ),\n labelOk: (\n <span className=\"power-logs-confirm-label\">\n <span aria-hidden=\"true\">\n <Renderer.Component.Icon svg={persistent ? \"push_pin\" : \"push_off\"} size={16} />\n </span>\n {persistent ? \"Keep snapshot\" : \"Allow expiration\"}\n </span>\n ),\n ok: async () => {\n if (!alive.current || deleting.current.has(capture.id) || queryRef.current || captureController.current) return;\n deleting.current.add(capture.id);\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.setPersistent(capture.id, persistent);\n await refreshCaptures();\n } catch (error) {\n if (alive.current) {\n const full = error instanceof Error && error.message.includes(\"Saved snapshot limit reached\");\n setSavedPoolFull(full);\n setError(\n full\n ? \"Saved snapshot limit reached. Delete a saved snapshot or clear saved snapshots from all clusters.\"\n : \"Could not update snapshot retention\",\n );\n }\n } finally {\n deleting.current.delete(capture.id);\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n };\n const clearSavedSnapshots = () =>\n Renderer.Component.ConfirmDialog.open({\n message: (\n <div className=\"power-logs-confirmation\">\n Delete all saved snapshots from all clusters? Temporary snapshots will be kept. This cannot be undone.\n </div>\n ),\n labelOk: (\n <span className=\"power-logs-confirm-label\">\n <span aria-hidden=\"true\">\n <Renderer.Component.Icon material=\"delete_outline\" size={16} />\n </span>\n Clear saved snapshots\n </span>\n ),\n okButtonProps: { className: \"ok power-logs-confirm-delete\" },\n ok: async () => {\n if (queryRef.current || captureController.current || deleting.current.size) return;\n deleting.current.add(\"clear-saved\");\n setDeletingCount(deleting.current.size);\n try {\n await drafts.flush();\n await client.clearPersistent();\n const removed = captures.filter((capture) => capture.persistent);\n for (const capture of removed) drafts.forget(capture.id);\n if (removed.some((capture) => capture.id === captureSelection.current)) {\n setCaptureId(\"\");\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n }\n setSavedPoolFull(false);\n setError(\"\");\n await refreshCaptures();\n } catch {\n if (alive.current) setError(\"Could not clear saved snapshots\");\n } finally {\n deleting.current.delete(\"clear-saved\");\n if (alive.current) setDeletingCount(deleting.current.size);\n }\n },\n });\n const native = () => {\n const first = sources[0];\n const pod = Renderer.K8sApi.podsStore\n .getItems()\n .find((item) =>\n target?.kind === \"Pod\" ? item.metadata.uid === target.uid : item.metadata.uid === first?.podUid,\n );\n const requested = source.startsWith(\"container:\")\n ? source.slice(10)\n : sources.find((item) => sourceKey(item) === source)?.container;\n const defaultContainer = pod?.metadata.annotations?.[\"kubectl.kubernetes.io/default-container\"];\n const container =\n pod?.getAllContainers().find((item) => item.name === (requested ?? defaultContainer)) ??\n pod?.getAllContainers()[0];\n if (pod && container)\n Renderer.Component.logTabStore.createPodTab({ selectedPod: pod, selectedContainer: container });\n else setError(\"Open the Pod in the native resource view to use its Logs action\");\n };\n const errorNotice = error && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error\">\n {error}\n {savedPoolFull && (\n <button type=\"button\" disabled={deletingCount > 0 || !!queryId || capturePending} onClick={clearSavedSnapshots}>\n Clear saved snapshots\n </button>\n )}\n </div>\n );\n return (\n <div\n className=\"power-logs\"\n data-testid=\"power-logs-page\"\n data-compact={compact || undefined}\n data-hide-resource-name={hideResourceName || undefined}\n >\n <style>{powerLogsStyles}</style>\n <header>\n <h1 className=\"power-logs-page-title\">Power Logs</h1>\n <div\n className=\"power-logs-tabs\"\n role=\"tablist\"\n aria-label=\"Log workspace\"\n onKeyDown={(event) => {\n if (![\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(event.key)) return;\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[role=tab]\")];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? tabs.length - 1\n : (index + (event.key === \"ArrowRight\" ? 1 : -1) + tabs.length) % tabs.length;\n tabs[next]?.focus();\n tabs[next]?.click();\n }}\n >\n <button role=\"tab\" aria-selected={tab === \"live\"} onClick={() => setTab(\"live\")}>\n <Icon material=\"subject\" size={16} /> Live view\n </button>\n <button\n role=\"tab\"\n aria-selected={tab === \"captures\"}\n onClick={() => {\n setTab(\"captures\");\n const latest = captures.find(\n (item) => item.state !== \"collecting\" && (!target || item.target.uid === target.uid),\n );\n if (!captureId && latest && !capturePending) {\n setCaptureId(latest.id);\n }\n void refreshCaptures();\n }}\n >\n <Icon material=\"code\" size={16} /> SQL\n </button>\n </div>\n\n <div className=\"power-logs-actions\">\n <div className=\"power-logs-toolbar power-logs-capture\">\n <details ref={captureOptions} className=\"power-logs-options\">\n <NativeTooltip title={`Capture window: ${captureMinutes} minutes`}>\n <summary>\n <Icon material=\"tune\" size={16} /> Options\n </summary>\n </NativeTooltip>\n <div>\n {\" \"}\n <label>\n Capture window\n <LogSelect\n label=\"Capture window\"\n value={String(captureMinutes)}\n onChange={(value) => setCaptureMinutes(Number(value))}\n options={[\n { value: \"5\", label: \"5 minutes\" },\n { value: \"15\", label: \"15 minutes\" },\n { value: \"60\", label: \"1 hour\" },\n ]}\n />\n </label>\n <Renderer.Component.Switch checked={previous} onChange={setPrevious}>\n Include previous containers\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={compact}\n onChange={(value) => {\n setCompact(value);\n preferences.compactRows = value;\n }}\n >\n Compact density\n </Renderer.Component.Switch>\n <Renderer.Component.Switch\n checked={hideResourceName}\n onChange={(value) => {\n setHideResourceName(value);\n preferences.hideResourceNameColumn = value;\n }}\n >\n Hide resource name column\n </Renderer.Component.Switch>\n </div>\n </details>\n {tab === \"captures\" && (\n <button\n type=\"button\"\n disabled={!target || capturePending || busy || !!queryId || deletingCount > 0}\n onClick={() => void capture()}\n >\n <Icon material=\"save_alt\" size={16} /> Capture logs\n </button>\n )}\n {capturePending && (\n <>\n <span role=\"status\" className=\"power-logs-muted\">\n {capturing\n ? `${capturing.rows.toLocaleString()} lines · ${(capturing.bytes / 1048576).toFixed(1)} MiB`\n : \"Preparing capture…\"}\n </span>\n <button type=\"button\" onClick={() => captureController.current?.abort()}>\n <Icon material=\"stop\" size={16} /> Stop & keep partial\n </button>\n </>\n )}\n </div>\n\n <DiagnosticExplainButton aria-label=\"Open AI assistant\" title=\"Open AI assistant\" onClick={attachAi}>\n <Icon material=\"chat_bubble_outline\" size={16} /> AI\n </DiagnosticExplainButton>\n {tab === \"live\" && (\n <button type=\"button\" disabled={!target || busy} onClick={() => void readHistory()}>\n <Icon material=\"refresh\" size={16} /> Refresh\n </button>\n )}\n {target?.kind === \"Pod\" && (\n <NativeTooltip title=\"Native logs\">\n <button type=\"button\" aria-label=\"Native logs\" onClick={native}>\n <Renderer.Component.Icon material=\"open_in_new\" size={16} />\n </button>\n </NativeTooltip>\n )}\n </div>\n </header>\n {target ? (\n <NativeTooltip title={`${target.kind} / ${target.name} · ${target.namespace} · UID ${target.uid}`}>\n <div className=\"power-logs-target power-logs-muted\">\n <strong>\n {target.kind} / {target.name}\n </strong>{\" \"}\n · {target.namespace}\n </div>\n </NativeTooltip>\n ) : (\n <SourcePicker />\n )}\n {tab === \"live\" ? (\n <>\n <div className=\"power-logs-filters\">\n <input\n aria-label=\"Search log messages\"\n placeholder=\"Search messages…\"\n value={text}\n maxLength={300}\n onChange={(event) => setText(event.target.value)}\n />\n <LogSelect\n label=\"Log level\"\n value={level}\n onChange={setLevel}\n options={[\n { value: \"\", label: \"All levels\" },\n ...levels.map((value) => ({ value, label: value.toUpperCase() })),\n ]}\n />\n <LogSelect\n label=\"Container source\"\n renderOption={(option, context) => {\n if (context !== \"menu\")\n return (\n <NativeTooltip title={option.label}>\n <span>{option.label}</span>\n </NativeTooltip>\n );\n const item = sources.find((item) => sourceKey(item) === option.value);\n return (\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-source-option\">\n <Icon material={item ? \"view_in_ar\" : \"layers\"} size={16} />\n <span className=\"power-logs-option-text\">\n <strong>{item ? item.pod : option.value ? \"All pods\" : option.label}</strong>\n <small>\n {option.value\n ? `Container · ${item?.container ?? option.value.slice(10)}`\n : \"Every pod and container\"}\n {item?.previous ? \" · Previous\" : \"\"}\n </small>\n </span>\n <span className=\"power-logs-source-check\" aria-hidden=\"true\">\n {source === option.value && <Icon material=\"check\" size={16} />}\n </span>\n </span>\n </NativeTooltip>\n );\n }}\n value={source}\n onChange={setSource}\n options={[\n { value: \"\", label: `All sources (${sources.length})` },\n ...[...new Set(sources.map((item) => item.container))].map((container) => ({\n value: `container:${container}`,\n label: `All pods / ${container}`,\n })),\n ...[...new Set(sources.map(sourceKey))].map((value) => ({ value, label: value })),\n ]}\n />\n <button\n type=\"button\"\n disabled={!sources.length || busy || capturePending}\n aria-pressed={live}\n onClick={toggleLive}\n >\n <Icon material={live ? \"pause\" : \"play_arrow\"} size={16} /> {live ? \"Pause\" : \"Live\"}\n </button>\n <button type=\"button\" aria-pressed={follow} onClick={() => setFollow(!follow)}>\n <Icon material=\"vertical_align_bottom\" size={16} /> Follow tail\n </button>\n {busy && (\n <button onClick={() => historyController.current?.abort()} type=\"button\">\n <Icon material=\"stop\" size={16} /> Stop loading\n </button>\n )}\n </div>\n {errorNotice}\n <FieldFilters\n filters={fieldFilters}\n onRemove={(index) => setFieldFilters(fieldFilters.filter((_, item) => item !== index))}\n />\n <NativeTooltip\n title={`${status} · Viewer retains up to ${limits.liveRows.toLocaleString()} lines / ${limits.liveBytes / 1048576} MiB`}\n >\n <div className=\"power-logs-muted power-logs-status\" role=\"status\">\n <span>{filtered.length.toLocaleString()} matching lines</span> · {status}\n {liveCoverage && live ? ` · ${liveCoverage.active}/${liveCoverage.total} active sources` : \"\"} · Viewer\n retains up to {limits.liveRows.toLocaleString()} lines / {limits.liveBytes / 1048576} MiB\n </div>\n </NativeTooltip>\n <div className=\"power-logs-workspace\">\n <LogRows\n records={filtered}\n loading={busy}\n selected={selected?.key}\n onSelect={setSelected}\n follow={follow}\n setFollow={setFollow}\n compact={compact}\n />\n {selected && (\n <LogDetails record={selected} onClose={() => setSelected(undefined)} onFilter={addLiveFilter} />\n )}\n </div>\n </>\n ) : (\n <>\n <div className=\"power-logs-toolbar power-logs-snapshot-bar\">\n <span className=\"power-logs-control-label\">Snapshot</span>\n <LogSelect\n label=\"Capture snapshot\"\n onKeyDown={(event) => {\n if (\n event.key !== \"Delete\" ||\n !event.altKey ||\n ((event.target as HTMLInputElement).value ?? \"\").length > 0\n )\n return;\n const button = document.querySelector<HTMLButtonElement>(\n \".Select__menu .Select__option--is-focused [data-capture-delete]\",\n );\n if (button && !button.disabled) {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(button.dataset.captureDelete!);\n }\n }}\n renderOption={(option, context) => {\n const item = captures.find((item) => item.id === option.value);\n if (context !== \"menu\" || !item) return option.label;\n return (\n <span className=\"power-logs-snapshot-option\">\n <NativeTooltip title={option.label}>\n <span className=\"power-logs-option-text\">\n <strong>{item.target.name}</strong>\n <small>\n {formatDateTime(item.createdAt)} · {item.rows.toLocaleString()} lines ·{\" \"}\n {item.state[0].toUpperCase()}\n {item.state.slice(1)}\n {item.persistent ? \" · Persistent\" : \"\"}\n </small>\n </span>\n </NativeTooltip>\n <NativeTooltip title={item.persistent ? \"Allow snapshot to expire\" : \"Keep snapshot\"}>\n <button\n type=\"button\"\n aria-label={`${item.persistent ? \"Allow expiration for\" : \"Keep\"} snapshot ${item.target.name}`}\n aria-pressed={Boolean(item.persistent)}\n data-capture-persistent={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmPersistentCapture(item);\n }}\n >\n <Renderer.Component.Icon svg={item.persistent ? \"push_off\" : \"push_pin\"} size={16} />\n </button>\n </NativeTooltip>\n <NativeTooltip title=\"Delete snapshot (Alt+Delete)\">\n <button\n type=\"button\"\n aria-label={`Delete snapshot ${item.target.name}`}\n data-capture-delete={item.id}\n onKeyDown={(event) => event.stopPropagation()}\n disabled={!!queryId || capturePending || deletingCount > 0 || item.state === \"collecting\"}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n confirmDeleteCapture(item.id);\n }}\n >\n <Renderer.Component.Icon material=\"delete_outline\" size={16} />\n </button>\n </NativeTooltip>\n </span>\n );\n }}\n value={captureId}\n disabled={!!queryId || capturePending || deletingCount > 0}\n onChange={(value) => {\n setCaptureId(value);\n setResult(undefined);\n setResultEvidence(undefined);\n setSelectedSqlRow(undefined);\n setSqlError(\"\");\n }}\n options={[\n { value: \"\", label: \"Choose a snapshot\" },\n ...captures.map((item) => ({\n value: item.id,\n label: `${item.target.name} · ${formatDateTime(item.createdAt)} · ${item.rows.toLocaleString()} lines · ${item.state[0].toUpperCase()}${item.state.slice(1)}${item.persistent ? \" · Persistent\" : \"\"}`,\n })),\n ]}\n />\n <NativeTooltip title=\"Export JSON Lines (NDJSON)\">\n <button\n type=\"button\"\n disabled={!captureId || !!queryId || deleting.current.has(captureId)}\n onClick={() => {\n void client.export(captureId).catch(() => setError(\"Could not export capture\"));\n }}\n >\n <Icon material=\"download\" size={16} /> Export JSON\n </button>\n </NativeTooltip>\n </div>\n <div className=\"power-logs-toolbar power-logs-sql-tools\">\n <NativeTooltip\n title={`Read-only SELECT · ${limits.queryMs / 1000} s · ${limits.resultRows.toLocaleString()} rows · Schema: logs(timestamp INTEGER in milliseconds, pod, podUid, container, level, message, fieldsJson, previous INTEGER 0 or 1)`}\n >\n <label htmlFor=\"power-logs-sql\" className=\"power-logs-control-label\">\n SQL query\n </label>\n </NativeTooltip>\n <button\n type=\"button\"\n disabled={\n !chosenCapture ||\n !!queryId ||\n capturePending ||\n deleting.current.has(captureId) ||\n chosenCapture.state === \"collecting\"\n }\n onClick={() => void runQuery()}\n >\n <Icon material=\"play_arrow\" size={16} /> Run query\n </button>\n {queryId && (\n <button\n type=\"button\"\n onClick={() => {\n void client.cancel(queryId).catch(() => setError(\"Could not cancel query\"));\n }}\n >\n <Icon material=\"stop\" size={16} /> Cancel\n </button>\n )}\n {examples.map(([title, query]) => (\n <button\n type=\"button\"\n key={title}\n disabled={!!queryId || capturePending}\n onClick={() => {\n if (title === \"JSON\" || title === \"Recent\") void applyPreset(title);\n else {\n setSql(query);\n setSqlFitVersion((version) => version + 1);\n }\n }}\n >\n <Icon\n material={\n title === \"Recent\"\n ? \"history\"\n : title === \"Errors\"\n ? \"error_outline\"\n : title === \"Timeline\"\n ? \"timeline\"\n : \"data_object\"\n }\n size={16}\n />{\" \"}\n SQL · {title}\n </button>\n ))}\n </div>\n <FieldFilters\n sql\n filters={activeSqlFilters?.filters ?? []}\n disabled={sqlFilteringDisabled}\n onRemove={(index) => applySqlFilters((activeSqlFilters?.filters ?? []).filter((_, item) => item !== index))}\n />\n <SqlEditor id=\"power-logs-sql\" value={sql} onChange={setSql} fitVersion={sqlFitVersion} />\n {errorNotice}\n {sqlError && (\n <div role=\"alert\" className=\"power-logs-notice power-logs-error power-logs-query-error\">\n {sqlError}\n </div>\n )}\n {result ? (\n <>\n <div className=\"power-logs-toolbar power-logs-results-bar\">\n <span role=\"status\" className=\"power-logs-muted\">\n {result.rows.length} rows · {result.elapsedMs} ms{result.truncated ? \" · Result truncated\" : \"\"}\n </span>\n </div>\n <div className=\"power-logs-workspace\">\n <div className=\"power-logs-results\">\n <table\n style={{\n minWidth:\n result.columns.length > 3\n ? result.columns.reduce((width, column) => width + sqlColumnWidth(column), 0)\n : undefined,\n }}\n >\n <colgroup>\n {result.columns.map((column, i) => (\n <col\n key={i}\n style={{\n width: result.columns.length > 3 ? sqlColumnWidth(column) : undefined,\n }}\n />\n ))}\n </colgroup>\n <thead>\n <tr>\n {result.columns.map((column, i) => (\n <th key={i} data-column={column}>\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.slice(resultPage * 50, (resultPage + 1) * 50).map((row, i) => (\n <tr\n key={i}\n tabIndex={0}\n aria-label={`Open SQL row ${resultPage * 50 + i + 1}`}\n onClick={() => setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row })}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setSelectedSqlRow({ ...sqlRowDetails(result.columns, row), row });\n }\n }}\n >\n {row.map((cell, j) => (\n <td\n key={j}\n data-column={result.columns[j]}\n data-level={sqlCellLevel(result.columns[j], cell)}\n >\n <LogJsonCell\n value={cell === null ? null : String(cell)}\n column={result.columns[j]}\n rawValue={cell}\n Icon={Icon}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {result.rows.length === 0 && (\n <div className=\"power-logs-empty\">\n {chosenCapture?.rows === 0\n ? \"This snapshot contains no log lines. Try a longer capture window.\"\n : \"This query returned no rows. Adjust the query or choose SQL · Recent.\"}\n </div>\n )}\n </div>\n {selectedSqlRow && (\n <LogDetails\n record={selectedSqlRow.record}\n jsonColumn={selectedSqlRow.jsonColumn}\n onFilter={\n !sqlFilteringDisabled && selectedSqlRow.jsonColumn\n ? (filter) => addSqlFilter(selectedSqlRow.jsonColumn!, filter)\n : undefined\n }\n onClose={() => setSelectedSqlRow(undefined)}\n />\n )}\n </div>\n {result.rows.length > 50 && (\n <nav className=\"power-logs-toolbar power-logs-pagination\" aria-label=\"SQL result pages\">\n <NativeTooltip title=\"Previous page\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={resultPage === 0}\n onClick={() => {\n setResultPage(resultPage - 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_left\" size={16} />\n </button>\n </NativeTooltip>\n <span className=\"power-logs-muted\">\n Page {resultPage + 1} / {Math.max(1, Math.ceil(result.rows.length / 50))}\n </span>\n <NativeTooltip title=\"Next page\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={(resultPage + 1) * 50 >= result.rows.length}\n onClick={() => {\n setResultPage(resultPage + 1);\n setSelectedSqlRow(undefined);\n }}\n >\n <Icon material=\"chevron_right\" size={16} />\n </button>\n </NativeTooltip>\n </nav>\n )}\n </>\n ) : (\n <div className=\"power-logs-results power-logs-empty\">\n {queryId\n ? \"Running query…\"\n : captures.length === 0\n ? \"Capture logs to create a temporary snapshot for SQL.\"\n : \"Choose a snapshot to preview its logs.\"}\n </div>\n )}\n </>\n )}\n <div className=\"power-logs-muted power-logs-footer\">\n <NativeTooltip\n 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 / 60000} minutes.`}\n >\n <span className=\"power-logs-caption\">\n Collection · {limits.requestsPerSecond} req/s · {limits.bytesPerSecond / 1048576} MiB/s ·{\" \"}\n {limits.captureBytes / 1048576} MiB/snapshot · Retention {limits.ttlMs / 60000} min\n </span>\n </NativeTooltip>\n {tab === \"live\" && collectionNotes.length > 0 && (\n <NativeTooltip title={collectionNotes.join(\"\\n\")}>\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>{collectionNotes.join(\" · \")}</span>\n </span>\n </NativeTooltip>\n )}\n {tab === \"captures\" &&\n chosenCapture &&\n (chosenCapture.state === \"partial\" || chosenCapture.notes.length > 0) && (\n <NativeTooltip\n title={\n chosenCapture.notes.join(\"\\n\") ||\n \"Collection stopped or a source was unavailable; this snapshot may be incomplete\"\n }\n >\n <span role=\"note\" className=\"power-logs-notice power-logs-collection-note\">\n <Icon material=\"warning_amber\" size={14} />\n <span>Incomplete snapshot</span>\n </span>\n </NativeTooltip>\n )}\n </div>\n </div>\n );\n}\n\nconst ObservedWorkspace = observer(Workspace);\n\nexport const PowerLogsPage = observer(() => {\n const enabled = LogsPreferencesStore.getInstanceOrCreate<LogsPreferencesStore>().enabled;\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n if (!enabled || !clusterId)\n return (\n <div className=\"power-logs\">\n <style>{powerLogsStyles}</style>\n <h1>Power Logs</h1>\n <p>Enable Power Logs in Power settings and open a cluster to view logs.</p>\n </div>\n );\n const contextId = searchContextId();\n return <ObservedWorkspace key={`${clusterId}:${contextId}`} clusterId={clusterId} contextId={contextId} />;\n});\n"],"mappings":"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"}
|