erosolar-cli 1.7.109 → 1.7.110

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.
@@ -1,7 +1,7 @@
1
- import { readFileSync, writeFileSync, existsSync } from 'node:fs';
1
+ import { readFile, writeFile, stat } from 'node:fs/promises';
2
2
  import { join, relative } from 'node:path';
3
3
  import { buildError } from '../core/errors.js';
4
- import { buildDiffSegments, formatDiffLines } from './diffUtils.js';
4
+ import { buildDiffSegmentsFast, formatDiffLines } from './diffUtils.js';
5
5
  /**
6
6
  * Creates the Edit tool for surgical file modifications using exact string replacement.
7
7
  *
@@ -65,12 +65,15 @@ export function createEditTools(workingDir) {
65
65
  }
66
66
  try {
67
67
  const filePath = resolveFilePath(workingDir, pathArg);
68
- // Check file exists
69
- if (!existsSync(filePath)) {
68
+ // Check file exists (async for speed)
69
+ try {
70
+ await stat(filePath);
71
+ }
72
+ catch {
70
73
  return `Error: File not found: ${filePath}`;
71
74
  }
72
- // Read current content
73
- const currentContent = readFileSync(filePath, 'utf-8');
75
+ // Read current content (async for speed)
76
+ const currentContent = await readFile(filePath, 'utf-8');
74
77
  // Check if old_string exists in file
75
78
  if (!currentContent.includes(oldString)) {
76
79
  // Provide helpful debugging info when match fails
@@ -99,10 +102,10 @@ export function createEditTools(workingDir) {
99
102
  const newContent = replaceAll
100
103
  ? currentContent.split(oldString).join(newString)
101
104
  : currentContent.replace(oldString, newString);
102
- // Generate diff
103
- const diffSegments = buildDiffSegments(currentContent, newContent);
104
- // Write file
105
- writeFileSync(filePath, newContent, 'utf-8');
105
+ // Generate diff (fast in-memory algorithm, no git spawning)
106
+ const diffSegments = buildDiffSegmentsFast(currentContent, newContent);
107
+ // Write file (async for speed)
108
+ await writeFile(filePath, newContent, 'utf-8');
106
109
  // Build summary
107
110
  const relativePath = relative(workingDir, filePath);
108
111
  const displayPath = relativePath && !relativePath.startsWith('..') ? relativePath : filePath;
@@ -149,7 +152,7 @@ function countOccurrences(text, search) {
149
152
  }
150
153
  /**
151
154
  * Find lines in the file that are similar to the search text.
152
- * Helps debug when exact match fails by showing what's actually in the file.
155
+ * Enhanced with whitespace detection and auto-correction suggestions.
153
156
  */
