@64mb/freelens-power 1.6.1 → 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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/out/main/common/power-logs.js.map +1 -1
  3. package/out/main/common/resource-search-kind-priority.js +23 -0
  4. package/out/main/common/resource-search-kind-priority.js.map +1 -0
  5. package/out/main/common/store/logs-preferences-store.js +5 -0
  6. package/out/main/common/store/logs-preferences-store.js.map +1 -1
  7. package/out/main/dashboard-views.js +26 -0
  8. package/out/main/dashboard-views.js.map +1 -1
  9. package/out/main/power-logs-database.js +5 -0
  10. package/out/main/power-logs-database.js.map +1 -1
  11. package/out/main/power-logs-ipc.js +8 -0
  12. package/out/main/power-logs-ipc.js.map +1 -1
  13. package/out/main/power-logs-query.js +1 -0
  14. package/out/main/power-logs-query.js.map +1 -1
  15. package/out/main/resource-search-database.js +7 -2
  16. package/out/main/resource-search-database.js.map +1 -1
  17. package/out/main/resource-search-worker.js +6 -2
  18. package/out/main/resource-search-worker.js.map +1 -1
  19. package/out/renderer/_virtual/_global-external_react.js +2 -1
  20. package/out/renderer/ai-diagnostic-handoff.js +1 -0
  21. package/out/renderer/ai-diagnostic-handoff.js.map +1 -1
  22. package/out/renderer/ai-extras.js +7 -2
  23. package/out/renderer/ai-extras.js.map +1 -1
  24. package/out/renderer/ai.js +1 -1
  25. package/out/renderer/ai.js.map +1 -1
  26. package/out/renderer/appearance.js +2 -0
  27. package/out/renderer/appearance.js.map +1 -1
  28. package/out/renderer/dashboard.js +35 -8
  29. package/out/renderer/dashboard.js.map +1 -1
  30. package/out/renderer/index.js +2 -1
  31. package/out/renderer/index.js.map +1 -1
  32. package/out/renderer/power-log-json-cell.js +82 -0
  33. package/out/renderer/power-log-json-cell.js.map +1 -0
  34. package/out/renderer/power-log-json-fields.js +144 -0
  35. package/out/renderer/power-log-json-fields.js.map +1 -0
  36. package/out/renderer/power-log-json.js +223 -20
  37. package/out/renderer/power-log-json.js.map +1 -1
  38. package/out/renderer/power-log-message-tokens.js +60 -0
  39. package/out/renderer/power-log-message-tokens.js.map +1 -0
  40. package/out/renderer/power-log-message.js +26 -0
  41. package/out/renderer/power-log-message.js.map +1 -0
  42. package/out/renderer/power-log-sql-editor.js +91 -0
  43. package/out/renderer/power-log-sql-editor.js.map +1 -0
  44. package/out/renderer/power-logs-client.js +4 -0
  45. package/out/renderer/power-logs-client.js.map +1 -1
  46. package/out/renderer/power-logs-sql-drafts.js +76 -0
  47. package/out/renderer/power-logs-sql-drafts.js.map +1 -0
  48. package/out/renderer/power-logs-sql-row.js +5 -13
  49. package/out/renderer/power-logs-sql-row.js.map +1 -1
  50. package/out/renderer/power-logs.css.js +39 -6
  51. package/out/renderer/power-logs.css.js.map +1 -1
  52. package/out/renderer/power-logs.js +372 -135
  53. package/out/renderer/power-logs.js.map +1 -1
  54. package/out/renderer/preferences/logs-preferences.js +159 -38
  55. package/out/renderer/preferences/logs-preferences.js.map +1 -1
  56. package/out/renderer/preferences/preferences.js +2 -9
  57. package/out/renderer/preferences/preferences.js.map +1 -1
  58. package/out/renderer/preferences/section-navigation.js +44 -0
  59. package/out/renderer/preferences/section-navigation.js.map +1 -0
  60. package/out/renderer/resource-search-model.js +2 -1
  61. package/out/renderer/resource-search-model.js.map +1 -1
  62. package/out/renderer/resource-search-sync.js +1 -1
  63. package/out/renderer/resource-search-sync.js.map +1 -1
  64. package/out/renderer/resource-search.js +84 -81
  65. package/out/renderer/resource-search.js.map +1 -1
  66. package/out/renderer/src/common/power-log-field-filters.js +92 -0
  67. package/out/renderer/src/common/power-log-field-filters.js.map +1 -0
  68. package/out/renderer/src/common/power-log-json-filter-sql.js +106 -0
  69. package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -0
  70. package/out/renderer/src/common/power-log-json-preset.js +34 -0
  71. package/out/renderer/src/common/power-log-json-preset.js.map +1 -0
  72. package/out/renderer/src/common/power-log-level.js +171 -0
  73. package/out/renderer/src/common/power-log-level.js.map +1 -0
  74. package/out/renderer/src/common/power-log-parser.js +7 -29
  75. package/out/renderer/src/common/power-log-parser.js.map +1 -1
  76. package/out/renderer/src/common/power-log-sql-level.js +25 -0
  77. package/out/renderer/src/common/power-log-sql-level.js.map +1 -0
  78. package/out/renderer/src/common/power-logs-ai.js +4 -0
  79. package/out/renderer/src/common/power-logs-ai.js.map +1 -1
  80. package/out/renderer/src/common/power-logs.js.map +1 -1
  81. package/out/renderer/src/common/resource-search-kind-priority.js +28 -0
  82. package/out/renderer/src/common/resource-search-kind-priority.js.map +1 -0
  83. package/out/renderer/src/common/store/logs-preferences-store.js +5 -0
  84. package/out/renderer/src/common/store/logs-preferences-store.js.map +1 -1
  85. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ const require_power_log_field_filters = require("./power-log-field-filters.js");
