# WebSocket Mutation Issue - HTTP POST Solution **Date**: October 31, 2025, 11:53 AM **Issue**: IRC→Kosmi messages not appearing despite successful WebSocket send ## Problem Discovery Messages from IRC were being sent to Kosmi's WebSocket successfully (we could see them in logs), but they were NOT appearing in the Kosmi chat interface. ### Root Cause Through comprehensive logging of browser console messages, we discovered: 1. **WebSocket closes immediately after sending mutation**: ``` [Browser Console] >>> Sending mutation... [Browser Console] >>> Sent successfully [Browser Console] error: CloseEvent ← WebSocket closes! ``` 2. **The WebSocket reopens** - indicating Kosmi is detecting an invalid message and resetting the connection ### Why WebSocket Mutations Fail We're piggy-backing on Kosmi's native WebSocket connection (established by the web page). When we inject our own GraphQL mutations: - We don't have proper authentication in the WebSocket frame - We're interfering with Kosmi's protocol state machine - The server detects this and closes the connection ## Solution: HTTP POST for Mutations From FINDINGS.md (which was created earlier but we forgot about): **Kosmi supports HTTP POST for GraphQL mutations!** ``` POST https://engine.kosmi.io/ Content-Type: application/json { "query": "mutation SendMessage($body: String!, $roomID: ID!) { sendMessage(body: $body, roomID: $roomID) { id } }", "variables": { "body": "message text", "roomID": "room-id" } } ``` ### Architecture - **Receiving (Subscriptions)**: Use WebSocket ✅ (working) - **Sending (Mutations)**: Use HTTP POST ✅ (to be implemented) This is the same approach we initially documented but forgot to use! ## Implementation Plan 1. Replace `SendMessage` in `native_client.go` to use HTTP POST 2. Extract cookies from Playwright page context for authentication 3. Use Go's `http.Client` to send the POST request 4. Keep WebSocket for receiving messages (already working) ## Next Steps Implement HTTP POST sending in the next iteration.