154
157
  function findSimilarLines(content, searchFirstLine, _filePath) {
155
158
  if (!searchFirstLine.trim()) {
@@ -163,6 +166,14 @@ function findSimilarLines(content, searchFirstLine, _filePath) {
163
166
  for (let i = 0; i < lines.length; i++) {
164
167
  const line = lines[i] || '';
165
168
  const lineNormalized = line.trim().toLowerCase();
169
+ // Check for exact match with different whitespace
170
+ if (lineNormalized === searchNormalized && line !== searchFirstLine) {
171
+ const hasTabs = line.includes('\t') !== searchFirstLine.includes('\t');
172
+ const leadingDiff = line.match(/^\s*/)?.[0]?.length !== searchFirstLine.match(/^\s*/)?.[0]?.length;
173
+ const issue = hasTabs ? 'tabs vs spaces' : leadingDiff ? 'different indentation' : 'whitespace difference';
174
+ matches.push({ lineNum: i + 1, line, similarity: 0.99, issue });
175
+ continue;
176
+ }
166
177
  // Check for partial match (contains significant portion of the search)
167
178
  if (lineNormalized.includes(searchNormalized.substring(0, 20))) {
168
179
  matches.push({ lineNum: i + 1, line, similarity: 1.0 });
@@ -185,8 +196,14 @@ function findSimilarLines(content, searchFirstLine, _filePath) {
185
196
  const topMatches = matches.slice(0, 3);
186
197
  const suggestions = topMatches.map(m => {
187
198
  const truncated = m.line.length > 80 ? m.line.substring(0, 77) + '...' : m.line;
188
- return ` Line ${m.lineNum}: ${JSON.stringify(truncated)}`;
199
+ const issueNote = m.issue ? ` (${m.issue})` : '';
200
+ return ` Line ${m.lineNum}${issueNote}: ${JSON.stringify(truncated)}`;
189
201
  });
202
+ // Add auto-correction hint for whitespace issues
203
+ const whitespaceMatch = topMatches.find(m => m.issue);
204
+ if (whitespaceMatch) {
205
+ return `Similar lines found (possible whitespace mismatch):\n${suggestions.join('\n')}\n\nTip: Copy the exact text from Read output including indentation.`;
206
+ }
190
207
  return `Similar lines found:\n${suggestions.join('\n')}`;
191
208
  }
192
209
  //# sourceMappingURL=editTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editTools.js","sourceRoot":"","sources":["../../src/tools/editTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editTools.js","sourceRoot":"","sources":["../../src/tools/editTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,OAAO;QACL;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,yLAAyL;YACtM,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yCAAyC;qBACvD;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uFAAuF;qBACrG;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iEAAiE;qBAC/E;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,yHAAyH;qBACvI;iBACF;gBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;gBACnD,oBAAoB,EAAE,KAAK;aAC5B;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;gBAEhD,kBAAkB;gBAClB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnD,OAAO,8CAA8C,CAAC;gBACxD,CAAC;gBACD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,qCAAqC,CAAC;gBAC/C,CAAC;gBACD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,qCAAqC,CAAC;gBAC/C,CAAC;gBACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,OAAO,qDAAqD,CAAC;gBAC/D,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAEtD,sCAAsC;oBACtC,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,0BAA0B,QAAQ,EAAE,CAAC;oBAC9C,CAAC;oBAED,yCAAyC;oBACzC,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAEzD,qCAAqC;oBACrC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACxC,kDAAkD;wBAClD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;wBACpE,OAAO;4BACL,sCAAsC;4BACtC,EAAE;4BACF,SAAS,QAAQ,EAAE;4BACnB,kBAAkB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;4BACnG,EAAE;4BACF,KAAK;4BACL,EAAE;4BACF,OAAO;4BACP,+CAA+C;4BAC/C,uCAAuC;4BACvC,4BAA4B;yBAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACf,CAAC;oBAED,oBAAoB;oBACpB,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;oBAEhE,IAAI,CAAC,UAAU,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;wBACnC,OAAO,6BAA6B,WAAW,sIAAsI,WAAW,yBAAyB,QAAQ,EAAE,CAAC;oBACtO,CAAC;oBAED,sBAAsB;oBACtB,MAAM,UAAU,GAAG,UAAU;wBAC3B,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;wBACjD,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;oBAEjD,4DAA4D;oBAC5D,MAAM,YAAY,GAAG,qBAAqB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;oBAEvE,+BAA+B;oBAC/B,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;oBAE/C,gBAAgB;oBAChB,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACpD,MAAM,WAAW,GAAG,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC7F,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;oBACvE,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;oBAC3E,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,WAAW,cAAc,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAEtG,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;wBACpC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC7C,CAAC,CAAC,0DAA0D,CAAC;oBAE/D,OAAO;wBACL,YAAY,WAAW,GAAG,eAAe,EAAE;wBAC3C,mBAAmB,UAAU,OAAO,YAAY,EAAE;wBAClD,EAAE;wBACF,eAAe;wBACf,SAAS;qBACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEf,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE;wBACvC,SAAS,EAAE,OAAO;wBAClB,iBAAiB,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACvE,iBAAiB,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;qBACxE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,IAAY;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,MAAc;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1D,KAAK,EAAE,CAAC;QACR,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,eAAuB,EAAE,SAAiB;IACnF,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,8CAA8C,CAAC;IACxD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAiF,EAAE,CAAC;IAEjG,oDAAoD;IACpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjD,kDAAkD;QAClD,IAAI,cAAc,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;YACnG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC;YAC3G,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,SAAS;QACX,CAAC;QAED,uEAAuE;QACvE,IAAI,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;YAC7D,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,8DAA8D,CAAC;IACxE,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,UAAU,CAAC,CAAC,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,wDAAwD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,sEAAsE,CAAC;IAC9J,CAAC;IAED,OAAO,yBAAyB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * EnhancedPinnedChatBox - Modified version of PinnedChatBox with persistent visibility during streaming
3
+ * and enhanced paste handling
4
+ */
5
+ export interface QueuedCommand {
6
+ id: string;
7
+ text: string;
8
+ type: 'request' | 'continuous' | 'slash';
9
+ timestamp: number;
10
+ preview: string;
11
+ }
12
+ export interface PinnedChatBoxState {
13
+ isProcessing: boolean;
14
+ queuedCommands: QueuedCommand[];
15
+ currentInput: string;
16
+ contextUsage: number;
17
+ statusMessage: string | null;
18
+ isVisible: boolean;
19
+ }
20
+ export declare class EnhancedPinnedChatBox {
21
+ private writeStream;
22
+ private state;
23
+ private reservedLines;
24
+ private _lastRenderedHeight;
25
+ private inputBuffer;
26
+ private cursorPosition;
27
+ private commandIdCounter;
28
+ private onCommandQueued?;
29
+ private onInputSubmit?;
30
+ private renderScheduled;
31
+ private isEnabled;
32
+ private isDisposed;
33
+ private lastRenderTime;
34
+ private renderThrottleMs;
35
+ private maxInputLength;
36
+ private maxQueueSize;
37
+ private readonly ansiPattern;
38
+ private readonly oscPattern;
39
+ private readonly maxStatusMessageLength;
40
+ private scrollRegionActive;
41
+ private inputHistory;
42
+ private historyIndex;
43
+ private tempCurrentInput;
44
+ private readonly maxHistorySize;
45
+ private isPastedBlock;
46
+ private pastedFullContent;
47
+ private pasteStartTime;
48
+ private pasteLineCount;
49
+ private readonly maxPasteLines;
50
+ private outputInterceptorCleanup?;
51
+ constructor(writeStream: NodeJS.WriteStream, _promptText?: string, options?: {
52
+ onCommandQueued?: (cmd: QueuedCommand) => void;
53
+ onInputSubmit?: (input: string) => void;
54
+ maxInputLength?: number;
55
+ maxQueueSize?: number;
56
+ });
57
+ /**
58
+ * Enhanced paste detection with summarization
59
+ */
60
+ handlePaste(content: string): void;
61
+ /**
62
+ * Clear paste state
63
+ */
64
+ private clearPastedBlock;
65
+ /**
66
+ * Handle character input with paste detection
67
+ */
68
+ handleCharacter(char: string): void;
69
+ /**
70
+ * Handle Enter key - only submit when explicitly pressed
71
+ */
72
+ handleEnter(): string | null;
73
+ /**
74
+ * Enhanced render that always shows during processing
75
+ */
76
+ render(): void;
77
+ /**
78
+ * Render persistent input during processing
79
+ */
80
+ renderPersistentInput(): void;
81
+ private supportsRendering;
82
+ private safeWrite;
83
+ private sanitizeCommandText;
84
+ private sanitizeStatusMessage;
85
+ private addToHistory;
86
+ setEnabled(enabled: boolean): void;
87
+ setProcessing(isProcessing: boolean): void;
88
+ setContextUsage(percentage: number): void;
89
+ setStatusMessage(message: string | null): void;
90
+ queueCommand(text: string, type?: 'request' | 'continuous' | 'slash'): QueuedCommand | null;
91
+ clearQueue(): void;
92
+ }
93
+ //# sourceMappingURL=enhancedPinnedChatBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancedPinnedChatBox.d.ts","sourceRoot":"","sources":["../../src/ui/enhancedPinnedChatBox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,372 @@
1
+ /**
2
+ * EnhancedPinnedChatBox - Modified version of PinnedChatBox with persistent visibility during streaming
3
+ * and enhanced paste handling
4
+ */
5
+ import { theme } from './theme.js';
6
+ import { ANSI } from './ansi.js';
7
+ export class EnhancedPinnedChatBox {
8
+ writeStream;
9
+ state;
10
+ reservedLines = 2;
11
+ _lastRenderedHeight = 0;
12
+ inputBuffer = '';
13
+ cursorPosition = 0;
14
+ commandIdCounter = 0;
15
+ onCommandQueued;
16
+ onInputSubmit;
17
+ renderScheduled = false;
18
+ isEnabled = true;
19
+ isDisposed = false;
20
+ lastRenderTime = 0;
21
+ renderThrottleMs = 16;
22
+ maxInputLength = 10000;
23
+ maxQueueSize = 100;
24
+ ansiPattern = /[\u001B\u009B][[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
25
+ oscPattern = /\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g;
26
+ maxStatusMessageLength = 200;
27
+ // Scroll region management
28
+ scrollRegionActive = false;
29
+ // Input history
30
+ inputHistory = [];
31
+ historyIndex = -1;
32
+ tempCurrentInput = '';
33
+ maxHistorySize = 100;
34
+ // Enhanced paste tracking
35
+ isPastedBlock = false;
36
+ pastedFullContent = '';
37
+ pasteStartTime = 0;
38
+ pasteLineCount = 0;
39
+ maxPasteLines = 50;
40
+ outputInterceptorCleanup;
41
+ constructor(writeStream, _promptText = '> ', options = {}) {
42
+ this.writeStream = writeStream;
43
+ this.onCommandQueued = options.onCommandQueued;
44
+ this.onInputSubmit = options.onInputSubmit;
45
+ this.maxInputLength = options.maxInputLength ?? this.maxInputLength;
46
+ this.maxQueueSize = options.maxQueueSize ?? this.maxQueueSize;
47
+ this.state = {
48
+ isProcessing: false,
49
+ queuedCommands: [],
50
+ currentInput: '',
51
+ contextUsage: 0,
52
+ statusMessage: null,
53
+ isVisible: true,
54
+ };
55
+ }
56
+ /**
57
+ * Enhanced paste detection with summarization
58
+ */
59
+ handlePaste(content) {
60
+ if (this.isDisposed)
61
+ return;
62
+ const lines = content.split('\n');
63
+ const lineCount = lines.length;
64
+ const charCount = content.length;
65
+ this.pasteStartTime = Date.now();
66
+ this.pasteLineCount = lineCount;
67
+ // For large pastes, show summary instead of full content
68
+ if (lineCount > this.maxPasteLines || charCount > 2000) {
69
+ this.isPastedBlock = true;
70
+ this.pastedFullContent = content;
71
+ const summaryLines = lines.slice(0, 5);
72
+ const remainingLines = lineCount - 5;
73
+ const summary = summaryLines.join('\n') +
74
+ (remainingLines > 0 ? `\n... (${remainingLines} more lines)` : '');
75
+ this.inputBuffer = summary;
76
+ this.cursorPosition = summary.length;
77
+ this.state.currentInput = summary;
78
+ this.setStatusMessage(`📋 Pasted ${lineCount} lines, ${charCount} chars - hit Enter to submit`);
79
+ }
80
+ else {
81
+ this.isPastedBlock = false;
82
+ this.pastedFullContent = '';
83
+ this.inputBuffer = content;
84
+ this.cursorPosition = content.length;
85
+ this.state.currentInput = content;
86
+ }
87
+ this.scheduleRender();
88
+ }
89
+ /**
90
+ * Clear paste state
91
+ */
92
+ clearPastedBlock() {
93
+ this.isPastedBlock = false;
94
+ this.pastedFullContent = '';
95
+ this.pasteStartTime = 0;
96
+ this.pasteLineCount = 0;
97
+ }
98
+ /**
99
+ * Handle character input with paste detection
100
+ */
101
+ handleCharacter(char) {
102
+ if (this.isDisposed)
103
+ return;
104
+ const now = Date.now();
105
+ if (this.pasteStartTime > 0 && now - this.pasteStartTime < 100) {
106
+ // Rapid input detected - treat as paste continuation
107
+ this.inputBuffer = this.inputBuffer.slice(0, this.cursorPosition) +
108
+ char +
109
+ this.inputBuffer.slice(this.cursorPosition);
110
+ this.cursorPosition += char.length;
111
+ this.state.currentInput = this.inputBuffer;
112
+ this.scheduleRender();
113
+ return;
114
+ }
115
+ // Normal character input
116
+ this.inputBuffer = this.inputBuffer.slice(0, this.cursorPosition) +
117
+ char +
118
+ this.inputBuffer.slice(this.cursorPosition);
119
+ this.cursorPosition += char.length;
120
+ this.state.currentInput = this.inputBuffer;
121
+ this.clearPastedBlock();
122
+ this.scheduleRender();
123
+ }
124
+ /**
125
+ * Handle Enter key - only submit when explicitly pressed
126
+ */
127
+ handleEnter() {
128
+ if (this.isDisposed)
129
+ return null;
130
+ let input;
131
+ // If we have a pasted block, use the full content
132
+ if (this.isPastedBlock && this.pastedFullContent) {
133
+ input = this.sanitizeCommandText(this.pastedFullContent);
134
+ }
135
+ else {
136
+ input = this.sanitizeCommandText(this.inputBuffer);
137
+ }
138
+ if (!input)
139
+ return null;
140
+ // Add to history before processing
141
+ const historyEntry = this.isPastedBlock
142
+ ? `[Pasted ${this.pasteLineCount} lines] ${input.slice(0, 100)}...`
143
+ : input;
144
+ this.addToHistory(historyEntry);
145
+ // If processing, queue the command instead of submitting
146
+ if (this.state.isProcessing) {
147
+ const type = input.startsWith('/') ? 'slash' : 'request';
148
+ const queued = this.queueCommand(input, type);
149
+ if (!queued) {
150
+ this.setStatusMessage(`Queue is full (${this.maxQueueSize}). Submit after current task or clear queued items.`);
151
+ return null;
152
+ }
153
+ this.clearInput();
154
+ return null;
155
+ }
156
+ // Clear input and paste state, then notify
157
+ this.clearInput();
158
+ if (this.onInputSubmit) {
159
+ this.onInputSubmit(input);
160
+ }
161
+ return input;
162
+ }
163
+ /**
164
+ * Enhanced render that always shows during processing
165
+ */
166
+ render() {
167
+ if (!this.state.isVisible || !this.supportsRendering())
168
+ return;
169
+ // ALWAYS render during processing - use persistent input mode
170
+ if (this.state.isProcessing) {
171
+ this.renderPersistentInput();
172
+ return;
173
+ }
174
+ // Not processing - render the standard status box
175
+ this.lastRenderTime = Date.now();
176
+ try {
177
+ const cols = Math.max(this.writeStream.columns || 80, 40);
178
+ const separatorWidth = Math.min(cols - 2, 72);
179
+ // Build status message
180
+ const statusParts = [];
181
+ // Processing status
182
+ if (this.state.statusMessage) {
183
+ const maxLen = Math.max(20, cols - 30);
184
+ const msg = this.state.statusMessage.length > maxLen
185
+ ? `${this.state.statusMessage.slice(0, maxLen - 3)}...`
186
+ : this.state.statusMessage;
187
+ statusParts.push(theme.ui.muted(msg));
188
+ }
189
+ if (statusParts.length === 0) {
190
+ // Not processing and no status - nothing to show
191
+ return;
192
+ }
193
+ const statusLine = statusParts.join(' │ ');
194
+ const separator = theme.ui.border('─'.repeat(separatorWidth));
195
+ // Write the 3-line pinned box
196
+ this.safeWrite(`\r${ANSI.CLEAR_LINE}${separator}\n`);
197
+ this.safeWrite(`${ANSI.CLEAR_LINE}${statusLine}\n`);
198
+ this.safeWrite(`${ANSI.CLEAR_LINE}${theme.ui.muted('>')} `);
199
+ this._lastRenderedHeight = 3;
200
+ }
201
+ catch {
202
+ // Silently handle render errors
203
+ }
204
+ }
205
+ /**
206
+ * Render persistent input during processing
207
+ */
208
+ renderPersistentInput() {
209
+ if (!this.supportsRendering())
210
+ return;
211
+ const rows = this.writeStream.rows || 24;
212
+ const cols = Math.max(this.writeStream.columns || 80, 40);
213
+ // Save cursor position
214
+ this.safeWrite(ANSI.SAVE_CURSOR);
215
+ // Move to the reserved bottom area (outside scroll region)
216
+ this.safeWrite(ANSI.CURSOR_TO_BOTTOM(rows - 1));
217
+ // Build status line
218
+ const queueCount = this.state.queuedCommands.length;
219
+ let statusText = '';
220
+ if (this.state.isProcessing) {
221
+ const queuePart = queueCount > 0 ? ` (${queueCount} queued)` : '';
222
+ statusText = `🔄 AI is streaming...${queuePart} [Enter: queue additional prompts]`;
223
+ }
224
+ else if (this.state.statusMessage) {
225
+ statusText = this.state.statusMessage;
226
+ }
227
+ else if (queueCount > 0) {
228
+ statusText = `${queueCount} follow-up${queueCount === 1 ? '' : 's'} queued`;
229
+ }
230
+ // Render separator and status on bottom lines
231
+ const separatorWidth = Math.min(cols - 2, 72);
232
+ const separator = theme.ui.border('─'.repeat(separatorWidth));
233
+ // Line rows-1: separator
234
+ this.safeWrite(ANSI.CLEAR_LINE);
235
+ this.safeWrite(separator);
236
+ // Line rows: input line with prompt or status
237
+ this.safeWrite(`\n${ANSI.CLEAR_LINE}`);
238
+ // Show actual input line during processing so user can see what they're typing
239
+ const promptPrefix = theme.ui.muted('> ');
240
+ const currentInput = this.inputBuffer;
241
+ const maxInputDisplay = cols - 4;
242
+ // Truncate input if too long, showing end of input
243
+ let displayInput = currentInput;
244
+ if (displayInput.length > maxInputDisplay) {
245
+ displayInput = '…' + displayInput.slice(-(maxInputDisplay - 1));
246
+ }
247
+ // Render prompt + input
248
+ this.safeWrite(promptPrefix);
249
+ this.safeWrite(displayInput);
250
+ // Show status hint on the right if there's room
251
+ if (statusText && currentInput.length < maxInputDisplay - statusText.length - 5) {
252
+ const padding = cols - 3 - currentInput.length - statusText.length - 3;
253
+ if (padding > 3) {
254
+ this.safeWrite(' '.repeat(padding));
255
+ this.safeWrite(theme.ui.muted(statusText.slice(0, cols - currentInput.length - 6)));
256
+ }
257
+ }
258
+ // Restore cursor to scroll region
259
+ this.safeWrite(ANSI.RESTORE_CURSOR);
260
+ }
261
+ // ... (other methods remain largely the same as PinnedChatBox)
262
+ supportsRendering() {
263
+ return this.isEnabled &&
264
+ !this.isDisposed &&
265
+ this.writeStream.writable &&
266
+ this.writeStream.isTTY;
267
+ }
268
+ safeWrite(content) {
269
+ try {
270
+ if (this.writeStream.writable) {
271
+ this.writeStream.write(content);
272
+ }
273
+ }
274
+ catch {
275
+ // Swallow write errors
276
+ }
277
+ }
278
+ sanitizeCommandText(text) {
279
+ return text
280
+ .replace(this.ansiPattern, '')
281
+ .replace(this.oscPattern, '')
282
+ .trim();
283
+ }
284
+ sanitizeStatusMessage(message) {
285
+ if (!message)
286
+ return null;
287
+ return message
288
+ .replace(this.ansiPattern, '')
289
+ .replace(this.oscPattern, '')
290
+ .slice(0, this.maxStatusMessageLength);
291
+ }
292
+ addToHistory(entry) {
293
+ if (!entry.trim())
294
+ return;
295
+ const existingIndex = this.inputHistory.indexOf(entry);
296
+ if (existingIndex >= 0) {
297
+ this.inputHistory.splice(existingIndex, 1);
298
+ }
299
+ this.inputHistory.push(entry);
300
+ if (this.inputHistory.length > this.maxHistorySize) {
301
+ this.inputHistory = this.inputHistory.slice(-this.maxHistorySize);
302
+ }
303
+ }
304
+ setEnabled(enabled) {
305
+ if (this.isDisposed)
306
+ return;
307
+ if (!enabled && this.isEnabled) {
308
+ this.clear();
309
+ }
310
+ this.isEnabled = enabled;
311
+ if (enabled) {
312
+ this.scheduleRender();
313
+ }
314
+ }
315
+ setProcessing(isProcessing) {
316
+ if (this.isDisposed)
317
+ return;
318
+ this.state.isProcessing = isProcessing;
319
+ this.scheduleRender();
320
+ }
321
+ setContextUsage(percentage) {
322
+ if (this.isDisposed)
323
+ return;
324
+ const value = Number.isFinite(percentage) ? percentage : 0;
325
+ this.state.contextUsage = Math.max(0, Math.min(100, value));
326
+ }
327
+ setStatusMessage(message) {
328
+ if (this.isDisposed)
329
+ return;
330
+ this.state.statusMessage = this.sanitizeStatusMessage(message);
331
+ this.scheduleRender();
332
+ }
333
+ queueCommand(text, type = 'request') {
334
+ if (this.isDisposed)
335
+ return null;
336
+ if (typeof text !== 'string')
337
+ return null;
338
+ const sanitizedText = this.sanitizeCommandText(text);
339
+ if (!sanitizedText)
340
+ return null;
341
+ if (this.state.queuedCommands.length >= this.maxQueueSize) {
342
+ const idx = this.state.queuedCommands.findIndex(c => c.type !== 'slash');
343
+ if (idx >= 0) {
344
+ this.state.queuedCommands.splice(idx, 1);
345
+ }
346
+ else {
347
+ return null;
348
+ }
349
+ }
350
+ const truncated = sanitizedText.slice(0, this.maxInputLength);
351
+ const preview = truncated.length > 60 ? `${truncated.slice(0, 57)}...` : truncated;
352
+ const cmd = {
353
+ id: `cmd-${++this.commandIdCounter}`,
354
+ text: truncated,
355
+ type,
356
+ timestamp: Date.now(),
357
+ preview,
358
+ };
359
+ this.state.queuedCommands.push(cmd);
360
+ this.scheduleRender();
361
+ if (this.onCommandQueued) {
362
+ this.onCommandQueued(cmd);
363
+ }
364
+ return cmd;
365
+ }
366
+ clearQueue() {
367
+ if (this.isDisposed)
368
+ return;
369
+ this.state.que;
370
+ }
371
+ }
372
+ //# sourceMappingURL=enhancedPinnedChatBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancedPinnedChatBox.js","sourceRoot":"","sources":["../../src/ui/enhancedPinnedChatBox.ts"],"names":[],"mappings":"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"}
@@ -182,8 +182,8 @@ export declare class PinnedChatBox {
182
182
  private pendingAfterWriteRender;
183
183
  /**
184
184
  * Register with the display's output interceptor system.
185
- * This ensures the pinned area is cleared before output (to prevent ghost lines)
186
- * and re-rendered after output (to maintain the pinned position).
185
+ * With scroll regions, output flows in the scrollable area while
186
+ * the input stays pinned at the bottom.
187
187
  */
188
188
  registerOutputInterceptor(display: {
189
189
  registerOutputInterceptor: (i: {
@@ -241,6 +241,7 @@ export declare class PinnedChatBox {
241
241
  setEnabled(enabled: boolean): void;
242
242
  /**
243
243
  * Set processing state
244
+ * Enables scroll region during processing to keep input visible while streaming
244
245
  */
245
246
  setProcessing(isProcessing: boolean): void;
246
247
  /**
@@ -388,8 +389,8 @@ export declare class PinnedChatBox {
388
389
  * Line 2: Status (⏳ Processing... or context info)
389
390
  * Line 3: Muted prompt (> ) for queued input
390
391
  *
391
- * DISABLED during processing to prevent duplicating lines during streaming.
392
- * Status updates are tracked but not rendered - content flows naturally.
392
+ * During processing with scroll region active, uses renderPersistentInput()
393
+ * to keep the input visible at the bottom while streaming continues above.
393
394
  */
394
395
  render(): void;
395
396
  /**