## Why The extraction agent and few-shot prompting infrastructure exist on the backend, but the chat UI has no way to send emails to the extraction endpoint. Users need to drag-and-drop or upload email files (.html) to trigger extraction. The client must route email uploads to `POST /api/chat/extract` and handle the conversational extraction flow, including disambiguation questions from the agent and result presentation. ## What Changes - **Add drag-and-drop zone** to `Chat.razor` that accepts email files (.html) - **Add file picker button** as an alternative upload method - **Route uploaded emails** to the extraction endpoint via `ChatApiClient.SendExtractionStreamingAsync()` - **Handle extraction conversation flow** — initial extraction streams in, user can reply to disambiguation questions, follow-ups continue via the extraction endpoint - **Present extraction results** — the agent's streamed response includes formatted output; optionally add a "Copy JSON" action - **Track conversation mode** — after an email upload, subsequent messages route to the extraction endpoint until "New Chat" resets to general mode ## Capabilities ### New Capabilities - `email-upload`: Defines the drag-and-drop upload zone, file handling, visual feedback, and supported formats - `extraction-conversation-flow`: Defines the client-side conversation mode tracking, routing between general chat and extraction, and result presentation ### Modified Capabilities - `chat-ui`: Add the upload zone to the chat input area and track conversation mode (general vs extraction) ## Impact - **UI changes**: New drop zone and upload button in Chat.razor, visual feedback during drag-over - **Chat.razor.css**: Styling for drop zone states (idle, drag-over, uploading) - **ChatApiClient**: Already has `SendExtractionStreamingAsync` from the previous change — this change wires it to the UI - **Conversation state**: New `_isExtractionMode` flag in Chat.razor to route messages correctly - **Depends on**: `update-extraction-schema` and `few-shot-prompt-infrastructure` (extraction endpoint must exist)