perspt 0.4.1

A high-performance CLI application for chatting with various AI models from multiple providers directly in your terminal
# Streaming UI Fix Summary

## Issue Identified

The UI was freezing during long AI responses due to **aggressive UI update throttling** in the streaming content handling logic.

## Root Cause

The `update_streaming_content()` method in `src/ui.rs` had flawed throttling logic:

1. **Modulo bug**: `buffer_len % UI_UPDATE_INTERVAL == 0` only triggered exactly at 1000, 2000, 3000, etc. characters
2. **Too aggressive thresholds**: `UI_UPDATE_INTERVAL = 1000` and `SMALL_BUFFER_THRESHOLD = 1000` caused long gaps between updates
3. **Limited content triggers**: Many response chunks didn't contain `\n`, `\`\`\``, or `##` patterns to trigger updates
4. **No fallback mechanism**: No guarantee of regular updates during long responses

## Evidence from Debug Logs

- 80 chunks totaling 24,768 characters over 27.4 seconds
- UI likely stopped updating after ~1000 characters
- Streaming continued but UI froze until next question triggered completion

## Solution Implemented

### 1. Improved Update Triggers
- **More responsive thresholds**: Reduced intervals from 1000→500 chars
- **Size-based tracking**: Track actual progress since last update instead of modulo
- **Enhanced content patterns**: Added detection for:
  - Bold/italic text (`**`, `*`)
  - List items (`- `)
  - Sentence endings (`. `, `? `, `! `)
- **Fallback guarantee**: Force update every 200 characters minimum

### 2. Better Constants
```rust
const UI_UPDATE_INTERVAL: usize = 500;       // More responsive (was 1000)
const SMALL_BUFFER_THRESHOLD: usize = 500;   // More responsive (was 1000)
```

### 3. Smarter Update Logic
```rust
let should_redraw_ui = 
    buffer_len < SMALL_BUFFER_THRESHOLD ||           // Always responsive for small content
    size_since_last_update >= (UI_UPDATE_INTERVAL / 2) ||  // Regular intervals (250 chars)
    content.contains('\n') ||                        // Line breaks
    content.contains("```") ||                       // Code blocks
    content.contains("**") ||                        // Bold text
    // ... more patterns ...
    size_since_last_update >= 200;                  // Fallback every 200 chars
```

## Benefits

1. **No more UI freezing**: Guaranteed updates during long responses
2. **Better responsiveness**: Updates every 200-250 characters instead of 1000
3. **Smarter triggers**: Updates on meaningful content patterns
4. **Maintained performance**: Still prevents excessive redraws for very large responses
5. **Fallback safety**: Always updates eventually, even without pattern matches

## Files Modified

- `src/ui.rs`: Fixed `update_streaming_content()` method and constants

## Testing

The fix ensures that:
- Short responses (< 500 chars) update immediately
- Long responses update regularly (every 200-250 chars)
- Pattern-based content (markdown, lists, etc.) updates promptly
- No response can freeze the UI for more than 200 characters