@64mb/freelens-power 2.0.0 → 2.1.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/out/main/common/power-logs.js.map +1 -1
- package/out/main/common/store/logs-preferences-store.js +5 -0
- package/out/main/common/store/logs-preferences-store.js.map +1 -1
- package/out/main/dashboard-views.js +26 -0
- package/out/main/dashboard-views.js.map +1 -1
- package/out/main/power-logs-database.js +5 -0
- package/out/main/power-logs-database.js.map +1 -1
- package/out/main/power-logs-ipc.js +8 -0
- package/out/main/power-logs-ipc.js.map +1 -1
- package/out/renderer/ai-diagnostic-handoff.js +1 -0
- package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
- package/out/renderer/ai-extras.js +7 -2
- package/out/renderer/ai-extras.js.map +1 -1
- package/out/renderer/ai.js +1 -1
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/appearance.js +2 -0
- package/out/renderer/appearance.js.map +1 -1
- package/out/renderer/dashboard.js +35 -8
- package/out/renderer/dashboard.js.map +1 -1
- package/out/renderer/index.js +2 -1
- package/out/renderer/index.js.map +1 -1
- package/out/renderer/power-log-json-cell.js +14 -6
- package/out/renderer/power-log-json-cell.js.map +1 -1
- package/out/renderer/power-log-json.js +100 -16
- package/out/renderer/power-log-json.js.map +1 -1
- package/out/renderer/power-log-sql-editor.js +91 -0
- package/out/renderer/power-log-sql-editor.js.map +1 -0
- package/out/renderer/power-logs-client.js +4 -0
- package/out/renderer/power-logs-client.js.map +1 -1
- package/out/renderer/power-logs-sql-drafts.js +76 -0
- package/out/renderer/power-logs-sql-drafts.js.map +1 -0
- package/out/renderer/power-logs-sql-row.js +3 -11
- package/out/renderer/power-logs-sql-row.js.map +1 -1
- package/out/renderer/power-logs.css.js +8 -4
- package/out/renderer/power-logs.css.js.map +1 -1
- package/out/renderer/power-logs.js +190 -141
- package/out/renderer/power-logs.js.map +1 -1
- package/out/renderer/preferences/preferences.js +2 -9
- package/out/renderer/preferences/preferences.js.map +1 -1
- package/out/renderer/preferences/section-navigation.js +44 -0
- package/out/renderer/preferences/section-navigation.js.map +1 -0
- package/out/renderer/src/common/power-log-json-preset.js +23 -25
- package/out/renderer/src/common/power-log-json-preset.js.map +1 -1
- package/out/renderer/src/common/power-log-sql-level.js +25 -0
- package/out/renderer/src/common/power-log-sql-level.js.map +1 -0
- package/out/renderer/src/common/power-logs-ai.js +4 -0
- package/out/renderer/src/common/power-logs-ai.js.map +1 -1
- package/out/renderer/src/common/power-logs.js.map +1 -1
- package/out/renderer/src/common/store/logs-preferences-store.js +5 -0
- package/out/renderer/src/common/store/logs-preferences-store.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-log-json.js","names":[],"sources":["../../src/renderer/power-log-json.tsx"],"sourcesContent":["import { clipboard } from \"electron\";\nimport { type ComponentType, type ReactNode, useMemo, useState } from \"react\";\nimport { type JsonField, jsonFieldLiteral, jsonFields, maxJsonTokens } from \"./power-log-json-fields\";\n\nimport type { JsonFieldFilter } from \"../common/power-log-field-filters\";\n\nexport interface LogJsonProps {\n text: string;\n fieldText?: string;\n fieldsEnabled?: boolean;\n Icon?: ComponentType<{ material: string; size?: number }>;\n onFilter?: (filter: JsonFieldFilter) => void;\n}\n\nexport function LogJson({ text, fieldText, fieldsEnabled = true, Icon, onFilter }: LogJsonProps) {\n const identity = fieldText ?? text;\n const interactive = fieldsEnabled && Boolean(Icon || onFilter);\n const fields = useMemo(\n () => (interactive ? jsonFields(identity) : new Map<number, JsonField>()),\n [identity, interactive],\n );\n const [active, setActive] = useState<{ field: JsonField; text: string; x: number; y: number }>();\n const [feedback, setFeedback] = useState(\"\");\n const selected = fieldsEnabled && active?.text === identity ? active : undefined;\n const tokens = useMemo(() => {\n const tokens: ReactNode[] = [];\n const pattern = /\"(?:\\\\.|[^\"\\\\])*\"(?:\\s*:)?|\\b(?:true|false|null)\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|[\\[{]/g;\n let cursor = 0;\n let count = 0;\n for (const match of text.matchAll(pattern)) {\n if (++count > maxJsonTokens) break;\n const start = match.index!;\n tokens.push(text.slice(cursor, start));\n const value = match[0];\n const key = value.startsWith('\"') && value.endsWith(\":\");\n const kind = key\n ? \"key\"\n : value.startsWith('\"')\n ? \"string\"\n : /^(true|false|null)$/.test(value)\n ? \"literal\"\n : /^[\\[{]$/.test(value)\n ? undefined\n : \"number\";\n const field = fields.get(start);\n const activate = (element: HTMLElement) => {\n if (!field) return;\n const rect = element.getBoundingClientRect();\n setActive({\n field,\n text: identity,\n x: Math.max(4, Math.min(rect.left, window.innerWidth - 250)),\n y: Math.max(4, Math.min(rect.bottom, window.innerHeight - 40)),\n });\n setFeedback(\"\");\n };\n tokens.push(\n <span\n key={start}\n data-token={kind}\n tabIndex={field ? 0 : undefined}\n onMouseEnter={field ? (event) => activate(event.currentTarget) : undefined}\n onFocus={field ? (event) => activate(event.currentTarget) : undefined}\n onKeyDown={\n field\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget\n .closest(\".power-log-json-fields\")\n ?.querySelector<HTMLButtonElement>('[role=\"toolbar\"] button')\n ?.focus();\n }\n }\n : undefined\n }\n >\n {key ? value.slice(0, -1) : value}\n </span>,\n );\n if (key) tokens.push(\":\");\n cursor = start + value.length;\n }\n tokens.push(text.slice(cursor));\n return tokens;\n }, [text, fields, identity]);\n const pre = <pre className=\"power-log-json\">{tokens}</pre>;\n if (!Icon && !onFilter) return pre;\n return (\n <div\n className=\"power-log-json-fields\"\n onMouseLeave={() => setActive(undefined)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) setActive(undefined);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setActive(undefined);\n }\n }}\n >\n {pre}\n {selected && (\n <div\n role=\"toolbar\"\n aria-label=\"JSON field actions\"\n style={{\n position: \"fixed\",\n left: selected.x,\n top: selected.y,\n zIndex: 1000,\n display: \"flex\",\n gap: 4,\n padding: 4,\n background: \"var(--mainBackground, #252525)\",\n border: \"1px solid var(--borderColor, #666)\",\n borderRadius: 4,\n }}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Escape\") setActive(undefined);\n }}\n >\n <button\n type=\"button\"\n title=\"Copy value\"\n aria-label=\"Copy value\"\n onClick={() => {\n try {\n const value = selected.field.value;\n clipboard.writeText(typeof value === \"string\" ? value : jsonFieldLiteral(identity, selected.field));\n setFeedback(\"Copied\");\n } catch {\n setFeedback(\"Copy failed\");\n }\n }}\n >\n {Icon ? <Icon material=\"content_copy\" size={14} /> : \"⧉\"}\n </button>\n {onFilter && (\n <>\n <button\n type=\"button\"\n title=\"Include value\"\n aria-label=\"Include value\"\n onClick={() => onFilter({ path: selected.field.path, value: selected.field.value, operator: \"eq\" })}\n >\n =\n </button>\n <button\n type=\"button\"\n title=\"Exclude value\"\n aria-label=\"Exclude value\"\n onClick={() => onFilter({ path: selected.field.path, value: selected.field.value, operator: \"neq\" })}\n >\n !=\n </button>\n </>\n )}\n {feedback && <span role=\"status\">{feedback}</span>}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"power-log-json.js","names":[],"sources":["../../src/renderer/power-log-json.tsx"],"sourcesContent":["import { clipboard } from \"electron\";\nimport { type ComponentType, type CSSProperties, type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { type JsonField, jsonFieldLiteral, jsonFields, maxJsonTokens } from \"./power-log-json-fields\";\n\nimport type { JsonFieldFilter } from \"../common/power-log-field-filters\";\n\nexport interface LogJsonProps {\n text: string;\n fieldText?: string;\n fieldsEnabled?: boolean;\n Icon?: ComponentType<{ material: string; size?: number; tooltip?: string }>;\n onFilter?: (filter: JsonFieldFilter) => void;\n}\n\nconst fieldButtonStyle: CSSProperties = {\n width: 20,\n height: 20,\n minHeight: 0,\n minWidth: 0,\n padding: 0,\n margin: 0,\n border: 0,\n borderRadius: 0,\n background: \"transparent\",\n color: \"inherit\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n};\n\nexport function LogJson({ text, fieldText, fieldsEnabled = true, Icon, onFilter }: LogJsonProps) {\n const leaveTimer = useRef<ReturnType<typeof setTimeout>>();\n const hoverTimer = useRef<ReturnType<typeof setTimeout>>();\n const keepOpen = () => {\n clearTimeout(leaveTimer.current);\n clearTimeout(hoverTimer.current);\n };\n useEffect(\n () => () => {\n clearTimeout(leaveTimer.current);\n clearTimeout(hoverTimer.current);\n },\n [],\n );\n const identity = fieldText ?? text;\n const interactive = fieldsEnabled && Boolean(Icon || onFilter);\n const fields = useMemo(\n () => (interactive ? jsonFields(identity) : new Map<number, JsonField>()),\n [identity, interactive],\n );\n const [active, setActive] = useState<{ field: JsonField; text: string; x: number; y: number }>();\n const activeField = useRef(active);\n activeField.current = active;\n const [feedback, setFeedback] = useState(\"\");\n const selected = fieldsEnabled && active?.text === identity ? active : undefined;\n const tokens = useMemo(() => {\n const tokens: ReactNode[] = [];\n const pattern = /\"(?:\\\\.|[^\"\\\\])*\"(?:\\s*:)?|\\b(?:true|false|null)\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|[\\[{]/g;\n let cursor = 0;\n let count = 0;\n for (const match of text.matchAll(pattern)) {\n if (++count > maxJsonTokens) break;\n const start = match.index!;\n tokens.push(text.slice(cursor, start));\n const value = match[0];\n const key = value.startsWith('\"') && value.endsWith(\":\");\n const kind = key\n ? \"key\"\n : value.startsWith('\"')\n ? \"string\"\n : /^(true|false|null)$/.test(value)\n ? \"literal\"\n : /^[\\[{]$/.test(value)\n ? undefined\n : \"number\";\n const field = fields.get(start);\n const activate = (element: HTMLElement) => {\n if (!field) return;\n clearTimeout(leaveTimer.current);\n const rect = element.getBoundingClientRect();\n let lineRight = rect.right;\n const pre = element.closest(\"pre\");\n if (pre) {\n const lineEnd = text.indexOf(\"\\n\", start);\n let remaining = lineEnd < 0 ? text.length : lineEnd;\n const walker = document.createTreeWalker(pre, NodeFilter.SHOW_TEXT);\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (remaining > (node.textContent?.length ?? 0)) {\n remaining -= node.textContent?.length ?? 0;\n continue;\n }\n const range = document.createRange();\n range.setStart(element, 0);\n range.setEnd(node, remaining);\n if (typeof range.getClientRects === \"function\") {\n for (const fragment of Array.from(range.getClientRects())) {\n if (Math.abs(fragment.top - rect.top) < Math.max(1, rect.height / 2)) {\n lineRight = Math.max(lineRight, fragment.right);\n }\n }\n }\n break;\n }\n }\n const wrapperRight = element.closest(\".power-log-json-fields\")?.getBoundingClientRect().right;\n const visibleRight = Math.min(\n window.innerWidth,\n wrapperRight && wrapperRight > 0 ? wrapperRight : window.innerWidth,\n );\n setActive({\n field,\n text: identity,\n x: Math.max(4, Math.min(lineRight + 4, visibleRight - 64)),\n y: Math.max(0, Math.min(rect.top, window.innerHeight - 20)),\n });\n setFeedback(\"\");\n };\n tokens.push(\n <span\n key={start}\n data-token={kind}\n tabIndex={field ? 0 : undefined}\n onMouseEnter={\n field\n ? (event) => {\n keepOpen();\n const element = event.currentTarget;\n if (activeField.current?.text === identity && activeField.current.field !== field) {\n hoverTimer.current = setTimeout(() => activate(element), 180);\n } else activate(element);\n }\n : undefined\n }\n onMouseLeave={field ? () => clearTimeout(hoverTimer.current) : undefined}\n onFocus={\n field\n ? (event) => {\n keepOpen();\n activate(event.currentTarget);\n }\n : undefined\n }\n onKeyDown={\n field\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget\n .closest(\".power-log-json-fields\")\n ?.querySelector<HTMLButtonElement>('[role=\"toolbar\"] button')\n ?.focus();\n }\n }\n : undefined\n }\n >\n {key ? value.slice(0, -1) : value}\n </span>,\n );\n if (key) tokens.push(\":\");\n cursor = start + value.length;\n }\n tokens.push(text.slice(cursor));\n return tokens;\n }, [text, fields, identity]);\n const pre = <pre className=\"power-log-json\">{tokens}</pre>;\n if (!Icon && !onFilter) return pre;\n return (\n <div\n className=\"power-log-json-fields\"\n style={{ paddingRight: 76 }}\n onMouseEnter={keepOpen}\n onMouseLeave={() => {\n leaveTimer.current = setTimeout(() => setActive(undefined), 150);\n }}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) setActive(undefined);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setActive(undefined);\n }\n }}\n >\n {pre}\n {selected && (\n <div\n role=\"toolbar\"\n aria-label=\"JSON field actions\"\n style={{\n position: \"fixed\",\n left: selected.x,\n top: selected.y,\n zIndex: 1000,\n display: \"flex\",\n gap: 2,\n padding: 0,\n background: \"transparent\",\n border: 0,\n alignItems: \"center\",\n height: 20,\n }}\n onMouseEnter={keepOpen}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Escape\") setActive(undefined);\n }}\n >\n <button\n type=\"button\"\n style={fieldButtonStyle}\n title={Icon ? undefined : \"Copy value\"}\n aria-label=\"Copy value\"\n onClick={() => {\n try {\n const value = selected.field.value;\n clipboard.writeText(typeof value === \"string\" ? value : jsonFieldLiteral(identity, selected.field));\n setFeedback(\"Copied\");\n } catch {\n setFeedback(\"Copy failed\");\n }\n }}\n >\n {Icon ? <Icon material=\"content_copy\" size={14} tooltip=\"Copy value\" /> : \"⧉\"}\n </button>\n {onFilter && (\n <>\n <button\n type=\"button\"\n style={fieldButtonStyle}\n title={Icon ? undefined : \"Include value\"}\n aria-label=\"Include value\"\n onClick={() => onFilter({ path: selected.field.path, value: selected.field.value, operator: \"eq\" })}\n >\n {Icon ? <Icon material=\"filter_alt\" size={14} tooltip=\"Include value\" /> : \"=\"}\n </button>\n <button\n type=\"button\"\n style={fieldButtonStyle}\n title={Icon ? undefined : \"Exclude value\"}\n aria-label=\"Exclude value\"\n onClick={() => onFilter({ path: selected.field.path, value: selected.field.value, operator: \"neq\" })}\n >\n {Icon ? <Icon material=\"filter_alt_off\" size={14} tooltip=\"Exclude value\" /> : \"!=\"}\n </button>\n </>\n )}\n {feedback && (\n <span role=\"status\" style={{ position: \"absolute\", top: 22, right: 0, whiteSpace: \"nowrap\" }}>\n {feedback}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const require__global_external_react = require("./_virtual/_global-external_react.js");
|
|
2
|
+
const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
|
|
3
|
+
//#region src/renderer/power-log-sql-editor.tsx
|
|
4
|
+
var keywords = new Set("SELECT FROM WHERE AS AND OR NOT NULL IS IN LIKE GLOB BETWEEN EXISTS CASE WHEN THEN ELSE END DISTINCT ALL JOIN LEFT RIGHT INNER OUTER CROSS FULL ON USING GROUP BY HAVING ORDER ASC DESC LIMIT OFFSET UNION INTERSECT EXCEPT WITH RECURSIVE OVER PARTITION ROWS RANGE UNBOUNDED PRECEDING FOLLOWING CURRENT ROW NULLS FIRST LAST TRUE FALSE COLLATE CAST FILTER WINDOW VALUES EXPLAIN QUERY PLAN".split(" "));
|
|
5
|
+
var lexeme = /--[^\n]*(?:\n|$)|\/\*[\s\S]*?(?:\*\/|$)|'(?:''|[^'])*(?:'|$)|"(?:""|[^"])*(?:"|$)|`(?:``|[^`])*(?:`|$)|\[[^\]]*(?:\]|$)|\b(?:0x[\da-f]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)(?![\w])|\b[a-z_]\w*\b/gi;
|
|
6
|
+
function isFunction(source, offset) {
|
|
7
|
+
while (offset < source.length && /\s/.test(source[offset])) offset++;
|
|
8
|
+
return source[offset] === "(";
|
|
9
|
+
}
|
|
10
|
+
function tokenizeSql(value) {
|
|
11
|
+
const source = value.slice(0, 65536);
|
|
12
|
+
const tokens = [];
|
|
13
|
+
let offset = 0;
|
|
14
|
+
lexeme.lastIndex = 0;
|
|
15
|
+
for (let match = lexeme.exec(source); match && tokens.length < 9998; match = lexeme.exec(source)) {
|
|
16
|
+
if (match.index > offset) tokens.push({ text: source.slice(offset, match.index) });
|
|
17
|
+
const text = match[0];
|
|
18
|
+
const kind = text.startsWith("--") || text.startsWith("/*") ? "comment" : text.startsWith("'") ? "string" : text.startsWith("\"") || text.startsWith("`") || text.startsWith("[") ? "identifier" : /^\d/.test(text) ? "number" : keywords.has(text.toUpperCase()) ? "keyword" : isFunction(source, match.index + text.length) ? "function" : void 0;
|
|
19
|
+
tokens.push({
|
|
20
|
+
text,
|
|
21
|
+
kind
|
|
22
|
+
});
|
|
23
|
+
offset = match.index + text.length;
|
|
24
|
+
}
|
|
25
|
+
if (offset < value.length) tokens.push({ text: value.slice(offset) });
|
|
26
|
+
return tokens;
|
|
27
|
+
}
|
|
28
|
+
var styles = `
|
|
29
|
+
.power-logs .power-logs-sql-editor{position:relative;box-sizing:border-box;width:100%;height:56px;min-height:48px;max-height:120px;flex-shrink:0;resize:vertical;overflow:hidden;border:1px solid var(--borderColor);border-radius:4px;background:var(--inputControlBackground,var(--contentColor));--sql-string:#e6a28c;--sql-number:#98c78e;--sql-function:#81b9e6;--sql-identifier:var(--textColorPrimary)}
|
|
30
|
+
.power-logs .power-logs-sql-editor::-webkit-resizer{border:0;background:linear-gradient(135deg,transparent 45%,var(--borderColor) 46% 53%,transparent 54% 70%,var(--borderColor) 71% 78%,transparent 79%) center/10px 10px no-repeat}
|
|
31
|
+
.theme-light .power-logs-sql-editor{--sql-string:#9e2b1a;--sql-number:#17642d;--sql-function:#005a9e;--sql-identifier:#684c9b}
|
|
32
|
+
.power-logs .power-logs-sql-editor>textarea,.power-logs .power-logs-sql-editor>pre{position:absolute;inset:0;box-sizing:border-box;width:100%;height:100%;min-height:0;max-height:none;margin:0;padding:4px 8px;border:0;border-radius:0;font:12px/1.6 var(--font-monospace,monospace);letter-spacing:normal;white-space:pre-wrap;overflow-wrap:anywhere;tab-size:2;overflow:auto;scrollbar-gutter:stable;resize:none}
|
|
33
|
+
.power-logs .power-logs-sql-editor>pre{pointer-events:none;color:var(--textColorPrimary);background:transparent;user-select:none}
|
|
34
|
+
.power-logs .power-logs-sql-editor>textarea{color:transparent;background:transparent;caret-color:var(--textColorPrimary);-webkit-text-fill-color:transparent}
|
|
35
|
+
.power-logs .power-logs-sql-editor>textarea::selection{background:rgba(100,150,240,.35);color:transparent}
|
|
36
|
+
.power-logs-sql-editor [data-sql-token=keyword]{color:var(--primary)}
|
|
37
|
+
.power-logs-sql-editor [data-sql-token=function]{color:var(--sql-function)}
|
|
38
|
+
.power-logs-sql-editor [data-sql-token=string]{color:var(--sql-string)}
|
|
39
|
+
.power-logs-sql-editor [data-sql-token=identifier]{color:var(--sql-identifier)}
|
|
40
|
+
.power-logs-sql-editor [data-sql-token=number]{color:var(--sql-number)}
|
|
41
|
+
.power-logs-sql-editor [data-sql-token=comment]{color:var(--textColorSecondary)}
|
|
42
|
+
`;
|
|
43
|
+
function SqlEditor({ id, value, onChange }) {
|
|
44
|
+
const textarea = require__global_external_react.useRef(null);
|
|
45
|
+
const highlight = require__global_external_react.useRef(null);
|
|
46
|
+
const tokens = require__global_external_react.useMemo(() => tokenizeSql(value), [value]);
|
|
47
|
+
const syncScroll = () => {
|
|
48
|
+
if (!textarea.current || !highlight.current) return;
|
|
49
|
+
highlight.current.scrollTop = textarea.current.scrollTop;
|
|
50
|
+
highlight.current.scrollLeft = textarea.current.scrollLeft;
|
|
51
|
+
};
|
|
52
|
+
require__global_external_react.useLayoutEffect(syncScroll, [value]);
|
|
53
|
+
const selectQuery = (event) => {
|
|
54
|
+
if (event.detail < 3) return;
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
event.stopPropagation();
|
|
57
|
+
window.getSelection()?.removeAllRanges();
|
|
58
|
+
event.currentTarget.focus();
|
|
59
|
+
event.currentTarget.select();
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
|
|
62
|
+
className: "power-logs-sql-editor",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ require_jsx_runtime.jsx("style", { children: styles }),
|
|
65
|
+
/* @__PURE__ */ require_jsx_runtime.jsxs("pre", {
|
|
66
|
+
ref: highlight,
|
|
67
|
+
"aria-hidden": "true",
|
|
68
|
+
children: [tokens.map((token, index) => /* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
69
|
+
"data-sql-token": token.kind,
|
|
70
|
+
children: token.text
|
|
71
|
+
}, index)), value.endsWith("\n") && " "]
|
|
72
|
+
}),
|
|
73
|
+
/* @__PURE__ */ require_jsx_runtime.jsx("textarea", {
|
|
74
|
+
ref: textarea,
|
|
75
|
+
id,
|
|
76
|
+
value,
|
|
77
|
+
maxLength: 65536,
|
|
78
|
+
spellCheck: false,
|
|
79
|
+
onChange: (event) => onChange(event.target.value.slice(0, 65536)),
|
|
80
|
+
onScroll: syncScroll,
|
|
81
|
+
onMouseDown: selectQuery,
|
|
82
|
+
onClick: selectQuery
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
exports.SqlEditor = SqlEditor;
|
|
89
|
+
exports.tokenizeSql = tokenizeSql;
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=power-log-sql-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-log-sql-editor.js","names":[],"sources":["../../src/renderer/power-log-sql-editor.tsx"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef } from \"react\";\n\nimport type { MouseEvent } from \"react\";\n\ntype SqlToken = { text: string; kind?: \"keyword\" | \"function\" | \"string\" | \"identifier\" | \"number\" | \"comment\" };\nconst keywords = new Set(\n \"SELECT FROM WHERE AS AND OR NOT NULL IS IN LIKE GLOB BETWEEN EXISTS CASE WHEN THEN ELSE END DISTINCT ALL JOIN LEFT RIGHT INNER OUTER CROSS FULL ON USING GROUP BY HAVING ORDER ASC DESC LIMIT OFFSET UNION INTERSECT EXCEPT WITH RECURSIVE OVER PARTITION ROWS RANGE UNBOUNDED PRECEDING FOLLOWING CURRENT ROW NULLS FIRST LAST TRUE FALSE COLLATE CAST FILTER WINDOW VALUES EXPLAIN QUERY PLAN\".split(\n \" \",\n ),\n);\nconst lexeme =\n /--[^\\n]*(?:\\n|$)|\\/\\*[\\s\\S]*?(?:\\*\\/|$)|'(?:''|[^'])*(?:'|$)|\"(?:\"\"|[^\"])*(?:\"|$)|`(?:``|[^`])*(?:`|$)|\\[[^\\]]*(?:\\]|$)|\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d*)?(?:e[+-]?\\d+)?)(?![\\w])|\\b[a-z_]\\w*\\b/gi;\n\nfunction isFunction(source: string, offset: number): boolean {\n while (offset < source.length && /\\s/.test(source[offset])) offset++;\n return source[offset] === \"(\";\n}\n\nexport function tokenizeSql(value: string): SqlToken[] {\n const source = value.slice(0, 65536);\n const tokens: SqlToken[] = [];\n let offset = 0;\n lexeme.lastIndex = 0;\n for (let match = lexeme.exec(source); match && tokens.length < 9998; match = lexeme.exec(source)) {\n if (match.index > offset) tokens.push({ text: source.slice(offset, match.index) });\n const text = match[0];\n const kind =\n text.startsWith(\"--\") || text.startsWith(\"/*\")\n ? \"comment\"\n : text.startsWith(\"'\")\n ? \"string\"\n : text.startsWith('\"') || text.startsWith(\"`\") || text.startsWith(\"[\")\n ? \"identifier\"\n : /^\\d/.test(text)\n ? \"number\"\n : keywords.has(text.toUpperCase())\n ? \"keyword\"\n : isFunction(source, match.index + text.length)\n ? \"function\"\n : undefined;\n tokens.push({ text, kind });\n offset = match.index + text.length;\n }\n if (offset < value.length) tokens.push({ text: value.slice(offset) });\n return tokens;\n}\n\nconst styles = `\n.power-logs .power-logs-sql-editor{position:relative;box-sizing:border-box;width:100%;height:56px;min-height:48px;max-height:120px;flex-shrink:0;resize:vertical;overflow:hidden;border:1px solid var(--borderColor);border-radius:4px;background:var(--inputControlBackground,var(--contentColor));--sql-string:#e6a28c;--sql-number:#98c78e;--sql-function:#81b9e6;--sql-identifier:var(--textColorPrimary)}\n.power-logs .power-logs-sql-editor::-webkit-resizer{border:0;background:linear-gradient(135deg,transparent 45%,var(--borderColor) 46% 53%,transparent 54% 70%,var(--borderColor) 71% 78%,transparent 79%) center/10px 10px no-repeat}\n.theme-light .power-logs-sql-editor{--sql-string:#9e2b1a;--sql-number:#17642d;--sql-function:#005a9e;--sql-identifier:#684c9b}\n.power-logs .power-logs-sql-editor>textarea,.power-logs .power-logs-sql-editor>pre{position:absolute;inset:0;box-sizing:border-box;width:100%;height:100%;min-height:0;max-height:none;margin:0;padding:4px 8px;border:0;border-radius:0;font:12px/1.6 var(--font-monospace,monospace);letter-spacing:normal;white-space:pre-wrap;overflow-wrap:anywhere;tab-size:2;overflow:auto;scrollbar-gutter:stable;resize:none}\n.power-logs .power-logs-sql-editor>pre{pointer-events:none;color:var(--textColorPrimary);background:transparent;user-select:none}\n.power-logs .power-logs-sql-editor>textarea{color:transparent;background:transparent;caret-color:var(--textColorPrimary);-webkit-text-fill-color:transparent}\n.power-logs .power-logs-sql-editor>textarea::selection{background:rgba(100,150,240,.35);color:transparent}\n.power-logs-sql-editor [data-sql-token=keyword]{color:var(--primary)}\n.power-logs-sql-editor [data-sql-token=function]{color:var(--sql-function)}\n.power-logs-sql-editor [data-sql-token=string]{color:var(--sql-string)}\n.power-logs-sql-editor [data-sql-token=identifier]{color:var(--sql-identifier)}\n.power-logs-sql-editor [data-sql-token=number]{color:var(--sql-number)}\n.power-logs-sql-editor [data-sql-token=comment]{color:var(--textColorSecondary)}\n`;\n\nexport function SqlEditor({ id, value, onChange }: { id: string; value: string; onChange(value: string): void }) {\n const textarea = useRef<HTMLTextAreaElement>(null);\n const highlight = useRef<HTMLPreElement>(null);\n const tokens = useMemo(() => tokenizeSql(value), [value]);\n const syncScroll = () => {\n if (!textarea.current || !highlight.current) return;\n highlight.current.scrollTop = textarea.current.scrollTop;\n highlight.current.scrollLeft = textarea.current.scrollLeft;\n };\n useLayoutEffect(syncScroll, [value]);\n const selectQuery = (event: MouseEvent<HTMLTextAreaElement>) => {\n if (event.detail < 3) return;\n event.preventDefault();\n event.stopPropagation();\n window.getSelection()?.removeAllRanges();\n event.currentTarget.focus();\n event.currentTarget.select();\n };\n return (\n <div className=\"power-logs-sql-editor\">\n <style>{styles}</style>\n <pre ref={highlight} aria-hidden=\"true\">\n {tokens.map((token, index) => (\n <span key={index} data-sql-token={token.kind}>\n {token.text}\n </span>\n ))}\n {value.endsWith(\"\\n\") && \" \"}\n </pre>\n <textarea\n ref={textarea}\n id={id}\n value={value}\n maxLength={65536}\n spellCheck={false}\n onChange={(event) => onChange(event.target.value.slice(0, 65536))}\n onScroll={syncScroll}\n onMouseDown={selectQuery}\n onClick={selectQuery}\n />\n </div>\n );\n}\n"],"mappings":";;;AAKA,IAAM,WAAW,IAAI,IACnB,kYAAkY,MAChY,GACF,CACF;AACA,IAAM,SACJ;AAEF,SAAS,WAAW,QAAgB,QAAyB;CAC3D,OAAO,SAAS,OAAO,UAAU,KAAK,KAAK,OAAO,OAAO,GAAG;CAC5D,OAAO,OAAO,YAAY;AAC5B;AAEA,SAAgB,YAAY,OAA2B;CACrD,MAAM,SAAS,MAAM,MAAM,GAAG,KAAK;CACnC,MAAM,SAAqB,CAAC;CAC5B,IAAI,SAAS;CACb,OAAO,YAAY;CACnB,KAAK,IAAI,QAAQ,OAAO,KAAK,MAAM,GAAG,SAAS,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG;EAChG,IAAI,MAAM,QAAQ,QAAQ,OAAO,KAAK,EAAE,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,CAAC;EACjF,MAAM,OAAO,MAAM;EACnB,MAAM,OACJ,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,IACzC,YACA,KAAK,WAAW,GAAG,IACjB,WACA,KAAK,WAAW,IAAG,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,IACjE,eACA,MAAM,KAAK,IAAI,IACb,WACA,SAAS,IAAI,KAAK,YAAY,CAAC,IAC7B,YACA,WAAW,QAAQ,MAAM,QAAQ,KAAK,MAAM,IAC1C,aACA,KAAA;EAChB,OAAO,KAAK;GAAE;GAAM;EAAK,CAAC;EAC1B,SAAS,MAAM,QAAQ,KAAK;CAC9B;CACA,IAAI,SAAS,MAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC;CACpE,OAAO;AACT;AAEA,IAAM,SAAS;;;;;;;;;;;;;;;AAgBf,SAAgB,UAAU,EAAE,IAAI,OAAO,YAA0E;CAC/G,MAAM,WAAW,+BAAA,OAA4B,IAAI;CACjD,MAAM,YAAY,+BAAA,OAAuB,IAAI;CAC7C,MAAM,SAAS,+BAAA,cAAc,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;CACxD,MAAM,mBAAmB;EACvB,IAAI,CAAC,SAAS,WAAW,CAAC,UAAU,SAAS;EAC7C,UAAU,QAAQ,YAAY,SAAS,QAAQ;EAC/C,UAAU,QAAQ,aAAa,SAAS,QAAQ;CAClD;CACA,+BAAA,gBAAgB,YAAY,CAAC,KAAK,CAAC;CACnC,MAAM,eAAe,UAA2C;EAC9D,IAAI,MAAM,SAAS,GAAG;EACtB,MAAM,eAAe;EACrB,MAAM,gBAAgB;EACtB,OAAO,aAAa,CAAC,EAAE,gBAAgB;EACvC,MAAM,cAAc,MAAM;EAC1B,MAAM,cAAc,OAAO;CAC7B;CACA,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;YAAf;GACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,OAAc,CAAA;GACtB,oCAAA,KAAC,OAAD;IAAK,KAAK;IAAW,eAAY;cAAjC,CACG,OAAO,KAAK,OAAO,UAClB,oCAAA,IAAC,QAAD;KAAkB,kBAAgB,MAAM;eACrC,MAAM;IACH,GAFK,KAEL,CACP,GACA,MAAM,SAAS,IAAI,KAAK,GACtB;;GACL,oCAAA,IAAC,YAAD;IACE,KAAK;IACD;IACG;IACP,WAAW;IACX,YAAY;IACZ,WAAW,UAAU,SAAS,MAAM,OAAO,MAAM,MAAM,GAAG,KAAK,CAAC;IAChE,UAAU;IACV,aAAa;IACb,SAAS;GACV,CAAA;EACE;;AAET"}
|
|
@@ -20,6 +20,10 @@ function createPowerLogsClient(partition) {
|
|
|
20
20
|
notes
|
|
21
21
|
}),
|
|
22
22
|
delete: (captureId) => invoke("delete", { captureId }),
|
|
23
|
+
saveSql: (captureId, sql) => invoke("save-sql", {
|
|
24
|
+
captureId,
|
|
25
|
+
sql
|
|
26
|
+
}),
|
|
23
27
|
query: (captureId, queryId, sql) => invoke("query", {
|
|
24
28
|
captureId,
|
|
25
29
|
queryId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs-client.js","names":[],"sources":["../../src/renderer/power-logs-client.ts"],"sourcesContent":["import { ipcRenderer } from \"electron\";\nimport {\n type LogCapture,\n type LogPartition,\n type LogQueryResult,\n type LogRecord,\n type LogTarget,\n POWER_LOGS_CHANNEL,\n} from \"../common/power-logs\";\n\nexport function createPowerLogsClient(partition: LogPartition) {\n const invoke = <T>(operation: string, fields: object = {}): Promise<T> =>\n ipcRenderer.invoke(POWER_LOGS_CHANNEL, { ...partition, operation, ...fields });\n return {\n list: () => invoke<LogCapture[]>(\"list\"),\n create: (target: LogTarget) => invoke<LogCapture>(\"create\", { target }),\n append: (captureId: string, records: LogRecord[]) => invoke<LogCapture>(\"append\", { captureId, records }),\n finish: (captureId: string, partial: boolean, notes: string[]) =>\n invoke<LogCapture>(\"finish\", { captureId, partial, notes }),\n delete: (captureId: string) => invoke<boolean>(\"delete\", { captureId }),\n query: (captureId: string, queryId: string, sql: string) =>\n invoke<LogQueryResult>(\"query\", { captureId, queryId, sql }),\n cancel: (queryId: string) => invoke<boolean>(\"cancel\", { queryId }),\n export: (captureId: string) => invoke<boolean>(\"export\", { captureId }),\n };\n}\n"],"mappings":";;;AAUA,SAAgB,sBAAsB,WAAyB;CAC7D,MAAM,UAAa,WAAmB,SAAiB,CAAC,MACtD,SAAA,YAAY,OAAO,mBAAA,oBAAoB;EAAE,GAAG;EAAW;EAAW,GAAG;CAAO,CAAC;CAC/E,OAAO;EACL,YAAY,OAAqB,MAAM;EACvC,SAAS,WAAsB,OAAmB,UAAU,EAAE,OAAO,CAAC;EACtE,SAAS,WAAmB,YAAyB,OAAmB,UAAU;GAAE;GAAW;EAAQ,CAAC;EACxG,SAAS,WAAmB,SAAkB,UAC5C,OAAmB,UAAU;GAAE;GAAW;GAAS;EAAM,CAAC;EAC5D,SAAS,cAAsB,OAAgB,UAAU,EAAE,UAAU,CAAC;EACtE,QAAQ,WAAmB,SAAiB,QAC1C,OAAuB,SAAS;GAAE;GAAW;GAAS;EAAI,CAAC;EAC7D,SAAS,YAAoB,OAAgB,UAAU,EAAE,QAAQ,CAAC;EAClE,SAAS,cAAsB,OAAgB,UAAU,EAAE,UAAU,CAAC;CACxE;AACF"}
|
|
1
|
+
{"version":3,"file":"power-logs-client.js","names":[],"sources":["../../src/renderer/power-logs-client.ts"],"sourcesContent":["import { ipcRenderer } from \"electron\";\nimport {\n type LogCapture,\n type LogPartition,\n type LogQueryResult,\n type LogRecord,\n type LogTarget,\n POWER_LOGS_CHANNEL,\n} from \"../common/power-logs\";\n\nexport function createPowerLogsClient(partition: LogPartition) {\n const invoke = <T>(operation: string, fields: object = {}): Promise<T> =>\n ipcRenderer.invoke(POWER_LOGS_CHANNEL, { ...partition, operation, ...fields });\n return {\n list: () => invoke<LogCapture[]>(\"list\"),\n create: (target: LogTarget) => invoke<LogCapture>(\"create\", { target }),\n append: (captureId: string, records: LogRecord[]) => invoke<LogCapture>(\"append\", { captureId, records }),\n finish: (captureId: string, partial: boolean, notes: string[]) =>\n invoke<LogCapture>(\"finish\", { captureId, partial, notes }),\n delete: (captureId: string) => invoke<boolean>(\"delete\", { captureId }),\n saveSql: (captureId: string, sql: string) => invoke<LogCapture>(\"save-sql\", { captureId, sql }),\n query: (captureId: string, queryId: string, sql: string) =>\n invoke<LogQueryResult>(\"query\", { captureId, queryId, sql }),\n cancel: (queryId: string) => invoke<boolean>(\"cancel\", { queryId }),\n export: (captureId: string) => invoke<boolean>(\"export\", { captureId }),\n };\n}\n"],"mappings":";;;AAUA,SAAgB,sBAAsB,WAAyB;CAC7D,MAAM,UAAa,WAAmB,SAAiB,CAAC,MACtD,SAAA,YAAY,OAAO,mBAAA,oBAAoB;EAAE,GAAG;EAAW;EAAW,GAAG;CAAO,CAAC;CAC/E,OAAO;EACL,YAAY,OAAqB,MAAM;EACvC,SAAS,WAAsB,OAAmB,UAAU,EAAE,OAAO,CAAC;EACtE,SAAS,WAAmB,YAAyB,OAAmB,UAAU;GAAE;GAAW;EAAQ,CAAC;EACxG,SAAS,WAAmB,SAAkB,UAC5C,OAAmB,UAAU;GAAE;GAAW;GAAS;EAAM,CAAC;EAC5D,SAAS,cAAsB,OAAgB,UAAU,EAAE,UAAU,CAAC;EACtE,UAAU,WAAmB,QAAgB,OAAmB,YAAY;GAAE;GAAW;EAAI,CAAC;EAC9F,QAAQ,WAAmB,SAAiB,QAC1C,OAAuB,SAAS;GAAE;GAAW;GAAS;EAAI,CAAC;EAC7D,SAAS,YAAoB,OAAgB,UAAU,EAAE,QAAQ,CAAC;EAClE,SAAS,cAAsB,OAAgB,UAAU,EAAE,UAAU,CAAC;CACxE;AACF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//#region src/renderer/power-logs-sql-drafts.ts
|
|
2
|
+
var CaptureSqlDrafts = class {
|
|
3
|
+
save;
|
|
4
|
+
onError;
|
|
5
|
+
local = /* @__PURE__ */ new Map();
|
|
6
|
+
pending = /* @__PURE__ */ new Map();
|
|
7
|
+
writes = /* @__PURE__ */ new Map();
|
|
8
|
+
timer;
|
|
9
|
+
version = 0;
|
|
10
|
+
disposed = false;
|
|
11
|
+
constructor(save, onError) {
|
|
12
|
+
this.save = save;
|
|
13
|
+
this.onError = onError;
|
|
14
|
+
}
|
|
15
|
+
read(capture, fallback) {
|
|
16
|
+
return this.local.get(capture.id)?.sql ?? capture.lastSql ?? fallback;
|
|
17
|
+
}
|
|
18
|
+
set(id, sql) {
|
|
19
|
+
if (this.disposed) return;
|
|
20
|
+
const draft = {
|
|
21
|
+
sql,
|
|
22
|
+
version: ++this.version,
|
|
23
|
+
lifetime: this.local.get(id)?.lifetime ?? {}
|
|
24
|
+
};
|
|
25
|
+
this.local.set(id, draft);
|
|
26
|
+
this.pending.set(id, draft);
|
|
27
|
+
this.clearTimer();
|
|
28
|
+
this.timer = setTimeout(() => {
|
|
29
|
+
this.flush();
|
|
30
|
+
}, 250);
|
|
31
|
+
}
|
|
32
|
+
async flush() {
|
|
33
|
+
this.clearTimer();
|
|
34
|
+
for (;;) {
|
|
35
|
+
const pending = [...this.pending];
|
|
36
|
+
this.pending.clear();
|
|
37
|
+
for (const [id, draft] of pending) this.enqueue(id, draft);
|
|
38
|
+
const writes = [...this.writes.values()];
|
|
39
|
+
if (!writes.length) return;
|
|
40
|
+
await Promise.all(writes);
|
|
41
|
+
if (!this.pending.size && !this.writes.size) return;
|
|
42
|
+
this.clearTimer();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
forget(id) {
|
|
46
|
+
this.local.delete(id);
|
|
47
|
+
this.pending.delete(id);
|
|
48
|
+
}
|
|
49
|
+
dispose() {
|
|
50
|
+
this.disposed = true;
|
|
51
|
+
return this.flush();
|
|
52
|
+
}
|
|
53
|
+
clearTimer() {
|
|
54
|
+
clearTimeout(this.timer);
|
|
55
|
+
this.timer = void 0;
|
|
56
|
+
}
|
|
57
|
+
enqueue(id, draft) {
|
|
58
|
+
const tracked = (this.writes.get(id) ?? Promise.resolve()).then(async () => {
|
|
59
|
+
if (this.local.get(id)?.lifetime !== draft.lifetime) return;
|
|
60
|
+
try {
|
|
61
|
+
await this.save(id, draft.sql);
|
|
62
|
+
} catch {
|
|
63
|
+
if (!this.disposed && this.local.get(id)?.version === draft.version) try {
|
|
64
|
+
this.onError?.(id);
|
|
65
|
+
} catch {}
|
|
66
|
+
}
|
|
67
|
+
}).finally(() => {
|
|
68
|
+
if (this.writes.get(id) === tracked) this.writes.delete(id);
|
|
69
|
+
});
|
|
70
|
+
this.writes.set(id, tracked);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
//#endregion
|
|
74
|
+
exports.CaptureSqlDrafts = CaptureSqlDrafts;
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=power-logs-sql-drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-logs-sql-drafts.js","names":[],"sources":["../../src/renderer/power-logs-sql-drafts.ts"],"sourcesContent":["import type { LogCapture } from \"../common/power-logs\";\n\ntype Draft = { sql: string; version: number; lifetime: object };\n\nexport class CaptureSqlDrafts {\n private local = new Map<string, Draft>();\n private pending = new Map<string, Draft>();\n private writes = new Map<string, Promise<void>>();\n private timer: ReturnType<typeof setTimeout> | undefined;\n private version = 0;\n private disposed = false;\n\n constructor(\n private save: (id: string, sql: string) => Promise<unknown>,\n private onError?: (id: string) => void,\n ) {}\n\n read(capture: LogCapture, fallback: string): string {\n return this.local.get(capture.id)?.sql ?? capture.lastSql ?? fallback;\n }\n\n set(id: string, sql: string): void {\n if (this.disposed) return;\n const draft = { sql, version: ++this.version, lifetime: this.local.get(id)?.lifetime ?? {} };\n this.local.set(id, draft);\n this.pending.set(id, draft);\n this.clearTimer();\n this.timer = setTimeout(() => {\n void this.flush();\n }, 250);\n }\n\n async flush(): Promise<void> {\n this.clearTimer();\n for (;;) {\n const pending = [...this.pending];\n this.pending.clear();\n for (const [id, draft] of pending) this.enqueue(id, draft);\n const writes = [...this.writes.values()];\n if (!writes.length) return;\n await Promise.all(writes);\n if (!this.pending.size && !this.writes.size) return;\n this.clearTimer();\n }\n }\n\n forget(id: string): void {\n this.local.delete(id);\n this.pending.delete(id);\n }\n\n dispose(): Promise<void> {\n this.disposed = true;\n return this.flush();\n }\n\n private clearTimer(): void {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n private enqueue(id: string, draft: Draft): void {\n const previous = this.writes.get(id) ?? Promise.resolve();\n const write = previous.then(async () => {\n if (this.local.get(id)?.lifetime !== draft.lifetime) return;\n try {\n await this.save(id, draft.sql);\n } catch {\n // retain the local draft without retrying failed writes or reporting obsolete failures\n if (!this.disposed && this.local.get(id)?.version === draft.version) {\n try {\n this.onError?.(id);\n } catch {\n /* error feedback must not break later saves */\n }\n }\n }\n });\n const tracked = write.finally(() => {\n if (this.writes.get(id) === tracked) this.writes.delete(id);\n });\n this.writes.set(id, tracked);\n }\n}\n"],"mappings":";AAIA,IAAa,mBAAb,MAA8B;CASlB;CACA;CATV,wBAAgB,IAAI,IAAmB;CACvC,0BAAkB,IAAI,IAAmB;CACzC,yBAAiB,IAAI,IAA2B;CAChD;CACA,UAAkB;CAClB,WAAmB;CAEnB,YACE,MACA,SACA;EAFQ,KAAA,OAAA;EACA,KAAA,UAAA;CACP;CAEH,KAAK,SAAqB,UAA0B;EAClD,OAAO,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC,EAAE,OAAO,QAAQ,WAAW;CAC/D;CAEA,IAAI,IAAY,KAAmB;EACjC,IAAI,KAAK,UAAU;EACnB,MAAM,QAAQ;GAAE;GAAK,SAAS,EAAE,KAAK;GAAS,UAAU,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC;EAAE;EAC3F,KAAK,MAAM,IAAI,IAAI,KAAK;EACxB,KAAK,QAAQ,IAAI,IAAI,KAAK;EAC1B,KAAK,WAAW;EAChB,KAAK,QAAQ,iBAAiB;GAC5B,KAAU,MAAM;EAClB,GAAG,GAAG;CACR;CAEA,MAAM,QAAuB;EAC3B,KAAK,WAAW;EAChB,SAAS;GACP,MAAM,UAAU,CAAC,GAAG,KAAK,OAAO;GAChC,KAAK,QAAQ,MAAM;GACnB,KAAK,MAAM,CAAC,IAAI,UAAU,SAAS,KAAK,QAAQ,IAAI,KAAK;GACzD,MAAM,SAAS,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;GACvC,IAAI,CAAC,OAAO,QAAQ;GACpB,MAAM,QAAQ,IAAI,MAAM;GACxB,IAAI,CAAC,KAAK,QAAQ,QAAQ,CAAC,KAAK,OAAO,MAAM;GAC7C,KAAK,WAAW;EAClB;CACF;CAEA,OAAO,IAAkB;EACvB,KAAK,MAAM,OAAO,EAAE;EACpB,KAAK,QAAQ,OAAO,EAAE;CACxB;CAEA,UAAyB;EACvB,KAAK,WAAW;EAChB,OAAO,KAAK,MAAM;CACpB;CAEA,aAA2B;EACzB,aAAa,KAAK,KAAK;EACvB,KAAK,QAAQ,KAAA;CACf;CAEA,QAAgB,IAAY,OAAoB;EAiB9C,MAAM,WAhBW,KAAK,OAAO,IAAI,EAAE,KAAK,QAAQ,QAAQ,EAAA,CACjC,KAAK,YAAY;GACtC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE,aAAa,MAAM,UAAU;GACrD,IAAI;IACF,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;GAC/B,QAAQ;IAEN,IAAI,CAAC,KAAK,YAAY,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE,YAAY,MAAM,SAC1D,IAAI;KACF,KAAK,UAAU,EAAE;IACnB,QAAQ,CAER;GAEJ;EACF,CACgB,CAAA,CAAM,cAAc;GAClC,IAAI,KAAK,OAAO,IAAI,EAAE,MAAM,SAAS,KAAK,OAAO,OAAO,EAAE;EAC5D,CAAC;EACD,KAAK,OAAO,IAAI,IAAI,OAAO;CAC7B;AACF"}
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
+
const require_power_log_sql_level = require("./src/common/power-log-sql-level.js");
|
|
1
2
|
//#region src/renderer/power-logs-sql-row.ts
|
|
2
|
-
var levels = /* @__PURE__ */ new Set([
|
|
3
|
-
"trace",
|
|
4
|
-
"debug",
|
|
5
|
-
"info",
|
|
6
|
-
"warn",
|
|
7
|
-
"error",
|
|
8
|
-
"fatal",
|
|
9
|
-
"unknown"
|
|
10
|
-
]);
|
|
11
3
|
function sqlRowDetails(columns, row) {
|
|
12
4
|
const cells = new Map(columns.map((column, index) => [column, row[index]]));
|
|
13
5
|
const stringCell = (name) => typeof cells.get(name) === "string" ? cells.get(name) : "";
|
|
@@ -30,7 +22,7 @@ function sqlRowDetails(columns, row) {
|
|
|
30
22
|
} catch {}
|
|
31
23
|
});
|
|
32
24
|
const timestamp = cells.get("timestamp");
|
|
33
|
-
const level =
|
|
25
|
+
const level = columns.map((column, index) => require_power_log_sql_level.sqlCellLevel(column, row[index])).find((level) => level !== "unknown") ?? "unknown";
|
|
34
26
|
const previous = cells.get("previous");
|
|
35
27
|
return {
|
|
36
28
|
record: {
|
|
@@ -38,7 +30,7 @@ function sqlRowDetails(columns, row) {
|
|
|
38
30
|
pod: stringCell("pod"),
|
|
39
31
|
podUid: stringCell("podUid"),
|
|
40
32
|
container: stringCell("container"),
|
|
41
|
-
level
|
|
33
|
+
level,
|
|
42
34
|
message: fieldsJson === null ? "" : stringCell("message"),
|
|
43
35
|
fieldsJson: fieldsJson ?? JSON.stringify(Object.fromEntries(columns.map((column, index) => [column, row[index] ?? null]))),
|
|
44
36
|
previous: previous === true || previous === 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs-sql-row.js","names":[],"sources":["../../src/renderer/power-logs-sql-row.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"power-logs-sql-row.js","names":[],"sources":["../../src/renderer/power-logs-sql-row.ts"],"sourcesContent":["import { sqlCellLevel } from \"../common/power-log-sql-level\";\n\nimport type { LogCell, LogRecord } from \"../common/power-logs\";\n\nexport function sqlRowDetails(columns: string[], row: LogCell[]): { record: LogRecord; jsonColumn?: string } {\n const cells = new Map(columns.map((column, index) => [column, row[index]]));\n const stringCell = (name: string) => (typeof cells.get(name) === \"string\" ? (cells.get(name) as string) : \"\");\n let fieldsJson: string | null = null;\n let jsonColumn: string | undefined;\n let largestBytes = -1;\n const encoder = new TextEncoder();\n columns.forEach((column, index) => {\n const value = row[index];\n if (typeof value !== \"string\") return;\n try {\n const parsed: unknown = JSON.parse(value);\n if (parsed === null || typeof parsed !== \"object\") return;\n const bytes = encoder.encode(value).byteLength;\n if (bytes > largestBytes) {\n largestBytes = bytes;\n fieldsJson = value;\n jsonColumn = column;\n }\n } catch {\n // malformed JSON remains available in the row fallback\n }\n });\n const timestamp = cells.get(\"timestamp\");\n const level =\n columns.map((column, index) => sqlCellLevel(column, row[index])).find((level) => level !== \"unknown\") ?? \"unknown\";\n const previous = cells.get(\"previous\");\n return {\n record: {\n timestamp: typeof timestamp === \"number\" && Number.isFinite(timestamp) ? timestamp : null,\n pod: stringCell(\"pod\"),\n podUid: stringCell(\"podUid\"),\n container: stringCell(\"container\"),\n level,\n message: fieldsJson === null ? \"\" : stringCell(\"message\"),\n fieldsJson:\n fieldsJson ?? JSON.stringify(Object.fromEntries(columns.map((column, index) => [column, row[index] ?? null]))),\n previous: previous === true || previous === 1,\n },\n ...(jsonColumn === undefined ? {} : { jsonColumn }),\n };\n}\n"],"mappings":";;AAIA,SAAgB,cAAc,SAAmB,KAA4D;CAC3G,MAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,QAAQ,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;CAC1E,MAAM,cAAc,SAAkB,OAAO,MAAM,IAAI,IAAI,MAAM,WAAY,MAAM,IAAI,IAAI,IAAe;CAC1G,IAAI,aAA4B;CAChC,IAAI;CACJ,IAAI,eAAe;CACnB,MAAM,UAAU,IAAI,YAAY;CAChC,QAAQ,SAAS,QAAQ,UAAU;EACjC,MAAM,QAAQ,IAAI;EAClB,IAAI,OAAO,UAAU,UAAU;EAC/B,IAAI;GACF,MAAM,SAAkB,KAAK,MAAM,KAAK;GACxC,IAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;GACnD,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GACpC,IAAI,QAAQ,cAAc;IACxB,eAAe;IACf,aAAa;IACb,aAAa;GACf;EACF,QAAQ,CAER;CACF,CAAC;CACD,MAAM,YAAY,MAAM,IAAI,WAAW;CACvC,MAAM,QACJ,QAAQ,KAAK,QAAQ,UAAU,4BAAA,aAAa,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,UAAU,UAAU,SAAS,KAAK;CAC3G,MAAM,WAAW,MAAM,IAAI,UAAU;CACrC,OAAO;EACL,QAAQ;GACN,WAAW,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,IAAI,YAAY;GACrF,KAAK,WAAW,KAAK;GACrB,QAAQ,WAAW,QAAQ;GAC3B,WAAW,WAAW,WAAW;GACjC;GACA,SAAS,eAAe,OAAO,KAAK,WAAW,SAAS;GACxD,YACE,cAAc,KAAK,UAAU,OAAO,YAAY,QAAQ,KAAK,QAAQ,UAAU,CAAC,QAAQ,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC;GAC/G,UAAU,aAAa,QAAQ,aAAa;EAC9C;EACA,GAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;CACnD;AACF"}
|
|
@@ -43,8 +43,8 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
43
43
|
.power-logs-workspace { position:relative; display:flex; flex:1; min-height:0; }
|
|
44
44
|
.power-logs-viewer { display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; gap:4px; }
|
|
45
45
|
.power-logs-stream { position:relative; flex:1; min-height:0; min-width:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; background:var(--contentColor); }
|
|
46
|
-
.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:
|
|
47
|
-
.power-logs[data-compact=true] .power-log-row { padding-inline:6px!important; gap:
|
|
46
|
+
.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(100px,180px) minmax(0,1fr); align-items:center; gap:8px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }
|
|
47
|
+
.power-logs[data-compact=true] .power-log-row { --log-time-width:calc(8ch + 1px); --log-level-width:calc(var(--power-log-level-ch,7) * .909091ch + 1px); padding-inline:6px!important; gap:4px!important; font-size:11px!important; line-height:16px; }
|
|
48
48
|
.power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }
|
|
49
49
|
.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
50
50
|
.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }
|
|
@@ -105,7 +105,7 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
105
105
|
.power-logs-options > summary { list-style:none; }
|
|
106
106
|
.power-logs-options > summary::-webkit-details-marker { display:none; }
|
|
107
107
|
.power-logs .power-logs-options[open] > summary { color:var(--primary); border-color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); }
|
|
108
|
-
.power-logs-options > div { position:absolute; z-index:10; top:100
|
|
108
|
+
.power-logs-options > div { position:absolute; z-index:10; top:calc(100% + 6px); right:0; box-sizing:border-box; width:280px; max-width:calc(100vw - 32px); border-radius:6px; padding:12px; display:flex; flex-direction:column; gap:12px; background:var(--mainBackground); border:1px solid var(--borderColor); box-shadow:0 4px 18px #0005; }
|
|
109
109
|
.power-logs-options label { white-space:nowrap; justify-content:space-between; gap:12px; }
|
|
110
110
|
.power-logs-options .power-logs-select { min-width:130px; }
|
|
111
111
|
.power-logs-select .Select__single-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
@@ -120,7 +120,7 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
120
120
|
.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
121
121
|
.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }
|
|
122
122
|
.power-logs-snapshot-notes { max-height:100px; overflow:auto; }
|
|
123
|
-
@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:
|
|
123
|
+
@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }
|
|
124
124
|
.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }
|
|
125
125
|
.Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }
|
|
126
126
|
.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }
|
|
@@ -139,6 +139,10 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
139
139
|
.theme-light .power-log-message [data-status-class="4"] { color:#8a4b00; }
|
|
140
140
|
.power-log-message [data-status-class="5"] { color:#f19b8d; }
|
|
141
141
|
.theme-light .power-log-message [data-status-class="5"] { color:#9e2b1a; }
|
|
142
|
+
.power-logs[data-hide-resource-name=true] .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); }
|
|
143
|
+
.power-logs[data-hide-resource-name=true] .power-log-origin { display:none; }
|
|
144
|
+
.power-logs .power-logs-control-label { display:block; flex:0 0 76px; width:76px; margin:0; }
|
|
145
|
+
.power-logs .power-logs-query-error { font-size:12px; color:var(--colorError); }
|
|
142
146
|
`;
|
|
143
147
|
//#endregion
|
|
144
148
|
exports.powerLogsStyles = powerLogsStyles;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs.css.js","names":[],"sources":["../../src/renderer/power-logs.css.ts"],"sourcesContent":["export const powerLogsStyles = `\nbody:has(.power-logs[data-testid=\"power-logs-page\"]) .power-ai-launcher { display:none; }\n.power-logs { display:flex; flex-direction:column; height:100%; min-height:0; min-width:0; box-sizing:border-box; overflow:hidden; padding:12px; gap:6px; color:var(--textColorPrimary); container-type:inline-size; }\n.power-logs header, .power-logs-toolbar, .power-logs-filters, .power-logs-source { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }\n.power-logs header h1 { margin:0; font-size:16px; display:flex; align-items:center; gap:10px; }\n.power-logs header .power-logs-actions { margin-left:auto; display:flex; gap:8px; flex-wrap:wrap; }\n.power-logs :is(button,input,select,textarea), .power-logs .power-logs-options > summary { font:inherit; color:inherit; }\n.power-logs :is(.power-logs-filters > input,textarea) { background:var(--contentColor); border:1px solid var(--borderColor); border-radius:5px; padding:4px 8px; min-width:0; }\n.power-logs-filters > input { flex:1; min-width:180px; }\n.power-logs label { display:flex; align-items:center; gap:8px; }\n.power-logs button, .power-logs .power-logs-options > summary { display:inline-flex; align-items:center; justify-content:center; gap:6px; min-height:28px; padding:3px 8px; border:1px solid var(--borderColor); border-radius:5px; background:var(--contentColor); cursor:pointer; box-shadow:none; }\n.power-logs button::before { content:none; }\n.power-logs :is(button:not(:disabled),.power-logs-options > summary):hover { color:var(--primary); border-color:var(--primary); }\n.power-logs button[aria-pressed=true], .power-logs button[aria-selected=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); border-color:var(--primary); }\n.power-logs button:disabled { opacity:.45; cursor:default; }\n.power-logs :is(button,input,select,textarea):focus-visible, .power-logs .power-logs-options > summary:focus-visible { outline:2px solid var(--primary); outline-offset:2px; }\n.power-logs .power-logs-filters > input:focus-visible, .power-logs textarea:focus-visible { outline:none; border-color:var(--primary); box-shadow:inset 0 0 0 1px var(--primary); }\n.power-logs .power-logs-muted { color:var(--textColorSecondary); font-size:12px; line-height:1.5; }\n.power-logs .power-logs-notice { padding:3px 8px; border:1px solid var(--borderColor); border-radius:4px; line-height:1.5; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex-shrink:0; }\n.power-logs .power-logs-error { color:var(--colorError,#e68b80); }\n.power-logs-tabs { display:flex; gap:4px; flex-shrink:0; }\n.power-logs header .power-logs-page-title { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\n.power-logs-snapshot-option { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-option-text { display:flex; flex-direction:column; gap:3px; min-width:0; white-space:normal; overflow-wrap:anywhere; }\n.power-logs-option-text strong { font-weight:500; }\n.power-logs-option-text small { opacity:.85; font-size:11px; }\n.power-logs-source-option { display:flex; align-items:center; gap:10px; width:100%; min-width:0; white-space:normal; line-height:1.4; }\n.power-logs-source-option > :first-child { flex-shrink:0; opacity:.75; }\n.power-logs-source-option .power-logs-option-text { flex:1; }\n.power-logs-source-option strong, .power-logs-source-option small { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-source-check { display:inline-flex; width:16px; flex-shrink:0; }\n.power-logs-snapshot-option > button { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; min-width:28px; min-height:28px; padding:0; border:0; border-radius:4px; background:transparent; color:inherit; cursor:pointer; }\n.power-logs-snapshot-option > button:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }\n.power-logs-snapshot-option > button:focus-visible { outline:2px solid var(--primary); outline-offset:-2px; }\n.power-logs-snapshot-option > button:disabled { opacity:.45; cursor:default; }\n.power-logs-level-label { color:var(--textColorSecondary); }\n.power-logs-level-label[data-level=debug] { color:var(--colorInfo); }\n.power-logs-level-label[data-level=info] { color:var(--primary); }\n.power-logs-level-label[data-level=warn] { color:var(--colorWarning); }\n.power-logs-level-label[data-level=error],.power-logs-level-label[data-level=fatal] { color:var(--colorError); }\n.Select__option--is-selected .power-logs-level-label { color:inherit; }\n.power-logs-workspace { position:relative; display:flex; flex:1; min-height:0; }\n.power-logs-viewer { display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; gap:4px; }\n.power-logs-stream { position:relative; flex:1; min-height:0; min-width:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; background:var(--contentColor); }\n.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:95px 48px minmax(100px,180px) minmax(0,1fr); align-items:center; gap:10px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }\n.power-logs[data-compact=true] .power-log-row { padding-inline:6px!important; gap:5px!important; font-size:11px!important; line-height:16px; }\n.power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }\n.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }\n.power-log-message { color:var(--textColorPrimary); }\n.power-log-message [data-log-token=http-method] { color:var(--primary); }\n.power-log-message [data-log-token=uuid] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=uuid] { color:#005a9e; }\n.power-log-row .power-log-level { font-size:10px; font-weight:600; text-transform:uppercase; }\n.power-log-row[data-level=warn] { border-left-color:var(--colorWarning,#d9a441)!important; }\n.power-log-row[data-level=error],.power-log-row[data-level=fatal] { border-left-color:var(--colorError,#d26860)!important; }\n.power-log-row[data-level=info] { border-left-color:var(--primary)!important; }\n.power-logs-detail { position:absolute; z-index:5; top:0; bottom:0; right:0; box-sizing:border-box; box-shadow:-4px 0 18px #0004; display:flex; flex-direction:column; align-items:stretch; gap:12px; width:460px; max-width:95%; padding:16px; background:var(--contentColor); border:1px solid var(--borderColor); border-radius:6px; overflow:auto; }\n.power-logs-detail header { justify-content:flex-end; }\n.power-logs-detail header > strong { margin-right:auto; }\n.power-logs-structured-heading { display:flex; align-items:center; gap:6px; }\n.power-logs .power-logs-detail-copy, .power-logs .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }\n.power-logs .power-logs-detail-copy:not(:disabled):hover, .power-logs .power-logs-detail-close:not(:disabled):hover { border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-log-json { --json-key:#9cdcfe; --json-string:#ce9178; --json-number:#b5cea8; --json-literal:#c586c0; }\n.theme-light .power-log-json { --json-key:#005a9e; --json-string:#9e2b1a; --json-number:#17642d; --json-literal:#7a288c; }\n.power-log-json [data-token=key] { color:var(--json-key); }\n.power-log-json [data-token=string] { color:var(--json-string); }\n.power-log-json [data-token=number] { color:var(--json-number); }\n.power-log-json [data-token=literal] { color:var(--json-literal); }\n.power-logs pre { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; line-height:1.6; }\n.power-logs textarea { user-select:text; box-sizing:border-box; width:100%; height:56px; min-height:48px; max-height:120px; flex-shrink:0; resize:vertical; font-family:var(--font-monospace,monospace); }\n.power-logs-results { flex:1; min-height:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; }\n.power-logs table { border-collapse:collapse; table-layout:fixed; font-size:12px; width:100%; min-width:0; }\n\n.power-logs th,.power-logs td { padding:6px 10px; text-align:left; border-bottom:1px solid var(--borderColor); max-width:400px; white-space:nowrap; vertical-align:top; }\n.power-logs .power-logs-cell { display:block; overflow:hidden; text-overflow:ellipsis; max-height:4.8em; }\n.power-logs .power-logs-json-cell { position:relative; display:flex; align-items:center; gap:4px; min-width:0; height:20px; max-height:20px; }\n.power-logs .power-logs-json-cell .power-log-json { flex:1; min-width:0; margin:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; line-height:20px; }\n.power-logs .power-logs-json-copy { display:inline-flex; align-items:center; justify-content:center; flex:0 0 20px; width:20px; height:20px; min-height:0; padding:0; border-color:transparent; background:transparent; opacity:.6; }\n.power-logs .power-logs-json-copy:hover, .power-logs .power-logs-json-copy:focus-visible { opacity:1; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-logs .power-logs-json-copy-feedback { position:absolute; left:0; top:0; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n\n.power-logs tbody tr { cursor:pointer; }\n.power-logs tbody tr:hover, .power-logs tbody tr:focus-visible { background:color-mix(in srgb,var(--primary) 10%,var(--contentColor)); outline:none; }\n.power-logs td[data-column=message] { font-family:var(--font-monospace,monospace); font-size:12px; white-space:pre-wrap; overflow-wrap:anywhere; }\n.power-logs td[data-level=error], .power-logs td[data-level=fatal] { color:var(--colorError,#d26860); }\n.power-logs td[data-level=warn] { color:var(--colorWarning,#d9a441); }\n.power-logs th { position:sticky; top:0; background:var(--contentColor); }\n.power-logs dialog { position:fixed; inset:0; margin:auto; background:var(--mainBackground); color:var(--textColorPrimary); border:1px solid var(--borderColor); border-radius:8px; padding:24px; width:min(640px,85vw); max-height:80vh; overflow:auto; }\n.power-logs dialog::backdrop { background:#0007; }\n.power-logs-empty { padding:32px; text-align:center; color:var(--textColorSecondary); }\n\n.power-logs > :not(.power-logs-workspace):not(.power-logs-results) { flex-shrink:0; }\n.power-logs-target, .power-logs-caption { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-select { display:inline-block; min-width:0; max-width:360px; flex:1; }\n.power-logs-source .power-logs-select { flex:1; max-width:none; }\n.power-logs-select > div { width:100%; min-width:0; }\n.power-logs-filters .power-logs-select { flex:0 1 180px; }\n.power-logs-filters .power-logs-select[data-source-select] { flex:1 1 260px; max-width:420px; }\n\n.power-logs-capture { display:flex; }\n.power-logs-capture > button { color:var(--primary); }\n.power-logs-options { position:relative; }\n.power-logs-options > summary { list-style:none; }\n.power-logs-options > summary::-webkit-details-marker { display:none; }\n.power-logs .power-logs-options[open] > summary { color:var(--primary); border-color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); }\n.power-logs-options > div { position:absolute; z-index:10; top:100%; right:0; box-sizing:border-box; width:280px; max-width:calc(100vw - 32px); border-radius:6px; padding:12px; display:flex; flex-direction:column; gap:12px; background:var(--mainBackground); border:1px solid var(--borderColor); box-shadow:0 4px 18px #0005; }\n.power-logs-options label { white-space:nowrap; justify-content:space-between; gap:12px; }\n.power-logs-options .power-logs-select { min-width:130px; }\n.power-logs-select .Select__single-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-sql-tools button { min-height:24px; font-size:12px; }\n.power-logs-pagination { justify-content:flex-end; gap:8px; }\n.power-logs-pagination button { width:28px; padding:3px; }\n.power-logs-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-caption { flex:1; min-width:0; font-size:11px!important; }\n.power-logs .power-logs-collection-note { display:flex; align-items:center; gap:5px; min-width:0; max-width:55%; padding:1px 6px; font-size:11px; }\n.power-logs-collection-note > :first-child { color:var(--colorWarning,#d9a441); flex-shrink:0; }\n.power-logs-collection-note > :last-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\n.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-snapshot-notes { max-height:100px; overflow:auto; }\n@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:80px 42px minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }\n.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }\n.Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }\n.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }\n.power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }\n.power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-field-filters button > :last-child { flex-shrink:0; }\n.power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }\n.power-logs .power-logs-json-cell .power-log-json { white-space:pre; }\n.power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=url], .theme-light .power-log-message [data-log-token=trace-id], .theme-light .power-log-message [data-log-token=address] { color:#005a9e; }\n.power-log-message [data-log-token=duration], .power-log-message [data-status-class=\"2\"] { color:#b5cea8; }\n.theme-light .power-log-message [data-log-token=duration], .theme-light .power-log-message [data-status-class=\"2\"] { color:#17642d; }\n.power-log-message [data-status-class=\"1\"], .power-log-message [data-status-class=\"3\"] { color:#9cdcfe; }\n.theme-light .power-log-message [data-status-class=\"1\"], .theme-light .power-log-message [data-status-class=\"3\"] { color:#005a9e; }\n.power-log-message [data-status-class=\"4\"] { color:#e3b56b; }\n.theme-light .power-log-message [data-status-class=\"4\"] { color:#8a4b00; }\n.power-log-message [data-status-class=\"5\"] { color:#f19b8d; }\n.theme-light .power-log-message [data-status-class=\"5\"] { color:#9e2b1a; }\n`;\n"],"mappings":";AAAA,IAAa,kBAAkB"}
|
|
1
|
+
{"version":3,"file":"power-logs.css.js","names":[],"sources":["../../src/renderer/power-logs.css.ts"],"sourcesContent":["export const powerLogsStyles = `\nbody:has(.power-logs[data-testid=\"power-logs-page\"]) .power-ai-launcher { display:none; }\n.power-logs { display:flex; flex-direction:column; height:100%; min-height:0; min-width:0; box-sizing:border-box; overflow:hidden; padding:12px; gap:6px; color:var(--textColorPrimary); container-type:inline-size; }\n.power-logs header, .power-logs-toolbar, .power-logs-filters, .power-logs-source { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }\n.power-logs header h1 { margin:0; font-size:16px; display:flex; align-items:center; gap:10px; }\n.power-logs header .power-logs-actions { margin-left:auto; display:flex; gap:8px; flex-wrap:wrap; }\n.power-logs :is(button,input,select,textarea), .power-logs .power-logs-options > summary { font:inherit; color:inherit; }\n.power-logs :is(.power-logs-filters > input,textarea) { background:var(--contentColor); border:1px solid var(--borderColor); border-radius:5px; padding:4px 8px; min-width:0; }\n.power-logs-filters > input { flex:1; min-width:180px; }\n.power-logs label { display:flex; align-items:center; gap:8px; }\n.power-logs button, .power-logs .power-logs-options > summary { display:inline-flex; align-items:center; justify-content:center; gap:6px; min-height:28px; padding:3px 8px; border:1px solid var(--borderColor); border-radius:5px; background:var(--contentColor); cursor:pointer; box-shadow:none; }\n.power-logs button::before { content:none; }\n.power-logs :is(button:not(:disabled),.power-logs-options > summary):hover { color:var(--primary); border-color:var(--primary); }\n.power-logs button[aria-pressed=true], .power-logs button[aria-selected=true] { color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); border-color:var(--primary); }\n.power-logs button:disabled { opacity:.45; cursor:default; }\n.power-logs :is(button,input,select,textarea):focus-visible, .power-logs .power-logs-options > summary:focus-visible { outline:2px solid var(--primary); outline-offset:2px; }\n.power-logs .power-logs-filters > input:focus-visible, .power-logs textarea:focus-visible { outline:none; border-color:var(--primary); box-shadow:inset 0 0 0 1px var(--primary); }\n.power-logs .power-logs-muted { color:var(--textColorSecondary); font-size:12px; line-height:1.5; }\n.power-logs .power-logs-notice { padding:3px 8px; border:1px solid var(--borderColor); border-radius:4px; line-height:1.5; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex-shrink:0; }\n.power-logs .power-logs-error { color:var(--colorError,#e68b80); }\n.power-logs-tabs { display:flex; gap:4px; flex-shrink:0; }\n.power-logs header .power-logs-page-title { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\n.power-logs-snapshot-option { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-option-text { display:flex; flex-direction:column; gap:3px; min-width:0; white-space:normal; overflow-wrap:anywhere; }\n.power-logs-option-text strong { font-weight:500; }\n.power-logs-option-text small { opacity:.85; font-size:11px; }\n.power-logs-source-option { display:flex; align-items:center; gap:10px; width:100%; min-width:0; white-space:normal; line-height:1.4; }\n.power-logs-source-option > :first-child { flex-shrink:0; opacity:.75; }\n.power-logs-source-option .power-logs-option-text { flex:1; }\n.power-logs-source-option strong, .power-logs-source-option small { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-source-check { display:inline-flex; width:16px; flex-shrink:0; }\n.power-logs-snapshot-option > button { display:inline-flex; align-items:center; justify-content:center; flex-shrink:0; min-width:28px; min-height:28px; padding:0; border:0; border-radius:4px; background:transparent; color:inherit; cursor:pointer; }\n.power-logs-snapshot-option > button:not(:disabled):hover { color:var(--colorError); background:color-mix(in srgb,var(--colorError) 12%,transparent); }\n.power-logs-snapshot-option > button:focus-visible { outline:2px solid var(--primary); outline-offset:-2px; }\n.power-logs-snapshot-option > button:disabled { opacity:.45; cursor:default; }\n.power-logs-level-label { color:var(--textColorSecondary); }\n.power-logs-level-label[data-level=debug] { color:var(--colorInfo); }\n.power-logs-level-label[data-level=info] { color:var(--primary); }\n.power-logs-level-label[data-level=warn] { color:var(--colorWarning); }\n.power-logs-level-label[data-level=error],.power-logs-level-label[data-level=fatal] { color:var(--colorError); }\n.Select__option--is-selected .power-logs-level-label { color:inherit; }\n.power-logs-workspace { position:relative; display:flex; flex:1; min-height:0; }\n.power-logs-viewer { display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; gap:4px; }\n.power-logs-stream { position:relative; flex:1; min-height:0; min-width:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; background:var(--contentColor); }\n.power-log-row { min-height:0!important; position:absolute; left:0; right:0; width:100%; display:grid!important; grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(100px,180px) minmax(0,1fr); align-items:center; gap:8px!important; padding:0 12px!important; border:0!important; border-left:3px solid var(--textColorSecondary)!important; border-bottom:1px solid var(--borderFaintColor)!important; border-radius:0!important; text-align:left; background:transparent!important; font-family:var(--font-monospace,monospace)!important; font-size:12px!important; }\n.power-logs[data-compact=true] .power-log-row { --log-time-width:calc(8ch + 1px); --log-level-width:calc(var(--power-log-level-ch,7) * .909091ch + 1px); padding-inline:6px!important; gap:4px!important; font-size:11px!important; line-height:16px; }\n.power-logs[data-compact=true] table :is(td,th) { padding:1px 6px; font-size:11px; line-height:16px; }\n.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }\n.power-log-message { color:var(--textColorPrimary); }\n.power-log-message [data-log-token=http-method] { color:var(--primary); }\n.power-log-message [data-log-token=uuid] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=uuid] { color:#005a9e; }\n.power-log-row .power-log-level { font-size:10px; font-weight:600; text-transform:uppercase; }\n.power-log-row[data-level=warn] { border-left-color:var(--colorWarning,#d9a441)!important; }\n.power-log-row[data-level=error],.power-log-row[data-level=fatal] { border-left-color:var(--colorError,#d26860)!important; }\n.power-log-row[data-level=info] { border-left-color:var(--primary)!important; }\n.power-logs-detail { position:absolute; z-index:5; top:0; bottom:0; right:0; box-sizing:border-box; box-shadow:-4px 0 18px #0004; display:flex; flex-direction:column; align-items:stretch; gap:12px; width:460px; max-width:95%; padding:16px; background:var(--contentColor); border:1px solid var(--borderColor); border-radius:6px; overflow:auto; }\n.power-logs-detail header { justify-content:flex-end; }\n.power-logs-detail header > strong { margin-right:auto; }\n.power-logs-structured-heading { display:flex; align-items:center; gap:6px; }\n.power-logs .power-logs-detail-copy, .power-logs .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }\n.power-logs .power-logs-detail-copy:not(:disabled):hover, .power-logs .power-logs-detail-close:not(:disabled):hover { border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-log-json { --json-key:#9cdcfe; --json-string:#ce9178; --json-number:#b5cea8; --json-literal:#c586c0; }\n.theme-light .power-log-json { --json-key:#005a9e; --json-string:#9e2b1a; --json-number:#17642d; --json-literal:#7a288c; }\n.power-log-json [data-token=key] { color:var(--json-key); }\n.power-log-json [data-token=string] { color:var(--json-string); }\n.power-log-json [data-token=number] { color:var(--json-number); }\n.power-log-json [data-token=literal] { color:var(--json-literal); }\n.power-logs pre { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; line-height:1.6; }\n.power-logs textarea { user-select:text; box-sizing:border-box; width:100%; height:56px; min-height:48px; max-height:120px; flex-shrink:0; resize:vertical; font-family:var(--font-monospace,monospace); }\n.power-logs-results { flex:1; min-height:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; }\n.power-logs table { border-collapse:collapse; table-layout:fixed; font-size:12px; width:100%; min-width:0; }\n\n.power-logs th,.power-logs td { padding:6px 10px; text-align:left; border-bottom:1px solid var(--borderColor); max-width:400px; white-space:nowrap; vertical-align:top; }\n.power-logs .power-logs-cell { display:block; overflow:hidden; text-overflow:ellipsis; max-height:4.8em; }\n.power-logs .power-logs-json-cell { position:relative; display:flex; align-items:center; gap:4px; min-width:0; height:20px; max-height:20px; }\n.power-logs .power-logs-json-cell .power-log-json { flex:1; min-width:0; margin:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; line-height:20px; }\n.power-logs .power-logs-json-copy { display:inline-flex; align-items:center; justify-content:center; flex:0 0 20px; width:20px; height:20px; min-height:0; padding:0; border-color:transparent; background:transparent; opacity:.6; }\n.power-logs .power-logs-json-copy:hover, .power-logs .power-logs-json-copy:focus-visible { opacity:1; background:color-mix(in srgb,var(--primary) 10%,transparent); }\n.power-logs .power-logs-json-copy-feedback { position:absolute; left:0; top:0; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n\n.power-logs tbody tr { cursor:pointer; }\n.power-logs tbody tr:hover, .power-logs tbody tr:focus-visible { background:color-mix(in srgb,var(--primary) 10%,var(--contentColor)); outline:none; }\n.power-logs td[data-column=message] { font-family:var(--font-monospace,monospace); font-size:12px; white-space:pre-wrap; overflow-wrap:anywhere; }\n.power-logs td[data-level=error], .power-logs td[data-level=fatal] { color:var(--colorError,#d26860); }\n.power-logs td[data-level=warn] { color:var(--colorWarning,#d9a441); }\n.power-logs th { position:sticky; top:0; background:var(--contentColor); }\n.power-logs dialog { position:fixed; inset:0; margin:auto; background:var(--mainBackground); color:var(--textColorPrimary); border:1px solid var(--borderColor); border-radius:8px; padding:24px; width:min(640px,85vw); max-height:80vh; overflow:auto; }\n.power-logs dialog::backdrop { background:#0007; }\n.power-logs-empty { padding:32px; text-align:center; color:var(--textColorSecondary); }\n\n.power-logs > :not(.power-logs-workspace):not(.power-logs-results) { flex-shrink:0; }\n.power-logs-target, .power-logs-caption { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-select { display:inline-block; min-width:0; max-width:360px; flex:1; }\n.power-logs-source .power-logs-select { flex:1; max-width:none; }\n.power-logs-select > div { width:100%; min-width:0; }\n.power-logs-filters .power-logs-select { flex:0 1 180px; }\n.power-logs-filters .power-logs-select[data-source-select] { flex:1 1 260px; max-width:420px; }\n\n.power-logs-capture { display:flex; }\n.power-logs-capture > button { color:var(--primary); }\n.power-logs-options { position:relative; }\n.power-logs-options > summary { list-style:none; }\n.power-logs-options > summary::-webkit-details-marker { display:none; }\n.power-logs .power-logs-options[open] > summary { color:var(--primary); border-color:var(--primary); background:color-mix(in srgb,var(--primary) 12%,var(--contentColor)); }\n.power-logs-options > div { position:absolute; z-index:10; top:calc(100% + 6px); right:0; box-sizing:border-box; width:280px; max-width:calc(100vw - 32px); border-radius:6px; padding:12px; display:flex; flex-direction:column; gap:12px; background:var(--mainBackground); border:1px solid var(--borderColor); box-shadow:0 4px 18px #0005; }\n.power-logs-options label { white-space:nowrap; justify-content:space-between; gap:12px; }\n.power-logs-options .power-logs-select { min-width:130px; }\n.power-logs-select .Select__single-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-sql-tools button { min-height:24px; font-size:12px; }\n.power-logs-pagination { justify-content:flex-end; gap:8px; }\n.power-logs-pagination button { width:28px; padding:3px; }\n.power-logs-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }\n.power-logs-caption { flex:1; min-width:0; font-size:11px!important; }\n.power-logs .power-logs-collection-note { display:flex; align-items:center; gap:5px; min-width:0; max-width:55%; padding:1px 6px; font-size:11px; }\n.power-logs-collection-note > :first-child { color:var(--colorWarning,#d9a441); flex-shrink:0; }\n.power-logs-collection-note > :last-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\n.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }\n.power-logs-snapshot-notes { max-height:100px; overflow:auto; }\n@container(max-width:760px) { .power-logs-detail { width:min(420px,86%); padding:12px; gap:10px; } .power-logs-filters .power-logs-select { flex:1 1 130px; } .power-logs-filters > input { flex-basis:100%; } .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }\n.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }\n.Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }\n.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }\n.power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }\n.power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.power-logs-field-filters button > :last-child { flex-shrink:0; }\n.power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }\n.power-logs .power-logs-json-cell .power-log-json { white-space:pre; }\n.power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }\n.theme-light .power-log-message [data-log-token=url], .theme-light .power-log-message [data-log-token=trace-id], .theme-light .power-log-message [data-log-token=address] { color:#005a9e; }\n.power-log-message [data-log-token=duration], .power-log-message [data-status-class=\"2\"] { color:#b5cea8; }\n.theme-light .power-log-message [data-log-token=duration], .theme-light .power-log-message [data-status-class=\"2\"] { color:#17642d; }\n.power-log-message [data-status-class=\"1\"], .power-log-message [data-status-class=\"3\"] { color:#9cdcfe; }\n.theme-light .power-log-message [data-status-class=\"1\"], .theme-light .power-log-message [data-status-class=\"3\"] { color:#005a9e; }\n.power-log-message [data-status-class=\"4\"] { color:#e3b56b; }\n.theme-light .power-log-message [data-status-class=\"4\"] { color:#8a4b00; }\n.power-log-message [data-status-class=\"5\"] { color:#f19b8d; }\n.theme-light .power-log-message [data-status-class=\"5\"] { color:#9e2b1a; }\n.power-logs[data-hide-resource-name=true] .power-log-row { grid-template-columns:var(--log-time-width,calc(8ch + 4px)) var(--log-level-width,calc(var(--power-log-level-ch,7) * .833333ch + 4px)) minmax(0,1fr); }\n.power-logs[data-hide-resource-name=true] .power-log-origin { display:none; }\n.power-logs .power-logs-control-label { display:block; flex:0 0 76px; width:76px; margin:0; }\n.power-logs .power-logs-query-error { font-size:12px; color:var(--colorError); }\n`;\n"],"mappings":";AAAA,IAAa,kBAAkB"}
|