## Integrating Kosmi Bridge into Full Matterbridge

This document explains how to integrate the Kosmi bridge into the full Matterbridge codebase.

## Current Status

The Kosmi bridge has been implemented as a standalone module with the following components:

### Implemented Features ✅

1. **WebSocket Connection**: Full GraphQL-WS protocol implementation
2. **Message Reception**: Subscribes to Kosmi chat messages and forwards to Matterbridge
3. **Message Sending**: Sends messages to Kosmi via GraphQL mutations
4. **Bridge Registration**: Properly registered in the bridgemap
5. **Configuration Support**: TOML configuration with room URL and server settings

### File Structure

```
bridge/
├── bridge.go           # Bridge interface and config (minimal implementation)
├── config/
│   └── config.go       # Message and channel structures
└── kosmi/
    ├── kosmi.go        # Main bridge implementation
    └── graphql.go      # GraphQL WebSocket client

gateway/
└── bridgemap/
    ├── bridgemap.go    # Bridge factory registry
    └── bkosmi.go       # Kosmi bridge registration

cmd/
└── test-kosmi/
    └── main.go         # Standalone test program

matterbridge.toml       # Example configuration
go.mod                  # Go module dependencies
```

## Integration Steps

To integrate this into the full Matterbridge project:

### Option 1: Copy into Existing Matterbridge

1. **Copy the Kosmi bridge files**:
   ```bash
   # From the matterbridge repository root
   cp -r /path/to/irc-kosmi-relay/bridge/kosmi bridge/kosmi
   cp /path/to/irc-kosmi-relay/gateway/bridgemap/bkosmi.go gateway/bridgemap/
   ```

2. **Update go.mod** (if needed):
   ```bash
   go get github.com/gorilla/websocket@v1.5.1
   go mod tidy
   ```

3. **Build Matterbridge**:
   ```bash
   go build
   ```

4. **Configure** (add to your matterbridge.toml):
   ```toml
   [kosmi.hyperspaceout]
   RoomURL="https://app.kosmi.io/room/@hyperspaceout"
   
   [[gateway]]
   name="kosmi-irc"
   enable=true
   
   [[gateway.inout]]
   account="kosmi.hyperspaceout"
   channel="main"
   
   [[gateway.inout]]
   account="irc.libera"
   channel="#your-channel"
   ```

5. **Run**:
   ```bash
   ./matterbridge -conf matterbridge.toml
   ```

### Option 2: Use as Standalone (Current Setup)

The current implementation can work standalone but requires the full Matterbridge gateway logic. To use it standalone:

1. **Test the Kosmi connection**:
   ```bash
   ./test-kosmi -room "https://app.kosmi.io/room/@hyperspaceout" -debug
   ```

2. **Implement a simple gateway** (you would need to add):
   - IRC bridge implementation (or copy from Matterbridge)
   - Gateway routing logic to relay messages between bridges
   - Main program that initializes both bridges

## Testing the Bridge

### Test 1: Kosmi Connection Only

```bash
# Build and run the test program
go build -o test-kosmi ./cmd/test-kosmi
./test-kosmi -room "https://app.kosmi.io/room/@hyperspaceout" -debug
```

Expected output:
```
INFO[...] Starting Kosmi bridge test
INFO[...] Room URL: https://app.kosmi.io/room/@hyperspaceout
INFO[...] Connecting to Kosmi...
INFO[...] Connecting to Kosmi GraphQL WebSocket: wss://engine.kosmi.io/gql-ws
INFO[...] WebSocket connection established
INFO[...] Sent connection_init message
INFO[...] Received connection_ack
INFO[...] GraphQL WebSocket handshake completed
INFO[...] Subscribed to messages in room: hyperspaceout
INFO[...] Successfully connected to Kosmi!
INFO[...] Starting message listener
INFO[...] Listening for messages... Press Ctrl+C to exit
```

When someone sends a message in the Kosmi room, you should see:
```
INFO[...] Received message: [15:04:05] Username: [Kosmi] <Username> message text
```

### Test 2: Full Integration with IRC

Once integrated into full Matterbridge:

1. **Start Matterbridge** with Kosmi configured
2. **Send a message in Kosmi** → Should appear in IRC as `[Kosmi] <username> message`
3. **Send a message in IRC** → Should appear in Kosmi as `[IRC] <username> message`

## Reverse Engineering Notes

### GraphQL API Details

The Kosmi bridge uses the following GraphQL operations:

**Subscription** (implemented and tested):
```graphql
subscription {
  newMessage(roomId: "roomId") {
    body
    time
    user {
      displayName
      username
    }
  }
}
```

**Mutation** (implemented but needs testing):
```graphql
mutation {
  sendMessage(roomId: "roomId", body: "message text") {
    id
  }
}
```

### Potential Issues

1. **Message Sending**: The `sendMessage` mutation is based on common GraphQL patterns but may need adjustment based on Kosmi's actual API. If sending doesn't work:
   - Use browser DevTools to capture the actual mutation
   - Update `graphql.go` SendMessage() method with correct mutation format

2. **Room ID Format**: The bridge supports both `@roomname` and `roomid` formats. If connection fails:
   - Check the actual room ID in browser DevTools
   - Update `extractRoomID()` function in `kosmi.go`

3. **Authentication**: Currently connects anonymously. If Kosmi adds authentication:
   - Add auth token configuration
   - Update `Connect()` to include auth headers

## Browser-Based Testing

To verify the GraphQL API structure:

1. **Open Kosmi room** in browser
2. **Open DevTools** → Network tab
3. **Filter by WS** (WebSocket)
4. **Click on the WebSocket connection** to `engine.kosmi.io`
5. **View messages** to see the exact GraphQL format

Example messages you might see:
```json
// Outgoing subscription
{
  "id": "1",
  "type": "start",
  "payload": {
    "query": "subscription { newMessage(roomId: \"...\") { ... } }"
  }
}

// Incoming message
{
  "type": "next",
  "id": "1",
  "payload": {
    "data": {
      "newMessage": {
        "body": "Hello!",
        "time": 1730349600,
        "user": {
          "displayName": "User",
          "username": "user123"
        }
      }
    }
  }
}
```

## Next Steps

1. **Test message sending**: Send a test message from the bridge to verify the mutation works
2. **Add IRC bridge**: Either integrate into full Matterbridge or implement a minimal IRC bridge
3. **Test bidirectional relay**: Verify messages flow both ways correctly
4. **Add error handling**: Improve reconnection logic and error recovery
5. **Add features**:
   - User presence/join/leave events
   - File/image sharing (if supported by Kosmi)
   - Message editing/deletion
   - Typing indicators

## Troubleshooting

### "Connection refused" or "dial tcp: lookup engine.kosmi.io"
- Check network connectivity
- Verify DNS resolution
- Check firewall rules

### "Connection closed unexpectedly"
- Enable debug logging: `-debug` flag
- Check if Kosmi API has changed
- Verify room ID is correct

### "Messages not appearing"
- Check message format in logs
- Verify subscription is active
- Test with browser DevTools to compare

### "Cannot send messages"
- The mutation may need adjustment
- Check browser DevTools for actual mutation format
- Update `SendMessage()` in `graphql.go`

## Contributing

To improve the bridge:

1. **Test thoroughly** with actual Kosmi rooms
2. **Document any API changes** you discover
3. **Add unit tests** for critical functions
4. **Improve error handling** and logging
5. **Add reconnection logic** for network issues

## License

Same as Matterbridge (Apache 2.0)

