erosolar-cli 1.7.119 → 1.7.121

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.
@@ -823,6 +823,11 @@ export class InteractiveShell {
823
823
  if (str.length === 1 && str.charCodeAt(0) >= 32 && str.charCodeAt(0) < 127) {
824
824
  return true;
825
825
  }
826
+ // Suppress very short writes (1-4 chars) that are likely user keystrokes
827
+ // AI streaming writes are typically longer or contain newlines/formatting
828
+ if (str.length <= 4 && !/[\n\r]/.test(str) && /^[\x20-\x7e]+$/.test(str)) {
829
+ return true;
830
+ }
826
831
  // Suppress backspace sequences (readline's delete char)
827
832
  if (str === '\b \b' || str === '\x1b[D \x1b[D' || str === '\b' || str === '\x7f') {
828
833
  return true;
@@ -832,16 +837,20 @@ export class InteractiveShell {
832
837
  return true;
833
838
  }
834
839
  // Suppress readline prompt redraw patterns (starts with \r or cursor home)
835
- if (/^\r/.test(str) && str.length < 20 && /^[\r\x1b\[\dGK> ]+$/.test(str)) {
840
+ if (/^\r/.test(str) && str.length < 30 && !/[a-zA-Z]{3,}/.test(str)) {
836
841
  return true;
837
842
  }
838
843
  // Suppress clear line + prompt patterns from readline
839
- if (/^\x1b\[\d*[GK]/.test(str) && str.length < 15) {
844
+ if (/^\x1b\[\d*[GK]/.test(str) && str.length < 20) {
840
845
  return true;
841
846
  }
842
847
  // Suppress short sequences that look like readline control (not AI content)
843
848
  // AI content is typically longer or contains actual text
844
- if (str.length <= 3 && /^[\x1b\[\]\d;GKJ]+$/.test(str)) {
849
+ if (str.length <= 5 && /^[\x1b\[\]\d;GKJ\b ]+$/.test(str)) {
850
+ return true;
851
+ }
852
+ // Suppress any short writes containing our prompt characters
853
+ if (str.length < 10 && /^[>\s›\x1b\[\dGK]+$/.test(str)) {
845
854
  return true;
846
855
  }
847
856
  // Allow everything else through (actual AI output)
@@ -986,11 +995,11 @@ export class InteractiveShell {
986
995
  });
987
996
  // Set the prompt to show paste chips, then position cursor after them
988
997
  // The user can type additional text after the chips
989
- this.persistentPrompt.updateInput(pasteChips + ' ', pasteChips.length + 1);
998
+ this.persistentPrompt.updateInput(`${pasteChips} `, pasteChips.length + 1);
990
999
  // Update readline's line buffer to include the chips as prefix
991
1000
  // This ensures typed text appears after the chips
992
1001
  if (this.rl.line !== undefined) {
993
- this.rl.line = pasteChips + ' ';
1002
+ this.rl.line = `${pasteChips} `;
994
1003
  this.rl.cursor = pasteChips.length + 1;
995
1004
  }
996
1005
  // NOTE: Don't clear pasteJustCaptured here - the counter-based logic in shouldIgnoreLineEvent()
@@ -1655,7 +1664,7 @@ export class InteractiveShell {
1655
1664
  lines.push(theme.bold('Session File Changes'));
1656
1665
  lines.push('');
1657
1666
  lines.push(`${theme.info('•')} ${summary.files} file${summary.files === 1 ? '' : 's'} modified`);
1658
- lines.push(`${theme.info('•')} ${theme.success('+' + summary.additions)} ${theme.error('-' + summary.removals)} lines`);
1667
+ lines.push(`${theme.info('•')} ${theme.success(`+${summary.additions}`)} ${theme.error(`-${summary.removals}`)} lines`);
1659
1668
  lines.push('');
1660
1669
  // Group changes by file
1661
1670
  const fileMap = new Map();
@@ -1679,7 +1688,7 @@ export class InteractiveShell {
1679
1688
  if (stats.writes > 0)
1680
1689
  operations.push(`${stats.writes} write${stats.writes === 1 ? '' : 's'}`);
1681
1690
  const opsText = operations.join(', ');
1682
- const diffText = `${theme.success('+' + stats.additions)} ${theme.error('-' + stats.removals)}`;
1691
+ const diffText = `${theme.success(`+${stats.additions}`)} ${theme.error(`-${stats.removals}`)}`;
1683
1692
  lines.push(` ${theme.dim(path)}`);
1684
1693
  lines.push(` ${opsText} • ${diffText}`);
1685
1694
  }
@@ -3406,7 +3415,7 @@ What's the next action?`;
3406
3415
  // Truncate to reasonable length
3407
3416
  const maxLength = 50;
3408
3417
  return cleaned.length > maxLength
3409
- ? cleaned.slice(0, maxLength - 3) + '...'
3418
+ ? `${cleaned.slice(0, maxLength - 3)}...`
3410
3419
  : cleaned;
3411
3420
  }
3412
3421
  splitThinkingResponse(content) {