kfctl 0.1.4

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,382 @@
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, clear } = 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
+ const [isWrap, setIsWrap] = useState(true);
27
+ // Track current filter state for the log callback (to avoid closure staleness)
28
+ const currentFilter = useRef(filter);
29
+ useEffect(() => {
30
+ currentFilter.current = filter;
31
+ // Re-filter when filter settings change
32
+ refilterAndDisplay();
33
+ }, [filter]);
34
+ // Initialize screen with space for status bar
35
+ const hasInitialized = useRef(false);
36
+ useEffect(() => {
37
+ if (!hasInitialized.current) {
38
+ write('\n\n\n');
39
+ hasInitialized.current = true;
40
+ }
41
+ // Restore wrap on exit
42
+ return () => {
43
+ write('\x1B[?7h');
44
+ };
45
+ }, []);
46
+ // Handle wrap toggling
47
+ useEffect(() => {
48
+ write(isWrap ? '\x1B[?7h' : '\x1B[?7l');
49
+ if (isConnected) {
50
+ refilterAndDisplay();
51
+ }
52
+ }, [isWrap]);
53
+ // Function to clear screen and display filtered logs
54
+ function refilterAndDisplay() {
55
+ // Clear screen
56
+ write('\x1Bc');
57
+ const { pattern, ignoreCase, invert, context, before, after } = currentFilter.current;
58
+ const filtered = filterLines(buffer.current, pattern, ignoreCase, invert, context, before, after);
59
+ if (filtered.length === 0 && pattern) {
60
+ write(chalk.yellow(`No matches found for pattern: ${pattern}\n\n`));
61
+ }
62
+ else {
63
+ let lastIdx = -2;
64
+ filtered.forEach(({ bufferedLine, isMatch, index }) => {
65
+ // Add separator for gaps
66
+ if (index - lastIdx > 1 && pattern) {
67
+ write(chalk.gray('--\n'));
68
+ }
69
+ // Highlight matches in the line
70
+ const highlightedLine = pattern && isMatch
71
+ ? highlightMatches(bufferedLine.line, pattern, ignoreCase)
72
+ : bufferedLine.line;
73
+ // Re-colorize the highlighted line
74
+ const coloredLine = colorizeLogLine(highlightedLine);
75
+ const prefix = isMatch && pattern ? chalk.red('> ') : ' ';
76
+ const podPart = bufferedLine.podPrefix ? `${bufferedLine.podPrefix} ` : '';
77
+ write(`${prefix}${podPart}${coloredLine}\n`);
78
+ lastIdx = index;
79
+ });
80
+ }
81
+ }
82
+ // Track if help is showing
83
+ const [isShowingHelp, setIsShowingHelp] = useState(false);
84
+ const isShowingHelpRef = useRef(false);
85
+ // Sync state to ref for callback access
86
+ useEffect(() => {
87
+ isShowingHelpRef.current = isShowingHelp;
88
+ if (isShowingHelp) {
89
+ write('\x1Bc');
90
+ }
91
+ else {
92
+ // Restore logs when closing help
93
+ if (isConnected) {
94
+ refilterAndDisplay();
95
+ }
96
+ }
97
+ }, [isShowingHelp, isConnected]);
98
+ // Handle keyboard input
99
+ useInput((input, key) => {
100
+ if (isShowingHelp) {
101
+ // Any key exits help
102
+ setIsShowingHelp(false);
103
+ return;
104
+ }
105
+ if (!isConnected) {
106
+ return;
107
+ }
108
+ if (filterMode) {
109
+ // In filter mode, handle text input
110
+ if (key.return) {
111
+ // Apply filter
112
+ filter.setPattern(filterInput);
113
+ setFilterMode(false);
114
+ }
115
+ else if (key.escape) {
116
+ // Cancel filter
117
+ setFilterMode(false);
118
+ setFilterInput('');
119
+ }
120
+ else if (key.backspace || key.delete) {
121
+ if (key.meta) {
122
+ // Option+Delete: Remove last word
123
+ setFilterInput(prev => {
124
+ const words = prev.trimEnd().split(' ');
125
+ words.pop();
126
+ return words.join(' ') + (words.length > 0 ? ' ' : '');
127
+ });
128
+ return;
129
+ }
130
+ if (key.ctrl) {
131
+ // Ctrl+Backspace
132
+ setFilterInput('');
133
+ return;
134
+ }
135
+ setFilterInput(prev => prev.slice(0, -1));
136
+ }
137
+ else if (key.ctrl && input === 'u') {
138
+ // Ctrl+U (Cmd+Delete often sends this)
139
+ setFilterInput('');
140
+ }
141
+ else if (!key.ctrl && !key.meta && input) {
142
+ setFilterInput(prev => prev + input);
143
+ }
144
+ }
145
+ else {
146
+ // Normal mode - keyboard shortcuts
147
+ if (input === '/') {
148
+ // Enter filter mode
149
+ setFilterMode(true);
150
+ setFilterInput(filter.pattern);
151
+ }
152
+ else if (input === 'c') {
153
+ // Clear filter
154
+ filter.clearFilter();
155
+ }
156
+ else if (input === 'i') {
157
+ // Toggle ignore case
158
+ filter.toggleIgnoreCase();
159
+ }
160
+ else if (input === 'v') {
161
+ // Toggle invert
162
+ filter.toggleInvert();
163
+ }
164
+ else if (input === 'p') {
165
+ // Toggle pause
166
+ setPaused(prev => !prev);
167
+ }
168
+ else if (input === '+') {
169
+ // Increase context
170
+ filter.increaseContext();
171
+ }
172
+ else if (input === '-') {
173
+ // Decrease context
174
+ filter.decreaseContext();
175
+ }
176
+ else if (input === '?') {
177
+ setIsShowingHelp(true);
178
+ }
179
+ else if (key.escape && onBack) {
180
+ onBack();
181
+ }
182
+ else if (input === 'x' || (key.ctrl && input === 'l')) {
183
+ // Clear logs
184
+ clear();
185
+ refilterAndDisplay();
186
+ }
187
+ else if (input === 'm') {
188
+ // Mark separator
189
+ const separator = chalk.dim('----------------------------------------------------------------');
190
+ const markLine = {
191
+ podPrefix: '',
192
+ line: '',
193
+ coloredLine: separator,
194
+ timestamp: Date.now(),
195
+ };
196
+ addLine(markLine);
197
+ if (!paused) {
198
+ write(` ${separator}\n`);
199
+ }
200
+ }
201
+ else if (input === 'w') {
202
+ // Toggle wrap
203
+ setIsWrap(prev => !prev);
204
+ }
205
+ }
206
+ }, { isActive: true });
207
+ // Connection state check for non-exit keys
208
+ useEffect(() => {
209
+ if (!isConnected && filterMode) {
210
+ setFilterMode(false);
211
+ }
212
+ }, [isConnected]);
213
+ // Main log streaming effect
214
+ useEffect(() => {
215
+ let cancelled = false;
216
+ async function startFollowing() {
217
+ try {
218
+ setStatus(`Connecting to ${deployment}...`);
219
+ setConnectionProgress('Initializing...');
220
+ setIsConnected(false);
221
+ await followLogs(deployment, namespace, context, tail, (logLine) => {
222
+ if (!cancelled && !paused) {
223
+ // Mark as connected on first log
224
+ if (!isConnected) {
225
+ setIsConnected(true);
226
+ setStatus(`Following logs for ${deployment}`);
227
+ setConnectionProgress('');
228
+ }
229
+ const podPrefix = `[${logLine.pod}/${logLine.container}]`;
230
+ const coloredLine = colorizeLogLine(logLine.line);
231
+ const bufferedLine = {
232
+ podPrefix,
233
+ line: logLine.line,
234
+ coloredLine,
235
+ timestamp: Date.now(),
236
+ };
237
+ // Add to buffer
238
+ addLine(bufferedLine);
239
+ // Use current filter state from ref
240
+ const { pattern, ignoreCase, invert } = currentFilter.current;
241
+ // Check if should display using utils
242
+ // shouldShowLine is now safe against invalid regex (returns true)
243
+ const isMatch = shouldShowLine(logLine.line, pattern, ignoreCase, invert);
244
+ if ((!pattern || isMatch) && !isShowingHelpRef.current) {
245
+ // Highlight matches in real-time
246
+ const highlightedLine = pattern && isMatch
247
+ ? highlightMatches(logLine.line, pattern, ignoreCase)
248
+ : logLine.line;
249
+ const finalColoredLine = colorizeLogLine(highlightedLine);
250
+ const prefix = isMatch && pattern ? chalk.red('> ') : '';
251
+ write(`${prefix}${podPrefix} ${finalColoredLine}\n`);
252
+ }
253
+ }
254
+ }, (error) => {
255
+ if (!cancelled) {
256
+ setIsConnected(false);
257
+ setConnectionProgress('');
258
+ if (retryCount < maxRetry) {
259
+ setRetryCount(prev => prev + 1);
260
+ const nextRetry = retryCount + 1;
261
+ setStatus(`Connection lost. Retrying (${nextRetry}/${maxRetry})...`);
262
+ setTimeout(() => startFollowing(), 2000);
263
+ }
264
+ else {
265
+ setStatus(`Failed after ${maxRetry} attempts: ${error.message}`);
266
+ write(chalk.red(`\n✗ Error: ${error.message}\n`));
267
+ setTimeout(() => exit(), 3000);
268
+ }
269
+ }
270
+ }, (progressMsg) => {
271
+ setConnectionProgress(progressMsg);
272
+ }, timeout * 1000);
273
+ }
274
+ catch (error) {
275
+ if (!cancelled) {
276
+ const errorMsg = error instanceof Error ? error.message : String(error);
277
+ setStatus(`Error: ${errorMsg}`);
278
+ setConnectionProgress('');
279
+ write(chalk.red(`\n✗ ${errorMsg}\n`));
280
+ setTimeout(() => exit(new Error(String(error))), 3000);
281
+ }
282
+ }
283
+ }
284
+ startFollowing();
285
+ return () => {
286
+ cancelled = true;
287
+ };
288
+ }, [deployment, namespace, context, tail, retryCount, paused]);
289
+ // Build status info
290
+ const contextInfo = context ? chalk.blue(`[${context}]`) : '';
291
+ const namespaceInfo = chalk.yellow(`[${namespace}]`);
292
+ const deploymentInfo = chalk.cyan(deployment);
293
+ const filterInfo = filter.pattern
294
+ ? ` | ${filter.invert ? 'NOT ' : ''}/${filter.pattern}/${filter.ignoreCase ? 'i' : ''}${filter.context > 0 ? ` ±${filter.context}` : ''}`
295
+ : '';
296
+ const pauseInfo = paused ? ' [PAUSED]' : '';
297
+ const modeInfo = filterMode ? ' [FILTER MODE]' : '';
298
+ const wrapInfo = !isWrap ? ' [NO WRAP]' : '';
299
+ const bufferInfo = ` (${buffer.current.length})`;
300
+ if (isShowingHelp) {
301
+ return (React.createElement(Box, { flexDirection: "column", padding: 1, borderStyle: "double", borderColor: "cyan" },
302
+ React.createElement(Text, { bold: true, color: "cyan", underline: true }, "KFC Interactive Mode - Keyboard Shortcuts"),
303
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" },
304
+ React.createElement(Text, null,
305
+ React.createElement(Text, { color: "yellow", bold: true }, "/"),
306
+ " Filter logs (type pattern, press Enter)"),
307
+ React.createElement(Text, null,
308
+ React.createElement(Text, { color: "yellow", bold: true }, "c"),
309
+ " Clear filter"),
310
+ React.createElement(Text, null,
311
+ React.createElement(Text, { color: "yellow", bold: true }, "i"),
312
+ " Toggle case-insensitive matching"),
313
+ React.createElement(Text, null,
314
+ React.createElement(Text, { color: "yellow", bold: true }, "v"),
315
+ " Toggle invert match"),
316
+ React.createElement(Text, null,
317
+ React.createElement(Text, { color: "yellow", bold: true }, "p"),
318
+ " Toggle pause/resume log streaming"),
319
+ React.createElement(Text, null,
320
+ React.createElement(Text, { color: "yellow", bold: true }, "+"),
321
+ " Increase context lines"),
322
+ React.createElement(Text, null,
323
+ React.createElement(Text, { color: "yellow", bold: true }, "-"),
324
+ " Decrease context lines"),
325
+ React.createElement(Text, null,
326
+ React.createElement(Text, { color: "yellow", bold: true }, "x"),
327
+ " Clear logs (or Ctrl+L)"),
328
+ React.createElement(Text, null,
329
+ React.createElement(Text, { color: "yellow", bold: true }, "m"),
330
+ " Add mark separator (----)"),
331
+ React.createElement(Text, null,
332
+ React.createElement(Text, { color: "yellow", bold: true }, "w"),
333
+ " Toggle text wrapping"),
334
+ React.createElement(Text, null,
335
+ React.createElement(Text, { color: "yellow", bold: true }, "?"),
336
+ " Show this help"),
337
+ React.createElement(Text, null,
338
+ React.createElement(Text, { color: "yellow", bold: true }, "Esc"),
339
+ " Go back")),
340
+ React.createElement(Box, { marginTop: 1 },
341
+ React.createElement(Text, { dimColor: true }, "Press any key to return..."))));
342
+ }
343
+ return (React.createElement(Box, { flexDirection: "column" },
344
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1 },
345
+ React.createElement(Text, null,
346
+ React.createElement(Text, { color: isConnected ? 'green' : 'gray' }, isConnected ? '●' : '○'),
347
+ context && React.createElement(Text, { color: "blue" },
348
+ " [",
349
+ context,
350
+ "]"),
351
+ React.createElement(Text, { color: "yellow" },
352
+ " [",
353
+ namespace,
354
+ "]"),
355
+ React.createElement(Text, { color: "cyan" },
356
+ " ",
357
+ deployment),
358
+ React.createElement(Text, { color: "magenta" }, filterInfo),
359
+ React.createElement(Text, { color: "yellow" }, pauseInfo),
360
+ React.createElement(Text, { color: "red" }, wrapInfo),
361
+ React.createElement(Text, { color: "yellow" }, modeInfo),
362
+ React.createElement(Text, { dimColor: true }, bufferInfo))),
363
+ filterMode && (React.createElement(Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginTop: 1 },
364
+ React.createElement(Text, { color: "yellow" },
365
+ "Filter: ",
366
+ React.createElement(Text, { color: "white" }, filterInput),
367
+ React.createElement(Text, { dimColor: true }, " (Enter to apply, Esc to cancel)")))),
368
+ !filterMode && isConnected && (React.createElement(Box, { marginTop: 1 },
369
+ React.createElement(Text, { dimColor: true },
370
+ "Press ",
371
+ React.createElement(Text, { color: "yellow" }, "?"),
372
+ " for help, ",
373
+ React.createElement(Text, { color: "yellow" }, "/"),
374
+ " to filter"))),
375
+ !isConnected && (React.createElement(Box, { marginTop: 1 },
376
+ React.createElement(Text, { color: "yellow" },
377
+ React.createElement(Spinner, { type: "dots" }),
378
+ " ",
379
+ connectionProgress || 'Connecting...',
380
+ retryCount > 0 && ` (Retry ${retryCount}/${maxRetry})`)))));
381
+ }
382
+ //# 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>;