2
+ //#region src/common/power-log-json-filter-sql.ts
3
+ var maxSqlLength = 65536;
4
+ var normalizedType = (type) => `CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END`;
5
+ var quoteIdentifier = (value) => `"${value.replace(/"/g, "\"\"")}"`;
6
+ var literal = (value) => value.split("\0").map((part) => `'${part.replace(/'/g, "''")}'`).join(" || char(0) || ");
7
+ var tree = (name) => `SELECT path, ${normalizedType("type")}, CASE
8
+ WHEN type IN ('object', 'array') THEN NULL
9
+ WHEN type IN ('integer', 'real') THEN CAST(value AS REAL)
10
+ ELSE value END FROM ${name}`;
11
+ var descendants = (name, root) => `${name}(path, value, type) AS (
12
+ ${root}
13
+ UNION ALL
14
+ SELECT json_insert(parent.path, '$[#]', j.key), j.value, j.type
15
+ FROM ${name} AS parent, json_each(CASE WHEN parent.type IN ('object', 'array') THEN parent.value ELSE NULL END) AS j
16
+ )`;
17
+ function predicate(filter) {
18
+ if (!filter || typeof filter.column !== "string" || !filter.column || filter.column.includes("\0") || !Array.isArray(filter.path) || filter.path.length > 128 || filter.operator !== "eq" && filter.operator !== "neq" || !require_power_log_field_filters.jsonValuesEqual(filter.value, filter.value)) throw new Error("Invalid JSON field filter");
19
+ const steps = [];
20
+ for (const [depth, part] of filter.path.entries()) {
21
+ if (typeof part !== "string" && !(typeof part === "number" && Number.isSafeInteger(part) && part >= 0)) throw new Error("Invalid JSON field path");
22
+ steps.push(`(walk.depth = ${depth} AND typeof(j.key) = '${typeof part === "string" ? "text" : "integer"}' AND j.key = ${typeof part === "string" ? literal(part) : part})`);
23
+ }
24
+ let encoded;
25
+ try {
26
+ encoded = JSON.stringify(filter.value);
27
+ } catch {
28
+ throw new Error("JSON field filter value cannot be encoded");
29
+ }
30
+ const source = `"__power_rows".${quoteIdentifier(filter.column)}`;
31
+ const safe = `CASE WHEN json_valid(${source}) THEN ${source} ELSE NULL END`;
32
+ const recursion = steps.length ? `
33
+ UNION ALL
34
+ SELECT walk.depth + 1, j.value, j.type
35
+ FROM walk, json_each(CASE WHEN walk.type IN ('object', 'array') THEN walk.value ELSE NULL END) AS j
36
+ WHERE ${steps.join(" OR ")}` : "";
37
+ const leftTree = tree("actual_tree");
38
+ const rightTree = tree("expected_tree");
39
+ const equal = `EXISTS (
40
+ SELECT 1 FROM walk, wanted WHERE walk.depth = ${filter.path.length}
41
+ AND CASE
42
+ WHEN walk.type IS NULL OR ${normalizedType("walk.type")} != ${normalizedType("wanted.type")} THEN 0
43
+ WHEN walk.type IN ('object', 'array') THEN
44
+ NOT EXISTS (${leftTree} EXCEPT ${rightTree}) AND NOT EXISTS (${rightTree} EXCEPT ${leftTree})
45
+ WHEN walk.type IN ('integer', 'real') THEN CAST(walk.value AS REAL) IS CAST(wanted.value AS REAL)
46
+ ELSE walk.value IS wanted.value
47
+ END
48
+ )`;
49
+ return `(WITH RECURSIVE walk(depth, value, type) AS (
50
+ SELECT 0, json_extract(${safe}, '$'), json_type(${safe})${recursion}
51
+ ), wanted(value, type) AS (
52
+ SELECT json_extract(${literal(encoded)}, '$'), json_type(${literal(encoded)})
53
+ ), ${descendants("actual_tree", `SELECT json_array(), value, type FROM walk WHERE depth = ${filter.path.length}`)},
54
+ ${descendants("expected_tree", "SELECT json_array(), value, type FROM wanted")}
55
+ SELECT ${filter.operator === "neq" ? "NOT " : ""}${equal})`;
56
+ }
57
+ function withoutFinalSemicolon(sql) {
58
+ let lastCode = -1;
59
+ for (let index = 0; index < sql.length;) {
60
+ const character = sql[index];
61
+ if (/\s/.test(character)) {
62
+ index++;
63
+ continue;
64
+ }
65
+ if (sql.startsWith("--", index)) {
66
+ const newline = sql.indexOf("\n", index + 2);
67
+ index = newline < 0 ? sql.length : newline + 1;
68
+ continue;
69
+ }
70
+ if (sql.startsWith("/*", index)) {
71
+ const end = sql.indexOf("*/", index + 2);
72
+ index = end < 0 ? sql.length : end + 2;
73
+ continue;
74
+ }
75
+ lastCode = index;
76
+ if (character === "'" || character === "\"" || character === "`" || character === "[") {
77
+ const closing = character === "[" ? "]" : character;
78
+ for (index++; index < sql.length; index++) {
79
+ if (sql[index] !== closing) continue;
80
+ if (closing !== "]" && sql[index + 1] === closing) {
81
+ index++;
82
+ continue;
83
+ }
84
+ index++;
85
+ break;
86
+ }
87
+ } else index++;
88
+ }
89
+ return sql[lastCode] === ";" ? sql.slice(0, lastCode) + sql.slice(lastCode + 1) : sql;
90
+ }
91
+ function buildJsonFilterSql(baseSql, filters) {
92
+ if (typeof baseSql !== "string" || !Array.isArray(filters)) throw new Error("Invalid JSON filter query");
93
+ if (!filters.length) return baseSql;
94
+ const base = withoutFinalSemicolon(baseSql.trim());
95
+ if (!base) throw new Error("JSON filter query must not be empty");
96
+ let sql = `SELECT * FROM (${base}\n) AS "__power_rows" WHERE `;
97
+ for (const [index, filter] of filters.entries()) {
98
+ sql += `${index ? " AND " : ""}${predicate(filter)}`;
99
+ if (sql.length > maxSqlLength) throw new Error("JSON filter query exceeds 65536 characters");
100
+ }
101
+ return sql;
102
+ }
103
+ //#endregion
104
+ exports.buildJsonFilterSql = buildJsonFilterSql;
105
+
106
+ //# sourceMappingURL=power-log-json-filter-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-json-filter-sql.js","names":[],"sources":["../../../../src/common/power-log-json-filter-sql.ts"],"sourcesContent":["import { type JsonFieldFilter, jsonValuesEqual } from \"./power-log-field-filters\";\n\nexport interface SqlJsonFieldFilter extends JsonFieldFilter {\n column: string;\n}\n\nconst maxSqlLength = 65536;\nconst normalizedType = (type: string) => `CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END`;\nconst quoteIdentifier = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\nconst literal = (value: string): string =>\n value\n .split(\"\\0\")\n .map((part) => `'${part.replace(/'/g, \"''\")}'`)\n .join(\" || char(0) || \");\nconst tree = (name: string) => `SELECT path, ${normalizedType(\"type\")}, CASE\n WHEN type IN ('object', 'array') THEN NULL\n WHEN type IN ('integer', 'real') THEN CAST(value AS REAL)\n ELSE value END FROM ${name}`;\nconst descendants = (name: string, root: string) => `${name}(path, value, type) AS (\n ${root}\n UNION ALL\n SELECT json_insert(parent.path, '$[#]', j.key), j.value, j.type\n FROM ${name} AS parent, json_each(CASE WHEN parent.type IN ('object', 'array') THEN parent.value ELSE NULL END) AS j\n )`;\n\nfunction predicate(filter: SqlJsonFieldFilter): string {\n if (\n !filter ||\n typeof filter.column !== \"string\" ||\n !filter.column ||\n filter.column.includes(\"\\0\") ||\n !Array.isArray(filter.path) ||\n filter.path.length > 128 ||\n (filter.operator !== \"eq\" && filter.operator !== \"neq\") ||\n !jsonValuesEqual(filter.value, filter.value)\n )\n throw new Error(\"Invalid JSON field filter\");\n const steps: string[] = [];\n for (const [depth, part] of filter.path.entries()) {\n if (typeof part !== \"string\" && !(typeof part === \"number\" && Number.isSafeInteger(part) && part >= 0)) {\n throw new Error(\"Invalid JSON field path\");\n }\n steps.push(\n `(walk.depth = ${depth} AND typeof(j.key) = '${typeof part === \"string\" ? \"text\" : \"integer\"}' AND j.key = ${typeof part === \"string\" ? literal(part) : part})`,\n );\n }\n let encoded: string;\n try {\n encoded = JSON.stringify(filter.value);\n } catch {\n throw new Error(\"JSON field filter value cannot be encoded\");\n }\n const source = `\"__power_rows\".${quoteIdentifier(filter.column)}`;\n const safe = `CASE WHEN json_valid(${source}) THEN ${source} ELSE NULL END`;\n const recursion = steps.length\n ? `\n UNION ALL\n SELECT walk.depth + 1, j.value, j.type\n FROM walk, json_each(CASE WHEN walk.type IN ('object', 'array') THEN walk.value ELSE NULL END) AS j\n WHERE ${steps.join(\" OR \")}`\n : \"\";\n const leftTree = tree(\"actual_tree\");\n const rightTree = tree(\"expected_tree\");\n const equal = `EXISTS (\n SELECT 1 FROM walk, wanted WHERE walk.depth = ${filter.path.length}\n AND CASE\n WHEN walk.type IS NULL OR ${normalizedType(\"walk.type\")} != ${normalizedType(\"wanted.type\")} THEN 0\n WHEN walk.type IN ('object', 'array') THEN\n NOT EXISTS (${leftTree} EXCEPT ${rightTree}) AND NOT EXISTS (${rightTree} EXCEPT ${leftTree})\n WHEN walk.type IN ('integer', 'real') THEN CAST(walk.value AS REAL) IS CAST(wanted.value AS REAL)\n ELSE walk.value IS wanted.value\n END\n )`;\n return `(WITH RECURSIVE walk(depth, value, type) AS (\n SELECT 0, json_extract(${safe}, '$'), json_type(${safe})${recursion}\n ), wanted(value, type) AS (\n SELECT json_extract(${literal(encoded)}, '$'), json_type(${literal(encoded)})\n ), ${descendants(\"actual_tree\", `SELECT json_array(), value, type FROM walk WHERE depth = ${filter.path.length}`)},\n ${descendants(\"expected_tree\", \"SELECT json_array(), value, type FROM wanted\")}\n SELECT ${filter.operator === \"neq\" ? \"NOT \" : \"\"}${equal})`;\n}\n\nfunction withoutFinalSemicolon(sql: string): string {\n let lastCode = -1;\n for (let index = 0; index < sql.length; ) {\n const character = sql[index];\n if (/\\s/.test(character)) {\n index++;\n continue;\n }\n if (sql.startsWith(\"--\", index)) {\n const newline = sql.indexOf(\"\\n\", index + 2);\n index = newline < 0 ? sql.length : newline + 1;\n continue;\n }\n if (sql.startsWith(\"/*\", index)) {\n const end = sql.indexOf(\"*/\", index + 2);\n index = end < 0 ? sql.length : end + 2;\n continue;\n }\n lastCode = index;\n if (character === \"'\" || character === '\"' || character === \"`\" || character === \"[\") {\n const closing = character === \"[\" ? \"]\" : character;\n for (index++; index < sql.length; index++) {\n if (sql[index] !== closing) continue;\n if (closing !== \"]\" && sql[index + 1] === closing) {\n index++;\n continue;\n }\n index++;\n break;\n }\n } else index++;\n }\n return sql[lastCode] === \";\" ? sql.slice(0, lastCode) + sql.slice(lastCode + 1) : sql;\n}\n\nexport function buildJsonFilterSql(baseSql: string, filters: SqlJsonFieldFilter[]): string {\n if (typeof baseSql !== \"string\" || !Array.isArray(filters)) throw new Error(\"Invalid JSON filter query\");\n if (!filters.length) return baseSql;\n const base = withoutFinalSemicolon(baseSql.trim());\n if (!base) throw new Error(\"JSON filter query must not be empty\");\n let sql = `SELECT * FROM (${base}\\n) AS \"__power_rows\" WHERE `;\n for (const [index, filter] of filters.entries()) {\n sql += `${index ? \" AND \" : \"\"}${predicate(filter)}`;\n if (sql.length > maxSqlLength) throw new Error(\"JSON filter query exceeds 65536 characters\");\n }\n return sql;\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ //#region src/common/power-log-json-preset.ts
2
+ var JSON_KEY_DISCOVERY_SQL = `SELECT DISTINCT field.key
3
+ FROM (SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL ORDER BY timestamp DESC NULLS LAST LIMIT 100) AS recent
4
+ JOIN json_each(recent.fieldsJson) AS field
5
+ WHERE typeof(field.key) = 'text'
6
+ LIMIT 65`;
7
+ function buildJsonProjectionSql(keys, options = {}) {
8
+ if (options.recent) return "SELECT message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200";
9
+ const fallbackSql = "SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100";
10
+ if (!keys.length || keys.length > 64) return fallbackSql;
11
+ const usable = (key) => typeof key === "string" && key.length <= 128 && !key.includes("\0");
12
+ const key = [
13
+ "message",
14
+ "msg",
15
+ "text",
16
+ "Message",
17
+ "RenderedMessage",
18
+ "@m",
19
+ "@mt",
20
+ "body",
21
+ "Body"
22
+ ].find((preferred) => keys.includes(preferred)) ?? keys.find(usable);
23
+ if (key === void 0 || !usable(key)) return fallbackSql;
24
+ const literal = `'${key.replace(/'/g, "''")}'`;
25
+ const identifier = `"${key.replace(/"/g, "\"\"")}"`;
26
+ return `SELECT\n ${/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) ? `json_extract(logs.fieldsJson, '$.${key}')` : `(SELECT value FROM json_each(logs.fieldsJson) WHERE key = ${literal} LIMIT 1)`} AS ${identifier}\nFROM logs\nWHERE fieldsJson IS NOT NULL
27
+ ORDER BY logs.timestamp DESC NULLS LAST
28
+ LIMIT 100`;
29
+ }
30
+ //#endregion
31
+ exports.JSON_KEY_DISCOVERY_SQL = JSON_KEY_DISCOVERY_SQL;
32
+ exports.buildJsonProjectionSql = buildJsonProjectionSql;
33
+
34
+ //# sourceMappingURL=power-log-json-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-json-preset.js","names":[],"sources":["../../../../src/common/power-log-json-preset.ts"],"sourcesContent":["export const JSON_KEY_DISCOVERY_SQL = `SELECT DISTINCT field.key\nFROM (SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL ORDER BY timestamp DESC NULLS LAST LIMIT 100) AS recent\nJOIN json_each(recent.fieldsJson) AS field\nWHERE typeof(field.key) = 'text'\nLIMIT 65`;\n\nexport function buildJsonProjectionSql(keys: string[], options: { recent?: boolean } = {}): string {\n if (options.recent)\n return \"SELECT message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\";\n const fallbackSql = \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\";\n if (!keys.length || keys.length > 64) return fallbackSql;\n const usable = (key: string) => typeof key === \"string\" && key.length <= 128 && !key.includes(\"\\0\");\n const key =\n [\"message\", \"msg\", \"text\", \"Message\", \"RenderedMessage\", \"@m\", \"@mt\", \"body\", \"Body\"].find((preferred) =>\n keys.includes(preferred),\n ) ?? keys.find(usable);\n if (key === undefined || !usable(key)) return fallbackSql;\n const literal = `'${key.replace(/'/g, \"''\")}'`;\n const identifier = `\"${key.replace(/\"/g, '\"\"')}\"`;\n const value = /^[A-Za-z_][A-Za-z0-9_]*$/.test(key)\n ? `json_extract(logs.fieldsJson, '$.${key}')`\n : `(SELECT value FROM json_each(logs.fieldsJson) WHERE key = ${literal} LIMIT 1)`;\n const tail = \"WHERE fieldsJson IS NOT NULL\\nORDER BY logs.timestamp DESC NULLS LAST\\nLIMIT 100\";\n return `SELECT\\n ${value} AS ${identifier}\\nFROM logs\\n${tail}`;\n}\n"],"mappings":";AAAA,IAAa,yBAAyB;;;;;AAMtC,SAAgB,uBAAuB,MAAgB,UAAgC,CAAC,GAAW;CACjG,IAAI,QAAQ,QACV,OAAO;CACT,MAAM,cAAc;CACpB,IAAI,CAAC,KAAK,UAAU,KAAK,SAAS,IAAI,OAAO;CAC7C,MAAM,UAAU,QAAgB,OAAO,QAAQ,YAAY,IAAI,UAAU,OAAO,CAAC,IAAI,SAAS,IAAI;CAClG,MAAM,MACJ;EAAC;EAAW;EAAO;EAAQ;EAAW;EAAmB;EAAM;EAAO;EAAQ;CAAM,CAAC,CAAC,MAAM,cAC1F,KAAK,SAAS,SAAS,CACzB,KAAK,KAAK,KAAK,MAAM;CACvB,IAAI,QAAQ,KAAA,KAAa,CAAC,OAAO,GAAG,GAAG,OAAO;CAC9C,MAAM,UAAU,IAAI,IAAI,QAAQ,MAAM,IAAI,EAAE;CAC5C,MAAM,aAAa,IAAI,IAAI,QAAQ,MAAM,MAAI,EAAE;CAK/C,OAAO,aAJO,2BAA2B,KAAK,GAAG,IAC7C,oCAAoC,IAAI,MACxC,6DAA6D,QAAQ,WAE/C,MAAM,WAAW;;;AAC7C"}
@@ -0,0 +1,171 @@
1
+ //#region src/common/power-log-level.ts
2
+ var names = {
3
+ trace: "trace",
4
+ verbose: "trace",
5
+ vrb: "trace",
6
+ trc: "trace",
7
+ trce: "trace",
8
+ fine: "debug",
9
+ finer: "trace",
10
+ finest: "trace",
11
+ debug: "debug",
12
+ dbg: "debug",
13
+ dbug: "debug",
14
+ info: "info",
15
+ information: "info",
16
+ informational: "info",
17
+ notice: "info",
18
+ inf: "info",
19
+ success: "info",
20
+ warn: "warn",
21
+ warning: "warn",
22
+ wrn: "warn",
23
+ error: "error",
24
+ err: "error",
25
+ severe: "error",
26
+ fail: "error",
27
+ dpanic: "error",
28
+ fatal: "fatal",
29
+ critical: "fatal",
30
+ crit: "fatal",
31
+ ftl: "fatal",
32
+ panic: "fatal",
33
+ alert: "fatal",
34
+ emerg: "fatal",
35
+ emergency: "fatal"
36
+ };
37
+ var pino = {
38
+ 10: "trace",
39
+ 20: "debug",
40
+ 30: "info",
41
+ 40: "warn",
42
+ 50: "error",
43
+ 60: "fatal"
44
+ };
45
+ var python = {
46
+ 10: "debug",
47
+ 20: "info",
48
+ 30: "warn",
49
+ 40: "error",
50
+ 50: "fatal"
51
+ };
52
+ var oldKeys = [
53
+ "level",
54
+ "severity",
55
+ "loglevel",
56
+ "log_level",
57
+ "levelname"
58
+ ];
59
+ var textKeys = [
60
+ "level_name",
61
+ "Level",
62
+ "LogLevel",
63
+ "severityText",
64
+ "severity_text",
65
+ "SeverityText",
66
+ "log.level",
67
+ "@l"
68
+ ];
69
+ var numberKeys = [
70
+ "severityNumber",
71
+ "severity_number",
72
+ "SeverityNumber"
73
+ ];
74
+ function object(value) {
75
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
76
+ }
77
+ function named(value) {
78
+ if (typeof value !== "string") return "unknown";
79
+ const key = value.trim().toLowerCase();
80
+ return Object.hasOwn(names, key) ? names[key] : "unknown";
81
+ }
82
+ function firstString(...values) {
83
+ return values.find((value) => typeof value === "string");
84
+ }
85
+ function ownValue(record, keys) {
86
+ for (const key of keys) if (record[key] !== void 0 && record[key] !== null) return record[key];
87
+ }
88
+ function structuredLogFields(record) {
89
+ const nested = object(record.record);
90
+ const loguruLevel = object(nested?.level);
91
+ if (typeof record.text === "string" && nested && loguruLevel) return {
92
+ level: typeof loguruLevel.name === "string" ? named(loguruLevel.name) : typeof loguruLevel.no === "number" ? {
93
+ 5: "trace",
94
+ ...python,
95
+ 25: "info"
96
+ }[loguruLevel.no] ?? "unknown" : "unknown",
97
+ message: firstString(nested.message, record.text)
98
+ };
99
+ const primary = ownValue(record, oldKeys);
100
+ const explicit = ownValue(record, textKeys) ?? oldKeys.slice(1).map((key) => record[key]).find((value) => typeof value === "string") ?? object(record.log)?.level;
101
+ let level = "unknown";
102
+ if (typeof primary === "string") level = named(primary);
103
+ else if (explicit !== void 0) level = named(explicit);
104
+ else if (numberKeys.some((key) => record[key] !== void 0)) {
105
+ const value = ownValue(record, numberKeys);
106
+ if (typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 24) level = [
107
+ "trace",
108
+ "debug",
109
+ "info",
110
+ "warn",
111
+ "error",
112
+ "fatal"
113
+ ][Math.floor((value - 1) / 4)];
114
+ } else if (record.levelno !== void 0) {
115
+ if (typeof record.levelno === "number") level = python[record.levelno] ?? "unknown";
116
+ } else if (typeof record.level === "number") level = pino[record.level] ?? "unknown";
117
+ else if (typeof record["@t"] === "string" && (typeof record["@m"] === "string" || typeof record["@mt"] === "string")) level = "info";
118
+ const body = record.body ?? record.Body;
119
+ return {
120
+ level,
121
+ message: firstString(record.message, record.msg, record.text, record.Message, record.RenderedMessage, record["@m"], record["@mt"], object(record.fields)?.message, numberKeys.some((key) => record[key] !== void 0) || [
122
+ "severityText",
123
+ "severity_text",
124
+ "SeverityText"
125
+ ].some((key) => record[key] !== void 0) ? typeof body === "string" ? body : object(body)?.stringValue : void 0)
126
+ };
127
+ }
128
+ function plainLogLevel(message) {
129
+ const klog = /^([IWEF])\d{4}\s\d{2}:\d{2}:\d{2}\.\d+\s+\d+\s+[^\s]+:\d+\]/.exec(message);
130
+ if (klog) return {
131
+ I: "info",
132
+ W: "warn",
133
+ E: "error",
134
+ F: "fatal"
135
+ }[klog[1]];
136
+ const syslog = /^<(\d{1,3})>(?=\d{1,2}\s|[A-Z][a-z]{2} \d)/.exec(message);
137
+ if (syslog && Number(syslog[1]) <= 191) return [
138
+ "fatal",
139
+ "fatal",
140
+ "fatal",
141
+ "error",
142
+ "warn",
143
+ "info",
144
+ "info",
145
+ "debug"
146
+ ][Number(syslog[1]) % 8];
147
+ const field = /\s*([A-Za-z_][A-Za-z0-9_.]*)=("(?:\\.|[^"\\])*"|[^"\s]+)(?=\s|$)/y;
148
+ let cursor = 0;
149
+ for (let count = 0; count < 256; count++) {
150
+ field.lastIndex = cursor;
151
+ const match = field.exec(message);
152
+ if (!match) break;
153
+ cursor = field.lastIndex;
154
+ if ([...oldKeys, ...textKeys].includes(match[1])) try {
155
+ return named(match[2].startsWith("\"") ? JSON.parse(match[2]) : match[2]);
156
+ } catch {
157
+ return "unknown";
158
+ }
159
+ }
160
+ const header = /^\s*(\[)?(?:(\d{4}[-/]\d{2}[-/]\d{2}[ T]\d{2}:\d{2}:\d{2}(?:[.,]\d{1,9})?(?:Z|[+-]\d{2}:?\d{2})?|\d{2}:\d{2}:\d{2}(?:[.,]\d{1,9})?)\s*[| ]\s*)?([A-Za-z]+)(?=$|[\s\]:|,-])/.exec(message);
161
+ if (!header) return "unknown";
162
+ const word = header[3];
163
+ const delimiter = message.slice(header[0].length).trimStart()[0];
164
+ if (!header[1] && !header[2] && word !== word.toUpperCase() && delimiter !== ":") return "unknown";
165
+ return named(word);
166
+ }
167
+ //#endregion
168
+ exports.plainLogLevel = plainLogLevel;
169
+ exports.structuredLogFields = structuredLogFields;
170
+
171
+ //# sourceMappingURL=power-log-level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-level.js","names":[],"sources":["../../../../src/common/power-log-level.ts"],"sourcesContent":["import type { LogLevel } from \"./power-logs\";\n\nconst names: Record<string, LogLevel> = {\n trace: \"trace\",\n verbose: \"trace\",\n vrb: \"trace\",\n trc: \"trace\",\n trce: \"trace\",\n fine: \"debug\",\n finer: \"trace\",\n finest: \"trace\",\n debug: \"debug\",\n dbg: \"debug\",\n dbug: \"debug\",\n info: \"info\",\n information: \"info\",\n informational: \"info\",\n notice: \"info\",\n inf: \"info\",\n success: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n wrn: \"warn\",\n error: \"error\",\n err: \"error\",\n severe: \"error\",\n fail: \"error\",\n dpanic: \"error\",\n fatal: \"fatal\",\n critical: \"fatal\",\n crit: \"fatal\",\n ftl: \"fatal\",\n panic: \"fatal\",\n alert: \"fatal\",\n emerg: \"fatal\",\n emergency: \"fatal\",\n};\nconst pino: Record<number, LogLevel> = { 10: \"trace\", 20: \"debug\", 30: \"info\", 40: \"warn\", 50: \"error\", 60: \"fatal\" };\nconst python: Record<number, LogLevel> = { 10: \"debug\", 20: \"info\", 30: \"warn\", 40: \"error\", 50: \"fatal\" };\nconst oldKeys = [\"level\", \"severity\", \"loglevel\", \"log_level\", \"levelname\"];\nconst textKeys = [\n \"level_name\",\n \"Level\",\n \"LogLevel\",\n \"severityText\",\n \"severity_text\",\n \"SeverityText\",\n \"log.level\",\n \"@l\",\n];\nconst numberKeys = [\"severityNumber\", \"severity_number\", \"SeverityNumber\"];\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\nfunction named(value: unknown): LogLevel {\n if (typeof value !== \"string\") return \"unknown\";\n const key = value.trim().toLowerCase();\n return Object.hasOwn(names, key) ? names[key] : \"unknown\";\n}\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find((value): value is string => typeof value === \"string\");\n}\nfunction ownValue(record: Record<string, unknown>, keys: string[]): unknown {\n for (const key of keys) if (record[key] !== undefined && record[key] !== null) return record[key];\n return undefined;\n}\n\nexport function structuredLogFields(record: Record<string, unknown>): { level: LogLevel; message?: string } {\n const nested = object(record.record);\n const loguruLevel = object(nested?.level);\n if (typeof record.text === \"string\" && nested && loguruLevel) {\n const level =\n typeof loguruLevel.name === \"string\"\n ? named(loguruLevel.name)\n : typeof loguruLevel.no === \"number\"\n ? (({ 5: \"trace\", ...python, 25: \"info\" } as Record<number, LogLevel>)[loguruLevel.no] ?? \"unknown\")\n : \"unknown\";\n return { level, message: firstString(nested.message, record.text) };\n }\n const primary = ownValue(record, oldKeys);\n const explicit =\n ownValue(record, textKeys) ??\n oldKeys\n .slice(1)\n .map((key) => record[key])\n .find((value) => typeof value === \"string\") ??\n object(record.log)?.level;\n let level: LogLevel = \"unknown\";\n if (typeof primary === \"string\") level = named(primary);\n else if (explicit !== undefined) level = named(explicit);\n else if (numberKeys.some((key) => record[key] !== undefined)) {\n const value = ownValue(record, numberKeys);\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 1 && value <= 24)\n level = ([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"] as LogLevel[])[Math.floor((value - 1) / 4)];\n } else if (record.levelno !== undefined) {\n if (typeof record.levelno === \"number\") level = python[record.levelno] ?? \"unknown\";\n } else if (typeof record.level === \"number\") level = pino[record.level] ?? \"unknown\";\n else if (typeof record[\"@t\"] === \"string\" && (typeof record[\"@m\"] === \"string\" || typeof record[\"@mt\"] === \"string\"))\n level = \"info\";\n const body = record.body ?? record.Body;\n return {\n level,\n message: firstString(\n record.message,\n record.msg,\n record.text,\n record.Message,\n record.RenderedMessage,\n record[\"@m\"],\n record[\"@mt\"],\n object(record.fields)?.message,\n numberKeys.some((key) => record[key] !== undefined) ||\n [\"severityText\", \"severity_text\", \"SeverityText\"].some((key) => record[key] !== undefined)\n ? typeof body === \"string\"\n ? body\n : object(body)?.stringValue\n : undefined,\n ),\n };\n}\n\nexport function plainLogLevel(message: string): LogLevel {\n const klog = /^([IWEF])\\d{4}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d+\\s+\\d+\\s+[^\\s]+:\\d+\\]/.exec(message);\n if (klog) return ({ I: \"info\", W: \"warn\", E: \"error\", F: \"fatal\" } as Record<string, LogLevel>)[klog[1]];\n const syslog = /^<(\\d{1,3})>(?=\\d{1,2}\\s|[A-Z][a-z]{2} \\d)/.exec(message);\n if (syslog && Number(syslog[1]) <= 191)\n return ([\"fatal\", \"fatal\", \"fatal\", \"error\", \"warn\", \"info\", \"info\", \"debug\"] as LogLevel[])[Number(syslog[1]) % 8];\n const field = /\\s*([A-Za-z_][A-Za-z0-9_.]*)=(\"(?:\\\\.|[^\"\\\\])*\"|[^\"\\s]+)(?=\\s|$)/y;\n let cursor = 0;\n for (let count = 0; count < 256; count++) {\n field.lastIndex = cursor;\n const match = field.exec(message);\n if (!match) break;\n cursor = field.lastIndex;\n if ([...oldKeys, ...textKeys].includes(match[1])) {\n try {\n return named(match[2].startsWith('\"') ? JSON.parse(match[2]) : match[2]);\n } catch {\n return \"unknown\";\n }\n }\n }\n const header =\n /^\\s*(\\[)?(?:(\\d{4}[-/]\\d{2}[-/]\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:[.,]\\d{1,9})?(?:Z|[+-]\\d{2}:?\\d{2})?|\\d{2}:\\d{2}:\\d{2}(?:[.,]\\d{1,9})?)\\s*[| ]\\s*)?([A-Za-z]+)(?=$|[\\s\\]:|,-])/.exec(\n message,\n );\n if (!header) return \"unknown\";\n const word = header[3];\n const delimiter = message.slice(header[0].length).trimStart()[0];\n if (!header[1] && !header[2] && word !== word.toUpperCase() && delimiter !== \":\") return \"unknown\";\n return named(word);\n}\n"],"mappings":"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"}
@@ -1,26 +1,7 @@
1
1
  const require_power_logs = require("./power-logs.js");
