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.
@@ -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.