erosolar-cli 1.7.95 → 1.7.97
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/shell/bracketedPasteManager.d.ts.map +1 -1
- package/dist/shell/bracketedPasteManager.js +10 -7
- package/dist/shell/bracketedPasteManager.js.map +1 -1
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +2 -0
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/ui/persistentChatBox.d.ts +113 -0
- package/dist/ui/persistentChatBox.d.ts.map +1 -0
- package/dist/ui/persistentChatBox.js +267 -0
- package/dist/ui/persistentChatBox.js.map +1 -0
- package/dist/ui/persistentPrompt.d.ts +19 -0
- package/dist/ui/persistentPrompt.d.ts.map +1 -1
- package/dist/ui/persistentPrompt.js +77 -0
- package/dist/ui/persistentPrompt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PersistentChatBox - Maintains a chat input at the bottom while AI is streaming
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Always visible chat input at bottom of terminal
|
|
6
|
+
* - Non-blocking input while AI is processing
|
|
7
|
+
* - Queue system for handling multiple user inputs
|
|
8
|
+
* - Visual separation between AI output and user input
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
export interface ChatMessage {
|
|
12
|
+
id: string;
|
|
13
|
+
content: string;
|
|
14
|
+
timestamp: Date;
|
|
15
|
+
type: 'user' | 'ai';
|
|
16
|
+
}
|
|
17
|
+
export interface ChatBoxState {
|
|
18
|
+
isVisible: boolean;
|
|
19
|
+
isProcessing: boolean;
|
|
20
|
+
userInput: string;
|
|
21
|
+
cursorPosition: number;
|
|
22
|
+
queuedMessages: ChatMessage[];
|
|
23
|
+
activeMessage?: ChatMessage;
|
|
24
|
+
}
|
|
25
|
+
export interface ChatBoxConfig {
|
|
26
|
+
promptText?: string;
|
|
27
|
+
maxHistory?: number;
|
|
28
|
+
enableAutoScroll?: boolean;
|
|
29
|
+
showTimestamps?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare class PersistentChatBox extends EventEmitter {
|
|
32
|
+
private writeStream;
|
|
33
|
+
private readlineInterface;
|
|
34
|
+
private config;
|
|
35
|
+
private state;
|
|
36
|
+
private isInitialized;
|
|
37
|
+
private outputBuffer;
|
|
38
|
+
private lastOutputHeight;
|
|
39
|
+
constructor(writeStream: NodeJS.WriteStream, config?: ChatBoxConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Initialize the chat box (call after setting up main UI)
|
|
42
|
+
*/
|
|
43
|
+
initialize(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Setup event handlers for readline
|
|
46
|
+
*/
|
|
47
|
+
private setupEventHandlers;
|
|
48
|
+
/**
|
|
49
|
+
* Show the chat box
|
|
50
|
+
*/
|
|
51
|
+
show(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Hide the chat box
|
|
54
|
+
*/
|
|
55
|
+
hide(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Set processing state (when AI is streaming)
|
|
58
|
+
*/
|
|
59
|
+
setProcessing(isProcessing: boolean): void;
|
|
60
|
+
/**
|
|
61
|
+
* Queue a user message for later processing
|
|
62
|
+
*/
|
|
63
|
+
private queueMessage;
|
|
64
|
+
/**
|
|
65
|
+
* Process queued messages when AI becomes available
|
|
66
|
+
*/
|
|
67
|
+
private processQueuedMessages;
|
|
68
|
+
/**
|
|
69
|
+
* Process immediate user input
|
|
70
|
+
*/
|
|
71
|
+
private processUserInput;
|
|
72
|
+
/**
|
|
73
|
+
* Add AI response to chat
|
|
74
|
+
*/
|
|
75
|
+
addAIResponse(content: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Redraw the prompt with current state
|
|
78
|
+
*/
|
|
79
|
+
private redrawPrompt;
|
|
80
|
+
/**
|
|
81
|
+
* Clear the prompt area
|
|
82
|
+
*/
|
|
83
|
+
private clearPrompt;
|
|
84
|
+
/**
|
|
85
|
+
* Show queued messages indicator
|
|
86
|
+
*/
|
|
87
|
+
private showQueuedIndicator;
|
|
88
|
+
/**
|
|
89
|
+
* Hide queued messages indicator
|
|
90
|
+
*/
|
|
91
|
+
private hideQueuedIndicator;
|
|
92
|
+
/**
|
|
93
|
+
* Get current state
|
|
94
|
+
*/
|
|
95
|
+
getState(): ChatBoxState;
|
|
96
|
+
/**
|
|
97
|
+
* Get queued message count
|
|
98
|
+
*/
|
|
99
|
+
getQueuedCount(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Clear all queued messages
|
|
102
|
+
*/
|
|
103
|
+
clearQueue(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Set prompt text
|
|
106
|
+
*/
|
|
107
|
+
setPromptText(text: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Cleanup resources
|
|
110
|
+
*/
|
|
111
|
+
destroy(): void;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=persistentChatBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentChatBox.d.ts","sourceRoot":"","sources":["../../src/ui/persistentChatBox.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAa;gBAGnC,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,MAAM,GAAE,aAAkB;IA8B5B;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAe1C;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWpC;;OAEG;IACH,OAAO,CAAC,YAAY;IA8BpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PersistentChatBox - Maintains a chat input at the bottom while AI is streaming
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Always visible chat input at bottom of terminal
|
|
6
|
+
* - Non-blocking input while AI is processing
|
|
7
|
+
* - Queue system for handling multiple user inputs
|
|
8
|
+
* - Visual separation between AI output and user input
|
|
9
|
+
*/
|
|
10
|
+
import * as readline from 'node:readline';
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
import { theme } from './theme.js';
|
|
13
|
+
export class PersistentChatBox extends EventEmitter {
|
|
14
|
+
writeStream;
|
|
15
|
+
readlineInterface;
|
|
16
|
+
config;
|
|
17
|
+
state;
|
|
18
|
+
isInitialized = false;
|
|
19
|
+
outputBuffer = [];
|
|
20
|
+
lastOutputHeight = 0;
|
|
21
|
+
constructor(writeStream, config = {}) {
|
|
22
|
+
super();
|
|
23
|
+
this.writeStream = writeStream;
|
|
24
|
+
this.config = {
|
|
25
|
+
promptText: '> ',
|
|
26
|
+
maxHistory: 100,
|
|
27
|
+
enableAutoScroll: true,
|
|
28
|
+
showTimestamps: false,
|
|
29
|
+
...config,
|
|
30
|
+
};
|
|
31
|
+
this.state = {
|
|
32
|
+
isVisible: true,
|
|
33
|
+
isProcessing: false,
|
|
34
|
+
userInput: '',
|
|
35
|
+
cursorPosition: 0,
|
|
36
|
+
queuedMessages: [],
|
|
37
|
+
};
|
|
38
|
+
this.readlineInterface = readline.createInterface({
|
|
39
|
+
input: process.stdin,
|
|
40
|
+
output: process.stdout,
|
|
41
|
+
prompt: '',
|
|
42
|
+
terminal: true,
|
|
43
|
+
});
|
|
44
|
+
this.setupEventHandlers();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Initialize the chat box (call after setting up main UI)
|
|
48
|
+
*/
|
|
49
|
+
initialize() {
|
|
50
|
+
if (this.isInitialized)
|
|
51
|
+
return;
|
|
52
|
+
this.isInitialized = true;
|
|
53
|
+
this.show();
|
|
54
|
+
this.emit('initialized');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Setup event handlers for readline
|
|
58
|
+
*/
|
|
59
|
+
setupEventHandlers() {
|
|
60
|
+
// Handle user input
|
|
61
|
+
this.readlineInterface.on('line', (input) => {
|
|
62
|
+
if (this.state.isProcessing) {
|
|
63
|
+
// Queue the input if AI is processing
|
|
64
|
+
this.queueMessage(input);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Process immediately if AI is idle
|
|
68
|
+
this.processUserInput(input);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Handle SIGINT (Ctrl+C)
|
|
72
|
+
this.readlineInterface.on('SIGINT', () => {
|
|
73
|
+
this.emit('interrupt');
|
|
74
|
+
});
|
|
75
|
+
// Handle line events for real-time input tracking
|
|
76
|
+
this.readlineInterface.on('line', () => {
|
|
77
|
+
// Reset input state after submission
|
|
78
|
+
this.state.userInput = '';
|
|
79
|
+
this.state.cursorPosition = 0;
|
|
80
|
+
});
|
|
81
|
+
// Track input changes
|
|
82
|
+
process.stdin.on('keypress', (str, key) => {
|
|
83
|
+
if (key && key.name === 'backspace') {
|
|
84
|
+
if (this.state.userInput.length > 0) {
|
|
85
|
+
this.state.userInput = this.state.userInput.slice(0, -1);
|
|
86
|
+
this.state.cursorPosition = Math.max(0, this.state.cursorPosition - 1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (str && str.length === 1) {
|
|
90
|
+
this.state.userInput += str;
|
|
91
|
+
this.state.cursorPosition++;
|
|
92
|
+
}
|
|
93
|
+
this.emit('inputChanged', this.state.userInput, this.state.cursorPosition);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Show the chat box
|
|
98
|
+
*/
|
|
99
|
+
show() {
|
|
100
|
+
if (!this.state.isVisible) {
|
|
101
|
+
this.state.isVisible = true;
|
|
102
|
+
this.redrawPrompt();
|
|
103
|
+
this.emit('visibilityChanged', true);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Hide the chat box
|
|
108
|
+
*/
|
|
109
|
+
hide() {
|
|
110
|
+
if (this.state.isVisible) {
|
|
111
|
+
this.state.isVisible = false;
|
|
112
|
+
this.clearPrompt();
|
|
113
|
+
this.emit('visibilityChanged', false);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Set processing state (when AI is streaming)
|
|
118
|
+
*/
|
|
119
|
+
setProcessing(isProcessing) {
|
|
120
|
+
this.state.isProcessing = isProcessing;
|
|
121
|
+
if (isProcessing) {
|
|
122
|
+
// Show processing indicator
|
|
123
|
+
this.redrawPrompt();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Process any queued messages
|
|
127
|
+
this.processQueuedMessages();
|
|
128
|
+
this.redrawPrompt();
|
|
129
|
+
}
|
|
130
|
+
this.emit('processingStateChanged', isProcessing);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Queue a user message for later processing
|
|
134
|
+
*/
|
|
135
|
+
queueMessage(input) {
|
|
136
|
+
const message = {
|
|
137
|
+
id: Date.now().toString(),
|
|
138
|
+
content: input,
|
|
139
|
+
timestamp: new Date(),
|
|
140
|
+
type: 'user',
|
|
141
|
+
};
|
|
142
|
+
this.state.queuedMessages.push(message);
|
|
143
|
+
// Limit history size
|
|
144
|
+
if (this.state.queuedMessages.length > this.config.maxHistory) {
|
|
145
|
+
this.state.queuedMessages.shift();
|
|
146
|
+
}
|
|
147
|
+
this.emit('messageQueued', message);
|
|
148
|
+
this.showQueuedIndicator();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Process queued messages when AI becomes available
|
|
152
|
+
*/
|
|
153
|
+
processQueuedMessages() {
|
|
154
|
+
while (this.state.queuedMessages.length > 0 && !this.state.isProcessing) {
|
|
155
|
+
const message = this.state.queuedMessages.shift();
|
|
156
|
+
if (message) {
|
|
157
|
+
this.emit('message', message);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
this.hideQueuedIndicator();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Process immediate user input
|
|
164
|
+
*/
|
|
165
|
+
processUserInput(input) {
|
|
166
|
+
const message = {
|
|
167
|
+
id: Date.now().toString(),
|
|
168
|
+
content: input,
|
|
169
|
+
timestamp: new Date(),
|
|
170
|
+
type: 'user',
|
|
171
|
+
};
|
|
172
|
+
this.emit('message', message);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Add AI response to chat
|
|
176
|
+
*/
|
|
177
|
+
addAIResponse(content) {
|
|
178
|
+
const message = {
|
|
179
|
+
id: Date.now().toString(),
|
|
180
|
+
content,
|
|
181
|
+
timestamp: new Date(),
|
|
182
|
+
type: 'ai',
|
|
183
|
+
};
|
|
184
|
+
this.emit('aiResponse', message);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Redraw the prompt with current state
|
|
188
|
+
*/
|
|
189
|
+
redrawPrompt() {
|
|
190
|
+
if (!this.state.isVisible)
|
|
191
|
+
return;
|
|
192
|
+
this.clearPrompt();
|
|
193
|
+
let promptLine = '';
|
|
194
|
+
if (this.state.isProcessing) {
|
|
195
|
+
// Show processing indicator
|
|
196
|
+
promptLine = `${theme.colors.cyan}⏳ AI is processing...${theme.colors.reset} `;
|
|
197
|
+
if (this.state.queuedMessages.length > 0) {
|
|
198
|
+
promptLine += `${theme.colors.yellow}[${this.state.queuedMessages.length} queued]${theme.colors.reset}`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Show normal prompt
|
|
203
|
+
promptLine = `${this.config.promptText}`;
|
|
204
|
+
if (this.state.queuedMessages.length > 0) {
|
|
205
|
+
promptLine += `${theme.colors.yellow}[${this.state.queuedMessages.length} queued]${theme.colors.reset} `;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
this.writeStream.write(`\n${promptLine}`);
|
|
209
|
+
// Set readline prompt to maintain cursor position
|
|
210
|
+
this.readlineInterface.setPrompt(promptLine);
|
|
211
|
+
this.readlineInterface.prompt(true);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Clear the prompt area
|
|
215
|
+
*/
|
|
216
|
+
clearPrompt() {
|
|
217
|
+
// Move cursor up and clear line
|
|
218
|
+
this.writeStream.write('\x1b[1A\x1b[2K');
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Show queued messages indicator
|
|
222
|
+
*/
|
|
223
|
+
showQueuedIndicator() {
|
|
224
|
+
this.redrawPrompt();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Hide queued messages indicator
|
|
228
|
+
*/
|
|
229
|
+
hideQueuedIndicator() {
|
|
230
|
+
this.redrawPrompt();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get current state
|
|
234
|
+
*/
|
|
235
|
+
getState() {
|
|
236
|
+
return { ...this.state };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get queued message count
|
|
240
|
+
*/
|
|
241
|
+
getQueuedCount() {
|
|
242
|
+
return this.state.queuedMessages.length;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Clear all queued messages
|
|
246
|
+
*/
|
|
247
|
+
clearQueue() {
|
|
248
|
+
this.state.queuedMessages = [];
|
|
249
|
+
this.redrawPrompt();
|
|
250
|
+
this.emit('queueCleared');
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Set prompt text
|
|
254
|
+
*/
|
|
255
|
+
setPromptText(text) {
|
|
256
|
+
this.config.promptText = text;
|
|
257
|
+
this.redrawPrompt();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Cleanup resources
|
|
261
|
+
*/
|
|
262
|
+
destroy() {
|
|
263
|
+
this.readlineInterface.close();
|
|
264
|
+
this.removeAllListeners();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=persistentChatBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentChatBox.js","sourceRoot":"","sources":["../../src/ui/persistentChatBox.ts"],"names":[],"mappings":"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"}
|
|
@@ -162,6 +162,7 @@ export declare class PinnedChatBox {
|
|
|
162
162
|
private readonly ansiPattern;
|
|
163
163
|
private readonly oscPattern;
|
|
164
164
|
private readonly maxStatusMessageLength;
|
|
165
|
+
private scrollRegionActive;
|
|
165
166
|
private inputHistory;
|
|
166
167
|
private historyIndex;
|
|
167
168
|
private tempCurrentInput;
|
|
@@ -190,6 +191,24 @@ export declare class PinnedChatBox {
|
|
|
190
191
|
afterWrite?: () => void;
|
|
191
192
|
}) => () => void;
|
|
192
193
|
}): void;
|
|
194
|
+
/**
|
|
195
|
+
* Enable scroll region to keep bottom lines reserved for input.
|
|
196
|
+
* Content scrolls in the upper region, input stays pinned at bottom.
|
|
197
|
+
*/
|
|
198
|
+
enableScrollRegion(): void;
|
|
199
|
+
/**
|
|
200
|
+
* Disable scroll region and restore normal terminal behavior.
|
|
201
|
+
*/
|
|
202
|
+
disableScrollRegion(): void;
|
|
203
|
+
/**
|
|
204
|
+
* Render the persistent input area at the bottom of the terminal.
|
|
205
|
+
* Called when scroll region is active to keep input visible during streaming.
|
|
206
|
+
*/
|
|
207
|
+
renderPersistentInput(): void;
|
|
208
|
+
/**
|
|
209
|
+
* Update the persistent input during streaming.
|
|
210
|
+
*/
|
|
211
|
+
updatePersistentInput(): void;
|
|
193
212
|
/**
|
|
194
213
|
* Determine if we can safely render to the terminal.
|
|
195
214
|
* Protects against non-TTY streams and disposed instances.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentPrompt.d.ts","sourceRoot":"","sources":["../../src/ui/persistentPrompt.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persistentPrompt.d.ts","sourceRoot":"","sources":["../../src/ui/persistentPrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -232,6 +232,8 @@ export class PinnedChatBox {
|
|
|
232
232
|
ansiPattern = /[\u001B\u009B][[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
|
|
233
233
|
oscPattern = /\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g;
|
|
234
234
|
maxStatusMessageLength = 200;
|
|
235
|
+
// Scroll region management for persistent bottom input
|
|
236
|
+
scrollRegionActive = false;
|
|
235
237
|
// Input history for up/down navigation
|
|
236
238
|
inputHistory = [];
|
|
237
239
|
historyIndex = -1;
|
|
@@ -280,6 +282,81 @@ export class PinnedChatBox {
|
|
|
280
282
|
},
|
|
281
283
|
});
|
|
282
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Enable scroll region to keep bottom lines reserved for input.
|
|
287
|
+
* Content scrolls in the upper region, input stays pinned at bottom.
|
|
288
|
+
*/
|
|
289
|
+
enableScrollRegion() {
|
|
290
|
+
if (!this.supportsRendering() || this.scrollRegionActive)
|
|
291
|
+
return;
|
|
292
|
+
const rows = this.writeStream.rows || 24;
|
|
293
|
+
const reservedHeight = this.reservedLines;
|
|
294
|
+
// Set scroll region to exclude bottom lines
|
|
295
|
+
this.safeWrite(ANSI.SET_SCROLL_REGION(1, rows - reservedHeight));
|
|
296
|
+
// Move cursor to end of scroll region
|
|
297
|
+
this.safeWrite(`\u001b[${rows - reservedHeight};1H`);
|
|
298
|
+
this.scrollRegionActive = true;
|
|
299
|
+
// Render the persistent input area at the bottom
|
|
300
|
+
this.renderPersistentInput();
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Disable scroll region and restore normal terminal behavior.
|
|
304
|
+
*/
|
|
305
|
+
disableScrollRegion() {
|
|
306
|
+
if (!this.supportsRendering() || !this.scrollRegionActive)
|
|
307
|
+
return;
|
|
308
|
+
// Reset scroll region to full terminal
|
|
309
|
+
this.safeWrite(ANSI.RESET_SCROLL_REGION);
|
|
310
|
+
this.scrollRegionActive = false;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Render the persistent input area at the bottom of the terminal.
|
|
314
|
+
* Called when scroll region is active to keep input visible during streaming.
|
|
315
|
+
*/
|
|
316
|
+
renderPersistentInput() {
|
|
317
|
+
if (!this.supportsRendering())
|
|
318
|
+
return;
|
|
319
|
+
const rows = this.writeStream.rows || 24;
|
|
320
|
+
const cols = Math.max(this.writeStream.columns || 80, 40);
|
|
321
|
+
// Save cursor position
|
|
322
|
+
this.safeWrite(ANSI.SAVE_CURSOR);
|
|
323
|
+
// Move to the reserved bottom area (outside scroll region)
|
|
324
|
+
this.safeWrite(ANSI.CURSOR_TO_BOTTOM(rows - 1));
|
|
325
|
+
// Build status line
|
|
326
|
+
const queueCount = this.state.queuedCommands.length;
|
|
327
|
+
let statusText = '';
|
|
328
|
+
if (this.state.isProcessing) {
|
|
329
|
+
const queuePart = queueCount > 0 ? ` (${queueCount} queued)` : '';
|
|
330
|
+
statusText = `⏳ Processing...${queuePart} [Esc: cancel · Enter: queue]`;
|
|
331
|
+
}
|
|
332
|
+
else if (this.state.statusMessage) {
|
|
333
|
+
statusText = this.state.statusMessage;
|
|
334
|
+
}
|
|
335
|
+
else if (queueCount > 0) {
|
|
336
|
+
statusText = `${queueCount} follow-up${queueCount === 1 ? '' : 's'} queued`;
|
|
337
|
+
}
|
|
338
|
+
// Render separator and status on bottom lines
|
|
339
|
+
const separatorWidth = Math.min(cols - 2, 72);
|
|
340
|
+
const separator = theme.ui.border('─'.repeat(separatorWidth));
|
|
341
|
+
// Line rows-1: separator
|
|
342
|
+
this.safeWrite(ANSI.CLEAR_LINE);
|
|
343
|
+
this.safeWrite(separator);
|
|
344
|
+
// Line rows: status/prompt
|
|
345
|
+
this.safeWrite(`\n${ANSI.CLEAR_LINE}`);
|
|
346
|
+
if (statusText) {
|
|
347
|
+
this.safeWrite(theme.ui.muted(statusText.slice(0, cols - 4)));
|
|
348
|
+
}
|
|
349
|
+
// Restore cursor to scroll region
|
|
350
|
+
this.safeWrite(ANSI.RESTORE_CURSOR);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Update the persistent input during streaming.
|
|
354
|
+
*/
|
|
355
|
+
updatePersistentInput() {
|
|
356
|
+
if (!this.scrollRegionActive)
|
|
357
|
+
return;
|
|
358
|
+
this.renderPersistentInput();
|
|
359
|
+
}
|
|
283
360
|
/**
|
|
284
361
|
* Determine if we can safely render to the terminal.
|
|
285
362
|
* Protects against non-TTY streams and disposed instances.
|