2
+ const require_power_log_level = require("./power-log-level.js");
2
3
  //#region src/common/power-log-parser.ts
3
4
  var ansi = /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\))/g;
4
- var levels = {
5
- trace: "trace",
6
- debug: "debug",
7
- info: "info",
8
- information: "info",
9
- warn: "warn",
10
- warning: "warn",
11
- error: "error",
12
- fatal: "fatal",
13
- critical: "fatal",
14
- panic: "fatal"
15
- };
16
- var pinoLevels = /* @__PURE__ */ new Map([
17
- [10, "trace"],
18
- [20, "debug"],
19
- [30, "info"],
20
- [40, "warn"],
21
- [50, "error"],
22
- [60, "fatal"]
23
- ]);
24
5
  function parseLogLine(line, source) {
25
6
  let message = line.replace(ansi, "").replace(/\r$/, "").replace(/\x00/g, "");
26
7
  let timestamp = null;
@@ -32,23 +13,20 @@ function parseLogLine(line, source) {
32
13
  }
33
14
  let fieldsJson = null;
34
15
  let level = "unknown";
16
+ let structured = false;
35
17
  try {
36
18
  const fields = JSON.parse(message);
37
19
  if (fields && typeof fields === "object" && !Array.isArray(fields)) {
38
20
  const object = fields;
39
- const rawLevel = object.level ?? object.severity ?? object.loglevel ?? object.log_level ?? object.levelname;
40
- if (typeof rawLevel === "string") level = levels[rawLevel.toLowerCase()] ?? "unknown";
41
- else if (typeof rawLevel === "number") level = pinoLevels.get(rawLevel) ?? "unknown";
42
- const rawMessage = object.message ?? object.msg ?? object.text;
43
- if (typeof rawMessage === "string") message = rawMessage.replace(ansi, "").replace(/\x00/g, "");
21
+ structured = true;
22
+ const extracted = require_power_log_level.structuredLogFields(object);
23
+ level = extracted.level;
24
+ if (extracted.message !== void 0) message = extracted.message.replace(ansi, "").replace(/\x00/g, "");
44
25
  const serialized = JSON.stringify(fields);
45
26
  if (Buffer.byteLength(serialized) <= require_power_logs.POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;
46
27
  }
47
28
  } catch {}
48
- if (level === "unknown") {
49
- const match = /(?:^|[\s\[])\b(trace|debug|info|warn(?:ing)?|error|fatal|critical|panic)\b[\s\]:-]?/i.exec(message);
50
- if (match) level = levels[match[1].toLowerCase()] ?? "unknown";
51
- }
29
+ if (!structured) level = require_power_log_level.plainLogLevel(message);
52
30
  const record = {
53
31
  timestamp,
54
32
  pod: source.pod,
@@ -1 +1 @@
1
- {"version":3,"file":"power-log-parser.js","names":[],"sources":["../../../../src/common/power-log-parser.ts"],"sourcesContent":["import { type LogLevel, type LogRecord, type LogSource, POWER_LOGS_LIMITS } from \"./power-logs\";\n\nconst ansi = /\\x1b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\x07]*(?:\\x07|\\x1b\\\\))/g;\nconst levels: Record<string, LogLevel> = {\n trace: \"trace\",\n debug: \"debug\",\n info: \"info\",\n information: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n error: \"error\",\n fatal: \"fatal\",\n critical: \"fatal\",\n panic: \"fatal\",\n};\nconst pinoLevels = new Map<number, LogLevel>([\n [10, \"trace\"],\n [20, \"debug\"],\n [30, \"info\"],\n [40, \"warn\"],\n [50, \"error\"],\n [60, \"fatal\"],\n]);\nexport function parseLogLine(line: string, source: LogSource): LogRecord {\n let message = line.replace(ansi, \"\").replace(/\\r$/, \"\").replace(/\\x00/g, \"\");\n let timestamp: number | null = null;\n const prefix = /^(\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d{1,9})?(?:Z|[+-]\\d\\d:\\d\\d))\\s/.exec(message);\n if (prefix) {\n const value = Date.parse(prefix[1]);\n if (Number.isFinite(value)) timestamp = value;\n message = message.slice(prefix[0].length);\n }\n let fieldsJson: string | null = null;\n let level: LogLevel = \"unknown\";\n try {\n const fields: unknown = JSON.parse(message);\n if (fields && typeof fields === \"object\" && !Array.isArray(fields)) {\n const object = fields as Record<string, unknown>;\n const rawLevel = object.level ?? object.severity ?? object.loglevel ?? object.log_level ?? object.levelname;\n if (typeof rawLevel === \"string\") level = levels[rawLevel.toLowerCase()] ?? \"unknown\";\n else if (typeof rawLevel === \"number\") level = pinoLevels.get(rawLevel) ?? \"unknown\";\n const rawMessage = object.message ?? object.msg ?? object.text;\n if (typeof rawMessage === \"string\") message = rawMessage.replace(ansi, \"\").replace(/\\x00/g, \"\");\n const serialized = JSON.stringify(fields);\n if (Buffer.byteLength(serialized) <= POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;\n }\n } catch {\n /* malformed structured lines remain plain text */\n }\n if (level === \"unknown\") {\n const match = /(?:^|[\\s\\[])\\b(trace|debug|info|warn(?:ing)?|error|fatal|critical|panic)\\b[\\s\\]:-]?/i.exec(message);\n if (match) level = levels[match[1].toLowerCase()] ?? \"unknown\";\n }\n const record: LogRecord = {\n timestamp,\n pod: source.pod,\n podUid: source.podUid,\n container: source.container,\n level,\n message,\n fieldsJson,\n previous: source.previous === true,\n };\n const serializedBytes = () => Buffer.byteLength(JSON.stringify(record));\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes && record.fieldsJson !== null) {\n record.fieldsJson = null;\n record.message += \" [structured fields omitted]\";\n }\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes) {\n const characters = Array.from(record.message);\n let low = 0;\n let high = characters.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n record.message = `${characters.slice(0, middle).join(\"\")} [truncated]`;\n if (serializedBytes() <= POWER_LOGS_LIMITS.recordBytes) low = middle;\n else high = middle - 1;\n }\n record.message = `${characters.slice(0, low).join(\"\")} [truncated]`;\n }\n return record;\n}\n\nexport class LogLineDecoder {\n private decoder = new TextDecoder();\n private pending = \"\";\n private dropping = false;\n truncated = false;\n push(chunk: Uint8Array | string, final = false): string[] {\n const text = typeof chunk === \"string\" ? chunk : this.decoder.decode(chunk, { stream: !final });\n const lines: string[] = [];\n for (const part of text.split(/(?<=\\n)/)) {\n const ended = part.endsWith(\"\\n\");\n if (!this.dropping) this.pending += part;\n if (Buffer.byteLength(this.pending) > POWER_LOGS_LIMITS.recordBytes) {\n this.pending = \"\";\n this.dropping = true;\n this.truncated = true;\n }\n if (ended) {\n if (!this.dropping) lines.push(this.pending.replace(/\\r?\\n$/, \"\"));\n this.pending = \"\";\n this.dropping = false;\n }\n }\n if (final && this.pending && !this.dropping) {\n lines.push(this.pending);\n this.pending = \"\";\n }\n return lines;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"power-log-parser.js","names":[],"sources":["../../../../src/common/power-log-parser.ts"],"sourcesContent":["import { plainLogLevel, structuredLogFields } from \"./power-log-level\";\nimport { type LogLevel, type LogRecord, type LogSource, POWER_LOGS_LIMITS } from \"./power-logs\";\n\nconst ansi = /\\x1b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\x07]*(?:\\x07|\\x1b\\\\))/g;\nexport function parseLogLine(line: string, source: LogSource): LogRecord {\n let message = line.replace(ansi, \"\").replace(/\\r$/, \"\").replace(/\\x00/g, \"\");\n let timestamp: number | null = null;\n const prefix = /^(\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d{1,9})?(?:Z|[+-]\\d\\d:\\d\\d))\\s/.exec(message);\n if (prefix) {\n const value = Date.parse(prefix[1]);\n if (Number.isFinite(value)) timestamp = value;\n message = message.slice(prefix[0].length);\n }\n let fieldsJson: string | null = null;\n let level: LogLevel = \"unknown\";\n let structured = false;\n try {\n const fields: unknown = JSON.parse(message);\n if (fields && typeof fields === \"object\" && !Array.isArray(fields)) {\n const object = fields as Record<string, unknown>;\n structured = true;\n const extracted = structuredLogFields(object);\n level = extracted.level;\n if (extracted.message !== undefined) message = extracted.message.replace(ansi, \"\").replace(/\\x00/g, \"\");\n const serialized = JSON.stringify(fields);\n if (Buffer.byteLength(serialized) <= POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;\n }\n } catch {\n /* malformed structured lines remain plain text */\n }\n if (!structured) level = plainLogLevel(message);\n const record: LogRecord = {\n timestamp,\n pod: source.pod,\n podUid: source.podUid,\n container: source.container,\n level,\n message,\n fieldsJson,\n previous: source.previous === true,\n };\n const serializedBytes = () => Buffer.byteLength(JSON.stringify(record));\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes && record.fieldsJson !== null) {\n record.fieldsJson = null;\n record.message += \" [structured fields omitted]\";\n }\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes) {\n const characters = Array.from(record.message);\n let low = 0;\n let high = characters.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n record.message = `${characters.slice(0, middle).join(\"\")} [truncated]`;\n if (serializedBytes() <= POWER_LOGS_LIMITS.recordBytes) low = middle;\n else high = middle - 1;\n }\n record.message = `${characters.slice(0, low).join(\"\")} [truncated]`;\n }\n return record;\n}\n\nexport class LogLineDecoder {\n private decoder = new TextDecoder();\n private pending = \"\";\n private dropping = false;\n truncated = false;\n push(chunk: Uint8Array | string, final = false): string[] {\n const text = typeof chunk === \"string\" ? chunk : this.decoder.decode(chunk, { stream: !final });\n const lines: string[] = [];\n for (const part of text.split(/(?<=\\n)/)) {\n const ended = part.endsWith(\"\\n\");\n if (!this.dropping) this.pending += part;\n if (Buffer.byteLength(this.pending) > POWER_LOGS_LIMITS.recordBytes) {\n this.pending = \"\";\n this.dropping = true;\n this.truncated = true;\n }\n if (ended) {\n if (!this.dropping) lines.push(this.pending.replace(/\\r?\\n$/, \"\"));\n this.pending = \"\";\n this.dropping = false;\n }\n }\n if (final && this.pending && !this.dropping) {\n lines.push(this.pending);\n this.pending = \"\";\n }\n return lines;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ const require_power_log_level = require("./power-log-level.js");
2
+ //#region src/common/power-log-sql-level.ts
3
+ var levelColumns = new Map([
4
+ "level",
5
+ "severity",
6
+ "loglevel",
7
+ "log_level",
8
+ "levelname",
9
+ "level_name",
10
+ "severityText",
11
+ "severity_text",
12
+ "severityNumber",
13
+ "severity_number",
14
+ "levelno",
15
+ "@l",
16
+ "log.level"
17
+ ].map((key) => [key.toLowerCase(), key]));
18
+ function sqlCellLevel(column, rawValue) {
19
+ const key = levelColumns.get(column.toLowerCase());
20
+ return key ? require_power_log_level.structuredLogFields({ [key]: rawValue }).level : "unknown";
21
+ }
22
+ //#endregion
23
+ exports.sqlCellLevel = sqlCellLevel;
24
+
25
+ //# sourceMappingURL=power-log-sql-level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-sql-level.js","names":[],"sources":["../../../../src/common/power-log-sql-level.ts"],"sourcesContent":["import { structuredLogFields } from \"./power-log-level\";\n\nimport type { LogCell, LogLevel } from \"./power-logs\";\n\nconst levelColumns = new Map(\n [\n \"level\",\n \"severity\",\n \"loglevel\",\n \"log_level\",\n \"levelname\",\n \"level_name\",\n \"severityText\",\n \"severity_text\",\n \"severityNumber\",\n \"severity_number\",\n \"levelno\",\n \"@l\",\n \"log.level\",\n ].map((key) => [key.toLowerCase(), key]),\n);\n\nexport function sqlCellLevel(column: string, rawValue: LogCell): LogLevel {\n const key = levelColumns.get(column.toLowerCase());\n return key ? structuredLogFields({ [key]: rawValue }).level : \"unknown\";\n}\n"],"mappings":";;AAIA,IAAM,eAAe,IAAI,IACvB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,YAAY,GAAG,GAAG,CAAC,CACzC;AAEA,SAAgB,aAAa,QAAgB,UAA6B;CACxE,MAAM,MAAM,aAAa,IAAI,OAAO,YAAY,CAAC;CACjD,OAAO,MAAM,wBAAA,oBAAoB,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,QAAQ;AAChE"}
@@ -44,6 +44,10 @@ function powerLogQueryEvidence(capture, sql, result) {
44
44
  state: capture.state,
45
45
  notes: capture.notes
46
46
  },
47
+ ...result.error ? {
48
+ state: "Query failed",
49
+ error: result.error
50
+ } : {},
47
51
  sql,
48
52
  rows,
49
53
  truncated: result.truncated || result.rows.length > 30
@@ -1 +1 @@
1
- {"version":3,"file":"power-logs-ai.js","names":[],"sources":["../../../../src/common/power-logs-ai.ts"],"sourcesContent":["import { redactAiTerminalText } from \"./ai-terminal-context\";\n\nimport type { LogCapture, LogQueryResult, LogRecord, LogTarget } from \"./power-logs\";\n\nconst sensitive = (key: string) =>\n /(?:password|passwd|token|secret|authorization|credential|apikey|privatekey|clientkeydata|clientcertificatedata)/i.test(\n key.replace(/[^a-z0-9]/gi, \"\"),\n );\n\nfunction project(value: unknown, depth = 0): unknown {\n if (depth > 8) return \"[nested content omitted]\";\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n if (parsed !== null && (typeof parsed === \"object\" || typeof parsed === \"string\"))\n return project(parsed, depth + 1);\n } catch {\n /* plain text uses the shared redactor */\n }\n return redactAiTerminalText(value);\n }\n if (Array.isArray(value)) return value.slice(0, 100).map((item) => project(item, depth + 1));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value)\n .slice(0, 100)\n .map(([key, item]) => [key, sensitive(key) ? \"[REDACTED]\" : project(item, depth + 1)]),\n );\n return value;\n}\n\nexport function powerLogLineEvidence(target: LogTarget | undefined, record: LogRecord): string {\n const { timestamp, pod, podUid, container, level, message, fieldsJson, previous } = record;\n return JSON.stringify(\n project({\n observedAt: new Date().toISOString(),\n target,\n line: { timestamp, pod, podUid, container, level, message, fieldsJson, previous },\n }),\n null,\n 2,\n ).slice(0, 6000);\n}\n\nexport function powerLogQueryEvidence(capture: LogCapture, sql: string, result: LogQueryResult): string {\n const rows = result.rows.slice(0, 30).map((row) =>\n row.map((value, index) => ({\n column: result.columns[index],\n value: sensitive(result.columns[index]) ? \"[REDACTED]\" : value,\n })),\n );\n return JSON.stringify(\n project({\n observedAt: new Date().toISOString(),\n capture: { target: capture.target, createdAt: capture.createdAt, state: capture.state, notes: capture.notes },\n sql,\n rows,\n truncated: result.truncated || result.rows.length > 30,\n }),\n null,\n 2,\n ).slice(0, 6000);\n}\n"],"mappings":";;AAIA,IAAM,aAAa,QACjB,mHAAmH,KACjH,IAAI,QAAQ,eAAe,EAAE,CAC/B;AAEF,SAAS,QAAQ,OAAgB,QAAQ,GAAY;CACnD,IAAI,QAAQ,GAAG,OAAO;CACtB,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,KAAK;GAC/B,IAAI,WAAW,SAAS,OAAO,WAAW,YAAY,OAAO,WAAW,WACtE,OAAO,QAAQ,QAAQ,QAAQ,CAAC;EACpC,QAAQ,CAER;EACA,OAAO,4BAAA,qBAAqB,KAAK;CACnC;CACA,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,SAAS,QAAQ,MAAM,QAAQ,CAAC,CAAC;CAC3F,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAClB,MAAM,GAAG,GAAG,CAAC,CACb,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU,GAAG,IAAI,eAAe,QAAQ,MAAM,QAAQ,CAAC,CAAC,CAAC,CACzF;CACF,OAAO;AACT;AAEA,SAAgB,qBAAqB,QAA+B,QAA2B;CAC7F,MAAM,EAAE,WAAW,KAAK,QAAQ,WAAW,OAAO,SAAS,YAAY,aAAa;CACpF,OAAO,KAAK,UACV,QAAQ;EACN,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACnC;EACA,MAAM;GAAE;GAAW;GAAK;GAAQ;GAAW;GAAO;GAAS;GAAY;EAAS;CAClF,CAAC,GACD,MACA,CACF,CAAC,CAAC,MAAM,GAAG,GAAI;AACjB;AAEA,SAAgB,sBAAsB,SAAqB,KAAa,QAAgC;CACtG,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,QACzC,IAAI,KAAK,OAAO,WAAW;EACzB,QAAQ,OAAO,QAAQ;EACvB,OAAO,UAAU,OAAO,QAAQ,MAAM,IAAI,eAAe;CAC3D,EAAE,CACJ;CACA,OAAO,KAAK,UACV,QAAQ;EACN,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACnC,SAAS;GAAE,QAAQ,QAAQ;GAAQ,WAAW,QAAQ;GAAW,OAAO,QAAQ;GAAO,OAAO,QAAQ;EAAM;EAC5G;EACA;EACA,WAAW,OAAO,aAAa,OAAO,KAAK,SAAS;CACtD,CAAC,GACD,MACA,CACF,CAAC,CAAC,MAAM,GAAG,GAAI;AACjB"}
1
+ {"version":3,"file":"power-logs-ai.js","names":[],"sources":["../../../../src/common/power-logs-ai.ts"],"sourcesContent":["import { redactAiTerminalText } from \"./ai-terminal-context\";\n\nimport type { LogCapture, LogQueryResult, LogRecord, LogTarget } from \"./power-logs\";\n\nconst sensitive = (key: string) =>\n /(?:password|passwd|token|secret|authorization|credential|apikey|privatekey|clientkeydata|clientcertificatedata)/i.test(\n key.replace(/[^a-z0-9]/gi, \"\"),\n );\n\nfunction project(value: unknown, depth = 0): unknown {\n if (depth > 8) return \"[nested content omitted]\";\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n if (parsed !== null && (typeof parsed === \"object\" || typeof parsed === \"string\"))\n return project(parsed, depth + 1);\n } catch {\n /* plain text uses the shared redactor */\n }\n return redactAiTerminalText(value);\n }\n if (Array.isArray(value)) return value.slice(0, 100).map((item) => project(item, depth + 1));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value)\n .slice(0, 100)\n .map(([key, item]) => [key, sensitive(key) ? \"[REDACTED]\" : project(item, depth + 1)]),\n );\n return value;\n}\n\nexport function powerLogLineEvidence(target: LogTarget | undefined, record: LogRecord): string {\n const { timestamp, pod, podUid, container, level, message, fieldsJson, previous } = record;\n return JSON.stringify(\n project({\n observedAt: new Date().toISOString(),\n target,\n line: { timestamp, pod, podUid, container, level, message, fieldsJson, previous },\n }),\n null,\n 2,\n ).slice(0, 6000);\n}\n\nexport function powerLogQueryEvidence(capture: LogCapture, sql: string, result: LogQueryResult): string {\n const rows = result.rows.slice(0, 30).map((row) =>\n row.map((value, index) => ({\n column: result.columns[index],\n value: sensitive(result.columns[index]) ? \"[REDACTED]\" : value,\n })),\n );\n return JSON.stringify(\n project({\n observedAt: new Date().toISOString(),\n capture: { target: capture.target, createdAt: capture.createdAt, state: capture.state, notes: capture.notes },\n ...(result.error ? { state: \"Query failed\", error: result.error } : {}),\n sql,\n rows,\n truncated: result.truncated || result.rows.length > 30,\n }),\n null,\n 2,\n ).slice(0, 6000);\n}\n"],"mappings":";;AAIA,IAAM,aAAa,QACjB,mHAAmH,KACjH,IAAI,QAAQ,eAAe,EAAE,CAC/B;AAEF,SAAS,QAAQ,OAAgB,QAAQ,GAAY;CACnD,IAAI,QAAQ,GAAG,OAAO;CACtB,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,KAAK;GAC/B,IAAI,WAAW,SAAS,OAAO,WAAW,YAAY,OAAO,WAAW,WACtE,OAAO,QAAQ,QAAQ,QAAQ,CAAC;EACpC,QAAQ,CAER;EACA,OAAO,4BAAA,qBAAqB,KAAK;CACnC;CACA,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,SAAS,QAAQ,MAAM,QAAQ,CAAC,CAAC;CAC3F,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAClB,MAAM,GAAG,GAAG,CAAC,CACb,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU,GAAG,IAAI,eAAe,QAAQ,MAAM,QAAQ,CAAC,CAAC,CAAC,CACzF;CACF,OAAO;AACT;AAEA,SAAgB,qBAAqB,QAA+B,QAA2B;CAC7F,MAAM,EAAE,WAAW,KAAK,QAAQ,WAAW,OAAO,SAAS,YAAY,aAAa;CACpF,OAAO,KAAK,UACV,QAAQ;EACN,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACnC;EACA,MAAM;GAAE;GAAW;GAAK;GAAQ;GAAW;GAAO;GAAS;GAAY;EAAS;CAClF,CAAC,GACD,MACA,CACF,CAAC,CAAC,MAAM,GAAG,GAAI;AACjB;AAEA,SAAgB,sBAAsB,SAAqB,KAAa,QAAgC;CACtG,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,QACzC,IAAI,KAAK,OAAO,WAAW;EACzB,QAAQ,OAAO,QAAQ;EACvB,OAAO,UAAU,OAAO,QAAQ,MAAM,IAAI,eAAe;CAC3D,EAAE,CACJ;CACA,OAAO,KAAK,UACV,QAAQ;EACN,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACnC,SAAS;GAAE,QAAQ,QAAQ;GAAQ,WAAW,QAAQ;GAAW,OAAO,QAAQ;GAAO,OAAO,QAAQ;EAAM;EAC5G,GAAI,OAAO,QAAQ;GAAE,OAAO;GAAgB,OAAO,OAAO;EAAM,IAAI,CAAC;EACrE;EACA;EACA,WAAW,OAAO,aAAa,OAAO,KAAK,SAAS;CACtD,CAAC,GACD,MACA,CACF,CAAC,CAAC,MAAM,GAAG,GAAI;AACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"power-logs.js","names":[],"sources":["../../../../src/common/power-logs.ts"],"sourcesContent":["export const POWER_LOGS_CHANNEL = \"freelens-power:logs\";\nexport const POWER_LOGS_DEFAULT_LIMITS = {\n liveRows: 10000,\n liveBytes: 16 * 1024 * 1024,\n batchRows: 1000,\n batchBytes: 2 * 1024 * 1024,\n recordBytes: 64 * 1024,\n captureBytes: 256 * 1024 * 1024,\n captureRows: 1000000,\n captures: 3,\n sources: 200,\n resultRows: 1000,\n resultBytes: 2 * 1024 * 1024,\n queryMs: 15000,\n ttlMs: 60 * 60 * 1000,\n historyLines: 1000,\n historyBytes: 1024 * 1024,\n captureSourceLines: 10000,\n captureSourceBytes: 8 * 1024 * 1024,\n requestsPerSecond: 2,\n bytesPerSecond: 1024 * 1024,\n historyConcurrency: 2,\n liveConcurrency: 4,\n} as const;\n\nexport type PowerLogsLimitKey = keyof typeof POWER_LOGS_DEFAULT_LIMITS;\nexport type PowerLogsLimits = { [Key in PowerLogsLimitKey]: number };\nexport const POWER_LOGS_LIMITS: PowerLogsLimits = { ...POWER_LOGS_DEFAULT_LIMITS };\n\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"unknown\";\nexport type LogWorkloadKind = \"Pod\" | \"Deployment\" | \"DaemonSet\" | \"StatefulSet\" | \"ReplicaSet\" | \"Job\" | \"CronJob\";\nexport interface LogTarget {\n kind: LogWorkloadKind;\n namespace: string;\n name: string;\n uid: string;\n}\nexport interface LogSource {\n namespace: string;\n pod: string;\n podUid: string;\n container: string;\n previous?: boolean;\n}\nexport interface LogRecord {\n timestamp: number | null;\n pod: string;\n podUid: string;\n container: string;\n level: LogLevel;\n message: string;\n fieldsJson: string | null;\n previous?: boolean;\n}\nexport interface LogCapture {\n id: string;\n target: LogTarget;\n createdAt: number;\n expiresAt: number;\n state: \"collecting\" | \"ready\" | \"partial\";\n rows: number;\n bytes: number;\n notes: string[];\n}\nexport type LogCell = string | number | boolean | null;\nexport interface LogQueryResult {\n error?: string;\n columns: string[];\n rows: LogCell[][];\n truncated: boolean;\n elapsedMs: number;\n}\nexport interface LogPartition {\n clusterId: string;\n contextId: string;\n}\nexport type LogRequest = LogPartition &\n (\n | { operation: \"permit\"; lane: \"start\" | \"bytes\"; bytes?: number }\n | { operation: \"stream-open\"; streamId: string; follow: boolean }\n | { operation: \"stream-close\" | \"stream-renew\"; streamId: string }\n | { operation: \"create\"; target: LogTarget }\n | { operation: \"append\"; captureId: string; records: LogRecord[] }\n | { operation: \"finish\"; captureId: string; partial: boolean; notes: string[] }\n | { operation: \"list\" }\n | { operation: \"delete\"; captureId: string }\n | { operation: \"query\"; captureId: string; queryId: string; sql: string }\n | { operation: \"cancel\"; queryId: string }\n | { operation: \"export\"; captureId: string }\n );\n"],"mappings":";AAAA,IAAa,qBAAqB;AAClC,IAAa,4BAA4B;CACvC,UAAU;CACV,WAAW,KAAK,OAAO;CACvB,WAAW;CACX,YAAY,IAAI,OAAO;CACvB,aAAa,KAAK;CAClB,cAAc,MAAM,OAAO;CAC3B,aAAa;CACb,UAAU;CACV,SAAS;CACT,YAAY;CACZ,aAAa,IAAI,OAAO;CACxB,SAAS;CACT,OAAO,OAAU;CACjB,cAAc;CACd,cAAc,OAAO;CACrB,oBAAoB;CACpB,oBAAoB,IAAI,OAAO;CAC/B,mBAAmB;CACnB,gBAAgB,OAAO;CACvB,oBAAoB;CACpB,iBAAiB;AACnB;AAIA,IAAa,oBAAqC,EAAE,GAAG,0BAA0B"}
1
+ {"version":3,"file":"power-logs.js","names":[],"sources":["../../../../src/common/power-logs.ts"],"sourcesContent":["export const POWER_LOGS_CHANNEL = \"freelens-power:logs\";\nexport const POWER_LOGS_DEFAULT_LIMITS = {\n liveRows: 10000,\n liveBytes: 16 * 1024 * 1024,\n batchRows: 1000,\n batchBytes: 2 * 1024 * 1024,\n recordBytes: 64 * 1024,\n captureBytes: 256 * 1024 * 1024,\n captureRows: 1000000,\n captures: 3,\n sources: 200,\n resultRows: 1000,\n resultBytes: 2 * 1024 * 1024,\n queryMs: 15000,\n ttlMs: 60 * 60 * 1000,\n historyLines: 1000,\n historyBytes: 1024 * 1024,\n captureSourceLines: 10000,\n captureSourceBytes: 8 * 1024 * 1024,\n requestsPerSecond: 2,\n bytesPerSecond: 1024 * 1024,\n historyConcurrency: 2,\n liveConcurrency: 4,\n} as const;\n\nexport type PowerLogsLimitKey = keyof typeof POWER_LOGS_DEFAULT_LIMITS;\nexport type PowerLogsLimits = { [Key in PowerLogsLimitKey]: number };\nexport const POWER_LOGS_LIMITS: PowerLogsLimits = { ...POWER_LOGS_DEFAULT_LIMITS };\n\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"unknown\";\nexport type LogWorkloadKind = \"Pod\" | \"Deployment\" | \"DaemonSet\" | \"StatefulSet\" | \"ReplicaSet\" | \"Job\" | \"CronJob\";\nexport interface LogTarget {\n kind: LogWorkloadKind;\n namespace: string;\n name: string;\n uid: string;\n}\nexport interface LogSource {\n namespace: string;\n pod: string;\n podUid: string;\n container: string;\n previous?: boolean;\n}\nexport interface LogRecord {\n timestamp: number | null;\n pod: string;\n podUid: string;\n container: string;\n level: LogLevel;\n message: string;\n fieldsJson: string | null;\n previous?: boolean;\n}\nexport interface LogCapture {\n id: string;\n target: LogTarget;\n createdAt: number;\n expiresAt: number;\n state: \"collecting\" | \"ready\" | \"partial\";\n rows: number;\n bytes: number;\n notes: string[];\n lastSql?: string;\n}\nexport type LogCell = string | number | boolean | null;\nexport interface LogQueryResult {\n error?: string;\n columns: string[];\n rows: LogCell[][];\n truncated: boolean;\n elapsedMs: number;\n}\nexport interface LogPartition {\n clusterId: string;\n contextId: string;\n}\nexport type LogRequest = LogPartition &\n (\n | { operation: \"permit\"; lane: \"start\" | \"bytes\"; bytes?: number }\n | { operation: \"stream-open\"; streamId: string; follow: boolean }\n | { operation: \"stream-close\" | \"stream-renew\"; streamId: string }\n | { operation: \"create\"; target: LogTarget }\n | { operation: \"append\"; captureId: string; records: LogRecord[] }\n | { operation: \"finish\"; captureId: string; partial: boolean; notes: string[] }\n | { operation: \"list\" }\n | { operation: \"delete\"; captureId: string }\n | { operation: \"save-sql\"; captureId: string; sql: string }\n | { operation: \"query\"; captureId: string; queryId: string; sql: string }\n | { operation: \"cancel\"; queryId: string }\n | { operation: \"export\"; captureId: string }\n );\n"],"mappings":";AAAA,IAAa,qBAAqB;AAClC,IAAa,4BAA4B;CACvC,UAAU;CACV,WAAW,KAAK,OAAO;CACvB,WAAW;CACX,YAAY,IAAI,OAAO;CACvB,aAAa,KAAK;CAClB,cAAc,MAAM,OAAO;CAC3B,aAAa;CACb,UAAU;CACV,SAAS;CACT,YAAY;CACZ,aAAa,IAAI,OAAO;CACxB,SAAS;CACT,OAAO,OAAU;CACjB,cAAc;CACd,cAAc,OAAO;CACrB,oBAAoB;CACpB,oBAAoB,IAAI,OAAO;CAC/B,mBAAmB;CACnB,gBAAgB,OAAO;CACvB,oBAAoB;CACpB,iBAAiB;AACnB;AAIA,IAAa,oBAAqC,EAAE,GAAG,0BAA0B"}
@@ -0,0 +1,28 @@
1
+ //#region src/common/resource-search-kind-priority.ts
2
+ var COMMON_RESOURCE_KINDS = [
3
+ "Pod",
4
+ "Deployment",
5
+ "Service",
6
+ "StatefulSet",
7
+ "DaemonSet",
8
+ "Job",
9
+ "CronJob",
10
+ "Ingress",
11
+ "Gateway",
12
+ "HTTPRoute",
13
+ "ConfigMap",
14
+ "Secret",
15
+ "Namespace",
16
+ "Node",
17
+ "PersistentVolumeClaim",
18
+ "PersistentVolume"
19
+ ];
20
+ function resourceKindPriority(kind) {
21
+ const index = COMMON_RESOURCE_KINDS.indexOf(kind);
22
+ return index < 0 ? COMMON_RESOURCE_KINDS.length : index;
23
+ }
24
+ //#endregion
25
+ exports.COMMON_RESOURCE_KINDS = COMMON_RESOURCE_KINDS;
26
+ exports.resourceKindPriority = resourceKindPriority;
27
+
28
+ //# sourceMappingURL=resource-search-kind-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-search-kind-priority.js","names":[],"sources":["../../../../src/common/resource-search-kind-priority.ts"],"sourcesContent":["export const COMMON_RESOURCE_KINDS = [\n \"Pod\",\n \"Deployment\",\n \"Service\",\n \"StatefulSet\",\n \"DaemonSet\",\n \"Job\",\n \"CronJob\",\n \"Ingress\",\n \"Gateway\",\n \"HTTPRoute\",\n \"ConfigMap\",\n \"Secret\",\n \"Namespace\",\n \"Node\",\n \"PersistentVolumeClaim\",\n \"PersistentVolume\",\n];\n\nexport function resourceKindPriority(kind: string): number {\n const index = COMMON_RESOURCE_KINDS.indexOf(kind);\n return index < 0 ? COMMON_RESOURCE_KINDS.length : index;\n}\n"],"mappings":";AAAA,IAAa,wBAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,qBAAqB,MAAsB;CACzD,MAAM,QAAQ,sBAAsB,QAAQ,IAAI;CAChD,OAAO,QAAQ,IAAI,sBAAsB,SAAS;AACpD"}
@@ -6,6 +6,7 @@ var LogsPreferencesStore = class extends require_extensions.Common.Store.Extensi
6
6
  enabled = false;
7
7
  gentle = true;
8
8
  compactRows = false;
9
+ hideResourceNameColumn = false;
9
10
  limits = require_power_logs_limits.normalizePowerLogsLimits(void 0);
10
11
  constructor() {
11
12
  super({
@@ -14,6 +15,7 @@ var LogsPreferencesStore = class extends require_extensions.Common.Store.Extensi
14
15
  enabled: false,
15
16
  gentle: true,
16
17
  compactRows: false,
18
+ hideResourceNameColumn: false,
17
19
  limits: require_power_logs_limits.normalizePowerLogsLimits(void 0)
18
20
  }
19
21
  });
@@ -21,6 +23,7 @@ var LogsPreferencesStore = class extends require_extensions.Common.Store.Extensi
21
23
  enabled: require__global_external_mobx.observable,
22
24
  gentle: require__global_external_mobx.observable,
23
25
  compactRows: require__global_external_mobx.observable,
26
+ hideResourceNameColumn: require__global_external_mobx.observable,
24
27
  limits: require__global_external_mobx.observable
25
28
  });
26
29
  }
@@ -28,6 +31,7 @@ var LogsPreferencesStore = class extends require_extensions.Common.Store.Extensi
28
31
  this.enabled = data?.enabled === true;
29
32
  this.gentle = data?.gentle !== false;
30
33
  this.compactRows = data?.compactRows === true;
34
+ this.hideResourceNameColumn = data?.hideResourceNameColumn === true;
31
35
  this.limits = require_power_logs_limits.normalizePowerLogsLimits(data?.limits);
32
36
  }
