kubefc 0.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.
@@ -0,0 +1,335 @@
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+ import { Box, Text, useApp, useStdout, useInput } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import chalk from 'chalk';
5
+ import { followLogs } from '../k8s/client.js';
6
+ import { colorizeLogLine } from '../utils/colorize.js';
7
+ import { useLogBuffer } from '../hooks/useLogBuffer.js';
8
+ import { useLogFilter } from '../hooks/useLogFilter.js';
9
+ import { filterLines, shouldShowLine } from '../utils/logFilter.js';
10
+ import { highlightMatches } from '../utils/logHighlight.js';
11
+ export default function LogViewer({ deployment, namespace, context, tail, maxRetry, timeout, grepPattern: initialPattern, grepAfter: initialAfter = 0, grepBefore: initialBefore = 0, grepContext: initialContext = 0, grepIgnoreCase: initialIgnoreCase = false, grepInvert: initialInvert = false, onBack, }) {
12
+ const { exit } = useApp();
13
+ const { write } = useStdout();
14
+ // Connection state
15
+ const [status, setStatus] = useState('Connecting...');
16
+ const [connectionProgress, setConnectionProgress] = useState('');
17
+ const [retryCount, setRetryCount] = useState(0);
18
+ const [isConnected, setIsConnected] = useState(false);
19
+ // Use custom hooks for buffer and filter management
20
+ const { buffer, addLine } = useLogBuffer(10000);
21
+ const filter = useLogFilter(initialPattern, initialAfter, initialBefore, initialContext, initialIgnoreCase, initialInvert);
22
+ // Interactive state
23
+ const [filterMode, setFilterMode] = useState(false);
24
+ const [filterInput, setFilterInput] = useState('');
25
+ const [paused, setPaused] = useState(false);
26
+ // Track current filter state for the log callback (to avoid closure staleness)
27
+ const currentFilter = useRef(filter);
28
+ useEffect(() => {
29
+ currentFilter.current = filter;
30
+ // Re-filter when filter settings change
31
+ refilterAndDisplay();
32
+ }, [filter]);
33
+ // Initialize screen with space for status bar
34
+ const hasInitialized = useRef(false);
35
+ useEffect(() => {
36
+ if (!hasInitialized.current) {
37
+ write('\n\n\n');
38
+ hasInitialized.current = true;
39
+ }
40
+ }, []);
41
+ // Function to clear screen and display filtered logs
42
+ function refilterAndDisplay() {
43
+ // Clear screen
44
+ write('\x1Bc');
45
+ const { pattern, ignoreCase, invert, context, before, after } = currentFilter.current;
46
+ const filtered = filterLines(buffer.current, pattern, ignoreCase, invert, context, before, after);
47
+ if (filtered.length === 0 && pattern) {
48
+ write(chalk.yellow(`No matches found for pattern: ${pattern}\n\n`));
49
+ }
50
+ else {
51
+ let lastIdx = -2;
52
+ filtered.forEach(({ bufferedLine, isMatch, index }) => {
53
+ // Add separator for gaps
54
+ if (index - lastIdx > 1 && pattern) {
55
+ write(chalk.gray('--\n'));
56
+ }
57
+ // Highlight matches in the line
58
+ const highlightedLine = pattern && isMatch
59
+ ? highlightMatches(bufferedLine.line, pattern, ignoreCase)
60
+ : bufferedLine.line;
61
+ // Re-colorize the highlighted line
62
+ const coloredLine = colorizeLogLine(highlightedLine);
63
+ const prefix = isMatch && pattern ? chalk.red('> ') : ' ';
64
+ write(`${prefix}${bufferedLine.podPrefix} ${coloredLine}\n`);
65
+ lastIdx = index;
66
+ });
67
+ }
68
+ }
69
+ // Track if help is showing
70
+ const [isShowingHelp, setIsShowingHelp] = useState(false);
71
+ const isShowingHelpRef = useRef(false);
72
+ // Sync state to ref for callback access
73
+ useEffect(() => {
74
+ isShowingHelpRef.current = isShowingHelp;
75
+ if (isShowingHelp) {
76
+ write('\x1Bc');
77
+ }
78
+ else {
79
+ // Restore logs when closing help
80
+ if (isConnected) {
81
+ refilterAndDisplay();
82
+ }
83
+ }
84
+ }, [isShowingHelp, isConnected]);
85
+ // Handle keyboard input
86
+ useInput((input, key) => {
87
+ if (isShowingHelp) {
88
+ // Any key exits help
89
+ setIsShowingHelp(false);
90
+ return;
91
+ }
92
+ if (!isConnected) {
93
+ return;
94
+ }
95
+ if (filterMode) {
96
+ // In filter mode, handle text input
97
+ if (key.return) {
98
+ // Apply filter
99
+ filter.setPattern(filterInput);
100
+ setFilterMode(false);
101
+ }
102
+ else if (key.escape) {
103
+ // Cancel filter
104
+ setFilterMode(false);
105
+ setFilterInput('');
106
+ }
107
+ else if (key.backspace || key.delete) {
108
+ if (key.meta) {
109
+ // Option+Delete: Remove last word
110
+ setFilterInput(prev => {
111
+ const words = prev.trimEnd().split(' ');
112
+ words.pop();
113
+ return words.join(' ') + (words.length > 0 ? ' ' : '');
114
+ });
115
+ return;
116
+ }
117
+ if (key.ctrl) {
118
+ // Ctrl+Backspace
119
+ setFilterInput('');
120
+ return;
121
+ }
122
+ setFilterInput(prev => prev.slice(0, -1));
123
+ }
124
+ else if (key.ctrl && input === 'u') {
125
+ // Ctrl+U (Cmd+Delete often sends this)
126
+ setFilterInput('');
127
+ }
128
+ else if (!key.ctrl && !key.meta && input) {
129
+ setFilterInput(prev => prev + input);
130
+ }
131
+ }
132
+ else {
133
+ // Normal mode - keyboard shortcuts
134
+ if (input === '/') {
135
+ // Enter filter mode
136
+ setFilterMode(true);
137
+ setFilterInput(filter.pattern);
138
+ }
139
+ else if (input === 'c') {
140
+ // Clear filter
141
+ filter.clearFilter();
142
+ }
143
+ else if (input === 'i') {
144
+ // Toggle ignore case
145
+ filter.toggleIgnoreCase();
146
+ }
147
+ else if (input === 'v') {
148
+ // Toggle invert
149
+ filter.toggleInvert();
150
+ }
151
+ else if (input === 'p') {
152
+ // Toggle pause
153
+ setPaused(prev => !prev);
154
+ }
155
+ else if (input === '+') {
156
+ // Increase context
157
+ filter.increaseContext();
158
+ }
159
+ else if (input === '-') {
160
+ // Decrease context
161
+ filter.decreaseContext();
162
+ }
163
+ else if (input === '?') {
164
+ setIsShowingHelp(true);
165
+ }
166
+ else if (key.escape && onBack) {
167
+ onBack();
168
+ }
169
+ }
170
+ }, { isActive: true });
171
+ // Connection state check for non-exit keys
172
+ useEffect(() => {
173
+ if (!isConnected && filterMode) {
174
+ setFilterMode(false);
175
+ }
176
+ }, [isConnected]);
177
+ // Main log streaming effect
178
+ useEffect(() => {
179
+ let cancelled = false;
180
+ async function startFollowing() {
181
+ try {
182
+ setStatus(`Connecting to ${deployment}...`);
183
+ setConnectionProgress('Initializing...');
184
+ setIsConnected(false);
185
+ await followLogs(deployment, namespace, context, tail, (logLine) => {
186
+ if (!cancelled && !paused) {
187
+ // Mark as connected on first log
188
+ if (!isConnected) {
189
+ setIsConnected(true);
190
+ setStatus(`Following logs for ${deployment}`);
191
+ setConnectionProgress('');
192
+ }
193
+ const podPrefix = `[${logLine.pod}/${logLine.container}]`;
194
+ const coloredLine = colorizeLogLine(logLine.line);
195
+ const bufferedLine = {
196
+ podPrefix,
197
+ line: logLine.line,
198
+ coloredLine,
199
+ timestamp: Date.now(),
200
+ };
201
+ // Add to buffer
202
+ addLine(bufferedLine);
203
+ // Use current filter state from ref
204
+ const { pattern, ignoreCase, invert } = currentFilter.current;
205
+ // Check if should display using utils
206
+ // shouldShowLine is now safe against invalid regex (returns true)
207
+ const isMatch = shouldShowLine(logLine.line, pattern, ignoreCase, invert);
208
+ if ((!pattern || isMatch) && !isShowingHelpRef.current) {
209
+ // Highlight matches in real-time
210
+ const highlightedLine = pattern && isMatch
211
+ ? highlightMatches(logLine.line, pattern, ignoreCase)
212
+ : logLine.line;
213
+ const finalColoredLine = colorizeLogLine(highlightedLine);
214
+ const prefix = isMatch && pattern ? chalk.red('> ') : '';
215
+ write(`${prefix}${podPrefix} ${finalColoredLine}\n`);
216
+ }
217
+ }
218
+ }, (error) => {
219
+ if (!cancelled) {
220
+ setIsConnected(false);
221
+ setConnectionProgress('');
222
+ if (retryCount < maxRetry) {
223
+ setRetryCount(prev => prev + 1);
224
+ const nextRetry = retryCount + 1;
225
+ setStatus(`Connection lost. Retrying (${nextRetry}/${maxRetry})...`);
226
+ setTimeout(() => startFollowing(), 2000);
227
+ }
228
+ else {
229
+ setStatus(`Failed after ${maxRetry} attempts: ${error.message}`);
230
+ write(chalk.red(`\n✗ Error: ${error.message}\n`));
231
+ setTimeout(() => exit(), 3000);
232
+ }
233
+ }
234
+ }, (progressMsg) => {
235
+ setConnectionProgress(progressMsg);
236
+ }, timeout * 1000);
237
+ }
238
+ catch (error) {
239
+ if (!cancelled) {
240
+ const errorMsg = error instanceof Error ? error.message : String(error);
241
+ setStatus(`Error: ${errorMsg}`);
242
+ setConnectionProgress('');
243
+ write(chalk.red(`\n✗ ${errorMsg}\n`));
244
+ setTimeout(() => exit(new Error(String(error))), 3000);
245
+ }
246
+ }
247
+ }
248
+ startFollowing();
249
+ return () => {
250
+ cancelled = true;
251
+ };
252
+ }, [deployment, namespace, context, tail, retryCount, paused]);
253
+ // Build status info
254
+ const contextInfo = context ? chalk.blue(`[${context}]`) : '';
255
+ const namespaceInfo = chalk.yellow(`[${namespace}]`);
256
+ const deploymentInfo = chalk.cyan(deployment);
257
+ const filterInfo = filter.pattern
258
+ ? ` | ${filter.invert ? 'NOT ' : ''}/${filter.pattern}/${filter.ignoreCase ? 'i' : ''}${filter.context > 0 ? ` ±${filter.context}` : ''}`
259
+ : '';
260
+ const pauseInfo = paused ? ' [PAUSED]' : '';
261
+ const modeInfo = filterMode ? ' [FILTER MODE]' : '';
262
+ const bufferInfo = ` (${buffer.current.length})`;
263
+ if (isShowingHelp) {
264
+ return (React.createElement(Box, { flexDirection: "column", padding: 1, borderStyle: "double", borderColor: "cyan" },
265
+ React.createElement(Text, { bold: true, color: "cyan", underline: true }, "KFC Interactive Mode - Keyboard Shortcuts"),
266
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" },
267
+ React.createElement(Text, null,
268
+ React.createElement(Text, { color: "yellow", bold: true }, "/"),
269
+ " Filter logs (type pattern, press Enter)"),
270
+ React.createElement(Text, null,
271
+ React.createElement(Text, { color: "yellow", bold: true }, "c"),
272
+ " Clear filter"),
273
+ React.createElement(Text, null,
274
+ React.createElement(Text, { color: "yellow", bold: true }, "i"),
275
+ " Toggle case-insensitive matching"),
276
+ React.createElement(Text, null,
277
+ React.createElement(Text, { color: "yellow", bold: true }, "v"),
278
+ " Toggle invert match"),
279
+ React.createElement(Text, null,
280
+ React.createElement(Text, { color: "yellow", bold: true }, "p"),
281
+ " Toggle pause/resume log streaming"),
282
+ React.createElement(Text, null,
283
+ React.createElement(Text, { color: "yellow", bold: true }, "+"),
284
+ " Increase context lines"),
285
+ React.createElement(Text, null,
286
+ React.createElement(Text, { color: "yellow", bold: true }, "-"),
287
+ " Decrease context lines"),
288
+ React.createElement(Text, null,
289
+ React.createElement(Text, { color: "yellow", bold: true }, "?"),
290
+ " Show this help"),
291
+ React.createElement(Text, null,
292
+ React.createElement(Text, { color: "yellow", bold: true }, "Esc"),
293
+ " Go back")),
294
+ React.createElement(Box, { marginTop: 1 },
295
+ React.createElement(Text, { dimColor: true }, "Press any key to return..."))));
296
+ }
297
+ return (React.createElement(Box, { flexDirection: "column" },
298
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1 },
299
+ React.createElement(Text, null,
300
+ React.createElement(Text, { color: isConnected ? 'green' : 'gray' }, isConnected ? '●' : '○'),
301
+ context && React.createElement(Text, { color: "blue" },
302
+ " [",
303
+ context,
304
+ "]"),
305
+ React.createElement(Text, { color: "yellow" },
306
+ " [",
307
+ namespace,
308
+ "]"),
309
+ React.createElement(Text, { color: "cyan" },
310
+ " ",
311
+ deployment),
312
+ React.createElement(Text, { color: "magenta" }, filterInfo),
313
+ React.createElement(Text, { color: "yellow" }, pauseInfo),
314
+ React.createElement(Text, { color: "yellow" }, modeInfo),
315
+ React.createElement(Text, { dimColor: true }, bufferInfo))),
316
+ filterMode && (React.createElement(Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginTop: 1 },
317
+ React.createElement(Text, { color: "yellow" },
318
+ "Filter: ",
319
+ React.createElement(Text, { color: "white" }, filterInput),
320
+ React.createElement(Text, { dimColor: true }, " (Enter to apply, Esc to cancel)")))),
321
+ !filterMode && isConnected && (React.createElement(Box, { marginTop: 1 },
322
+ React.createElement(Text, { dimColor: true },
323
+ "Press ",
324
+ React.createElement(Text, { color: "yellow" }, "?"),
325
+ " for help, ",
326
+ React.createElement(Text, { color: "yellow" }, "/"),
327
+ " to filter"))),
328
+ !isConnected && (React.createElement(Box, { marginTop: 1 },
329
+ React.createElement(Text, { color: "yellow" },
330
+ React.createElement(Spinner, { type: "dots" }),
331
+ " ",
332
+ connectionProgress || 'Connecting...',
333
+ retryCount > 0 && ` (Retry ${retryCount}/${maxRetry})`)))));
334
+ }
335
+ //# sourceMappingURL=LogViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogViewer.js","sourceRoot":"","sources":["../../src/components/LogViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Hook for managing log buffer
3
+ */
4
+ export interface BufferedLine {
5
+ podPrefix: string;
6
+ line: string;
7
+ coloredLine: string;
8
+ timestamp: number;
9
+ }
10
+ export interface UseLogBufferReturn {
11
+ buffer: React.MutableRefObject<BufferedLine[]>;
12
+ addLine: (line: BufferedLine) => void;
13
+ clear: () => void;
14
+ getSize: () => number;
15
+ }
16
+ export declare function useLogBuffer(maxSize?: number): UseLogBufferReturn;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Hook for managing log buffer
3
+ */
4
+ import { useRef, useCallback } from 'react';
5
+ export function useLogBuffer(maxSize = 10000) {
6
+ const buffer = useRef([]);
7
+ const addLine = useCallback((line) => {
8
+ buffer.current.push(line);
9
+ // Trim buffer if too large
10
+ if (buffer.current.length > maxSize) {
11
+ buffer.current = buffer.current.slice(-maxSize);
12
+ }
13
+ }, [maxSize]);
14
+ const clear = useCallback(() => {
15
+ buffer.current = [];
16
+ }, []);
17
+ const getSize = useCallback(() => {
18
+ return buffer.current.length;
19
+ }, []);
20
+ return {
21
+ buffer,
22
+ addLine,
23
+ clear,
24
+ getSize,
25
+ };
26
+ }
27
+ //# sourceMappingURL=useLogBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogBuffer.js","sourceRoot":"","sources":["../../src/hooks/useLogBuffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAgB5C,MAAM,UAAU,YAAY,CAAC,UAAkB,KAAK;IACnD,MAAM,MAAM,GAAG,MAAM,CAAiB,EAAE,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,WAAW,CAC1B,CAAC,IAAkB,EAAE,EAAE;QACtB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1B,2BAA2B;QAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;IACF,CAAC,EACD,CAAC,OAAO,CAAC,CACT,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACN,MAAM;QACN,OAAO;QACP,KAAK;QACL,OAAO;KACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Hook for managing log filter state
3
+ */
4
+ export interface LogFilterState {
5
+ pattern: string;
6
+ ignoreCase: boolean;
7
+ invert: boolean;
8
+ context: number;
9
+ before: number;
10
+ after: number;
11
+ }
12
+ export interface LogFilterActions {
13
+ setPattern: (pattern: string) => void;
14
+ toggleIgnoreCase: () => void;
15
+ toggleInvert: () => void;
16
+ increaseContext: () => void;
17
+ decreaseContext: () => void;
18
+ clearFilter: () => void;
19
+ }
20
+ export interface UseLogFilterReturn extends LogFilterState, LogFilterActions {
21
+ }
22
+ export declare function useLogFilter(initialPattern?: string, initialAfter?: number, initialBefore?: number, initialContext?: number, initialIgnoreCase?: boolean, initialInvert?: boolean): UseLogFilterReturn;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Hook for managing log filter state
3
+ */
4
+ import { useState, useCallback } from 'react';
5
+ export function useLogFilter(initialPattern, initialAfter = 0, initialBefore = 0, initialContext = 0, initialIgnoreCase = false, initialInvert = false) {
6
+ const [pattern, setPattern] = useState(initialPattern || '');
7
+ const [ignoreCase, setIgnoreCase] = useState(initialIgnoreCase);
8
+ const [invert, setInvert] = useState(initialInvert);
9
+ const [context, setContext] = useState(initialContext);
10
+ const [before] = useState(initialBefore);
11
+ const [after] = useState(initialAfter);
12
+ const toggleIgnoreCase = useCallback(() => {
13
+ setIgnoreCase((prev) => !prev);
14
+ }, []);
15
+ const toggleInvert = useCallback(() => {
16
+ setInvert((prev) => !prev);
17
+ }, []);
18
+ const increaseContext = useCallback(() => {
19
+ setContext((prev) => Math.min(prev + 1, 20));
20
+ }, []);
21
+ const decreaseContext = useCallback(() => {
22
+ setContext((prev) => Math.max(prev - 1, 0));
23
+ }, []);
24
+ const clearFilter = useCallback(() => {
25
+ setPattern('');
26
+ setIgnoreCase(false);
27
+ setInvert(false);
28
+ setContext(0);
29
+ }, []);
30
+ return {
31
+ pattern,
32
+ ignoreCase,
33
+ invert,
34
+ context,
35
+ before,
36
+ after,
37
+ setPattern,
38
+ toggleIgnoreCase,
39
+ toggleInvert,
40
+ increaseContext,
41
+ decreaseContext,
42
+ clearFilter,
43
+ };
44
+ }
45
+ //# sourceMappingURL=useLogFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogFilter.js","sourceRoot":"","sources":["../../src/hooks/useLogFilter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAsB9C,MAAM,UAAU,YAAY,CAC3B,cAAuB,EACvB,eAAuB,CAAC,EACxB,gBAAwB,CAAC,EACzB,iBAAyB,CAAC,EAC1B,oBAA6B,KAAK,EAClC,gBAAyB,KAAK;IAE9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACN,OAAO;QACP,UAAU;QACV,MAAM;QACN,OAAO;QACP,MAAM;QACN,KAAK;QACL,UAAU;QACV,gBAAgB;QAChB,YAAY;QACZ,eAAe;QACf,eAAe;QACf,WAAW;KACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface LogLine {
2
+ pod: string;
3
+ container: string;
4
+ line: string;
5
+ timestamp?: Date;
6
+ }
7
+ export declare function getContexts(): string[];
8
+ export declare function getCurrentContext(): string;
9
+ export declare function getNamespaces(context?: string, timeoutMs?: number): Promise<string[]>;
10
+ export declare function getDeployments(namespace: string, context?: string, timeoutMs?: number): Promise<string[]>;
11
+ export declare function followLogs(deployment: string, namespace: string, context: string | undefined, tailLines: number, onLog: (log: LogLine) => void, onError: (error: Error) => void, onProgress?: (message: string) => void, timeoutMs?: number): Promise<void>;
@@ -0,0 +1,134 @@
1
+ import * as k8s from '@kubernetes/client-node';
2
+ import { Writable } from 'stream';
3
+ // Helper function to add timeout to promises
4
+ function withTimeout(promise, timeoutMs, operation) {
5
+ return Promise.race([
6
+ promise,
7
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms: ${operation}`)), timeoutMs)),
8
+ ]);
9
+ }
10
+ export function getContexts() {
11
+ const kc = new k8s.KubeConfig();
12
+ kc.loadFromDefault();
13
+ return kc.contexts.map(ctx => ctx.name);
14
+ }
15
+ export function getCurrentContext() {
16
+ const kc = new k8s.KubeConfig();
17
+ kc.loadFromDefault();
18
+ return kc.currentContext;
19
+ }
20
+ export async function getNamespaces(context, timeoutMs = 5000) {
21
+ const kc = new k8s.KubeConfig();
22
+ kc.loadFromDefault();
23
+ if (context) {
24
+ kc.setCurrentContext(context);
25
+ }
26
+ const coreApi = kc.makeApiClient(k8s.CoreV1Api);
27
+ try {
28
+ const response = await withTimeout(coreApi.listNamespace(), timeoutMs, `listing namespaces${context ? ` (context: ${context})` : ''}`);
29
+ return response.items.map((item) => item.metadata?.name || '').filter(Boolean);
30
+ }
31
+ catch (error) {
32
+ throw new Error(`Failed to list namespaces: ${error instanceof Error ? error.message : String(error)}`);
33
+ }
34
+ }
35
+ export async function getDeployments(namespace, context, timeoutMs = 15000) {
36
+ const kc = new k8s.KubeConfig();
37
+ kc.loadFromDefault();
38
+ if (context) {
39
+ kc.setCurrentContext(context);
40
+ }
41
+ const appsApi = kc.makeApiClient(k8s.AppsV1Api);
42
+ try {
43
+ const response = await withTimeout(appsApi.listNamespacedDeployment({ namespace }), timeoutMs, `listing deployments in namespace "${namespace}"${context ? ` (context: ${context})` : ''}`);
44
+ return response.items.map((item) => item.metadata?.name || '').filter(Boolean);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof Error && error.message.includes('timed out')) {
48
+ throw new Error(`Connection timeout: Unable to connect to cluster${context ? ` "${context}"` : ''}. Please check your network connection and cluster availability.`);
49
+ }
50
+ throw new Error(`Failed to list deployments: ${error instanceof Error ? error.message : String(error)}`);
51
+ }
52
+ }
53
+ export async function followLogs(deployment, namespace, context, tailLines, onLog, onError, onProgress, timeoutMs = 10000) {
54
+ const kc = new k8s.KubeConfig();
55
+ kc.loadFromDefault();
56
+ if (context) {
57
+ kc.setCurrentContext(context);
58
+ }
59
+ const coreApi = kc.makeApiClient(k8s.CoreV1Api);
60
+ const appsApi = kc.makeApiClient(k8s.AppsV1Api);
61
+ try {
62
+ // Get deployment
63
+ onProgress?.('Fetching deployment info...');
64
+ let deploymentResponse;
65
+ try {
66
+ deploymentResponse = await withTimeout(appsApi.readNamespacedDeployment({ name: deployment, namespace }), timeoutMs, `reading deployment "${deployment}"`);
67
+ }
68
+ catch (error) {
69
+ if (error instanceof Error && error.message.includes('timed out')) {
70
+ throw new Error(`Connection timeout: Unable to connect to cluster${context ? ` "${context}"` : ''}. Please check your network connection and cluster availability.`);
71
+ }
72
+ if (error.response?.statusCode === 404) {
73
+ throw new Error(`Deployment "${deployment}" not found in namespace "${namespace}". Use 'kubectl get deployments -n ${namespace}' to list available deployments.`);
74
+ }
75
+ throw error;
76
+ }
77
+ const selector = deploymentResponse.spec?.selector?.matchLabels;
78
+ if (!selector) {
79
+ throw new Error('Deployment has no selector labels');
80
+ }
81
+ // Convert selector to label selector string
82
+ const labelSelector = Object.entries(selector)
83
+ .map(([key, value]) => `${key}=${value}`)
84
+ .join(',');
85
+ // Get pods
86
+ onProgress?.('Finding pods...');
87
+ const podsResponse = await withTimeout(coreApi.listNamespacedPod({
88
+ namespace,
89
+ labelSelector,
90
+ }), timeoutMs, `listing pods for deployment "${deployment}"`);
91
+ if (podsResponse.items.length === 0) {
92
+ throw new Error(`No pods found for deployment "${deployment}". The deployment may have 0 replicas.`);
93
+ }
94
+ // Follow logs from the first running pod
95
+ const pod = podsResponse.items.find((p) => p.status?.phase === 'Running');
96
+ if (!pod || !pod.metadata?.name) {
97
+ throw new Error('No running pods found');
98
+ }
99
+ const podName = pod.metadata.name;
100
+ const containerName = pod.spec?.containers[0]?.name || '';
101
+ // Create log stream
102
+ onProgress?.(`Connecting to pod ${podName}...`);
103
+ const logStream = new k8s.Log(kc);
104
+ const stream = new Writable({
105
+ write(chunk, encoding, callback) {
106
+ const lines = chunk.toString().split('\n').filter(Boolean);
107
+ lines.forEach((line) => {
108
+ onLog({
109
+ pod: podName,
110
+ container: containerName,
111
+ line,
112
+ timestamp: new Date(),
113
+ });
114
+ });
115
+ callback();
116
+ },
117
+ });
118
+ try {
119
+ await logStream.log(namespace, podName, containerName, stream, {
120
+ follow: true,
121
+ tailLines,
122
+ pretty: false,
123
+ timestamps: false,
124
+ });
125
+ }
126
+ catch (error) {
127
+ onError(error instanceof Error ? error : new Error(String(error)));
128
+ }
129
+ }
130
+ catch (error) {
131
+ onError(error instanceof Error ? error : new Error(String(error)));
132
+ }
133
+ }
134
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/k8s/client.ts"],"names":[],"mappings":"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"}
Binary file
@@ -0,0 +1,2 @@
1
+ export declare function getCachedDeployments(context: string, namespace: string): string[] | null;
2
+ export declare function setCachedDeployments(context: string, namespace: string, deployments: string[]): void;