Commit Graph

280 Commits

  • Add /thinking command and improve TUI UX
    - Add /thinking slash command with autocomplete for setting reasoning levels (off, minimal, low, medium, high)
    - Fix Ctrl+C behavior: remove hardcoded exit in TUI, let focused component handle it
    - Add empty lines before and after tool execution components for better visual separation
    - Fix stats rendering: display stats AFTER tool executions complete (matches web-ui behavior)
    - Remove "Press Ctrl+C again to exit" message, show "(esc to interrupt)" in loader instead
    - Add bash tool abort signal support with immediate SIGKILL on interrupt
    - Make Text and Markdown components return empty arrays when no actual text content
    - Add setCustomBgRgb() method to Markdown for dynamic background colors
  • Fix markdown streaming duplication by splitting newlines first
    - Added string-width library for proper terminal column width calculation
    - Fixed wrapLine() to split by newlines before wrapping (like Text component)
    - Fixed Loader interval leak by stopping before container removal
    - Changed loader message from 'Loading...' to 'Working...'
  • Clean up TUI package and refactor component structure
    - Remove old TUI implementation and components (LoadingAnimation, MarkdownComponent, TextComponent, TextEditor, WhitespaceComponent)
    - Rename components-new to components with new API (Loader, Markdown, Text, Editor, Spacer)
    - Move Text and Input components to separate files in src/components/
    - Add render caching to Text component (similar to Markdown)
    - Add proper ANSI code handling in Text component using stripVTControlCharacters
    - Update coding-agent to use new TUI API (requires ProcessTerminal, uses custom Editor subclass for key handling)
    - Remove old test files, keep only chat-simple.ts and virtual-terminal.ts
    - Update README.md with new minimal API documentation
    - Switch from tsc to tsgo for type checking
    - Update package dependencies across monorepo
  • Add line count to paste markers
    - Paste markers now show line count: [paste #1 +50 lines]
    - Update replacement logic to handle both old and new marker formats
    - Provides better visibility into paste size
  • Add padding to Text component and fix padding calculation
    - Add paddingX and paddingY support to Text component (default 1, 1)
    - Fix padding calculation bug in both Text and Markdown
    - Right padding now correctly fills to terminal width
    - Remove unused Spacer import from chat-simple
  • Fix terminal rendering and add improvements
    - Enable bracketed paste mode for handling large pastes
    - Fix editor duplicate line rendering bug at terminal width
    - Add padding support to Markdown component (paddingX/Y)
    - Add Spacer component for vertical spacing
    - Update chat-simple with spacers between messages
  • Add minimal TUI rewrite with differential rendering
    - New TUI implementation with 3-strategy differential rendering
    - Synchronized output (CSI 2026) for flicker-free updates
    - New components: Editor, Markdown, Loader, SelectList, Spacer
    - Editor: file autocomplete, slash commands, large paste markers
    - Markdown: RGB background colors, caching
    - Terminal: cursor movement, visibility, clear operations
    - Chat demo with color-coded messages
  • Improve web-ui message and tool UX
    - Add collapsible thinking blocks with shimmer animation during streaming
    - Update user messages to use orange gradient pill styling (matching sitegeist)
    - Fix cost display to only show for completed messages, not while streaming
    - Update tool renderers to use ChevronsUpDown/ChevronUp icons instead of rotating ChevronRight
    - Export ThinkingBlock component from public API
  • Fix ProviderKeyInput UX: improve save button state and remove clear button
    - Add inputChanged state to track when user modifies input after save
    - Remove Clear button and removeKey() method entirely
    - Save button now disables after successful save until input changes
    - Save button stays enabled on test failure (allows immediate retry)
    - Keep input field showing stars (••••) after successful save instead of clearing
    
    This provides clearer feedback and prevents accidental key deletion.
  • Fix token statistics on abort for Anthropic provider
    - Add handling for message_start event to capture initial token usage
    - Fix message_delta to use assignment (=) instead of addition (+=)
      since Anthropic sends cumulative token counts, not incremental
    - Add comprehensive tests for all providers (Google, OpenAI Completions,
      OpenAI Responses, Anthropic)
    - Document OpenAI limitation: token stats only available at stream end
    
    Fixes issue where aborted streams had zero token counts despite
    Anthropic sending input tokens in the initial message_start event.
  • Add reload button to HTML artifact header
    Adds a reload button with RefreshCw icon to HTML artifact header buttons.
    Clicking the button clears logs and re-executes the HTML content, useful
    for manually refreshing when developing HTML artifacts or testing changes.
    
    Changes:
    - Import Button, icon from mini-lit and RefreshCw from lucide
    - Add reload button to getHeaderButtons() that clears logs and calls executeContent()
    - Add "Reload HTML" i18n key in English and German translations
  • Add auto-reload for HTML artifacts when dependencies change
    HTML artifacts can read other artifacts via getArtifact() and attachments.
    When any artifact is created, updated, rewritten, or deleted, all HTML
    artifacts now automatically reload to reflect the latest data.
    
    Changes:
    - Add reloadAllHtmlArtifacts() method to ArtifactsPanel
    - Call reload after all artifact mutations (create/update/rewrite/delete)
    - Make HtmlArtifact.sandboxIframeRef and executeContent() public
    - Update runtime providers before re-executing HTML content
    
    This ensures HTML artifacts always display current data from their dependencies.
  • Add Unicode surrogate sanitization for all providers
    Fixes issue where unpaired Unicode surrogates in tool results cause JSON serialization errors in API providers, particularly Anthropic.
    
    - Add sanitizeSurrogates() utility function to remove unpaired surrogates
    - Apply sanitization in all provider convertMessages() functions:
      - User message text content (string and text blocks)
      - Assistant message text and thinking blocks
      - Tool result output
      - System prompts
    - Valid emoji (properly paired surrogates) are preserved
    - Add comprehensive test suite covering all 8 providers
    
    Previously only Google and Groq handled unpaired surrogates correctly.
    Now all providers (Anthropic, OpenAI Completions/Responses, Google, xAI, Groq, Cerebras, zAI) sanitize text before API submission.
  • Fix console.log duplication bug in ConsoleRuntimeProvider
    Issue:
    Each browser_javascript execution wrapped console methods, but captured
    the current (already wrapped) console as "original". This created a chain
    of wrappers that accumulated across executions:
    - Execution 1: 1x console.log (wrapper1 → real console)
    - Execution 2: 2x console.log (wrapper2 → wrapper1 → real console)
    - Execution 3: 3x console.log (wrapper3 → wrapper2 → wrapper1 → real console)
    - Execution 4: 4x console.log (and so on...)
    
    Fix:
    Store the truly original console methods in window.__originalConsole on
    first wrap only. All subsequent executions use these stored original methods
    instead of capturing the current console. This prevents wrapper accumulation.
    
    Changes:
    - Check if window.__originalConsole exists before wrapping
    - Store original console methods with .bind() to preserve context
    - Always use window.__originalConsole for local logging
    - Now each execution logs exactly 1x regardless of execution count
  • Add paste image support to MessageEditor
    - Add handlePaste method to detect and process pasted images
    - Automatically attach pasted images as attachments
    - Support multiple images in single paste
    - Prevent default paste behavior for images (text paste still works normally)
    - Use same loadAttachment utility as drag-and-drop for consistency
  • Fix TypeScript errors and export UserMessageWithAttachments
    - Export UserMessageWithAttachments type from web-ui index
    - Remove unused i18n import from extract-document tool
    - Update models.generated.ts (model order changes from API)
    
    This fixes type errors when sitegeist uses custom user message renderer
  • Add extract_document tool and improve artifacts tab scrolling
    - Add extract_document tool for extracting text from PDF/DOCX/XLSX/PPTX from URLs
    - CORS proxy support from settings for fetching documents
    - Proper error messages guiding users on CORS issues and manual file attachment
    - Add scroll-into-view for active artifact tabs
    - Export extract_document tool from web-ui package
  • Add standalone mode for HTML artifact downloads
    When downloading HTML artifacts, the generated HTML now works standalone
    without requiring the extension runtime.
    
    Changes:
    - Add PrepareHtmlOptions config object to SandboxedIframe.prepareHtmlDocument()
    - Add isStandalone flag to skip runtime bridge and navigation interceptor
    - When isStandalone=true:
      - window.sendRuntimeMessage is NOT defined
      - Navigation interceptor is NOT injected
      - Artifact runtime providers fall back to embedded data
    - HtmlArtifact download button now uses isStandalone: true
    
    This fixes the issue where downloaded HTML artifacts would:
    - Try to call window.sendRuntimeMessage (which would fail silently)
    - Try to postMessage to non-existent parent window
    - Not work when opened via file:// protocol
    
    Now downloaded artifacts work completely standalone with embedded data.
  • Revert: Fix extension context detection - original logic was correct
    The negated approach broke browser_script which runs in page context.
    browser_script injects into web pages (http://, https://) where
    chrome.runtime.sendMessage doesn't work. The original whitelist
    approach correctly identifies extension contexts only.
    
    The real issue with artifacts in sandbox iframes needs a different fix.
  • Fix module script validation and extension context detection
    1. Skip JavaScript validation for <script type="module"> tags
       - new Function() cannot validate ES module syntax (import/export)
       - Module scripts now execute without validation errors
       - Fixes issue where HTML artifacts with modules would fail to load
    
    2. Improve __isExtensionContext detection logic
       - Changed from whitelist (chrome-extension://, moz-extension://)
       - To blacklist approach: negate http://, https://, file://
       - More robust - handles all extension protocols (about:srcdoc, etc.)
       - Fixes "offline mode" errors when using browser_script artifacts
    
    Resolves artifacts not working in extension context after document.write()
  • Intercept iframe navigation and open links externally
    - Add navigation interceptor script that prevents all iframe navigation
    - Intercept link clicks, form submissions, and window.location changes
    - Send open-external-url messages to parent window
    - Use chrome.tabs.create() in extension context, window.open() fallback
    - Fix font-size workaround to use 'initial' instead of hardcoded 16px
    - Document Chrome extension font-size bug with Stack Overflow reference
    
    This prevents HTML artifacts from navigating away when users click links,
    which would break the sandbox message system. All links now open in new
    Chrome tabs instead.
  • Fix font-size inheritance in HTML artifact iframes
    Set explicit font-size: 16px on the <html> element in sandboxed iframes
    to prevent browser default inheritance quirks that can cause unexpected
    font sizes (e.g., 75% shown in devtools).
    
    This establishes a consistent base font size while still allowing user
    HTML content to override it on body or specific elements as needed.
    
    Fixes the issue where HTML artifacts displayed with inconsistent font
    sizes due to iframe inheritance behavior.
  • Fix extension context detection in runtime providers
    Replace window.sendRuntimeMessage existence check with URL-based detection.
    The sendRuntimeMessage function exists in both extension and non-extension
    contexts (e.g., downloaded HTML artifacts), causing incorrect behavior.
    
    Changes:
    - Add window.__isExtensionContext() helper to RuntimeMessageBridge that checks:
      - chrome-extension:// URLs (Chrome)
      - moz-extension:// URLs (Firefox)
      - about:srcdoc (sandbox iframes)
    - Update all runtime providers to use __isExtensionContext() instead:
      - FileDownloadRuntimeProvider: Correctly falls back to browser download
      - ConsoleRuntimeProvider: Only sends messages in extension context
      - ArtifactsRuntimeProvider: Properly detects offline/read-only mode
    
    This fixes the issue where downloaded HTML artifacts incorrectly try to
    communicate with the extension when opened from disk.
  • Add getAllFromIndex method for efficient sorted queries
    - Add getAllFromIndex to StorageBackend interface for index-based queries
    - Implement getAllFromIndex in IndexedDBStorageBackend using cursor API
    - Update SessionsStore.getAllMetadata to use lastModified index
    - Enables database-native sorting instead of fetching all keys and sorting in JS
    
    Benefits:
    - Much faster for large datasets (uses IndexedDB cursor with direction)
    - Reduces memory usage (no need to load all keys first)
    - Leverages existing indices for optimal performance
  • Add ToolRenderResult interface for custom tool rendering
    - Changed ToolRenderer return type from TemplateResult to ToolRenderResult
    - ToolRenderResult = { content: TemplateResult, isCustom: boolean }
    - isCustom: true = no card wrapper, false = wrap in card
    - Updated all existing tool renderers to return new format
    - Updated Messages.ts to handle custom rendering
    
    This enables tools to render without default card chrome when needed.
  • Expose agent, agentInterface, and artifactsPanel as public in ChatPanel
    Make these properties public so they can be accessed externally for
    test automation and other programmatic control.
    
    Changes:
    - Change agent, agentInterface, artifactsPanel from private to public
  • Refactor JavaScript REPL tool description with consistent pattern
    Clean up and restructure JavaScript REPL description following consistent pattern:
    - Purpose section
    - When to Use section
    - Environment section
    - Common Libraries section
    - Important Notes section
    - Example section
    
    Removed buildJavaScriptReplDescription() function - no longer dynamically
    injecting runtime provider docs into tool description (will move to system prompt).
    
    Changes:
    - Replace JAVASCRIPT_REPL_BASE_DESCRIPTION with JAVASCRIPT_REPL_DESCRIPTION
    - Remove JAVASCRIPT_REPL_CHART_EXAMPLE and JAVASCRIPT_REPL_FOOTER
    - Remove buildJavaScriptReplDescription() function
    - Update javascript-repl tool to use static description
    - Simpler, more scannable structure with clear hierarchy