33
37
  toJSON() {
@@ -35,6 +39,7 @@ var LogsPreferencesStore = class extends require_extensions.Common.Store.Extensi
35
39
  enabled: this.enabled,
36
40
  gentle: this.gentle,
37
41
  compactRows: this.compactRows,
42
+ hideResourceNameColumn: this.hideResourceNameColumn,
38
43
  limits: require_power_logs_limits.normalizePowerLogsLimits(this.limits)
39
44
  };
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logs-preferences-store.js","names":[],"sources":["../../../../../src/common/store/logs-preferences-store.ts"],"sourcesContent":["import { Common } from \"@freelensapp/extensions\";\nimport { makeObservable, observable } from \"mobx\";\nimport { normalizePowerLogsLimits } from \"../power-logs-limits\";\n\nimport type { PowerLogsLimits } from \"../power-logs\";\n\nexport class LogsPreferencesStore extends Common.Store.ExtensionStore<{\n enabled: boolean;\n gentle: boolean;\n compactRows: boolean;\n limits: PowerLogsLimits;\n}> {\n enabled = false;\n gentle = true;\n compactRows = false;\n limits = normalizePowerLogsLimits(undefined);\n\n constructor() {\n super({\n configName: \"logs-preferences\",\n defaults: { enabled: false, gentle: true, compactRows: false, limits: normalizePowerLogsLimits(undefined) },\n });\n makeObservable(this, { enabled: observable, gentle: observable, compactRows: observable, limits: observable });\n }\n\n fromStore(data: { enabled?: boolean; gentle?: boolean; compactRows?: boolean; limits?: unknown }): void {\n this.enabled = data?.enabled === true;\n this.gentle = data?.gentle !== false;\n this.compactRows = data?.compactRows === true;\n this.limits = normalizePowerLogsLimits(data?.limits);\n }\n\n toJSON() {\n return {\n enabled: this.enabled,\n gentle: this.gentle,\n compactRows: this.compactRows,\n limits: normalizePowerLogsLimits(this.limits),\n };\n }\n}\n"],"mappings":";;;;AAMA,IAAa,uBAAb,cAA0C,mBAAA,OAAO,MAAM,eAKpD;CACD,UAAU;CACV,SAAS;CACT,cAAc;CACd,SAAS,0BAAA,yBAAyB,KAAA,CAAS;CAE3C,cAAc;EACZ,MAAM;GACJ,YAAY;GACZ,UAAU;IAAE,SAAS;IAAO,QAAQ;IAAM,aAAa;IAAO,QAAQ,0BAAA,yBAAyB,KAAA,CAAS;GAAE;EAC5G,CAAC;EACD,8BAAA,eAAe,MAAM;GAAE,SAAS,8BAAA;GAAY,QAAQ,8BAAA;GAAY,aAAa,8BAAA;GAAY,QAAQ,8BAAA;EAAW,CAAC;CAC/G;CAEA,UAAU,MAA8F;EACtG,KAAK,UAAU,MAAM,YAAY;EACjC,KAAK,SAAS,MAAM,WAAW;EAC/B,KAAK,cAAc,MAAM,gBAAgB;EACzC,KAAK,SAAS,0BAAA,yBAAyB,MAAM,MAAM;CACrD;CAEA,SAAS;EACP,OAAO;GACL,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,QAAQ,0BAAA,yBAAyB,KAAK,MAAM;EAC9C;CACF;AACF"}
1
+ {"version":3,"file":"logs-preferences-store.js","names":[],"sources":["../../../../../src/common/store/logs-preferences-store.ts"],"sourcesContent":["import { Common } from \"@freelensapp/extensions\";\nimport { makeObservable, observable } from \"mobx\";\nimport { normalizePowerLogsLimits } from \"../power-logs-limits\";\n\nimport type { PowerLogsLimits } from \"../power-logs\";\n\nexport class LogsPreferencesStore extends Common.Store.ExtensionStore<{\n enabled: boolean;\n gentle: boolean;\n compactRows: boolean;\n hideResourceNameColumn: boolean;\n limits: PowerLogsLimits;\n}> {\n enabled = false;\n gentle = true;\n compactRows = false;\n hideResourceNameColumn = false;\n limits = normalizePowerLogsLimits(undefined);\n\n constructor() {\n super({\n configName: \"logs-preferences\",\n defaults: {\n enabled: false,\n gentle: true,\n compactRows: false,\n hideResourceNameColumn: false,\n limits: normalizePowerLogsLimits(undefined),\n },\n });\n makeObservable(this, {\n enabled: observable,\n gentle: observable,\n compactRows: observable,\n hideResourceNameColumn: observable,\n limits: observable,\n });\n }\n\n fromStore(data: {\n enabled?: boolean;\n gentle?: boolean;\n compactRows?: boolean;\n hideResourceNameColumn?: boolean;\n limits?: unknown;\n }): void {\n this.enabled = data?.enabled === true;\n this.gentle = data?.gentle !== false;\n this.compactRows = data?.compactRows === true;\n this.hideResourceNameColumn = data?.hideResourceNameColumn === true;\n this.limits = normalizePowerLogsLimits(data?.limits);\n }\n\n toJSON() {\n return {\n enabled: this.enabled,\n gentle: this.gentle,\n compactRows: this.compactRows,\n hideResourceNameColumn: this.hideResourceNameColumn,\n limits: normalizePowerLogsLimits(this.limits),\n };\n }\n}\n"],"mappings":";;;;AAMA,IAAa,uBAAb,cAA0C,mBAAA,OAAO,MAAM,eAMpD;CACD,UAAU;CACV,SAAS;CACT,cAAc;CACd,yBAAyB;CACzB,SAAS,0BAAA,yBAAyB,KAAA,CAAS;CAE3C,cAAc;EACZ,MAAM;GACJ,YAAY;GACZ,UAAU;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,wBAAwB;IACxB,QAAQ,0BAAA,yBAAyB,KAAA,CAAS;GAC5C;EACF,CAAC;EACD,8BAAA,eAAe,MAAM;GACnB,SAAS,8BAAA;GACT,QAAQ,8BAAA;GACR,aAAa,8BAAA;GACb,wBAAwB,8BAAA;GACxB,QAAQ,8BAAA;EACV,CAAC;CACH;CAEA,UAAU,MAMD;EACP,KAAK,UAAU,MAAM,YAAY;EACjC,KAAK,SAAS,MAAM,WAAW;EAC/B,KAAK,cAAc,MAAM,gBAAgB;EACzC,KAAK,yBAAyB,MAAM,2BAA2B;EAC/D,KAAK,SAAS,0BAAA,yBAAyB,MAAM,MAAM;CACrD;CAEA,SAAS;EACP,OAAO;GACL,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,wBAAwB,KAAK;GAC7B,QAAQ,0BAAA,yBAAyB,KAAK,MAAM;EAC9C;CACF;AACF"}