@64mb/freelens-power 1.5.0 → 1.6.1

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 (71) hide show
  1. package/README.md +4 -1
  2. package/out/main/ai-ipc.js +34 -3
  3. package/out/main/ai-ipc.js.map +1 -1
  4. package/out/main/common/power-logs-limits.js +227 -0
  5. package/out/main/common/power-logs-limits.js.map +1 -0
  6. package/out/main/common/power-logs.js +32 -0
  7. package/out/main/common/power-logs.js.map +1 -0
  8. package/out/main/common/store/logs-preferences-store.js +45 -0
  9. package/out/main/common/store/logs-preferences-store.js.map +1 -0
  10. package/out/main/dashboard-icon-cache.js +1 -1
  11. package/out/main/index.js +4 -0
  12. package/out/main/index.js.map +1 -1
  13. package/out/main/power-logs-budget.js +126 -0
  14. package/out/main/power-logs-budget.js.map +1 -0
  15. package/out/main/power-logs-child.js +86 -0
  16. package/out/main/power-logs-child.js.map +1 -0
  17. package/out/main/power-logs-database.js +179 -0
  18. package/out/main/power-logs-database.js.map +1 -0
  19. package/out/main/power-logs-ipc.js +275 -0
  20. package/out/main/power-logs-ipc.js.map +1 -0
  21. package/out/main/power-logs-query-child.js +23 -0
  22. package/out/main/power-logs-query-child.js.map +1 -0
  23. package/out/main/power-logs-query.js +127 -0
  24. package/out/main/power-logs-query.js.map +1 -0
  25. package/out/main/power-logs-worker.js +215 -0
  26. package/out/main/power-logs-worker.js.map +1 -0
  27. package/out/main/resource-search.js +1 -1
  28. package/out/renderer/ai-logs-sql.js +27 -0
  29. package/out/renderer/ai-logs-sql.js.map +1 -0
  30. package/out/renderer/ai-message.js +48 -27
  31. package/out/renderer/ai-message.js.map +1 -1
  32. package/out/renderer/ai-terminal-context.js +50 -40
  33. package/out/renderer/ai-terminal-context.js.map +1 -1
  34. package/out/renderer/ai.js +15 -2
  35. package/out/renderer/ai.js.map +1 -1
  36. package/out/renderer/appearance.js +1 -0
  37. package/out/renderer/appearance.js.map +1 -1
  38. package/out/renderer/index.js +67 -29
  39. package/out/renderer/index.js.map +1 -1
  40. package/out/renderer/power-log-json.js +29 -0
  41. package/out/renderer/power-log-json.js.map +1 -0
  42. package/out/renderer/power-logs-client.js +35 -0
  43. package/out/renderer/power-logs-client.js.map +1 -0
  44. package/out/renderer/power-logs-collector.js +316 -0
  45. package/out/renderer/power-logs-collector.js.map +1 -0
  46. package/out/renderer/power-logs-entrypoints.js +201 -0
  47. package/out/renderer/power-logs-entrypoints.js.map +1 -0
  48. package/out/renderer/power-logs-sql-row.js +52 -0
  49. package/out/renderer/power-logs-sql-row.js.map +1 -0
  50. package/out/renderer/power-logs-transport.js +122 -0
  51. package/out/renderer/power-logs-transport.js.map +1 -0
  52. package/out/renderer/power-logs.css.js +117 -0
  53. package/out/renderer/power-logs.css.js.map +1 -0
  54. package/out/renderer/power-logs.js +1385 -0
  55. package/out/renderer/power-logs.js.map +1 -0
  56. package/out/renderer/preferences/logs-preferences.js +93 -0
  57. package/out/renderer/preferences/logs-preferences.js.map +1 -0
  58. package/out/renderer/preferences/preferences.js +23 -9
  59. package/out/renderer/preferences/preferences.js.map +1 -1
  60. package/out/renderer/resource-relationships.js +1 -1
  61. package/out/renderer/src/common/power-log-parser.js +114 -0
  62. package/out/renderer/src/common/power-log-parser.js.map +1 -0
  63. package/out/renderer/src/common/power-logs-ai.js +56 -0
  64. package/out/renderer/src/common/power-logs-ai.js.map +1 -0
  65. package/out/renderer/src/common/power-logs-limits.js +227 -0
  66. package/out/renderer/src/common/power-logs-limits.js.map +1 -0
  67. package/out/renderer/src/common/power-logs.js +32 -0
  68. package/out/renderer/src/common/power-logs.js.map +1 -0
  69. package/out/renderer/src/common/store/logs-preferences-store.js +45 -0
  70. package/out/renderer/src/common/store/logs-preferences-store.js.map +1 -0
  71. package/package.json +4 -2
