# Kosmi Client - Standalone CLI Chat Client A simple, standalone command-line client for Kosmi that demonstrates WebSocket communication, GraphQL operations, and real-time chat functionality. ## Features - ✅ Manual JWT token authentication - ✅ Email/password authentication with browser automation - ✅ Interactive CLI for sending/receiving messages - ✅ Real-time message subscription - ✅ Graceful shutdown (Ctrl+C) ## Prerequisites - Go 1.21 or higher - A Kosmi account (for authenticated access) - JWT token from your browser session ## Installation ```bash cd cmd/kosmi-client go mod download go build ``` ## Getting Your JWT Token To use this client, you need to extract your JWT token from the Kosmi web application: ### Method 1: Browser DevTools (Recommended) 1. Open [https://app.kosmi.io](https://app.kosmi.io) in your browser 2. Log in to your account 3. Open Developer Tools (F12 or Right-click → Inspect) 4. Go to the **Console** tab 5. Type the following command and press Enter: ```javascript localStorage.getItem('token') ``` 6. Copy the token (it will be a long string starting with `eyJ...`) ### Method 2: Network Tab 1. Open [https://app.kosmi.io](https://app.kosmi.io) in your browser 2. Open Developer Tools (F12) 3. Go to the **Network** tab 4. Filter by "WS" (WebSocket) 5. Look for the connection to `engine.kosmi.io` 6. Click on it and view the **Messages** tab 7. Find the `connection_init` message 8. Copy the token from the payload ## Usage ### Basic Usage **Option 1: Email/Password (Recommended)** ```bash ./kosmi-client --email "your@email.com" --password "yourpassword" --room "@hyperspaceout" ``` **Option 2: Manual Token** ```bash ./kosmi-client --token "YOUR_JWT_TOKEN" --room "@hyperspaceout" ``` ### Command-Line Options | Flag | Description | Required | Example | |------|-------------|----------|---------| | `--token` | JWT authentication token | Yes* | `--token "eyJ..."` | | `--room` | Room ID to join | Yes | `--room "@hyperspaceout"` | | `--email` | Email for login | Yes* | `--email "user@example.com"` | | `--password` | Password for login | Yes* | `--password "secret"` | \* Either `--token` OR both `--email` and `--password` are required ### Interactive Commands Once connected, you can use these commands: - **Send a message**: Just type your message and press Enter - `/help` - Show available commands - `/quit` or `/exit` - Exit the client - **Ctrl+C** - Graceful shutdown ### Example Session ``` $ ./kosmi-client --email "email@email.com" --password "password" --room "@hyperspaceout" Connecting to Kosmi WebSocket... Sending connection_init... ✓ Connection acknowledged Querying current user... ✓ Logged in as: John Doe (@johndoe) [Anonymous: false] Joining room: @hyperspaceout... ✓ Successfully joined room Subscribing to new messages... ✓ Subscription active Connection setup complete! ============================================================ Connected! Type messages and press Enter to send. Press Ctrl+C to exit. ============================================================ > Hello, world! > [14:23:45] Jane Smith: Hey there! > How are you? > [14:24:01] Jane Smith: I'm good, thanks! > /quit Exiting... Closing Kosmi client... ✓ Client closed Goodbye! ``` ## Architecture The client consists of three main components: ### 1. `auth.go` - Authentication Management - `GetToken()` - Retrieves token (manual or via chromedp) - `loginWithChromedp()` - Browser automation for email/password login ### 2. `client.go` - WebSocket Client - `KosmiClient` - Main client struct - `Connect()` - Establishes connection and performs GraphQL handshake - `SendMessage()` - Sends messages to the room - `listenForMessages()` - Receives messages in real-time - `Close()` - Graceful shutdown ### 3. `main.go` - CLI Interface - Command-line argument parsing - Interactive message input/output - Signal handling for graceful shutdown ## GraphQL Operations The client uses these minimal GraphQL operations: 1. **connection_init** - Authenticate with JWT token 2. **ExtendedCurrentUserQuery** - Get current user info 3. **JoinRoom** - Join the specified room 4. **NewMessageSubscription** - Subscribe to new messages 5. **SendMessage2** - Send messages to the room ## Troubleshooting ### "Authentication error: no authentication method provided" You must provide either `--token` or both `--email` and `--password`. ### "Connection error: failed to connect to WebSocket" - Check your internet connection - Verify the Kosmi service is accessible - Ensure you're not behind a restrictive firewall ### "expected connection_ack, got: connection_error" Your JWT token is likely invalid or expired. Get a fresh token from your browser. ### Messages not appearing - Verify you've joined the correct room ID - Check that the room exists and you have access to it - Ensure your token has the necessary permissions ## Helper Tools ### `cmd/get-kosmi-token` - Standalone Token Extractor A separate utility for extracting JWT tokens without running the full client: ```bash cd cmd/get-kosmi-token go run main.go --email "your@email.com" --password "yourpassword" ``` Options: - `--email` - Your Kosmi email - `--password` - Your Kosmi password - `--headless` - Run browser in headless mode (default: true) - `--verbose` - Enable verbose logging The token will be printed to stdout, making it easy to capture: ```bash TOKEN=$(go run main.go --email "your@email.com" --password "yourpassword" 2>/dev/null) ./kosmi-client --token "$TOKEN" --room "@hyperspaceout" ``` ## Future Enhancements ### Additional Features (Ideas) - [ ] Room chat history retrieval (`RoomChatQuery`) - [ ] Member join/leave notifications - [ ] Typing indicators - [ ] File/image upload support - [ ] Multiple room support - [ ] Persistent token storage - [ ] Reconnection with exponential backoff - [ ] Message editing and deletion - [ ] Reactions and emojis ## Development ### Running from Source ```bash go run . --token "YOUR_TOKEN" --room "@hyperspaceout" ``` ### Building ```bash go build -o kosmi-client ``` ### Dependencies - `github.com/gorilla/websocket` - WebSocket client library - `github.com/chromedp/chromedp` - Browser automation (for future use) ## License This is a proof-of-concept demonstration client. Use responsibly and in accordance with Kosmi's Terms of Service. ## Contributing This is a standalone proof of concept. Feel free to fork and extend it for your own use cases! ## Support For issues related to: - **Kosmi service**: Contact Kosmi support - **This client**: Check the code comments and implementation details --- **Note**: This client is not officially affiliated with or endorsed by Kosmi. It's an independent implementation for educational and development purposes.