/** * Chat — message input + conversation view + streaming */ import { sendMessage } from '../app.js'; let messagesEl; let inputEl; let sendBtn; let streamBtn; let indicatorEl; let streamingBubble = null; // Minimal markdown renderer function renderMarkdown(text) { let html = text // Code blocks .replace(/```(\w*)\n([\s\S]*?)```/g, '
$2
') // Inline code .replace(/`([^`]+)`/g, '$1') // Headers .replace(/^### (.+)$/gm, '

$1

') .replace(/^## (.+)$/gm, '

$1

') .replace(/^# (.+)$/gm, '

$1

') // Bold .replace(/\*\*(.+?)\*\*/g, '$1') // Lists .replace(/^\- (.+)$/gm, '
  • $1
  • ') .replace(/^\* (.+)$/gm, '
  • $1
  • ') // Paragraphs (double newlines) .replace(/\n\n/g, '

    ') // Single newlines .replace(/\n/g, '
    '); // Wrap loose

  • in