@64mb/freelens-power 1.6.0 → 2.0.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/out/main/common/resource-search-kind-priority.js +23 -0
- package/out/main/common/resource-search-kind-priority.js.map +1 -0
- package/out/main/power-logs-query.js +1 -0
- package/out/main/power-logs-query.js.map +1 -1
- package/out/main/resource-search-database.js +7 -2
- package/out/main/resource-search-database.js.map +1 -1
- package/out/main/resource-search-worker.js +6 -2
- package/out/main/resource-search-worker.js.map +1 -1
- package/out/renderer/_virtual/_global-external_react.js +2 -1
- package/out/renderer/power-log-json-cell.js +74 -0
- package/out/renderer/power-log-json-cell.js.map +1 -0
- package/out/renderer/power-log-json-fields.js +144 -0
- package/out/renderer/power-log-json-fields.js.map +1 -0
- package/out/renderer/power-log-json.js +139 -20
- package/out/renderer/power-log-json.js.map +1 -1
- package/out/renderer/power-log-message-tokens.js +60 -0
- package/out/renderer/power-log-message-tokens.js.map +1 -0
- package/out/renderer/power-log-message.js +26 -0
- package/out/renderer/power-log-message.js.map +1 -0
- package/out/renderer/power-logs-sql-row.js +2 -2
- package/out/renderer/power-logs-sql-row.js.map +1 -1
- package/out/renderer/power-logs.css.js +36 -6
- package/out/renderer/power-logs.css.js.map +1 -1
- package/out/renderer/power-logs.js +249 -28
- package/out/renderer/power-logs.js.map +1 -1
- package/out/renderer/preferences/logs-preferences.js +159 -38
- package/out/renderer/preferences/logs-preferences.js.map +1 -1
- package/out/renderer/resource-search-model.js +2 -1
- package/out/renderer/resource-search-model.js.map +1 -1
- package/out/renderer/resource-search-sync.js +1 -1
- package/out/renderer/resource-search-sync.js.map +1 -1
- package/out/renderer/resource-search.js +84 -81
- package/out/renderer/resource-search.js.map +1 -1
- package/out/renderer/src/common/power-log-field-filters.js +92 -0
- package/out/renderer/src/common/power-log-field-filters.js.map +1 -0
- package/out/renderer/src/common/power-log-json-filter-sql.js +106 -0
- package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -0
- package/out/renderer/src/common/power-log-json-preset.js +36 -0
- package/out/renderer/src/common/power-log-json-preset.js.map +1 -0
- package/out/renderer/src/common/power-log-level.js +171 -0
- package/out/renderer/src/common/power-log-level.js.map +1 -0
- package/out/renderer/src/common/power-log-parser.js +7 -29
- package/out/renderer/src/common/power-log-parser.js.map +1 -1
- package/out/renderer/src/common/resource-search-kind-priority.js +28 -0
- package/out/renderer/src/common/resource-search-kind-priority.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,26 +1,145 @@
|
|
|
1
|
+
const require__global_external_react = require("./_virtual/_global-external_react.js");
|
|
1
2
|
const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
|
|
3
|
+
const require_power_log_json_fields = require("./power-log-json-fields.js");
|
|
4
|
+
let electron = require("electron");
|
|
2
5
|
//#region src/renderer/power-log-json.tsx
|
|
3
|
-
function LogJson({ text }) {
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const key = value.startsWith("\"") && value.endsWith(":");
|
|
12
|
-
const kind = key ? "key" : value.startsWith("\"") ? "string" : /^(true|false|null)$/.test(value) ? "literal" : "number";
|
|
13
|
-
tokens.push(/* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
14
|
-
"data-token": kind,
|
|
15
|
-
children: key ? value.slice(0, -1) : value
|
|
16
|
-
}, start));
|
|
17
|
-
if (key) tokens.push(":");
|
|
18
|
-
cursor = start + value.length;
|
|
19
|
-
}
|
|
20
|
-
tokens.push(text.slice(cursor));
|
|
21
|
-
return /* @__PURE__ */ require_jsx_runtime.jsx("pre", {
|
|
6
|
+
function LogJson({ text, fieldText, fieldsEnabled = true, Icon, onFilter }) {
|
|
7
|
+
const identity = fieldText ?? text;
|
|
8
|
+
const interactive = fieldsEnabled && Boolean(Icon || onFilter);
|
|
9
|
+
const fields = require__global_external_react.useMemo(() => interactive ? require_power_log_json_fields.jsonFields(identity) : /* @__PURE__ */ new Map(), [identity, interactive]);
|
|
10
|
+
const [active, setActive] = require__global_external_react.useState();
|
|
11
|
+
const [feedback, setFeedback] = require__global_external_react.useState("");
|
|
12
|
+
const selected = fieldsEnabled && active?.text === identity ? active : void 0;
|
|
13
|
+
const pre = /* @__PURE__ */ require_jsx_runtime.jsx("pre", {
|
|
22
14
|
className: "power-log-json",
|
|
23
|
-
children:
|
|
15
|
+
children: require__global_external_react.useMemo(() => {
|
|
16
|
+
const tokens = [];
|
|
17
|
+
const pattern = /"(?:\\.|[^"\\])*"(?:\s*:)?|\b(?:true|false|null)\b|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|[\[{]/g;
|
|
18
|
+
let cursor = 0;
|
|
19
|
+
let count = 0;
|
|
20
|
+
for (const match of text.matchAll(pattern)) {
|
|
21
|
+
if (++count > 2e4) break;
|
|
22
|
+
const start = match.index;
|
|
23
|
+
tokens.push(text.slice(cursor, start));
|
|
24
|
+
const value = match[0];
|
|
25
|
+
const key = value.startsWith("\"") && value.endsWith(":");
|
|
26
|
+
const kind = key ? "key" : value.startsWith("\"") ? "string" : /^(true|false|null)$/.test(value) ? "literal" : /^[\[{]$/.test(value) ? void 0 : "number";
|
|
27
|
+
const field = fields.get(start);
|
|
28
|
+
const activate = (element) => {
|
|
29
|
+
if (!field) return;
|
|
30
|
+
const rect = element.getBoundingClientRect();
|
|
31
|
+
setActive({
|
|
32
|
+
field,
|
|
33
|
+
text: identity,
|
|
34
|
+
x: Math.max(4, Math.min(rect.left, window.innerWidth - 250)),
|
|
35
|
+
y: Math.max(4, Math.min(rect.bottom, window.innerHeight - 40))
|
|
36
|
+
});
|
|
37
|
+
setFeedback("");
|
|
38
|
+
};
|
|
39
|
+
tokens.push(/* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
40
|
+
"data-token": kind,
|
|
41
|
+
tabIndex: field ? 0 : void 0,
|
|
42
|
+
onMouseEnter: field ? (event) => activate(event.currentTarget) : void 0,
|
|
43
|
+
onFocus: field ? (event) => activate(event.currentTarget) : void 0,
|
|
44
|
+
onKeyDown: field ? (event) => {
|
|
45
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
event.stopPropagation();
|
|
48
|
+
event.currentTarget.closest(".power-log-json-fields")?.querySelector("[role=\"toolbar\"] button")?.focus();
|
|
49
|
+
}
|
|
50
|
+
} : void 0,
|
|
51
|
+
children: key ? value.slice(0, -1) : value
|
|
52
|
+
}, start));
|
|
53
|
+
if (key) tokens.push(":");
|
|
54
|
+
cursor = start + value.length;
|
|
55
|
+
}
|
|
56
|
+
tokens.push(text.slice(cursor));
|
|
57
|
+
return tokens;
|
|
58
|
+
}, [
|
|
59
|
+
text,
|
|
60
|
+
fields,
|
|
61
|
+
identity
|
|
62
|
+
])
|
|
63
|
+
});
|
|
64
|
+
if (!Icon && !onFilter) return pre;
|
|
65
|
+
return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
|
|
66
|
+
className: "power-log-json-fields",
|
|
67
|
+
onMouseLeave: () => setActive(void 0),
|
|
68
|
+
onBlur: (event) => {
|
|
69
|
+
if (!event.currentTarget.contains(event.relatedTarget)) setActive(void 0);
|
|
70
|
+
},
|
|
71
|
+
onKeyDown: (event) => {
|
|
72
|
+
if (event.key === "Escape") {
|
|
73
|
+
event.stopPropagation();
|
|
74
|
+
setActive(void 0);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
children: [pre, selected && /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
|
|
78
|
+
role: "toolbar",
|
|
79
|
+
"aria-label": "JSON field actions",
|
|
80
|
+
style: {
|
|
81
|
+
position: "fixed",
|
|
82
|
+
left: selected.x,
|
|
83
|
+
top: selected.y,
|
|
84
|
+
zIndex: 1e3,
|
|
85
|
+
display: "flex",
|
|
86
|
+
gap: 4,
|
|
87
|
+
padding: 4,
|
|
88
|
+
background: "var(--mainBackground, #252525)",
|
|
89
|
+
border: "1px solid var(--borderColor, #666)",
|
|
90
|
+
borderRadius: 4
|
|
91
|
+
},
|
|
92
|
+
onClick: (event) => event.stopPropagation(),
|
|
93
|
+
onKeyDown: (event) => {
|
|
94
|
+
event.stopPropagation();
|
|
95
|
+
if (event.key === "Escape") setActive(void 0);
|
|
96
|
+
},
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ require_jsx_runtime.jsx("button", {
|
|
99
|
+
type: "button",
|
|
100
|
+
title: "Copy value",
|
|
101
|
+
"aria-label": "Copy value",
|
|
102
|
+
onClick: () => {
|
|
103
|
+
try {
|
|
104
|
+
const value = selected.field.value;
|
|
105
|
+
electron.clipboard.writeText(typeof value === "string" ? value : require_power_log_json_fields.jsonFieldLiteral(identity, selected.field));
|
|
106
|
+
setFeedback("Copied");
|
|
107
|
+
} catch {
|
|
108
|
+
setFeedback("Copy failed");
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
children: Icon ? /* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
|
|
112
|
+
material: "content_copy",
|
|
113
|
+
size: 14
|
|
114
|
+
}) : "⧉"
|
|
115
|
+
}),
|
|
116
|
+
onFilter && /* @__PURE__ */ require_jsx_runtime.jsxs(require_jsx_runtime.Fragment, { children: [/* @__PURE__ */ require_jsx_runtime.jsx("button", {
|
|
117
|
+
type: "button",
|
|
118
|
+
title: "Include value",
|
|
119
|
+
"aria-label": "Include value",
|
|
120
|
+
onClick: () => onFilter({
|
|
121
|
+
path: selected.field.path,
|
|
122
|
+
value: selected.field.value,
|
|
123
|
+
operator: "eq"
|
|
124
|
+
}),
|
|
125
|
+
children: "="
|
|
126
|
+
}), /* @__PURE__ */ require_jsx_runtime.jsx("button", {
|
|
127
|
+
type: "button",
|
|
128
|
+
title: "Exclude value",
|
|
129
|
+
"aria-label": "Exclude value",
|
|
130
|
+
onClick: () => onFilter({
|
|
131
|
+
path: selected.field.path,
|
|
132
|
+
value: selected.field.value,
|
|
133
|
+
operator: "neq"
|
|
134
|
+
}),
|
|
135
|
+
children: "!="
|
|
136
|
+
})] }),
|
|
137
|
+
feedback && /* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
138
|
+
role: "status",
|
|
139
|
+
children: feedback
|
|
140
|
+
})
|
|
141
|
+
]
|
|
142
|
+
})]
|
|
24
143
|
});
|
|
25
144
|
}
|
|
26
145
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-log-json.js","names":[],"sources":["../../src/renderer/power-log-json.tsx"],"sourcesContent":["import
|
|
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":";;;;;AAcA,SAAgB,QAAQ,EAAE,MAAM,WAAW,gBAAgB,MAAM,MAAM,YAA0B;CAC/F,MAAM,WAAW,aAAa;CAC9B,MAAM,cAAc,iBAAiB,QAAQ,QAAQ,QAAQ;CAC7D,MAAM,SAAS,+BAAA,cACN,cAAc,8BAAA,WAAW,QAAQ,oBAAI,IAAI,IAAuB,GACvE,CAAC,UAAU,WAAW,CACxB;CACA,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAmE;CAC/F,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAS,EAAE;CAC3C,MAAM,WAAW,iBAAiB,QAAQ,SAAS,WAAW,SAAS,KAAA;CAgEvE,MAAM,MAAM,oCAAA,IAAC,OAAD;EAAK,WAAU;YA/DZ,+BAAA,cAAc;GAC3B,MAAM,SAAsB,CAAC;GAC7B,MAAM,UAAU;GAChB,IAAI,SAAS;GACb,IAAI,QAAQ;GACZ,KAAK,MAAM,SAAS,KAAK,SAAS,OAAO,GAAG;IAC1C,IAAI,EAAE,QAAA,KAAuB;IAC7B,MAAM,QAAQ,MAAM;IACpB,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,CAAC;IACrC,MAAM,QAAQ,MAAM;IACpB,MAAM,MAAM,MAAM,WAAW,IAAG,KAAK,MAAM,SAAS,GAAG;IACvD,MAAM,OAAO,MACT,QACA,MAAM,WAAW,IAAG,IAClB,WACA,sBAAsB,KAAK,KAAK,IAC9B,YACA,UAAU,KAAK,KAAK,IAClB,KAAA,IACA;IACV,MAAM,QAAQ,OAAO,IAAI,KAAK;IAC9B,MAAM,YAAY,YAAyB;KACzC,IAAI,CAAC,OAAO;KACZ,MAAM,OAAO,QAAQ,sBAAsB;KAC3C,UAAU;MACR;MACA,MAAM;MACN,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,OAAO,aAAa,GAAG,CAAC;MAC3D,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,OAAO,cAAc,EAAE,CAAC;KAC/D,CAAC;KACD,YAAY,EAAE;IAChB;IACA,OAAO,KACL,oCAAA,IAAC,QAAD;KAEE,cAAY;KACZ,UAAU,QAAQ,IAAI,KAAA;KACtB,cAAc,SAAS,UAAU,SAAS,MAAM,aAAa,IAAI,KAAA;KACjE,SAAS,SAAS,UAAU,SAAS,MAAM,aAAa,IAAI,KAAA;KAC5D,WACE,SACK,UAAU;MACT,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;OAC9C,MAAM,eAAe;OACrB,MAAM,gBAAgB;OACtB,MAAM,cACH,QAAQ,wBAAwB,CAAC,EAChC,cAAiC,2BAAyB,CAAC,EAC3D,MAAM;MACZ;KACF,IACA,KAAA;eAGL,MAAM,MAAM,MAAM,GAAG,EAAE,IAAI;IACxB,GArBC,KAqBD,CACR;IACA,IAAI,KAAK,OAAO,KAAK,GAAG;IACxB,SAAS,QAAQ,MAAM;GACzB;GACA,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC;GAC9B,OAAO;EACT,GAAG;GAAC;GAAM;GAAQ;EAAQ,CACmB;CAAY,CAAA;CACzD,IAAI,CAAC,QAAQ,CAAC,UAAU,OAAO;CAC/B,OACE,oCAAA,KAAC,OAAD;EACE,WAAU;EACV,oBAAoB,UAAU,KAAA,CAAS;EACvC,SAAS,UAAU;GACjB,IAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAqB,GAAG,UAAU,KAAA,CAAS;EACrF;EACA,YAAY,UAAU;GACpB,IAAI,MAAM,QAAQ,UAAU;IAC1B,MAAM,gBAAgB;IACtB,UAAU,KAAA,CAAS;GACrB;EACF;YAXF,CAaG,KACA,YACC,oCAAA,KAAC,OAAD;GACE,MAAK;GACL,cAAW;GACX,OAAO;IACL,UAAU;IACV,MAAM,SAAS;IACf,KAAK,SAAS;IACd,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,cAAc;GAChB;GACA,UAAU,UAAU,MAAM,gBAAgB;GAC1C,YAAY,UAAU;IACpB,MAAM,gBAAgB;IACtB,IAAI,MAAM,QAAQ,UAAU,UAAU,KAAA,CAAS;GACjD;aAnBF;IAqBE,oCAAA,IAAC,UAAD;KACE,MAAK;KACL,OAAM;KACN,cAAW;KACX,eAAe;MACb,IAAI;OACF,MAAM,QAAQ,SAAS,MAAM;OAC7B,SAAA,UAAU,UAAU,OAAO,UAAU,WAAW,QAAQ,8BAAA,iBAAiB,UAAU,SAAS,KAAK,CAAC;OAClG,YAAY,QAAQ;MACtB,QAAQ;OACN,YAAY,aAAa;MAC3B;KACF;eAEC,OAAO,oCAAA,IAAC,MAAD;MAAM,UAAS;MAAe,MAAM;KAAK,CAAA,IAAI;IAC/C,CAAA;IACP,YACC,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACE,oCAAA,IAAC,UAAD;KACE,MAAK;KACL,OAAM;KACN,cAAW;KACX,eAAe,SAAS;MAAE,MAAM,SAAS,MAAM;MAAM,OAAO,SAAS,MAAM;MAAO,UAAU;KAAK,CAAC;eACnG;IAEO,CAAA,GACR,oCAAA,IAAC,UAAD;KACE,MAAK;KACL,OAAM;KACN,cAAW;KACX,eAAe,SAAS;MAAE,MAAM,SAAS,MAAM;MAAM,OAAO,SAAS,MAAM;MAAO,UAAU;KAAM,CAAC;eACpG;IAEO,CAAA,CACR,EAAA,CAAA;IAEH,YAAY,oCAAA,IAAC,QAAD;KAAM,MAAK;eAAU;IAAe,CAAA;GAC9C;IAEJ;;AAET"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
let node_net = require("node:net");
|
|
2
|
+
//#region src/renderer/power-log-message-tokens.ts
|
|
3
|
+
var identifier = /[\p{L}\p{N}_]/u;
|
|
4
|
+
var candidate = /(?<![\p{L}\p{N}_.])(?:https?:\/\/[^\s<>"']+|(?:trace_id|traceId|span_id|spanId|traceparent|ip|client_ip|remote_addr|clientIp|remoteAddr|http_status|status_code|statusCode|http\.status_code|http\.response\.status_code)["']?\s*[:=]\s*["']?[^\s,"'<>]+|HTTP\/\d(?:\.\d)?\s+\d+|\[[\da-fA-F:.]+\]:\d+|\d{1,3}(?:\.\d{1,3}){3}:\d{1,5}|[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}|(?:GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS|CONNECT|TRACE)|\d+(?:\.\d+)?(?:ns|us|µs|μs|ms|s))/gu;
|
|
5
|
+
function validAddress(value) {
|
|
6
|
+
const socket = /^(?:\[([^\]]+)\]|(\d+(?:\.\d+){3})):(\d+)$/.exec(value);
|
|
7
|
+
return socket ? (0, node_net.isIP)(socket[1] ?? socket[2]) === (socket[1] ? 6 : 4) && Number(socket[3]) <= 65535 : (0, node_net.isIP)(value) !== 0;
|
|
8
|
+
}
|
|
9
|
+
function messageTokens(text) {
|
|
10
|
+
const tokens = [];
|
|
11
|
+
const limit = Math.min(text.length, 65536);
|
|
12
|
+
const input = text.slice(0, limit);
|
|
13
|
+
for (const match of input.matchAll(candidate)) {
|
|
14
|
+
let value = match[0];
|
|
15
|
+
let start = match.index;
|
|
16
|
+
const end = start + value.length;
|
|
17
|
+
if (identifier.test(text[start - 1] ?? "") || identifier.test(text[end] ?? "")) continue;
|
|
18
|
+
let kind;
|
|
19
|
+
if (value.startsWith("http://") || value.startsWith("https://")) {
|
|
20
|
+
if (value.length <= 4096 && !/[.,;!?)]$/.test(value)) try {
|
|
21
|
+
if (new URL(value).hostname) kind = "url";
|
|
22
|
+
} catch {}
|
|
23
|
+
} else {
|
|
24
|
+
const label = /^(.*?)['"]?\s*[:=]\s*['"]?(.*)$/.exec(value);
|
|
25
|
+
if (label && !value.startsWith("[") && !/^\d/.test(value)) {
|
|
26
|
+
const name = label[1].replace(/["']$/, "");
|
|
27
|
+
value = label[2];
|
|
28
|
+
start = end - value.length;
|
|
29
|
+
if (/^(trace_id|traceId|span_id|spanId)$/.test(name)) {
|
|
30
|
+
const size = name.startsWith("span") ? 16 : 32;
|
|
31
|
+
if (new RegExp(`^[a-fA-F0-9]{${size}}$`).test(value) && /[1-9a-f]/i.test(value)) kind = "trace-id";
|
|
32
|
+
} else if (name === "traceparent") {
|
|
33
|
+
const trace = /^00-([\da-f]{32})-([\da-f]{16})-[\da-f]{2}$/.exec(value);
|
|
34
|
+
if (trace && /[1-9a-f]/.test(trace[1]) && /[1-9a-f]/.test(trace[2])) kind = "trace-id";
|
|
35
|
+
} else if (/^(ip|client_ip|remote_addr|clientIp|remoteAddr)$/.test(name)) {
|
|
36
|
+
if (validAddress(value)) kind = "address";
|
|
37
|
+
} else if (/^[1-5]\d{2}$/.test(value)) kind = "http-status";
|
|
38
|
+
} else if (value.startsWith("HTTP/")) {
|
|
39
|
+
value = /\d+$/.exec(value)[0];
|
|
40
|
+
start = end - value.length;
|
|
41
|
+
if (/^[1-5]\d{2}$/.test(value)) kind = "http-status";
|
|
42
|
+
} else if (validAddress(value)) kind = "address";
|
|
43
|
+
else if (/^[\da-fA-F]{8}-/.test(value)) kind = "uuid";
|
|
44
|
+
else if (/^[A-Z]+$/.test(value)) kind = "http-method";
|
|
45
|
+
else if (/^\d+(?:\.\d+)?(?:ns|us|µs|μs|ms|s)$/.test(value) && Number.parseFloat(value) > 0 && !/[.\-+]/.test(text[start - 1] ?? "")) kind = "duration";
|
|
46
|
+
}
|
|
47
|
+
if (kind) tokens.push({
|
|
48
|
+
start,
|
|
49
|
+
end,
|
|
50
|
+
kind,
|
|
51
|
+
...kind === "http-status" ? { statusClass: value[0] } : {}
|
|
52
|
+
});
|
|
53
|
+
if (tokens.length === 80) break;
|
|
54
|
+
}
|
|
55
|
+
return tokens;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
exports.messageTokens = messageTokens;
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=power-log-message-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-log-message-tokens.js","names":[],"sources":["../../src/renderer/power-log-message-tokens.ts"],"sourcesContent":["import { isIP } from \"node:net\";\n\nexport interface LogMessageToken {\n start: number;\n end: number;\n kind: \"http-method\" | \"uuid\" | \"url\" | \"trace-id\" | \"address\" | \"http-status\" | \"duration\";\n statusClass?: string;\n}\n\nconst identifier = /[\\p{L}\\p{N}_]/u;\nconst candidate =\n /(?<![\\p{L}\\p{N}_.])(?:https?:\\/\\/[^\\s<>\"']+|(?:trace_id|traceId|span_id|spanId|traceparent|ip|client_ip|remote_addr|clientIp|remoteAddr|http_status|status_code|statusCode|http\\.status_code|http\\.response\\.status_code)[\"']?\\s*[:=]\\s*[\"']?[^\\s,\"'<>]+|HTTP\\/\\d(?:\\.\\d)?\\s+\\d+|\\[[\\da-fA-F:.]+\\]:\\d+|\\d{1,3}(?:\\.\\d{1,3}){3}:\\d{1,5}|[\\da-fA-F]{8}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{4}-[\\da-fA-F]{12}|(?:GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS|CONNECT|TRACE)|\\d+(?:\\.\\d+)?(?:ns|us|µs|μs|ms|s))/gu;\n\nfunction validAddress(value: string): boolean {\n const socket = /^(?:\\[([^\\]]+)\\]|(\\d+(?:\\.\\d+){3})):(\\d+)$/.exec(value);\n return socket\n ? isIP(socket[1] ?? socket[2]) === (socket[1] ? 6 : 4) && Number(socket[3]) <= 65535\n : isIP(value) !== 0;\n}\n\nexport function messageTokens(text: string): LogMessageToken[] {\n const tokens: LogMessageToken[] = [];\n // cap scanning as well as output nodes for oversized records\n const limit = Math.min(text.length, 65536);\n const input = text.slice(0, limit);\n for (const match of input.matchAll(candidate)) {\n let value = match[0];\n let start = match.index!;\n const end = start + value.length;\n if (identifier.test(text[start - 1] ?? \"\") || identifier.test(text[end] ?? \"\")) continue;\n let kind: LogMessageToken[\"kind\"] | undefined;\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n // URLs remain opaque even when validation fails\n if (value.length <= 4096 && !/[.,;!?)]$/.test(value)) {\n try {\n const url = new URL(value);\n if (url.hostname) kind = \"url\";\n } catch {\n /* invalid URLs stay plain */\n }\n }\n } else {\n const label = /^(.*?)['\"]?\\s*[:=]\\s*['\"]?(.*)$/.exec(value);\n if (label && !value.startsWith(\"[\") && !/^\\d/.test(value)) {\n const name = label[1].replace(/[\"']$/, \"\");\n value = label[2];\n start = end - value.length;\n if (/^(trace_id|traceId|span_id|spanId)$/.test(name)) {\n const size = name.startsWith(\"span\") ? 16 : 32;\n if (new RegExp(`^[a-fA-F0-9]{${size}}$`).test(value) && /[1-9a-f]/i.test(value)) kind = \"trace-id\";\n } else if (name === \"traceparent\") {\n // version [00] follows W3C Trace Context's lowercase and nonzero ID rules\n const trace = /^00-([\\da-f]{32})-([\\da-f]{16})-[\\da-f]{2}$/.exec(value);\n if (trace && /[1-9a-f]/.test(trace[1]) && /[1-9a-f]/.test(trace[2])) kind = \"trace-id\";\n } else if (/^(ip|client_ip|remote_addr|clientIp|remoteAddr)$/.test(name)) {\n if (validAddress(value)) kind = \"address\";\n } else if (/^[1-5]\\d{2}$/.test(value)) kind = \"http-status\";\n } else if (value.startsWith(\"HTTP/\")) {\n value = /\\d+$/.exec(value)![0];\n start = end - value.length;\n if (/^[1-5]\\d{2}$/.test(value)) kind = \"http-status\";\n } else if (validAddress(value)) kind = \"address\";\n else if (/^[\\da-fA-F]{8}-/.test(value)) kind = \"uuid\";\n else if (/^[A-Z]+$/.test(value)) kind = \"http-method\";\n else if (\n /^\\d+(?:\\.\\d+)?(?:ns|us|µs|μs|ms|s)$/.test(value) &&\n Number.parseFloat(value) > 0 &&\n !/[.\\-+]/.test(text[start - 1] ?? \"\")\n )\n kind = \"duration\";\n }\n if (kind) tokens.push({ start, end, kind, ...(kind === \"http-status\" ? { statusClass: value[0] } : {}) });\n if (tokens.length === 80) break;\n }\n return tokens;\n}\n"],"mappings":";;AASA,IAAM,aAAa;AACnB,IAAM,YACJ;AAEF,SAAS,aAAa,OAAwB;CAC5C,MAAM,SAAS,6CAA6C,KAAK,KAAK;CACtE,OAAO,UAAA,GAAA,SAAA,KAAA,CACE,OAAO,MAAM,OAAO,EAAE,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,OAAO,EAAE,KAAK,SAAA,GAAA,SAAA,KAAA,CACxE,KAAK,MAAM;AACtB;AAEA,SAAgB,cAAc,MAAiC;CAC7D,MAAM,SAA4B,CAAC;CAEnC,MAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK;CACzC,MAAM,QAAQ,KAAK,MAAM,GAAG,KAAK;CACjC,KAAK,MAAM,SAAS,MAAM,SAAS,SAAS,GAAG;EAC7C,IAAI,QAAQ,MAAM;EAClB,IAAI,QAAQ,MAAM;EAClB,MAAM,MAAM,QAAQ,MAAM;EAC1B,IAAI,WAAW,KAAK,KAAK,QAAQ,MAAM,EAAE,KAAK,WAAW,KAAK,KAAK,QAAQ,EAAE,GAAG;EAChF,IAAI;EACJ,IAAI,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU;OAExD,MAAM,UAAU,QAAQ,CAAC,YAAY,KAAK,KAAK,GACjD,IAAI;IAEF,IAAI,IADY,IAAI,KAChB,CAAA,CAAI,UAAU,OAAO;GAC3B,QAAQ,CAER;SAEG;GACL,MAAM,QAAQ,kCAAkC,KAAK,KAAK;GAC1D,IAAI,SAAS,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,GAAG;IACzD,MAAM,OAAO,MAAM,EAAE,CAAC,QAAQ,SAAS,EAAE;IACzC,QAAQ,MAAM;IACd,QAAQ,MAAM,MAAM;IACpB,IAAI,sCAAsC,KAAK,IAAI,GAAG;KACpD,MAAM,OAAO,KAAK,WAAW,MAAM,IAAI,KAAK;KAC5C,IAAI,IAAI,OAAO,gBAAgB,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK,GAAG,OAAO;IAC1F,OAAO,IAAI,SAAS,eAAe;KAEjC,MAAM,QAAQ,8CAA8C,KAAK,KAAK;KACtE,IAAI,SAAS,WAAW,KAAK,MAAM,EAAE,KAAK,WAAW,KAAK,MAAM,EAAE,GAAG,OAAO;IAC9E,OAAO,IAAI,mDAAmD,KAAK,IAAI;SACjE,aAAa,KAAK,GAAG,OAAO;IAAA,OAC3B,IAAI,eAAe,KAAK,KAAK,GAAG,OAAO;GAChD,OAAO,IAAI,MAAM,WAAW,OAAO,GAAG;IACpC,QAAQ,OAAO,KAAK,KAAK,CAAC,CAAE;IAC5B,QAAQ,MAAM,MAAM;IACpB,IAAI,eAAe,KAAK,KAAK,GAAG,OAAO;GACzC,OAAO,IAAI,aAAa,KAAK,GAAG,OAAO;QAClC,IAAI,kBAAkB,KAAK,KAAK,GAAG,OAAO;QAC1C,IAAI,WAAW,KAAK,KAAK,GAAG,OAAO;QACnC,IACH,sCAAsC,KAAK,KAAK,KAChD,OAAO,WAAW,KAAK,IAAI,KAC3B,CAAC,SAAS,KAAK,KAAK,QAAQ,MAAM,EAAE,GAEpC,OAAO;EACX;EACA,IAAI,MAAM,OAAO,KAAK;GAAE;GAAO;GAAK;GAAM,GAAI,SAAS,gBAAgB,EAAE,aAAa,MAAM,GAAG,IAAI,CAAC;EAAG,CAAC;EACxG,IAAI,OAAO,WAAW,IAAI;CAC5B;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
const require_power_log_message_tokens = require("./power-log-message-tokens.js");
|
|
4
|
+
//#region src/renderer/power-log-message.tsx
|
|
5
|
+
var LogMessage = require__global_external_react.memo(function LogMessage({ text }) {
|
|
6
|
+
const tokens = [];
|
|
7
|
+
let cursor = 0;
|
|
8
|
+
for (const token of require_power_log_message_tokens.messageTokens(text)) {
|
|
9
|
+
tokens.push(text.slice(cursor, token.start));
|
|
10
|
+
tokens.push(/* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
11
|
+
"data-log-token": token.kind,
|
|
12
|
+
"data-status-class": token.statusClass,
|
|
13
|
+
children: text.slice(token.start, token.end)
|
|
14
|
+
}, token.start));
|
|
15
|
+
cursor = token.end;
|
|
16
|
+
}
|
|
17
|
+
tokens.push(text.slice(cursor));
|
|
18
|
+
return /* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
19
|
+
className: "power-log-message",
|
|
20
|
+
children: tokens
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.LogMessage = LogMessage;
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=power-log-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-log-message.js","names":[],"sources":["../../src/renderer/power-log-message.tsx"],"sourcesContent":["import { memo, type ReactNode } from \"react\";\nimport { messageTokens } from \"./power-log-message-tokens\";\n\nexport const LogMessage = memo(function LogMessage({ text }: { text: string }) {\n const tokens: ReactNode[] = [];\n let cursor = 0;\n for (const token of messageTokens(text)) {\n tokens.push(text.slice(cursor, token.start));\n tokens.push(\n <span key={token.start} data-log-token={token.kind} data-status-class={token.statusClass}>\n {text.slice(token.start, token.end)}\n </span>,\n );\n cursor = token.end;\n }\n tokens.push(text.slice(cursor));\n return <span className=\"power-log-message\">{tokens}</span>;\n});\n"],"mappings":";;;;AAGA,IAAa,aAAa,+BAAA,KAAK,SAAS,WAAW,EAAE,QAA0B;CAC7E,MAAM,SAAsB,CAAC;CAC7B,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,iCAAA,cAAc,IAAI,GAAG;EACvC,OAAO,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK,CAAC;EAC3C,OAAO,KACL,oCAAA,IAAC,QAAD;GAAwB,kBAAgB,MAAM;GAAM,qBAAmB,MAAM;aAC1E,KAAK,MAAM,MAAM,OAAO,MAAM,GAAG;EAC9B,GAFK,MAAM,KAEX,CACR;EACA,SAAS,MAAM;CACjB;CACA,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC;CAC9B,OAAO,oCAAA,IAAC,QAAD;EAAM,WAAU;YAAqB;CAAa,CAAA;AAC3D,CAAC"}
|
|
@@ -39,8 +39,8 @@ function sqlRowDetails(columns, row) {
|
|
|
39
39
|
podUid: stringCell("podUid"),
|
|
40
40
|
container: stringCell("container"),
|
|
41
41
|
level: levels.has(level) ? level : "unknown",
|
|
42
|
-
message: fieldsJson === null ?
|
|
43
|
-
fieldsJson,
|
|
42
|
+
message: fieldsJson === null ? "" : stringCell("message"),
|
|
43
|
+
fieldsJson: fieldsJson ?? JSON.stringify(Object.fromEntries(columns.map((column, index) => [column, row[index] ?? null]))),
|
|
44
44
|
previous: previous === true || previous === 1
|
|
45
45
|
},
|
|
46
46
|
...jsonColumn === void 0 ? {} : { jsonColumn }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"power-logs-sql-row.js","names":[],"sources":["../../src/renderer/power-logs-sql-row.ts"],"sourcesContent":["import type { LogCell, LogLevel, LogRecord } from \"../common/power-logs\";\n\nconst levels = new Set<LogLevel>([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"]);\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 = stringCell(\"level\");\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: levels.has(level as LogLevel) ? (level as LogLevel) : \"unknown\",\n message
|
|
1
|
+
{"version":3,"file":"power-logs-sql-row.js","names":[],"sources":["../../src/renderer/power-logs-sql-row.ts"],"sourcesContent":["import type { LogCell, LogLevel, LogRecord } from \"../common/power-logs\";\n\nconst levels = new Set<LogLevel>([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"unknown\"]);\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 = stringCell(\"level\");\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: levels.has(level as LogLevel) ? (level as LogLevel) : \"unknown\",\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":";AAEA,IAAM,yBAAS,IAAI,IAAc;CAAC;CAAS;CAAS;CAAQ;CAAQ;CAAS;CAAS;AAAS,CAAC;AAEhG,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,QAAQ,WAAW,OAAO;CAChC,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,OAAO,OAAO,IAAI,KAAiB,IAAK,QAAqB;GAC7D,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"}
|
|
@@ -44,9 +44,14 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
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
46
|
.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; }
|
|
47
|
-
.power-logs[data-compact=true] .power-log-row { padding-inline:
|
|
48
|
-
.power-logs[data-compact=true] td
|
|
47
|
+
.power-logs[data-compact=true] .power-log-row { padding-inline:6px!important; gap:5px!important; font-size:11px!important; line-height:16px; }
|
|
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
|
+
.power-log-row > span:last-child { white-space:pre; height:16px; line-height:16px; }
|
|
51
|
+
.power-log-message { color:var(--textColorPrimary); }
|
|
52
|
+
.power-log-message [data-log-token=http-method] { color:var(--primary); }
|
|
53
|
+
.power-log-message [data-log-token=uuid] { color:#9cdcfe; }
|
|
54
|
+
.theme-light .power-log-message [data-log-token=uuid] { color:#005a9e; }
|
|
50
55
|
.power-log-row .power-log-level { font-size:10px; font-weight:600; text-transform:uppercase; }
|
|
51
56
|
.power-log-row[data-level=warn] { border-left-color:var(--colorWarning,#d9a441)!important; }
|
|
52
57
|
.power-log-row[data-level=error],.power-log-row[data-level=fatal] { border-left-color:var(--colorError,#d26860)!important; }
|
|
@@ -54,8 +59,9 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
54
59
|
.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; }
|
|
55
60
|
.power-logs-detail header { justify-content:flex-end; }
|
|
56
61
|
.power-logs-detail header > strong { margin-right:auto; }
|
|
57
|
-
.power-logs
|
|
58
|
-
.power-logs .power-logs-detail-close:
|
|
62
|
+
.power-logs-structured-heading { display:flex; align-items:center; gap:6px; }
|
|
63
|
+
.power-logs .power-logs-detail-copy, .power-logs .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }
|
|
64
|
+
.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); }
|
|
59
65
|
.power-log-json { --json-key:#9cdcfe; --json-string:#ce9178; --json-number:#b5cea8; --json-literal:#c586c0; }
|
|
60
66
|
.theme-light .power-log-json { --json-key:#005a9e; --json-string:#9e2b1a; --json-number:#17642d; --json-literal:#7a288c; }
|
|
61
67
|
.power-log-json [data-token=key] { color:var(--json-key); }
|
|
@@ -63,12 +69,18 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
63
69
|
.power-log-json [data-token=number] { color:var(--json-number); }
|
|
64
70
|
.power-log-json [data-token=literal] { color:var(--json-literal); }
|
|
65
71
|
.power-logs pre { white-space:pre-wrap; overflow-wrap:anywhere; font-size:12px; line-height:1.6; }
|
|
66
|
-
.power-logs textarea { 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); }
|
|
72
|
+
.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); }
|
|
67
73
|
.power-logs-results { flex:1; min-height:0; overflow:auto; border:1px solid var(--borderColor); border-radius:6px; }
|
|
68
74
|
.power-logs table { border-collapse:collapse; table-layout:fixed; font-size:12px; width:100%; min-width:0; }
|
|
69
75
|
|
|
70
76
|
.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; }
|
|
71
77
|
.power-logs .power-logs-cell { display:block; overflow:hidden; text-overflow:ellipsis; max-height:4.8em; }
|
|
78
|
+
.power-logs .power-logs-json-cell { position:relative; display:flex; align-items:center; gap:4px; min-width:0; height:20px; max-height:20px; }
|
|
79
|
+
.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; }
|
|
80
|
+
.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; }
|
|
81
|
+
.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); }
|
|
82
|
+
.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; }
|
|
83
|
+
|
|
72
84
|
.power-logs tbody tr { cursor:pointer; }
|
|
73
85
|
.power-logs tbody tr:hover, .power-logs tbody tr:focus-visible { background:color-mix(in srgb,var(--primary) 10%,var(--contentColor)); outline:none; }
|
|
74
86
|
.power-logs td[data-column=message] { font-family:var(--font-monospace,monospace); font-size:12px; white-space:pre-wrap; overflow-wrap:anywhere; }
|
|
@@ -102,13 +114,31 @@ body:has(.power-logs[data-testid="power-logs-page"]) .power-ai-launcher { displa
|
|
|
102
114
|
.power-logs-pagination button { width:28px; padding:3px; }
|
|
103
115
|
.power-logs-footer { display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }
|
|
104
116
|
.power-logs-caption { flex:1; min-width:0; font-size:11px!important; }
|
|
105
|
-
.power-logs .power-logs-collection-note { display:flex; align-items:center; gap:5px; min-width:0; max-width:55%; padding:1px 6px; font-size:
|
|
117
|
+
.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; }
|
|
106
118
|
.power-logs-collection-note > :first-child { color:var(--colorWarning,#d9a441); flex-shrink:0; }
|
|
107
119
|
.power-logs-collection-note > :last-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
108
120
|
.power-logs-status { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
109
121
|
.power-logs .power-logs-error { white-space:normal; overflow:visible; overflow-wrap:anywhere; }
|
|
110
122
|
.power-logs-snapshot-notes { max-height:100px; overflow:auto; }
|
|
111
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:80px 42px minmax(0,1fr); } .power-log-row .power-log-origin { display:none; } .power-logs header .power-logs-actions { gap:4px; } }
|
|
124
|
+
.Select__option--is-selected .power-logs-snapshot-option > button { color:#fff; background:#0002; border:1px solid #fff7; }
|
|
125
|
+
.Select__option--is-selected .power-logs-snapshot-option > button:not(:disabled):hover { color:#a61b1b; background:#fff; border-color:#fff; }
|
|
126
|
+
.power-logs-field-filters { display:flex; align-items:center; flex-wrap:wrap; gap:4px; }
|
|
127
|
+
.power-logs .power-logs-field-filters button { max-width:360px; min-height:24px; padding:2px 6px; font-size:11px; }
|
|
128
|
+
.power-logs-field-filters button > span:first-child { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
129
|
+
.power-logs-field-filters button > :last-child { flex-shrink:0; }
|
|
130
|
+
.power-logs .power-logs-json-cell .power-log-json-fields { flex:1; min-width:0; overflow:hidden; }
|
|
131
|
+
.power-logs .power-logs-json-cell .power-log-json { white-space:pre; }
|
|
132
|
+
.power-log-message [data-log-token=url], .power-log-message [data-log-token=trace-id], .power-log-message [data-log-token=address] { color:#9cdcfe; }
|
|
133
|
+
.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; }
|
|
134
|
+
.power-log-message [data-log-token=duration], .power-log-message [data-status-class="2"] { color:#b5cea8; }
|
|
135
|
+
.theme-light .power-log-message [data-log-token=duration], .theme-light .power-log-message [data-status-class="2"] { color:#17642d; }
|
|
136
|
+
.power-log-message [data-status-class="1"], .power-log-message [data-status-class="3"] { color:#9cdcfe; }
|
|
137
|
+
.theme-light .power-log-message [data-status-class="1"], .theme-light .power-log-message [data-status-class="3"] { color:#005a9e; }
|
|
138
|
+
.power-log-message [data-status-class="4"] { color:#e3b56b; }
|
|
139
|
+
.theme-light .power-log-message [data-status-class="4"] { color:#8a4b00; }
|
|
140
|
+
.power-log-message [data-status-class="5"] { color:#f19b8d; }
|
|
141
|
+
.theme-light .power-log-message [data-status-class="5"] { color:#9e2b1a; }
|
|
112
142
|
`;
|
|
113
143
|
//#endregion
|
|
114
144
|
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:8px!important; gap:6px!important; }\n.power-logs[data-compact=true] td,.power-logs[data-compact=true] th { padding:3px 8px; }\n.power-log-row > span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\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 .power-logs-detail-close { flex-shrink:0; width:28px; padding:0; border-color:transparent; background:transparent; }\n.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 { 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 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:10px; }\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`;\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: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"}
|