forge-reasoning 0.1.2

Reasoning tools for LLM debugging - checkpointing, hypotheses, contradictions
Documentation
# TDD Wave 6: WebSocket API Server

**Date**: 2026-02-19  
**Focus**: Real-time remote API access via WebSocket

---

## Wave 6 Tests Summary

| Test | Description | Status |
|------|-------------|--------|
| 51 | Server can start and accept connections ||
| 52 | Client can connect and send commands ||
| 53 | Server broadcasts checkpoint events | ✅ See Wave 8 |
| 54 | Server handles malformed messages ||
| 55 | Multiple concurrent sessions ||
| 56 | Client disconnect handling ||
| 57 | List checkpoints command ||
| 58 | Unknown method error handling ||
| 59 | Authentication support ||
| 60 | High message volume stress test ||

**Results**: 9 passed, 1 deferred to Wave 8

---

## Implementation Details

### New Module: `websocket.rs`

WebSocket server implementation using `tokio-tungstenite`:

```rust
pub struct CheckpointWebSocketServer {
    bind_addr: String,
    service: Arc<CheckpointService>,
    config: WebSocketConfig,
    shutdown_tx: Option<broadcast::Sender<()>>,
    clients: Arc<RwLock<HashMap<String, mpsc::UnboundedSender<Message>>>>,
}
```

### WebSocket Protocol

**Command Format:**
```json
{
    "id": "cmd-123",
    "method": "create_session",
    "params": { "name": "my-session" }
}
```

**Response Format:**
```json
{
    "id": "cmd-123",
    "success": true,
    "result": { "session_id": "..." }
}
```

**Event Format:**
```json
{
    "event_type": "checkpoint_created",
    "data": {
        "checkpoint_id": "...",
        "session_id": "...",
        "timestamp": "2026-02-19T..."
    }
}
```

### Supported Methods

| Method | Description |
|--------|-------------|
| `authenticate` | Authenticate with token |
| `create_session` | Create new checkpoint session |
| `list_checkpoints` | List session checkpoints |
| `checkpoint` | Create a checkpoint |
| `subscribe` | Subscribe to session events |
| `metrics` | Get service metrics |

### Configuration

```rust
pub struct WebSocketConfig {
    pub require_auth: bool,
    pub auth_token: Option<String>,
    pub max_connections: usize,
}
```

---

## Architecture

```
┌─────────────────────────────────────────────────────────────┐
│                    WebSocket Clients                        │
└──────────────────┬──────────────────────────────────────────┘
                   │ WebSocket Protocol
┌─────────────────────────────────────────────────────────────┐
│           CheckpointWebSocketServer                         │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Connection Handler (per-client task)                  │  │
│  │  - Message parsing                                     │  │
│  │  - Command routing                                     │  │
│  │  - Event forwarding                                    │  │
│  └───────────────────────────────────────────────────────┘  │
└────────────────────┬────────────────────────────────────────┘
                     │ Arc<CheckpointService>
┌─────────────────────────────────────────────────────────────┐
│              CheckpointService                              │
│         (Existing from Wave 5)                              │
└─────────────────────────────────────────────────────────────┘
```

---

## Event Broadcasting (Completed in Wave 8)

The event broadcasting infrastructure was in place but not fully wired up in Wave 6.
See `docs/TDD_WAVE_08.md` for the completion of real-time event streaming.

---

## Usage Example

```rust
use forge_reasoning::*;
use std::sync::Arc;

#[tokio::main]
async fn main() -> Result<()> {
    // Create service
    let storage = ThreadSafeStorage::open("checkpoints.db").await?;
    let service = Arc::new(CheckpointService::new(storage));
    
    // Start WebSocket server
    let mut server = CheckpointWebSocketServer::new(
        "127.0.0.1:8080".to_string(),
        service
    );
    let addr = server.start().await?;
    println!("WebSocket server running on ws://{}", addr);
    
    // Run until shutdown
    tokio::signal::ctrl_c().await?;
    server.stop().await?;
    
    Ok(())
}
```

### Client Connection (JavaScript)

```javascript
const ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {
    // Create session
    ws.send(JSON.stringify({
        id: '1',
        method: 'create_session',
        params: { name: 'debug-session' }
    }));
};

ws.onmessage = (event) => {
    const msg = JSON.parse(event.data);
    console.log('Received:', msg);
};
```

---

## Code Metrics

| File | Lines | Change |
|------|-------|--------|
| `src/websocket.rs` | ~470 | New |
| `tests/websocket_tests.rs` | ~410 | New |
| `Cargo.toml` | +4 | WebSocket deps |

---

## Testing

```bash
cd /home/feanor/Projects/forge/forge-reasoning
cargo test --test websocket_tests

# Individual tests
cargo test --test websocket_tests test_websocket_server_start
cargo test --test websocket_tests test_websocket_high_volume
```

---

## Security Considerations

- Authentication is optional (`WebSocketConfig.require_auth`)
- When enabled, clients must call `authenticate` with valid token
- Token-based authentication suitable for development/debugging
- For production, consider TLS/WSS and more robust auth

---

**Wave 6 Complete** ✅

WebSocket API provides real-time remote access to checkpoint operations. Event broadcasting infrastructure is in place, completed in Wave 8.