@gxp-dev/tools 2.0.11 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lib/cli.js +42 -0
- package/bin/lib/commands/extract-config.js +186 -0
- package/bin/lib/commands/index.js +2 -0
- package/bin/lib/commands/init.js +446 -180
- package/bin/lib/tui/App.tsx +158 -41
- package/bin/lib/tui/components/CommandInput.tsx +100 -95
- package/bin/lib/tui/components/LogPanel.tsx +30 -17
- package/bin/lib/tui/components/TabBar.tsx +1 -1
- package/bin/lib/utils/ai-scaffold.js +877 -0
- package/bin/lib/utils/extract-config.js +468 -0
- package/bin/lib/utils/files.js +43 -2
- package/bin/lib/utils/index.js +4 -0
- package/bin/lib/utils/prompts.js +352 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +134 -40
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +87 -89
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/LogPanel.d.ts +4 -2
- package/dist/tui/components/LogPanel.d.ts.map +1 -1
- package/dist/tui/components/LogPanel.js +25 -15
- package/dist/tui/components/LogPanel.js.map +1 -1
- package/dist/tui/components/TabBar.js +1 -1
- package/dist/tui/components/TabBar.js.map +1 -1
- package/mcp/gxp-api-server.js +524 -0
- package/package.json +4 -2
- package/runtime/stores/gxpPortalConfigStore.js +9 -0
- package/template/.claude/agents/gxp-developer.md +335 -0
- package/template/.claude/settings.json +9 -0
- package/template/AGENTS.md +125 -0
- package/template/GEMINI.md +80 -0
- package/template/app-manifest.json +1 -0
|
@@ -1,40 +1,57 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useState, useMemo, useEffect } from 'react';
|
|
2
|
+
import React, { useState, useMemo, useEffect, useCallback, useRef } from 'react';
|
|
3
3
|
import { Box, Text, useInput } from 'ink';
|
|
4
4
|
import TextInput from 'ink-text-input';
|
|
5
|
-
// Command definitions with descriptions
|
|
5
|
+
// Command definitions with descriptions - comprehensive list
|
|
6
6
|
const COMMANDS = [
|
|
7
|
-
|
|
7
|
+
// Dev server commands
|
|
8
|
+
{ cmd: '/dev', args: '', desc: 'Start Vite dev server' },
|
|
8
9
|
{ cmd: '/dev', args: '--with-socket', desc: 'Start Vite + Socket.IO' },
|
|
9
|
-
{ cmd: '/dev', args: '--with-mock', desc: 'Start Vite + Socket.IO + Mock API
|
|
10
|
-
{ cmd: '/dev', args: '--firefox', desc: 'Start Vite + Firefox extension' },
|
|
11
|
-
{ cmd: '/dev', args: '--chrome', desc: 'Start Vite + Chrome extension' },
|
|
12
|
-
{ cmd: '/dev', args: '--no-socket', desc: 'Start Vite without Socket.IO' },
|
|
10
|
+
{ cmd: '/dev', args: '--with-mock', desc: 'Start Vite + Socket.IO + Mock API' },
|
|
13
11
|
{ cmd: '/dev', args: '--no-https', desc: 'Start Vite without SSL' },
|
|
12
|
+
{ cmd: '/dev', args: '--no-socket', desc: 'Start Vite without Socket.IO' },
|
|
13
|
+
{ cmd: '/dev', args: '--chrome', desc: 'Start Vite + Chrome extension' },
|
|
14
|
+
{ cmd: '/dev', args: '--firefox', desc: 'Start Vite + Firefox extension' },
|
|
15
|
+
// Socket commands
|
|
14
16
|
{ cmd: '/socket', args: '', desc: 'Start Socket.IO server' },
|
|
15
|
-
{ cmd: '/socket', args: '
|
|
16
|
-
{ cmd: '/socket', args: '
|
|
17
|
-
{ cmd: '/
|
|
18
|
-
{ cmd: '/
|
|
19
|
-
|
|
20
|
-
{ cmd: '/
|
|
17
|
+
{ cmd: '/socket', args: '--with-mock', desc: 'Start Socket.IO + Mock API' },
|
|
18
|
+
{ cmd: '/socket', args: 'send <event>', desc: 'Send a socket event' },
|
|
19
|
+
{ cmd: '/socket', args: 'list', desc: 'List available socket events' },
|
|
20
|
+
{ cmd: '/mock', args: '', desc: 'Start Socket.IO + Mock API (shorthand)' },
|
|
21
|
+
// Browser extension commands
|
|
22
|
+
{ cmd: '/ext', args: 'chrome', desc: 'Launch Chrome with extension' },
|
|
23
|
+
{ cmd: '/ext', args: 'firefox', desc: 'Launch Firefox with extension' },
|
|
24
|
+
// Service management
|
|
25
|
+
{ cmd: '/stop', args: '[service]', desc: 'Stop current or specified service' },
|
|
26
|
+
{ cmd: '/restart', args: '[service]', desc: 'Restart current or specified service' },
|
|
21
27
|
{ cmd: '/clear', args: '', desc: 'Clear current log panel' },
|
|
22
|
-
|
|
23
|
-
{ cmd: '/
|
|
28
|
+
// Config extraction
|
|
29
|
+
{ cmd: '/extract-config', args: '', desc: 'Extract GxP config from source' },
|
|
30
|
+
{ cmd: '/extract-config', args: '--dry-run', desc: 'Preview config extraction' },
|
|
31
|
+
{ cmd: '/extract-config', args: '--overwrite', desc: 'Overwrite existing config values' },
|
|
32
|
+
// AI commands
|
|
33
|
+
{ cmd: '/gemini', args: '', desc: 'Open Gemini AI chat panel' },
|
|
34
|
+
{ cmd: '/gemini', args: 'enable', desc: 'Set up Google authentication' },
|
|
24
35
|
{ cmd: '/gemini', args: 'ask <query>', desc: 'Quick AI question' },
|
|
36
|
+
{ cmd: '/gemini', args: 'status', desc: 'Check AI auth status' },
|
|
37
|
+
{ cmd: '/gemini', args: 'logout', desc: 'Log out from Gemini' },
|
|
38
|
+
{ cmd: '/gemini', args: 'clear', desc: 'Clear conversation history' },
|
|
39
|
+
{ cmd: '/ai', args: '', desc: 'Open Gemini AI chat (alias)' },
|
|
40
|
+
// General
|
|
25
41
|
{ cmd: '/help', args: '', desc: 'Show all commands' },
|
|
26
42
|
{ cmd: '/quit', args: '', desc: 'Exit application' },
|
|
43
|
+
{ cmd: '/exit', args: '', desc: 'Exit application (alias)' },
|
|
27
44
|
];
|
|
28
45
|
export default function CommandInput({ onSubmit, activeService, onSuggestionsChange }) {
|
|
29
|
-
const [value, setValue] = useState('');
|
|
30
|
-
const [displayValue, setDisplayValue] = useState(''); // What's shown in input (may differ when navigating)
|
|
31
|
-
const [isNavigating, setIsNavigating] = useState(false); // Track if user is arrowing through suggestions
|
|
46
|
+
const [value, setValue] = useState('');
|
|
32
47
|
const [history, setHistory] = useState([]);
|
|
33
48
|
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
34
49
|
const [selectedSuggestion, setSelectedSuggestion] = useState(0);
|
|
35
|
-
//
|
|
36
|
-
const
|
|
37
|
-
//
|
|
50
|
+
// Use ref to track if we should skip the next onChange (after programmatic update)
|
|
51
|
+
const skipNextChange = useRef(false);
|
|
52
|
+
// Track previous suggestion count to avoid unnecessary parent updates
|
|
53
|
+
const prevSuggestionCount = useRef(0);
|
|
54
|
+
// Filter commands based on typed value
|
|
38
55
|
const suggestions = useMemo(() => {
|
|
39
56
|
if (!value.startsWith('/'))
|
|
40
57
|
return [];
|
|
@@ -43,11 +60,11 @@ export default function CommandInput({ onSubmit, activeService, onSuggestionsCha
|
|
|
43
60
|
const fullCmd = c.args ? `${c.cmd} ${c.args}` : c.cmd;
|
|
44
61
|
return fullCmd.toLowerCase().includes(search) ||
|
|
45
62
|
c.cmd.toLowerCase().startsWith(search);
|
|
46
|
-
});
|
|
63
|
+
}).slice(0, 8); // Limit to 8 suggestions for cleaner UI
|
|
47
64
|
}, [value]);
|
|
48
65
|
const showSuggestions = value.startsWith('/') && value.length >= 1 && suggestions.length > 0;
|
|
49
66
|
// Helper to build full command string from suggestion
|
|
50
|
-
const buildFullCommand = (suggestion) => {
|
|
67
|
+
const buildFullCommand = useCallback((suggestion) => {
|
|
51
68
|
if (suggestion.args) {
|
|
52
69
|
const hasPlaceholder = suggestion.args.includes('<') || suggestion.args.includes('[');
|
|
53
70
|
if (!hasPlaceholder) {
|
|
@@ -55,52 +72,39 @@ export default function CommandInput({ onSubmit, activeService, onSuggestionsCha
|
|
|
55
72
|
}
|
|
56
73
|
}
|
|
57
74
|
return suggestion.cmd;
|
|
58
|
-
};
|
|
59
|
-
// Notify parent when suggestions change (
|
|
75
|
+
}, []);
|
|
76
|
+
// Notify parent when suggestions change (debounced to reduce flicker)
|
|
60
77
|
useEffect(() => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
78
|
+
const count = showSuggestions ? suggestions.length + 2 : 0;
|
|
79
|
+
if (count !== prevSuggestionCount.current) {
|
|
80
|
+
prevSuggestionCount.current = count;
|
|
81
|
+
onSuggestionsChange?.(count);
|
|
64
82
|
}
|
|
65
83
|
}, [showSuggestions, suggestions.length, onSuggestionsChange]);
|
|
84
|
+
// Reset selected suggestion when suggestions change
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (selectedSuggestion >= suggestions.length) {
|
|
87
|
+
setSelectedSuggestion(Math.max(0, suggestions.length - 1));
|
|
88
|
+
}
|
|
89
|
+
}, [suggestions.length, selectedSuggestion]);
|
|
66
90
|
useInput((input, key) => {
|
|
67
|
-
// Tab to autocomplete selected suggestion
|
|
91
|
+
// Tab to autocomplete selected suggestion
|
|
68
92
|
if (key.tab && showSuggestions && suggestions[selectedSuggestion]) {
|
|
69
93
|
const suggestion = suggestions[selectedSuggestion];
|
|
70
94
|
const fullCmd = buildFullCommand(suggestion);
|
|
71
|
-
|
|
95
|
+
skipNextChange.current = true;
|
|
72
96
|
setValue(fullCmd);
|
|
73
|
-
setDisplayValue(fullCmd);
|
|
74
97
|
setSelectedSuggestion(0);
|
|
75
|
-
setIsNavigating(false);
|
|
76
|
-
// Increment key to force TextInput remount (resets cursor to end)
|
|
77
|
-
setInputKey(k => k + 1);
|
|
78
98
|
return;
|
|
79
99
|
}
|
|
80
100
|
// Up/Down to navigate suggestions when showing
|
|
81
101
|
if (showSuggestions) {
|
|
82
102
|
if (key.upArrow) {
|
|
83
|
-
|
|
84
|
-
setSelectedSuggestion(newIndex);
|
|
85
|
-
setIsNavigating(true);
|
|
86
|
-
// Update display value to show highlighted command
|
|
87
|
-
const suggestion = suggestions[newIndex];
|
|
88
|
-
if (suggestion) {
|
|
89
|
-
setDisplayValue(buildFullCommand(suggestion));
|
|
90
|
-
setInputKey(k => k + 1);
|
|
91
|
-
}
|
|
103
|
+
setSelectedSuggestion(prev => Math.max(0, prev - 1));
|
|
92
104
|
return;
|
|
93
105
|
}
|
|
94
106
|
if (key.downArrow) {
|
|
95
|
-
|
|
96
|
-
setSelectedSuggestion(newIndex);
|
|
97
|
-
setIsNavigating(true);
|
|
98
|
-
// Update display value to show highlighted command
|
|
99
|
-
const suggestion = suggestions[newIndex];
|
|
100
|
-
if (suggestion) {
|
|
101
|
-
setDisplayValue(buildFullCommand(suggestion));
|
|
102
|
-
setInputKey(k => k + 1);
|
|
103
|
-
}
|
|
107
|
+
setSelectedSuggestion(prev => Math.min(suggestions.length - 1, prev + 1));
|
|
104
108
|
return;
|
|
105
109
|
}
|
|
106
110
|
}
|
|
@@ -109,72 +113,66 @@ export default function CommandInput({ onSubmit, activeService, onSuggestionsCha
|
|
|
109
113
|
if (key.upArrow && history.length > 0) {
|
|
110
114
|
const newIndex = Math.min(historyIndex + 1, history.length - 1);
|
|
111
115
|
setHistoryIndex(newIndex);
|
|
112
|
-
|
|
113
|
-
setValue(
|
|
114
|
-
setDisplayValue(histVal);
|
|
115
|
-
setInputKey(k => k + 1);
|
|
116
|
+
skipNextChange.current = true;
|
|
117
|
+
setValue(history[history.length - 1 - newIndex] || '');
|
|
116
118
|
return;
|
|
117
119
|
}
|
|
118
120
|
if (key.downArrow) {
|
|
119
121
|
const newIndex = Math.max(historyIndex - 1, -1);
|
|
120
122
|
setHistoryIndex(newIndex);
|
|
123
|
+
skipNextChange.current = true;
|
|
121
124
|
if (newIndex < 0) {
|
|
122
125
|
setValue('');
|
|
123
|
-
setDisplayValue('');
|
|
124
126
|
}
|
|
125
127
|
else {
|
|
126
|
-
|
|
127
|
-
setValue(histVal);
|
|
128
|
-
setDisplayValue(histVal);
|
|
128
|
+
setValue(history[history.length - 1 - newIndex] || '');
|
|
129
129
|
}
|
|
130
|
-
setInputKey(k => k + 1);
|
|
131
130
|
return;
|
|
132
131
|
}
|
|
133
132
|
}
|
|
133
|
+
// Escape to clear input or close suggestions
|
|
134
|
+
if (key.escape) {
|
|
135
|
+
setValue('');
|
|
136
|
+
setSelectedSuggestion(0);
|
|
137
|
+
setHistoryIndex(-1);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
134
140
|
});
|
|
135
|
-
const handleSubmit = (input) => {
|
|
141
|
+
const handleSubmit = useCallback((input) => {
|
|
136
142
|
if (!input.trim())
|
|
137
143
|
return;
|
|
138
|
-
// Add to history
|
|
139
|
-
|
|
140
|
-
setHistory(prev => [...prev.filter(h => h !== input.trim()), input.trim()]);
|
|
141
|
-
}
|
|
144
|
+
// Add to history (avoid duplicates)
|
|
145
|
+
setHistory(prev => [...prev.filter(h => h !== input.trim()), input.trim()]);
|
|
142
146
|
// Reset state
|
|
143
147
|
setValue('');
|
|
144
|
-
setDisplayValue('');
|
|
145
148
|
setHistoryIndex(-1);
|
|
146
149
|
setSelectedSuggestion(0);
|
|
147
|
-
setIsNavigating(false);
|
|
148
150
|
// Call handler
|
|
149
151
|
onSubmit(input);
|
|
150
|
-
};
|
|
152
|
+
}, [onSubmit]);
|
|
151
153
|
// Handle text input changes
|
|
152
|
-
const handleChange = (v) => {
|
|
153
|
-
|
|
154
|
+
const handleChange = useCallback((v) => {
|
|
155
|
+
if (skipNextChange.current) {
|
|
156
|
+
skipNextChange.current = false;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
154
159
|
setValue(v);
|
|
155
|
-
setDisplayValue(v);
|
|
156
160
|
setSelectedSuggestion(0);
|
|
157
|
-
|
|
158
|
-
};
|
|
161
|
+
}, []);
|
|
159
162
|
// Get context-specific hints for current tab
|
|
160
|
-
const
|
|
161
|
-
const
|
|
163
|
+
const hints = useMemo(() => {
|
|
164
|
+
const h = [];
|
|
162
165
|
if (activeService) {
|
|
163
166
|
const isRunning = activeService.status === 'running' || activeService.status === 'starting';
|
|
164
|
-
if (isRunning) {
|
|
165
|
-
|
|
166
|
-
hints.push(`/restart to restart`);
|
|
167
|
-
}
|
|
168
|
-
if (activeService.id === 'vite') {
|
|
169
|
-
hints.push('r to refresh browser');
|
|
167
|
+
if (isRunning && activeService.id !== 'system') {
|
|
168
|
+
h.push(`Ctrl+K stop`);
|
|
170
169
|
}
|
|
171
170
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
return
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
return (_jsxs(Box, { flexDirection: "column", children: [showSuggestions && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", marginBottom: 0, children: [suggestions.map((suggestion, index) => (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { backgroundColor: index === selectedSuggestion ? 'blue' : undefined, color: index === selectedSuggestion ? 'white' : 'cyan', bold: index === selectedSuggestion, children: suggestion.cmd }), suggestion.args && (_jsxs(Text, { color: index === selectedSuggestion ? 'white' : 'gray', backgroundColor: index === selectedSuggestion ? 'blue' : undefined, children: [' ', suggestion.args] })), _jsx(Text, { color: "gray", children: " - " }), _jsx(Text, { color: index === selectedSuggestion ? 'white' : 'gray', dimColor: index !== selectedSuggestion, children: suggestion.desc })] }, `${suggestion.cmd}-${suggestion.args}-${index}`))), _jsx(Box, { paddingX: 1, borderStyle: undefined, children: _jsx(Text, { dimColor: true, children: "Tab to complete \u00B7 Up/Down to select" }) })] })), _jsxs(Box, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: ">" }), _jsx(Text, { children: " " }), _jsx(TextInput, { value: displayValue, onChange: handleChange, onSubmit: () => handleSubmit(displayValue.startsWith('/') ? displayValue : '/' + displayValue), placeholder: "Type / to run a command..." }, inputKey)] }), _jsx(Box, { paddingX: 1, justifyContent: "space-between", children: _jsx(Box, { children: hints.slice(0, 4).map((hint, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Text, { color: "gray", children: " \u00B7 " }), _jsx(Text, { dimColor: true, children: hint })] }, hint))) }) })] }));
|
|
171
|
+
h.push('Ctrl+L clear');
|
|
172
|
+
h.push('←/→ tabs');
|
|
173
|
+
h.push('Esc cancel');
|
|
174
|
+
return h;
|
|
175
|
+
}, [activeService]);
|
|
176
|
+
return (_jsxs(Box, { flexDirection: "column", children: [showSuggestions && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", marginBottom: 0, children: [suggestions.map((suggestion, index) => (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { backgroundColor: index === selectedSuggestion ? 'blue' : undefined, color: index === selectedSuggestion ? 'white' : 'cyan', bold: index === selectedSuggestion, children: suggestion.cmd }), suggestion.args && (_jsxs(Text, { color: index === selectedSuggestion ? 'white' : 'gray', backgroundColor: index === selectedSuggestion ? 'blue' : undefined, children: [' ', suggestion.args] })), _jsx(Text, { color: "gray", children: " - " }), _jsx(Text, { color: index === selectedSuggestion ? 'white' : 'gray', dimColor: index !== selectedSuggestion, children: suggestion.desc })] }, `${suggestion.cmd}-${suggestion.args}-${index}`))), _jsx(Box, { paddingX: 1, children: _jsx(Text, { dimColor: true, children: "Tab complete \u00B7 \u2191\u2193 select \u00B7 Esc cancel" }) })] })), _jsxs(Box, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: ">" }), _jsx(Text, { children: " " }), _jsx(TextInput, { value: value, onChange: handleChange, onSubmit: () => handleSubmit(value.startsWith('/') ? value : '/' + value), placeholder: "Type / to run a command..." })] }), _jsx(Box, { paddingX: 1, justifyContent: "space-between", children: _jsx(Box, { children: hints.map((hint, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Text, { color: "gray", children: " \u00B7 " }), _jsx(Text, { dimColor: true, children: hint })] }, hint))) }) })] }));
|
|
179
177
|
}
|
|
180
178
|
//# sourceMappingURL=CommandInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandInput.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/CommandInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandInput.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/CommandInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,6DAA6D;AAC7D,MAAM,QAAQ,GAAG;IACf,sBAAsB;IACtB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACxD,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACtE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC/E,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC1E,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACxE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gCAAgC,EAAE;IAE1E,kBAAkB;IAClB,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE;IAC5D,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,4BAA4B,EAAE;IAC3E,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE;IACrE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACtE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAE1E,6BAA6B;IAC7B,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACrE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,+BAA+B,EAAE;IAEvE,qBAAqB;IACrB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC9E,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,sCAAsC,EAAE;IACpF,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE;IAE5D,oBAAoB;IACpB,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE;IAC5E,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,2BAA2B,EAAE;IAChF,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAEzF,cAAc;IACd,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;IAC/D,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,8BAA8B,EAAE;IACxE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAClE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAChE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAC/D,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,4BAA4B,EAAE;IACrE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE;IAE7D,UAAU;IACV,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACrD,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACpD,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC7D,CAAC;AAcF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAqB;IACtG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhE,mFAAmF;IACnF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,sEAAsE;IACtE,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtC,uCAAuC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wCAAwC;IAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAE7F,sDAAsD;IACtD,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,UAA8B,EAAU,EAAE;QAC9E,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,GAAG,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,GAAG,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAC1C,mBAAmB,CAAC,OAAO,GAAG,KAAK,CAAC;YACpC,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE/D,oDAAoD;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YAC7C,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE7C,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,0CAA0C;QAC1C,IAAI,GAAG,CAAC,GAAG,IAAI,eAAe,IAAI,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC7C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAChE,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC1B,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC9B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChD,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC1B,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC9B,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzB,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO;QAE1B,oCAAoC;QACpC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5E,cAAc;QACd,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzB,eAAe;QACf,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,4BAA4B;IAC5B,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAS,EAAE,EAAE;QAC7C,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,CAAC;QACZ,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,6CAA6C;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAa,EAAE;QACnC,MAAM,CAAC,GAAa,EAAE,CAAC;QAEvB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,KAAK,UAAU,CAAC;YAC5F,IAAI,SAAS,IAAI,aAAa,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAErB,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAExB,eAAe,IAAI,CAClB,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,YAAY,EAAE,CAAC,aAEd,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,MAAC,GAAG,IAAuD,QAAQ,EAAE,CAAC,aACpE,KAAC,IAAI,IACH,eAAe,EAAE,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAClE,KAAK,EAAE,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACtD,IAAI,EAAE,KAAK,KAAK,kBAAkB,YAEjC,UAAU,CAAC,GAAG,GACV,EACN,UAAU,CAAC,IAAI,IAAI,CAClB,MAAC,IAAI,IACH,KAAK,EAAE,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACtD,eAAe,EAAE,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAEjE,GAAG,EAAE,UAAU,CAAC,IAAI,IAChB,CACR,EACD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,EAC7B,KAAC,IAAI,IACH,KAAK,EAAE,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACtD,QAAQ,EAAE,KAAK,KAAK,kBAAkB,YAErC,UAAU,CAAC,IAAI,GACX,KAtBC,GAAG,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,IAAI,KAAK,EAAE,CAuBnD,CACP,CAAC,EACF,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,IAAC,QAAQ,gFAA6C,GACvD,IACF,CACP,EAGD,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,aAEX,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,wBAAY,EACnC,KAAC,IAAI,oBAAS,EACd,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,EACzE,WAAW,EAAC,4BAA4B,GACxC,IACE,EAGN,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,YAC9C,KAAC,GAAG,cACD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,MAAC,KAAK,CAAC,QAAQ,eACZ,KAAK,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAW,EAC3C,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,KAFT,IAAI,CAGR,CAClB,CAAC,GACE,GACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
interface LogPanelProps {
|
|
2
3
|
logs: string[];
|
|
3
4
|
isActive?: boolean;
|
|
4
5
|
maxHeight?: number;
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
declare function LogPanel({ logs, isActive, maxHeight }: LogPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
declare const _default: React.MemoExoticComponent<typeof LogPanel>;
|
|
9
|
+
export default _default;
|
|
8
10
|
//# sourceMappingURL=LogPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LogPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAG/E,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,iBAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAe,EAAE,SAAS,EAAE,EAAE,aAAa,2CA+FpE;;AAsBD,wBAA8B"}
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useMemo, memo } from 'react';
|
|
3
3
|
import { Box, Text, useStdout, useInput } from 'ink';
|
|
4
|
-
|
|
4
|
+
// Memoized log line component to prevent unnecessary re-renders
|
|
5
|
+
const LogLine = memo(({ log, index }) => (_jsx(Text, { wrap: "wrap", children: formatLog(log) }, index)));
|
|
6
|
+
LogLine.displayName = 'LogLine';
|
|
7
|
+
function LogPanel({ logs, isActive = true, maxHeight }) {
|
|
5
8
|
const { stdout } = useStdout();
|
|
6
9
|
const [scrollOffset, setScrollOffset] = useState(0);
|
|
7
10
|
const [autoScroll, setAutoScroll] = useState(true);
|
|
8
11
|
// Calculate visible lines based on provided maxHeight or terminal height
|
|
9
12
|
// Subtract 2 for padding, 2 for border
|
|
10
|
-
const
|
|
11
|
-
|
|
13
|
+
const maxLines = useMemo(() => {
|
|
14
|
+
const defaultMaxLines = stdout ? Math.max(5, stdout.rows - 10) : 15;
|
|
15
|
+
return maxHeight ? Math.max(3, maxHeight - 4) : defaultMaxLines;
|
|
16
|
+
}, [stdout?.rows, maxHeight]);
|
|
12
17
|
// Reset scroll when logs are cleared
|
|
13
18
|
useEffect(() => {
|
|
14
19
|
if (logs.length === 0) {
|
|
15
20
|
setScrollOffset(0);
|
|
16
21
|
setAutoScroll(true);
|
|
17
22
|
}
|
|
18
|
-
}, [logs.length
|
|
23
|
+
}, [logs.length]);
|
|
19
24
|
// Auto-scroll to bottom when new logs arrive (if autoScroll is enabled)
|
|
20
25
|
useEffect(() => {
|
|
21
26
|
if (autoScroll) {
|
|
@@ -57,15 +62,19 @@ export default function LogPanel({ logs, isActive = true, maxHeight }) {
|
|
|
57
62
|
return;
|
|
58
63
|
}
|
|
59
64
|
});
|
|
60
|
-
// Calculate visible logs with scroll offset
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
// Calculate visible logs with scroll offset - memoized
|
|
66
|
+
const { visibleLogs, startIndex, canScrollUp, canScrollDown } = useMemo(() => {
|
|
67
|
+
const totalLogs = logs.length;
|
|
68
|
+
const start = Math.max(0, totalLogs - maxLines - scrollOffset);
|
|
69
|
+
const end = Math.max(0, totalLogs - scrollOffset);
|
|
70
|
+
return {
|
|
71
|
+
visibleLogs: logs.slice(start, end),
|
|
72
|
+
startIndex: start,
|
|
73
|
+
canScrollUp: start > 0,
|
|
74
|
+
canScrollDown: scrollOffset > 0,
|
|
75
|
+
};
|
|
76
|
+
}, [logs, maxLines, scrollOffset]);
|
|
77
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, flexGrow: 1, overflow: "hidden", children: [canScrollUp && (_jsxs(Text, { color: "gray", dimColor: true, children: ["\u2191 ", startIndex, " more lines (Shift+\u2191 to scroll)"] })), visibleLogs.length === 0 ? (_jsx(Text, { color: "gray", dimColor: true, children: "No logs yet..." })) : (visibleLogs.map((log, index) => (_jsx(LogLine, { log: log, index: startIndex + index }, startIndex + index)))), canScrollDown && (_jsxs(Text, { color: "gray", dimColor: true, children: ["\u2193 ", scrollOffset, " more lines (Shift+\u2193 to scroll)"] }))] }));
|
|
69
78
|
}
|
|
70
79
|
function formatLog(log) {
|
|
71
80
|
// Color code different log types
|
|
@@ -86,4 +95,5 @@ function formatLog(log) {
|
|
|
86
95
|
}
|
|
87
96
|
return _jsx(Text, { children: log });
|
|
88
97
|
}
|
|
98
|
+
export default memo(LogPanel);
|
|
89
99
|
//# sourceMappingURL=LogPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LogPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,6 @@ export default function TabBar({ services, activeTab, onTabChange }) {
|
|
|
18
18
|
const statusColor = STATUS_COLORS[service.status];
|
|
19
19
|
const statusIcon = STATUS_ICONS[service.status];
|
|
20
20
|
return (_jsx(Box, { children: _jsxs(Text, { color: isActive ? 'white' : 'gray', backgroundColor: isActive ? 'blue' : undefined, bold: isActive, children: [' ', _jsx(Text, { color: statusColor, children: statusIcon }), ' ', service.name, ' '] }) }, service.id));
|
|
21
|
-
}) }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "
|
|
21
|
+
}) }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "\u2190/\u2192 switch tabs" }) })] }));
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=TabBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/TabBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,aAAa,GAAsC;IACvD,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,YAAY,GAAsC;IACtD,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAe;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aACtD,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;oBACrC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAEhD,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAClC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9C,IAAI,EAAE,QAAQ,aAEb,GAAG,EACJ,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,UAAU,GAAQ,EAC5C,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,GAAG,IACC,IAXC,OAAO,CAAC,EAAE,CAYd,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/TabBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,aAAa,GAAsC;IACvD,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,YAAY,GAAsC;IACtD,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAe;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aACtD,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;oBACrC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAEhD,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAClC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9C,IAAI,EAAE,QAAQ,aAEb,GAAG,EACJ,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,UAAU,GAAQ,EAC5C,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,GAAG,IACC,IAXC,OAAO,CAAC,EAAE,CAYd,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0CAAuB,GACrC,IACF,CACP,CAAC;AACJ,CAAC"}
|