@@ -0,0 +1,56 @@
1
+ const require_ai_terminal_context = require("./ai-terminal-context.js");
2
+ //#region src/common/power-logs-ai.ts
3
+ var sensitive = (key) => /(?:password|passwd|token|secret|authorization|credential|apikey|privatekey|clientkeydata|clientcertificatedata)/i.test(key.replace(/[^a-z0-9]/gi, ""));
4
+ function project(value, depth = 0) {
5
+ if (depth > 8) return "[nested content omitted]";
6
+ if (typeof value === "string") {
7
+ try {
8
+ const parsed = JSON.parse(value);
9
+ if (parsed !== null && (typeof parsed === "object" || typeof parsed === "string")) return project(parsed, depth + 1);
10
+ } catch {}
11
+ return require_ai_terminal_context.redactAiTerminalText(value);
12
+ }
13
+ if (Array.isArray(value)) return value.slice(0, 100).map((item) => project(item, depth + 1));
14
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).slice(0, 100).map(([key, item]) => [key, sensitive(key) ? "[REDACTED]" : project(item, depth + 1)]));
15
+ return value;
16
+ }
17
+ function powerLogLineEvidence(target, record) {
18
+ const { timestamp, pod, podUid, container, level, message, fieldsJson, previous } = record;
19
+ return JSON.stringify(project({
20
+ observedAt: (/* @__PURE__ */ new Date()).toISOString(),
21
+ target,
22
+ line: {
23
+ timestamp,
24
+ pod,
25
+ podUid,
26
+ container,
27
+ level,
28
+ message,
29
+ fieldsJson,
30
+ previous
31
+ }
32
+ }), null, 2).slice(0, 6e3);
33
+ }
34
+ function powerLogQueryEvidence(capture, sql, result) {
35
+ const rows = result.rows.slice(0, 30).map((row) => row.map((value, index) => ({
36
+ column: result.columns[index],
37
+ value: sensitive(result.columns[index]) ? "[REDACTED]" : value
38
+ })));
39
+ return JSON.stringify(project({
40
+ observedAt: (/* @__PURE__ */ new Date()).toISOString(),
41
+ capture: {
42
+ target: capture.target,
43
+ createdAt: capture.createdAt,
44
+ state: capture.state,
45
+ notes: capture.notes
46
+ },
47
+ sql,
48
+ rows,
49
+ truncated: result.truncated || result.rows.length > 30
50
+ }), null, 2).slice(0, 6e3);
51
+ }
52
+ //#endregion
53
+ exports.powerLogLineEvidence = powerLogLineEvidence;
54
+ exports.powerLogQueryEvidence = powerLogQueryEvidence;
55
+
56
+ //# sourceMappingURL=power-logs-ai.js.map
@@ -0,0 +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"}
@@ -0,0 +1,227 @@
1
+ const require_power_logs = require("./power-logs.js");
2
+ //#region src/common/power-logs-limits.ts
3
+ var KiB = 1024;
4
+ var MiB = KiB * KiB;
5
+ var LOG_LIMIT_FIELDS = [
6
+ {
7
+ key: "liveRows",
8
+ label: "Buffered rows",
9
+ unit: "rows",
10
+ group: "Live logs",
11
+ min: 1,
12
+ max: 1e6,
13
+ step: 1e3
14
+ },
15
+ {
16
+ key: "liveBytes",
17
+ label: "Buffer size",
18
+ unit: "MiB",
19
+ group: "Live logs",
20
+ min: KiB,
21
+ max: 1024 * MiB,
22
+ step: MiB,
23
+ scale: MiB
24
+ },
25
+ {
26
+ key: "batchRows",
27
+ label: "Batch rows",
28
+ unit: "rows",
29
+ group: "Live logs",
30
+ min: 1,
31
+ max: 1e5,
32
+ step: 100
33
+ },
34
+ {
35
+ key: "batchBytes",
36
+ label: "Batch size",
37
+ unit: "MiB",
38
+ group: "Live logs",
39
+ min: KiB,
40
+ max: 64 * MiB,
41
+ step: MiB,
42
+ scale: MiB
43
+ },
44
+ {
45
+ key: "recordBytes",
46
+ label: "Record size",
47
+ unit: "KiB",
48
+ group: "Live logs",
49
+ min: KiB,
50
+ max: 16 * MiB,
51
+ step: KiB,
52
+ scale: KiB
53
+ },
54
+ {
55
+ key: "historyLines",
56
+ label: "Lines per source",
57
+ unit: "lines",
58
+ group: "History",
59
+ min: 1,
60
+ max: 1e6,
61
+ step: 1e3
62
+ },
63
+ {
64
+ key: "historyBytes",
65
+ label: "Bytes per source",
66
+ unit: "MiB",
67
+ group: "History",
68
+ min: KiB,
69
+ max: 256 * MiB,
70
+ step: MiB,
71
+ scale: MiB
72
+ },
73
+ {
74
+ key: "historyConcurrency",
75
+ label: "Parallel requests",
76
+ unit: "requests",
77
+ group: "History",
78
+ min: 1,
79
+ max: 32,
80
+ step: 1
81
+ },
82
+ {
83
+ key: "captureBytes",
84
+ label: "Capture size",
85
+ unit: "MiB",
86
+ group: "Captures",
87
+ min: KiB,
88
+ max: 4096 * MiB,
89
+ step: MiB,
90
+ scale: MiB
91
+ },
92
+ {
93
+ key: "captureRows",
94
+ label: "Rows per capture",
95
+ unit: "rows",
96
+ group: "Captures",
97
+ min: 1,
98
+ max: 1e7,
99
+ step: 1e4
100
+ },
101
+ {
102
+ key: "captures",
103
+ label: "Retained captures",
104
+ unit: "captures",
105
+ group: "Captures",
106
+ min: 1,
107
+ max: 100,
108
+ step: 1
109
+ },
110
+ {
111
+ key: "sources",
112
+ label: "Sources per capture",
113
+ unit: "sources",
114
+ group: "Captures",
115
+ min: 1,
116
+ max: 2e3,
117
+ step: 10
118
+ },
119
+ {
120
+ key: "captureSourceLines",
121
+ label: "Lines per source",
122
+ unit: "lines",
123
+ group: "Captures",
124
+ min: 1,
125
+ max: 1e6,
126
+ step: 1e3
127
+ },
128
+ {
129
+ key: "captureSourceBytes",
130
+ label: "Bytes per source",
131
+ unit: "MiB",
132
+ group: "Captures",
133
+ min: KiB,
134
+ max: 256 * MiB,
135
+ step: MiB,
136
+ scale: MiB
137
+ },
138
+ {
139
+ key: "ttlMs",
140
+ label: "Retention",
141
+ unit: "minutes",
142
+ group: "Captures",
143
+ min: 6e4,
144
+ max: 10080 * 6e4,
145
+ step: 6e4,
146
+ scale: 6e4
147
+ },
148
+ {
149
+ key: "resultRows",
150
+ label: "Result rows",
151
+ unit: "rows",
152
+ group: "SQL results",
153
+ min: 1,
154
+ max: 1e5,
155
+ step: 100
156
+ },
157
+ {
158
+ key: "resultBytes",
159
+ label: "Result size",
160
+ unit: "MiB",
161
+ group: "SQL results",
162
+ min: KiB,
163
+ max: 64 * MiB,
164
+ step: MiB,
165
+ scale: MiB
166
+ },
167
+ {
168
+ key: "queryMs",
169
+ label: "Query timeout",
170
+ unit: "seconds",
171
+ group: "SQL results",
172
+ min: 1e3,
173
+ max: 3e5,
174
+ step: 1e3,
175
+ scale: 1e3
176
+ },
177
+ {
178
+ key: "requestsPerSecond",
179
+ label: "Request rate",
180
+ unit: "requests/s",
181
+ group: "Throughput",
182
+ min: 1,
183
+ max: 100,
184
+ step: 1
185
+ },
186
+ {
187
+ key: "bytesPerSecond",
188
+ label: "Data rate",
189
+ unit: "MiB/s",
190
+ group: "Throughput",
191
+ min: KiB,
192
+ max: 256 * MiB,
193
+ step: MiB,
194
+ scale: MiB
195
+ },
196
+ {
197
+ key: "liveConcurrency",
198
+ label: "Parallel streams",
199
+ unit: "streams",
200
+ group: "Throughput",
201
+ min: 1,
202
+ max: 64,
203
+ step: 1
204
+ }
205
+ ];
206
+ function normalizePowerLogsLimits(input) {
207
+ const values = input !== null && typeof input === "object" ? input : {};
208
+ const normalized = { ...require_power_logs.POWER_LOGS_DEFAULT_LIMITS };
209
+ for (const field of LOG_LIMIT_FIELDS) {
210
+ const value = values[field.key];
211
+ if (typeof value === "number" && Number.isFinite(value)) normalized[field.key] = Math.max(field.min, Math.min(field.max, Math.trunc(value)));
212
+ }
213
+ normalized.batchBytes = Math.max(normalized.batchBytes, normalized.recordBytes + 3);
214
+ normalized.captureSourceBytes = Math.max(normalized.captureSourceBytes, normalized.recordBytes);
215
+ return normalized;
216
+ }
217
+ function applyPowerLogsLimits(input) {
218
+ const normalized = normalizePowerLogsLimits(input);
219
+ Object.assign(require_power_logs.POWER_LOGS_LIMITS, normalized);
220
+ return normalized;
221
+ }
222
+ //#endregion
223
+ exports.LOG_LIMIT_FIELDS = LOG_LIMIT_FIELDS;
224
+ exports.applyPowerLogsLimits = applyPowerLogsLimits;
225
+ exports.normalizePowerLogsLimits = normalizePowerLogsLimits;
226
+
227
+ //# sourceMappingURL=power-logs-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-logs-limits.js","names":[],"sources":["../../../../src/common/power-logs-limits.ts"],"sourcesContent":["import {\n POWER_LOGS_DEFAULT_LIMITS,\n POWER_LOGS_LIMITS,\n type PowerLogsLimitKey,\n type PowerLogsLimits,\n} from \"./power-logs\";\n\nexport interface LogLimitField {\n key: PowerLogsLimitKey;\n label: string;\n unit: string;\n group: \"Live logs\" | \"History\" | \"Captures\" | \"SQL results\" | \"Throughput\";\n min: number;\n max: number;\n step: number;\n scale?: number;\n}\n\nconst KiB = 1024;\nconst MiB = KiB * KiB;\n\nexport const LOG_LIMIT_FIELDS: readonly LogLimitField[] = [\n { key: \"liveRows\", label: \"Buffered rows\", unit: \"rows\", group: \"Live logs\", min: 1, max: 1000000, step: 1000 },\n {\n key: \"liveBytes\",\n label: \"Buffer size\",\n unit: \"MiB\",\n group: \"Live logs\",\n min: KiB,\n max: 1024 * MiB,\n step: MiB,\n scale: MiB,\n },\n { key: \"batchRows\", label: \"Batch rows\", unit: \"rows\", group: \"Live logs\", min: 1, max: 100000, step: 100 },\n {\n key: \"batchBytes\",\n label: \"Batch size\",\n unit: \"MiB\",\n group: \"Live logs\",\n min: KiB,\n max: 64 * MiB,\n step: MiB,\n scale: MiB,\n },\n {\n key: \"recordBytes\",\n label: \"Record size\",\n unit: \"KiB\",\n group: \"Live logs\",\n min: KiB,\n max: 16 * MiB,\n step: KiB,\n scale: KiB,\n },\n { key: \"historyLines\", label: \"Lines per source\", unit: \"lines\", group: \"History\", min: 1, max: 1000000, step: 1000 },\n {\n key: \"historyBytes\",\n label: \"Bytes per source\",\n unit: \"MiB\",\n group: \"History\",\n min: KiB,\n max: 256 * MiB,\n step: MiB,\n scale: MiB,\n },\n {\n key: \"historyConcurrency\",\n label: \"Parallel requests\",\n unit: \"requests\",\n group: \"History\",\n min: 1,\n max: 32,\n step: 1,\n },\n {\n key: \"captureBytes\",\n label: \"Capture size\",\n unit: \"MiB\",\n group: \"Captures\",\n min: KiB,\n max: 4096 * MiB,\n step: MiB,\n scale: MiB,\n },\n {\n key: \"captureRows\",\n label: \"Rows per capture\",\n unit: \"rows\",\n group: \"Captures\",\n min: 1,\n max: 10000000,\n step: 10000,\n },\n { key: \"captures\", label: \"Retained captures\", unit: \"captures\", group: \"Captures\", min: 1, max: 100, step: 1 },\n { key: \"sources\", label: \"Sources per capture\", unit: \"sources\", group: \"Captures\", min: 1, max: 2000, step: 10 },\n {\n key: \"captureSourceLines\",\n label: \"Lines per source\",\n unit: \"lines\",\n group: \"Captures\",\n min: 1,\n max: 1000000,\n step: 1000,\n },\n {\n key: \"captureSourceBytes\",\n label: \"Bytes per source\",\n unit: \"MiB\",\n group: \"Captures\",\n min: KiB,\n max: 256 * MiB,\n step: MiB,\n scale: MiB,\n },\n {\n key: \"ttlMs\",\n label: \"Retention\",\n unit: \"minutes\",\n group: \"Captures\",\n min: 60000,\n max: 7 * 24 * 60 * 60000,\n step: 60000,\n scale: 60000,\n },\n { key: \"resultRows\", label: \"Result rows\", unit: \"rows\", group: \"SQL results\", min: 1, max: 100000, step: 100 },\n {\n key: \"resultBytes\",\n label: \"Result size\",\n unit: \"MiB\",\n group: \"SQL results\",\n min: KiB,\n max: 64 * MiB,\n step: MiB,\n scale: MiB,\n },\n {\n key: \"queryMs\",\n label: \"Query timeout\",\n unit: \"seconds\",\n group: \"SQL results\",\n min: 1000,\n max: 300000,\n step: 1000,\n scale: 1000,\n },\n {\n key: \"requestsPerSecond\",\n label: \"Request rate\",\n unit: \"requests/s\",\n group: \"Throughput\",\n min: 1,\n max: 100,\n step: 1,\n },\n {\n key: \"bytesPerSecond\",\n label: \"Data rate\",\n unit: \"MiB/s\",\n group: \"Throughput\",\n min: KiB,\n max: 256 * MiB,\n step: MiB,\n scale: MiB,\n },\n { key: \"liveConcurrency\", label: \"Parallel streams\", unit: \"streams\", group: \"Throughput\", min: 1, max: 64, step: 1 },\n];\n\nexport function normalizePowerLogsLimits(input: unknown): PowerLogsLimits {\n const values = input !== null && typeof input === \"object\" ? (input as Record<string, unknown>) : {};\n const normalized: PowerLogsLimits = { ...POWER_LOGS_DEFAULT_LIMITS };\n for (const field of LOG_LIMIT_FIELDS) {\n const value = values[field.key];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n normalized[field.key] = Math.max(field.min, Math.min(field.max, Math.trunc(value)));\n }\n }\n normalized.batchBytes = Math.max(normalized.batchBytes, normalized.recordBytes + 3);\n normalized.captureSourceBytes = Math.max(normalized.captureSourceBytes, normalized.recordBytes);\n return normalized;\n}\n\nexport function applyPowerLogsLimits(input: unknown): PowerLogsLimits {\n const normalized = normalizePowerLogsLimits(input);\n Object.assign(POWER_LOGS_LIMITS, normalized);\n return normalized;\n}\n"],"mappings":";;AAkBA,IAAM,MAAM;AACZ,IAAM,MAAM,MAAM;AAElB,IAAa,mBAA6C;CACxD;EAAE,KAAK;EAAY,OAAO;EAAiB,MAAM;EAAQ,OAAO;EAAa,KAAK;EAAG,KAAK;EAAS,MAAM;CAAK;CAC9G;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,OAAO;EACZ,MAAM;EACN,OAAO;CACT;CACA;EAAE,KAAK;EAAa,OAAO;EAAc,MAAM;EAAQ,OAAO;EAAa,KAAK;EAAG,KAAK;EAAQ,MAAM;CAAI;CAC1G;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,KAAK;EACV,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,KAAK;EACV,MAAM;EACN,OAAO;CACT;CACA;EAAE,KAAK;EAAgB,OAAO;EAAoB,MAAM;EAAS,OAAO;EAAW,KAAK;EAAG,KAAK;EAAS,MAAM;CAAK;CACpH;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,MAAM;EACX,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACL,MAAM;CACR;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,OAAO;EACZ,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACL,MAAM;CACR;CACA;EAAE,KAAK;EAAY,OAAO;EAAqB,MAAM;EAAY,OAAO;EAAY,KAAK;EAAG,KAAK;EAAK,MAAM;CAAE;CAC9G;EAAE,KAAK;EAAW,OAAO;EAAuB,MAAM;EAAW,OAAO;EAAY,KAAK;EAAG,KAAK;EAAM,MAAM;CAAG;CAChH;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACL,MAAM;CACR;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,MAAM;EACX,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,QAAc;EACnB,MAAM;EACN,OAAO;CACT;CACA;EAAE,KAAK;EAAc,OAAO;EAAe,MAAM;EAAQ,OAAO;EAAe,KAAK;EAAG,KAAK;EAAQ,MAAM;CAAI;CAC9G;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,KAAK;EACV,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACL,MAAM;EACN,OAAO;CACT;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK;EACL,MAAM;CACR;CACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,OAAO;EACP,KAAK;EACL,KAAK,MAAM;EACX,MAAM;EACN,OAAO;CACT;CACA;EAAE,KAAK;EAAmB,OAAO;EAAoB,MAAM;EAAW,OAAO;EAAc,KAAK;EAAG,KAAK;EAAI,MAAM;CAAE;AACtH;AAEA,SAAgB,yBAAyB,OAAiC;CACxE,MAAM,SAAS,UAAU,QAAQ,OAAO,UAAU,WAAY,QAAoC,CAAC;CACnG,MAAM,aAA8B,EAAE,GAAG,mBAAA,0BAA0B;CACnE,KAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,OAAO,MAAM;EAC3B,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GACpD,WAAW,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;CAEtF;CACA,WAAW,aAAa,KAAK,IAAI,WAAW,YAAY,WAAW,cAAc,CAAC;CAClF,WAAW,qBAAqB,KAAK,IAAI,WAAW,oBAAoB,WAAW,WAAW;CAC9F,OAAO;AACT;AAEA,SAAgB,qBAAqB,OAAiC;CACpE,MAAM,aAAa,yBAAyB,KAAK;CACjD,OAAO,OAAO,mBAAA,mBAAmB,UAAU;CAC3C,OAAO;AACT"}
@@ -0,0 +1,32 @@
1
+ //#region src/common/power-logs.ts
2
+ var POWER_LOGS_CHANNEL = "freelens-power:logs";
3
+ var POWER_LOGS_DEFAULT_LIMITS = {
4
+ liveRows: 1e4,
5
+ liveBytes: 16 * 1024 * 1024,
6
+ batchRows: 1e3,
7
+ batchBytes: 2 * 1024 * 1024,
8
+ recordBytes: 64 * 1024,
9
+ captureBytes: 256 * 1024 * 1024,
10
+ captureRows: 1e6,
11
+ captures: 3,
12
+ sources: 200,
13
+ resultRows: 1e3,
14
+ resultBytes: 2 * 1024 * 1024,
15
+ queryMs: 15e3,
16
+ ttlMs: 3600 * 1e3,
17
+ historyLines: 1e3,
18
+ historyBytes: 1024 * 1024,
19
+ captureSourceLines: 1e4,
20
+ captureSourceBytes: 8 * 1024 * 1024,
21
+ requestsPerSecond: 2,
22
+ bytesPerSecond: 1024 * 1024,
23
+ historyConcurrency: 2,
24
+ liveConcurrency: 4
25
+ };
26
+ var POWER_LOGS_LIMITS = { ...POWER_LOGS_DEFAULT_LIMITS };
27
+ //#endregion
28
+ exports.POWER_LOGS_CHANNEL = POWER_LOGS_CHANNEL;
29
+ exports.POWER_LOGS_DEFAULT_LIMITS = POWER_LOGS_DEFAULT_LIMITS;
30
+ exports.POWER_LOGS_LIMITS = POWER_LOGS_LIMITS;
31
+
32
+ //# sourceMappingURL=power-logs.js.map
@@ -0,0 +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"}
@@ -0,0 +1,45 @@
1
+ const require_extensions = require("../../../_virtual/_global-external_@freelensapp/extensions.js");
2
+ const require__global_external_mobx = require("../../../_virtual/_global-external_mobx.js");
3
+ const require_power_logs_limits = require("../power-logs-limits.js");
4
+ //#region src/common/store/logs-preferences-store.ts
5
+ var LogsPreferencesStore = class extends require_extensions.Common.Store.ExtensionStore {
6
+ enabled = false;
7
+ gentle = true;
8
+ compactRows = false;
9
+ limits = require_power_logs_limits.normalizePowerLogsLimits(void 0);
10
+ constructor() {
11
+ super({
12
+ configName: "logs-preferences",
13
+ defaults: {
14
+ enabled: false,
15
+ gentle: true,
16
+ compactRows: false,
17
+ limits: require_power_logs_limits.normalizePowerLogsLimits(void 0)
18
+ }
19
+ });
20
+ require__global_external_mobx.makeObservable(this, {
21
+ enabled: require__global_external_mobx.observable,
22
+ gentle: require__global_external_mobx.observable,
23
+ compactRows: require__global_external_mobx.observable,
24
+ limits: require__global_external_mobx.observable
25
+ });
26
+ }
27
+ fromStore(data) {
28
+ this.enabled = data?.enabled === true;
29
+ this.gentle = data?.gentle !== false;
30
+ this.compactRows = data?.compactRows === true;
31
+ this.limits = require_power_logs_limits.normalizePowerLogsLimits(data?.limits);
32
+ }
33
+ toJSON() {
34
+ return {
35
+ enabled: this.enabled,
36
+ gentle: this.gentle,
37
+ compactRows: this.compactRows,
38
+ limits: require_power_logs_limits.normalizePowerLogsLimits(this.limits)
39
+ };
40
+ }
41
+ };
42
+ //#endregion
43
+ exports.LogsPreferencesStore = LogsPreferencesStore;
44
+
45
+ //# sourceMappingURL=logs-preferences-store.js.map
@@ -0,0 +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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@64mb/freelens-power",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "description": "Power tools for Freelens Kubernetes IDE",
5
5
  "main": "out/main/index.js",
6
6
  "renderer": "out/renderer/index.js",
7
7
  "files": [
8
8
  "out/**/*",
9
+ "!out/**/duckdb/**",
9
10
  "THIRD_PARTY_LICENSES"
10
11
  ],
11
12
  "engines": {
@@ -81,6 +82,7 @@
81
82
  "dev": "electron-vite build --watch",
82
83
  "test:e2e": "playwright test --config e2e/playwright.config.ts",
83
84
  "test:e2e:provision": "node e2e/provision.mjs",
84
- "type:check:e2e": "tsc -p e2e/tsconfig.json"
85
+ "type:check:e2e": "tsc -p e2e/tsconfig.json",
86
+ "test:packaging": "pnpm build && node --test build/power-logs-assets.test.mjs"
85
87
  }
86
88
  }