@gxp-dev/tools 2.0.5 → 2.0.7
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/dist/tui/App.d.ts +13 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +480 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/CommandInput.d.ts +13 -0
- package/dist/tui/components/CommandInput.d.ts.map +1 -0
- package/dist/tui/components/CommandInput.js +180 -0
- package/dist/tui/components/CommandInput.js.map +1 -0
- package/dist/tui/components/GeminiPanel.d.ts +7 -0
- package/dist/tui/components/GeminiPanel.d.ts.map +1 -0
- package/dist/tui/components/GeminiPanel.js +99 -0
- package/dist/tui/components/GeminiPanel.js.map +1 -0
- package/dist/tui/components/Header.d.ts +6 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +6 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/LogPanel.d.ts +8 -0
- package/dist/tui/components/LogPanel.d.ts.map +1 -0
- package/dist/tui/components/LogPanel.js +89 -0
- package/dist/tui/components/LogPanel.js.map +1 -0
- package/dist/tui/components/TabBar.d.ts +9 -0
- package/dist/tui/components/TabBar.d.ts.map +1 -0
- package/dist/tui/components/TabBar.js +23 -0
- package/dist/tui/components/TabBar.js.map +1 -0
- package/dist/tui/components/WelcomeScreen.d.ts +2 -0
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
- package/dist/tui/components/WelcomeScreen.js +14 -0
- package/dist/tui/components/WelcomeScreen.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +47 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/package.json +1 -0
- package/dist/tui/services/ExtensionService.d.ts +11 -0
- package/dist/tui/services/ExtensionService.d.ts.map +1 -0
- package/dist/tui/services/ExtensionService.js +101 -0
- package/dist/tui/services/ExtensionService.js.map +1 -0
- package/dist/tui/services/GeminiService.d.ts +40 -0
- package/dist/tui/services/GeminiService.d.ts.map +1 -0
- package/dist/tui/services/GeminiService.js +327 -0
- package/dist/tui/services/GeminiService.js.map +1 -0
- package/dist/tui/services/ServiceManager.d.ts +40 -0
- package/dist/tui/services/ServiceManager.d.ts.map +1 -0
- package/dist/tui/services/ServiceManager.js +283 -0
- package/dist/tui/services/ServiceManager.js.map +1 -0
- package/dist/tui/services/SocketService.d.ts +19 -0
- package/dist/tui/services/SocketService.d.ts.map +1 -0
- package/dist/tui/services/SocketService.js +163 -0
- package/dist/tui/services/SocketService.js.map +1 -0
- package/dist/tui/services/ViteService.d.ts +8 -0
- package/dist/tui/services/ViteService.d.ts.map +1 -0
- package/dist/tui/services/ViteService.js +89 -0
- package/dist/tui/services/ViteService.js.map +1 -0
- package/dist/tui/services/index.d.ts +6 -0
- package/dist/tui/services/index.d.ts.map +1 -0
- package/dist/tui/services/index.js +6 -0
- package/dist/tui/services/index.js.map +1 -0
- package/package.json +11 -1
- package/.github/workflows/npm-publish.yml +0 -48
- package/CLAUDE.md +0 -400
- package/REFACTOR_PLAN.md +0 -194
- package/docs/DOCUSAURUS_IMPORT.md +0 -378
- package/docs/_category_.json +0 -8
- package/docs/app-manifest.md +0 -272
- package/docs/building-for-platform.md +0 -315
- package/docs/dev-tools.md +0 -291
- package/docs/getting-started.md +0 -180
- package/docs/gxp-store.md +0 -305
- package/docs/index.md +0 -44
- package/tsconfig.tui.json +0 -21
- package/vite.config.js +0 -164
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useMemo, useEffect } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import TextInput from 'ink-text-input';
|
|
5
|
+
// Command definitions with descriptions
|
|
6
|
+
const COMMANDS = [
|
|
7
|
+
{ cmd: '/dev', args: '', desc: 'Start Vite (+ Socket if SOCKET_IO_ENABLED)' },
|
|
8
|
+
{ cmd: '/dev', args: '--with-socket', desc: 'Start Vite + Socket.IO' },
|
|
9
|
+
{ cmd: '/dev', args: '--with-mock', desc: 'Start Vite + Socket.IO + Mock API server' },
|
|
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' },
|
|
13
|
+
{ cmd: '/dev', args: '--no-https', desc: 'Start Vite without SSL' },
|
|
14
|
+
{ cmd: '/socket', args: '', desc: 'Start Socket.IO server' },
|
|
15
|
+
{ cmd: '/socket', args: 'send <event>', desc: 'Send socket event' },
|
|
16
|
+
{ cmd: '/socket', args: 'list', desc: 'List available events' },
|
|
17
|
+
{ cmd: '/ext', args: 'chrome', desc: 'Launch Chrome extension' },
|
|
18
|
+
{ cmd: '/ext', args: 'firefox', desc: 'Launch Firefox extension' },
|
|
19
|
+
{ cmd: '/stop', args: '[service]', desc: 'Stop current/specified service' },
|
|
20
|
+
{ cmd: '/restart', args: '[service]', desc: 'Restart current/specified service' },
|
|
21
|
+
{ cmd: '/clear', args: '', desc: 'Clear current log panel' },
|
|
22
|
+
{ cmd: '/gemini', args: '', desc: 'Open Gemini AI chat' },
|
|
23
|
+
{ cmd: '/gemini', args: 'enable', desc: 'Set up Google auth' },
|
|
24
|
+
{ cmd: '/gemini', args: 'ask <query>', desc: 'Quick AI question' },
|
|
25
|
+
{ cmd: '/help', args: '', desc: 'Show all commands' },
|
|
26
|
+
{ cmd: '/quit', args: '', desc: 'Exit application' },
|
|
27
|
+
];
|
|
28
|
+
export default function CommandInput({ onSubmit, activeService, onSuggestionsChange }) {
|
|
29
|
+
const [value, setValue] = useState(''); // The actual typed value (for filtering)
|
|
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
|
|
32
|
+
const [history, setHistory] = useState([]);
|
|
33
|
+
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
34
|
+
const [selectedSuggestion, setSelectedSuggestion] = useState(0);
|
|
35
|
+
// Key to force TextInput remount when value is set programmatically (resets cursor)
|
|
36
|
+
const [inputKey, setInputKey] = useState(0);
|
|
37
|
+
// Filter commands based on the TYPED value (not display value)
|
|
38
|
+
const suggestions = useMemo(() => {
|
|
39
|
+
if (!value.startsWith('/'))
|
|
40
|
+
return [];
|
|
41
|
+
const search = value.toLowerCase();
|
|
42
|
+
return COMMANDS.filter(c => {
|
|
43
|
+
const fullCmd = c.args ? `${c.cmd} ${c.args}` : c.cmd;
|
|
44
|
+
return fullCmd.toLowerCase().includes(search) ||
|
|
45
|
+
c.cmd.toLowerCase().startsWith(search);
|
|
46
|
+
});
|
|
47
|
+
}, [value]);
|
|
48
|
+
const showSuggestions = value.startsWith('/') && value.length >= 1 && suggestions.length > 0;
|
|
49
|
+
// Helper to build full command string from suggestion
|
|
50
|
+
const buildFullCommand = (suggestion) => {
|
|
51
|
+
if (suggestion.args) {
|
|
52
|
+
const hasPlaceholder = suggestion.args.includes('<') || suggestion.args.includes('[');
|
|
53
|
+
if (!hasPlaceholder) {
|
|
54
|
+
return `${suggestion.cmd} ${suggestion.args}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return suggestion.cmd;
|
|
58
|
+
};
|
|
59
|
+
// Notify parent when suggestions change (for layout adjustment)
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (onSuggestionsChange) {
|
|
62
|
+
// +2 for border and help text row
|
|
63
|
+
onSuggestionsChange(showSuggestions ? suggestions.length + 2 : 0);
|
|
64
|
+
}
|
|
65
|
+
}, [showSuggestions, suggestions.length, onSuggestionsChange]);
|
|
66
|
+
useInput((input, key) => {
|
|
67
|
+
// Tab to autocomplete selected suggestion (commits the selection)
|
|
68
|
+
if (key.tab && showSuggestions && suggestions[selectedSuggestion]) {
|
|
69
|
+
const suggestion = suggestions[selectedSuggestion];
|
|
70
|
+
const fullCmd = buildFullCommand(suggestion);
|
|
71
|
+
// Commit to both value and displayValue
|
|
72
|
+
setValue(fullCmd);
|
|
73
|
+
setDisplayValue(fullCmd);
|
|
74
|
+
setSelectedSuggestion(0);
|
|
75
|
+
setIsNavigating(false);
|
|
76
|
+
// Increment key to force TextInput remount (resets cursor to end)
|
|
77
|
+
setInputKey(k => k + 1);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Up/Down to navigate suggestions when showing
|
|
81
|
+
if (showSuggestions) {
|
|
82
|
+
if (key.upArrow) {
|
|
83
|
+
const newIndex = Math.max(0, selectedSuggestion - 1);
|
|
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
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (key.downArrow) {
|
|
95
|
+
const newIndex = Math.min(suggestions.length - 1, selectedSuggestion + 1);
|
|
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
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// History navigation when not showing suggestions
|
|
109
|
+
if (key.upArrow && history.length > 0) {
|
|
110
|
+
const newIndex = Math.min(historyIndex + 1, history.length - 1);
|
|
111
|
+
setHistoryIndex(newIndex);
|
|
112
|
+
const histVal = history[history.length - 1 - newIndex] || '';
|
|
113
|
+
setValue(histVal);
|
|
114
|
+
setDisplayValue(histVal);
|
|
115
|
+
setInputKey(k => k + 1);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (key.downArrow) {
|
|
119
|
+
const newIndex = Math.max(historyIndex - 1, -1);
|
|
120
|
+
setHistoryIndex(newIndex);
|
|
121
|
+
if (newIndex < 0) {
|
|
122
|
+
setValue('');
|
|
123
|
+
setDisplayValue('');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const histVal = history[history.length - 1 - newIndex] || '';
|
|
127
|
+
setValue(histVal);
|
|
128
|
+
setDisplayValue(histVal);
|
|
129
|
+
}
|
|
130
|
+
setInputKey(k => k + 1);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
const handleSubmit = (input) => {
|
|
136
|
+
if (!input.trim())
|
|
137
|
+
return;
|
|
138
|
+
// Add to history
|
|
139
|
+
if (input.trim()) {
|
|
140
|
+
setHistory(prev => [...prev.filter(h => h !== input.trim()), input.trim()]);
|
|
141
|
+
}
|
|
142
|
+
// Reset state
|
|
143
|
+
setValue('');
|
|
144
|
+
setDisplayValue('');
|
|
145
|
+
setHistoryIndex(-1);
|
|
146
|
+
setSelectedSuggestion(0);
|
|
147
|
+
setIsNavigating(false);
|
|
148
|
+
// Call handler
|
|
149
|
+
onSubmit(input);
|
|
150
|
+
};
|
|
151
|
+
// Handle text input changes
|
|
152
|
+
const handleChange = (v) => {
|
|
153
|
+
// User typed something, reset navigation state
|
|
154
|
+
setValue(v);
|
|
155
|
+
setDisplayValue(v);
|
|
156
|
+
setSelectedSuggestion(0);
|
|
157
|
+
setIsNavigating(false);
|
|
158
|
+
};
|
|
159
|
+
// Get context-specific hints for current tab
|
|
160
|
+
const getHints = () => {
|
|
161
|
+
const hints = [];
|
|
162
|
+
if (activeService) {
|
|
163
|
+
const isRunning = activeService.status === 'running' || activeService.status === 'starting';
|
|
164
|
+
if (isRunning) {
|
|
165
|
+
hints.push(`Ctrl+K stop ${activeService.name}`);
|
|
166
|
+
hints.push(`/restart to restart`);
|
|
167
|
+
}
|
|
168
|
+
if (activeService.id === 'vite') {
|
|
169
|
+
hints.push('r to refresh browser');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
hints.push('Ctrl+L clear logs');
|
|
173
|
+
hints.push('Tab/Arrow switch tabs');
|
|
174
|
+
hints.push('Ctrl+C quit');
|
|
175
|
+
return hints;
|
|
176
|
+
};
|
|
177
|
+
const hints = getHints();
|
|
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))) }) })] }));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=CommandInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandInput.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/CommandInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/GeminiPanel.tsx"],"names":[],"mappings":"AASA,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAOD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA6IvE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text, useInput, useStdout } from 'ink';
|
|
4
|
+
import TextInput from 'ink-text-input';
|
|
5
|
+
import { geminiService, isAuthenticated, loadGeminiConfig, } from '../services/index.js';
|
|
6
|
+
export default function GeminiPanel({ onClose, onLog }) {
|
|
7
|
+
const { stdout } = useStdout();
|
|
8
|
+
const [input, setInput] = useState('');
|
|
9
|
+
const [messages, setMessages] = useState([]);
|
|
10
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
11
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
12
|
+
// Calculate available height for messages
|
|
13
|
+
const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10;
|
|
14
|
+
// Check authentication on mount
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!isAuthenticated()) {
|
|
17
|
+
setMessages([{
|
|
18
|
+
role: 'system',
|
|
19
|
+
content: 'Not authenticated. Run /gemini enable to set up Google authentication.',
|
|
20
|
+
}]);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const config = loadGeminiConfig();
|
|
24
|
+
setMessages([{
|
|
25
|
+
role: 'system',
|
|
26
|
+
content: `Gemini AI ready. ${config.projectContext ? 'Project context loaded.' : ''}\nType your message and press Enter. Press Escape to close.`,
|
|
27
|
+
}]);
|
|
28
|
+
// Load project context
|
|
29
|
+
geminiService.loadProjectContext(process.cwd());
|
|
30
|
+
}
|
|
31
|
+
}, []);
|
|
32
|
+
// Handle keyboard input
|
|
33
|
+
useInput((char, key) => {
|
|
34
|
+
if (key.escape) {
|
|
35
|
+
onClose();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Scroll with Shift+Up/Down
|
|
39
|
+
if (key.shift && key.upArrow) {
|
|
40
|
+
setScrollOffset(prev => Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (key.shift && key.downArrow) {
|
|
44
|
+
setScrollOffset(prev => Math.max(0, prev - 1));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const handleSubmit = async (value) => {
|
|
49
|
+
if (!value.trim() || isLoading)
|
|
50
|
+
return;
|
|
51
|
+
const userMessage = value.trim();
|
|
52
|
+
setInput('');
|
|
53
|
+
// Add user message
|
|
54
|
+
setMessages(prev => [...prev, { role: 'user', content: userMessage }]);
|
|
55
|
+
setIsLoading(true);
|
|
56
|
+
try {
|
|
57
|
+
const response = await geminiService.sendMessage(userMessage);
|
|
58
|
+
setMessages(prev => [...prev, { role: 'assistant', content: response }]);
|
|
59
|
+
setScrollOffset(0); // Auto-scroll to bottom
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
63
|
+
setMessages(prev => [...prev, {
|
|
64
|
+
role: 'system',
|
|
65
|
+
content: `Error: ${errorMessage}`,
|
|
66
|
+
}]);
|
|
67
|
+
onLog(`Gemini error: ${errorMessage}`);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
setIsLoading(false);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
// Render messages with scrolling
|
|
74
|
+
const renderMessages = () => {
|
|
75
|
+
const start = Math.max(0, messages.length - maxMessageLines - scrollOffset);
|
|
76
|
+
const end = messages.length - scrollOffset;
|
|
77
|
+
const visibleMessages = messages.slice(start, end);
|
|
78
|
+
return visibleMessages.map((msg, idx) => {
|
|
79
|
+
let color;
|
|
80
|
+
let prefix;
|
|
81
|
+
switch (msg.role) {
|
|
82
|
+
case 'user':
|
|
83
|
+
color = 'cyan';
|
|
84
|
+
prefix = 'You: ';
|
|
85
|
+
break;
|
|
86
|
+
case 'assistant':
|
|
87
|
+
color = 'green';
|
|
88
|
+
prefix = 'Gemini: ';
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
color = 'yellow';
|
|
92
|
+
prefix = '';
|
|
93
|
+
}
|
|
94
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: color, bold: true, children: prefix }), _jsx(Text, { wrap: "wrap", children: msg.content })] }, start + idx));
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
return (_jsxs(Box, { flexDirection: "column", height: "100%", borderStyle: "double", borderColor: "magenta", children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "magenta", children: "Gemini AI Assistant" }), _jsx(Text, { color: "gray", dimColor: true, children: "Esc to close" })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, overflow: "hidden", children: [messages.length > maxMessageLines + scrollOffset && (_jsxs(Text, { color: "gray", dimColor: true, children: ["... ", messages.length - maxMessageLines - scrollOffset, " earlier messages"] })), renderMessages(), scrollOffset > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: ["... ", scrollOffset, " newer messages below"] }))] }), _jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, children: isLoading ? (_jsx(Text, { color: "yellow", children: "Thinking..." })) : (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "> " }), _jsx(TextInput, { value: input, onChange: setInput, onSubmit: handleSubmit, placeholder: "Ask Gemini something..." })] })) })] }));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=GeminiPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/GeminiPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/Header.tsx"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,WAAW,2CAmB1D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export default function Header({ projectName }) {
|
|
4
|
+
return (_jsxs(Box, { borderStyle: "single", borderColor: "blue", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "blue", bold: true, children: "GxP" }), _jsx(Text, { color: "white", children: " DevStudio" }), _jsx(Text, { color: "gray", children: " - " }), _jsx(Text, { color: "cyan", children: projectName })] }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "Ctrl+C to quit" }) })] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,WAAW,EAAe;IACzD,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,0BAAW,EAClC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,2BAAkB,EACrC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,WAAW,GAAQ,IACnC,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,+BAAsB,GACpC,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LogPanelProps {
|
|
2
|
+
logs: string[];
|
|
3
|
+
isActive?: boolean;
|
|
4
|
+
maxHeight?: number;
|
|
5
|
+
}
|
|
6
|
+
export default function LogPanel({ logs, isActive, maxHeight }: LogPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=LogPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAe,EAAE,SAAS,EAAE,EAAE,aAAa,2CA4FnF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Box, Text, useStdout, useInput } from 'ink';
|
|
4
|
+
export default function LogPanel({ logs, isActive = true, maxHeight }) {
|
|
5
|
+
const { stdout } = useStdout();
|
|
6
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
7
|
+
const [autoScroll, setAutoScroll] = useState(true);
|
|
8
|
+
// Calculate visible lines based on provided maxHeight or terminal height
|
|
9
|
+
// Subtract 2 for padding, 2 for border
|
|
10
|
+
const defaultMaxLines = stdout ? Math.max(5, stdout.rows - 10) : 15;
|
|
11
|
+
const maxLines = maxHeight ? Math.max(3, maxHeight - 4) : defaultMaxLines;
|
|
12
|
+
// Reset scroll when logs are cleared
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (logs.length === 0) {
|
|
15
|
+
setScrollOffset(0);
|
|
16
|
+
setAutoScroll(true);
|
|
17
|
+
}
|
|
18
|
+
}, [logs.length === 0]);
|
|
19
|
+
// Auto-scroll to bottom when new logs arrive (if autoScroll is enabled)
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (autoScroll) {
|
|
22
|
+
setScrollOffset(0);
|
|
23
|
+
}
|
|
24
|
+
}, [logs.length, autoScroll]);
|
|
25
|
+
// Handle keyboard input for scrolling
|
|
26
|
+
useInput((input, key) => {
|
|
27
|
+
if (!isActive)
|
|
28
|
+
return;
|
|
29
|
+
// Page Up - scroll up by half a page
|
|
30
|
+
if (key.pageUp || (key.shift && key.upArrow)) {
|
|
31
|
+
const maxOffset = Math.max(0, logs.length - maxLines);
|
|
32
|
+
setScrollOffset(prev => Math.min(prev + Math.floor(maxLines / 2), maxOffset));
|
|
33
|
+
setAutoScroll(false);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Page Down - scroll down by half a page
|
|
37
|
+
if (key.pageDown || (key.shift && key.downArrow)) {
|
|
38
|
+
setScrollOffset(prev => {
|
|
39
|
+
const newOffset = Math.max(prev - Math.floor(maxLines / 2), 0);
|
|
40
|
+
if (newOffset === 0)
|
|
41
|
+
setAutoScroll(true);
|
|
42
|
+
return newOffset;
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Home - scroll to top
|
|
47
|
+
if (key.meta && key.upArrow) {
|
|
48
|
+
const maxOffset = Math.max(0, logs.length - maxLines);
|
|
49
|
+
setScrollOffset(maxOffset);
|
|
50
|
+
setAutoScroll(false);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// End - scroll to bottom
|
|
54
|
+
if (key.meta && key.downArrow) {
|
|
55
|
+
setScrollOffset(0);
|
|
56
|
+
setAutoScroll(true);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// Calculate visible logs with scroll offset
|
|
61
|
+
const totalLogs = logs.length;
|
|
62
|
+
const startIndex = Math.max(0, totalLogs - maxLines - scrollOffset);
|
|
63
|
+
const endIndex = Math.max(0, totalLogs - scrollOffset);
|
|
64
|
+
const visibleLogs = logs.slice(startIndex, endIndex);
|
|
65
|
+
// Show scroll indicator
|
|
66
|
+
const canScrollUp = startIndex > 0;
|
|
67
|
+
const canScrollDown = scrollOffset > 0;
|
|
68
|
+
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(Text, { wrap: "wrap", children: formatLog(log) }, startIndex + index)))), canScrollDown && (_jsxs(Text, { color: "gray", dimColor: true, children: ["\u2193 ", scrollOffset, " more lines (Shift+\u2193 to scroll)"] }))] }));
|
|
69
|
+
}
|
|
70
|
+
function formatLog(log) {
|
|
71
|
+
// Color code different log types
|
|
72
|
+
if (log.startsWith('[VITE]') || log.includes('VITE')) {
|
|
73
|
+
return _jsx(Text, { color: "cyan", children: log });
|
|
74
|
+
}
|
|
75
|
+
if (log.startsWith('[SOCKET]') || log.includes('Socket')) {
|
|
76
|
+
return _jsx(Text, { color: "green", children: log });
|
|
77
|
+
}
|
|
78
|
+
if (log.includes('error') || log.includes('Error') || log.includes('ERROR')) {
|
|
79
|
+
return _jsx(Text, { color: "red", children: log });
|
|
80
|
+
}
|
|
81
|
+
if (log.includes('warning') || log.includes('Warning') || log.includes('WARN')) {
|
|
82
|
+
return _jsx(Text, { color: "yellow", children: log });
|
|
83
|
+
}
|
|
84
|
+
if (log.includes('Starting') || log.includes('started')) {
|
|
85
|
+
return _jsx(Text, { color: "blue", children: log });
|
|
86
|
+
}
|
|
87
|
+
return _jsx(Text, { children: log });
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=LogPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Service } from '../App.js';
|
|
2
|
+
interface TabBarProps {
|
|
3
|
+
services: Service[];
|
|
4
|
+
activeTab: number;
|
|
5
|
+
onTabChange: (index: number) => void;
|
|
6
|
+
}
|
|
7
|
+
export default function TabBar({ services, activeTab, onTabChange }: TabBarProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=TabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/TabBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,UAAU,WAAW;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAgBD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,WAAW,2CA+B/E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const STATUS_COLORS = {
|
|
4
|
+
stopped: 'gray',
|
|
5
|
+
starting: 'yellow',
|
|
6
|
+
running: 'green',
|
|
7
|
+
error: 'red',
|
|
8
|
+
};
|
|
9
|
+
const STATUS_ICONS = {
|
|
10
|
+
stopped: '○',
|
|
11
|
+
starting: '◐',
|
|
12
|
+
running: '●',
|
|
13
|
+
error: '✖',
|
|
14
|
+
};
|
|
15
|
+
export default function TabBar({ services, activeTab, onTabChange }) {
|
|
16
|
+
return (_jsxs(Box, { paddingX: 1, gap: 2, justifyContent: "space-between", children: [_jsx(Box, { gap: 2, children: services.map((service, index) => {
|
|
17
|
+
const isActive = index === activeTab;
|
|
18
|
+
const statusColor = STATUS_COLORS[service.status];
|
|
19
|
+
const statusIcon = STATUS_ICONS[service.status];
|
|
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: "Tab/\u2190\u2192 switch tabs" }) })] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=TabBar.js.map
|
|
@@ -0,0 +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,6CAA0B,GACxC,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAmEpC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const LOGO = `
|
|
4
|
+
██████╗ ██╗ ██╗██████╗
|
|
5
|
+
██╔════╝ ╚██╗██╔╝██╔══██╗
|
|
6
|
+
██║ ███╗ ╚███╔╝ ██████╔╝
|
|
7
|
+
██║ ██║ ██╔██╗ ██╔═══╝
|
|
8
|
+
╚██████╔╝██╔╝ ██╗██║
|
|
9
|
+
╚═════╝ ╚═╝ ╚═╝╚═╝
|
|
10
|
+
`;
|
|
11
|
+
export default function WelcomeScreen() {
|
|
12
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, padding: 1, children: [_jsx(Text, { color: "blue", children: LOGO }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, color: "white", children: "GxP DevStudio" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Interactive development environment for GxP plugins" }) }), _jsxs(Box, { marginTop: 2, flexDirection: "row", justifyContent: "center", children: [_jsxs(Box, { flexDirection: "column", marginRight: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Quick Start" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev" }), " Start Vite dev server"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --with-socket" }), " Start Vite + Socket.IO"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --no-socket" }), " Start Vite only (no Socket)"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/socket" }), " Start Socket.IO server"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/ext chrome" }), " Launch Chrome extension"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/help" }), " Show all commands"] })] })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Keyboard Shortcuts" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Tab" }), " Cycle through tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Left/Right" }), " Switch tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+K" }), " Stop current service"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+L" }), " Clear current log"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+C" }), " Exit application"] })] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Socket Events" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket list" }), " to see available events"] }), _jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket send EventName" }), " to simulate events"] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Browser Extensions" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "gray", children: "Test your plugin on live GxP pages with the browser extension" }), _jsx(Text, { color: "gray", children: "Open DevTools and use the \"GxP Inspector\" panel to select components" })] })] }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Type a command below to get started..." }) })] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=WelcomeScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WelcomeScreen.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";AAWA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,UAAe,QAqChD;AASD,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { render } from 'ink';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import App from './App.js';
|
|
7
|
+
import { serviceManager } from './services/index.js';
|
|
8
|
+
// Load .env from the current working directory (project directory)
|
|
9
|
+
dotenv.config({ path: path.join(process.cwd(), '.env') });
|
|
10
|
+
export function startTUI(options = {}) {
|
|
11
|
+
// Check if stdin supports raw mode (required for Ink input handling)
|
|
12
|
+
// This can fail when:
|
|
13
|
+
// - Running in CI environments
|
|
14
|
+
// - Piped input (stdin is not a TTY)
|
|
15
|
+
// - Some terminal emulators
|
|
16
|
+
const stdin = process.stdin;
|
|
17
|
+
const stdinIsTTY = stdin.isTTY === true;
|
|
18
|
+
// If stdin doesn't support raw mode, we need to handle it gracefully
|
|
19
|
+
// Ink 5.x uses stdin by default and requires raw mode for input
|
|
20
|
+
if (!stdinIsTTY) {
|
|
21
|
+
console.error('Warning: Terminal does not support interactive mode.');
|
|
22
|
+
console.error('The TUI requires an interactive terminal (TTY) to function.');
|
|
23
|
+
console.error('');
|
|
24
|
+
console.error('Try running the command directly from your terminal, not from a script or pipe.');
|
|
25
|
+
console.error('');
|
|
26
|
+
console.error('Alternatively, use the non-TUI commands:');
|
|
27
|
+
console.error(' npm run dev # Start Vite dev server');
|
|
28
|
+
console.error(' npm run dev-http # Start HTTP dev server');
|
|
29
|
+
console.error(' gxdev socket list # List socket events');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const { waitUntilExit } = render(_jsx(App, { autoStart: options.autoStart, args: options.args }));
|
|
34
|
+
waitUntilExit().then(() => {
|
|
35
|
+
// Ensure all services are stopped before exiting
|
|
36
|
+
serviceManager.forceStopAll();
|
|
37
|
+
process.exit(0);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// Check if run directly (ESM way)
|
|
41
|
+
import { fileURLToPath } from 'url';
|
|
42
|
+
const isMain = process.argv[1] && process.argv[1] === fileURLToPath(import.meta.url);
|
|
43
|
+
if (isMain) {
|
|
44
|
+
startTUI();
|
|
45
|
+
}
|
|
46
|
+
export default startTUI;
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";;AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,mEAAmE;AACnE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAO1D,MAAM,UAAU,QAAQ,CAAC,UAAsB,EAAE;IAC/C,qEAAqE;IACrE,sBAAsB;IACtB,+BAA+B;IAC/B,qCAAqC;IACrC,4BAA4B;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAExC,qEAAqE;IACrE,gEAAgE;IAChE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACjG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAC,GAAG,IACF,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,GAClB,CACH,CAAC;IAEF,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACxB,iDAAiD;QACjD,cAAc,CAAC,YAAY,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrF,IAAI,MAAM,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|