OpenQAOpenQA
API Reference

WebSocket Events

Real-time events for monitoring OpenQA activity via WebSocket.

Connection

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

ws.onopen = () => {
  console.log('Connected to OpenQA');
};

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

ws.onclose = () => {
  console.log('Disconnected from OpenQA');
};

Event Types

EVENTthinking

Brain is processing/thinking

Payload
{
  "type": "thinking",
  "thought": "Analyzing checkout flow for potential vulnerabilities..."
}
EVENTanalysis-complete

Application analysis finished

Payload
{
  "type": "analysis-complete",
  "understanding": "E-commerce app with user auth...",
  "suggestedTests": ["Test cart persistence", ...],
  "risks": ["Cart race conditions", ...]
}
EVENTtest-generated

A new test was generated

Payload
{
  "type": "test-generated",
  "test": {
    "id": "test_001",
    "name": "test_checkout_flow.spec.ts",
    "type": "e2e"
  }
}
EVENTagent-created

A new dynamic agent was created

Payload
{
  "type": "agent-created",
  "agent": {
    "id": "agent_001",
    "name": "Checkout Flow Tester",
    "purpose": "Test checkout with various payment methods"
  }
}
EVENTtest-started

A test execution started

Payload
{
  "type": "test-started",
  "testId": "test_001",
  "name": "test_checkout_flow.spec.ts"
}
EVENTtest-completed

A test execution completed

Payload
{
  "type": "test-completed",
  "testId": "test_001",
  "name": "test_checkout_flow.spec.ts",
  "status": "passed",
  "duration": 2300
}
EVENTbug-found

A bug was discovered

Payload
{
  "type": "bug-found",
  "bug": {
    "id": "bug_001",
    "title": "XSS vulnerability in search",
    "severity": "high",
    "testId": "test_002"
  }
}
EVENTsession-complete

A test session finished

Payload
{
  "type": "session-complete",
  "sessionId": "session_abc123",
  "testsRun": 15,
  "testsPassed": 13,
  "testsFailed": 2,
  "bugsFound": 1,
  "duration": 1800000
}
EVENTgit-merge

A merge to main branch was detected

Payload
{
  "type": "git-merge",
  "source": "github",
  "branch": "feature/checkout-fix",
  "commit": "abc123",
  "author": "developer@example.com"
}
EVENTgit-pipeline-success

A CI/CD pipeline completed successfully

Payload
{
  "type": "git-pipeline-success",
  "source": "github",
  "pipelineId": "12345",
  "branch": "main"
}

Complete Example

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

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  
  switch (data.type) {
    case 'thinking':
      console.log('๐Ÿง  Brain:', data.thought);
      break;
      
    case 'test-generated':
      console.log('๐Ÿงช New test:', data.test.name);
      break;
      
    case 'agent-created':
      console.log('๐Ÿค– New agent:', data.agent.name);
      break;
      
    case 'test-started':
      console.log('โ–ถ๏ธ Running:', data.name);
      break;
      
    case 'test-completed':
      const icon = data.status === 'passed' ? 'โœ…' : 'โŒ';
      console.log(`${icon} ${data.name}: ${data.status}`);
      break;
      
    case 'bug-found':
      console.log('๐Ÿ› Bug found:', data.bug.title);
      break;
      
    case 'session-complete':
      console.log(`๐Ÿ“Š Session complete: ${data.testsPassed}/${data.testsRun} passed`);
      break;
      
    case 'git-merge':
      console.log('๐Ÿ”€ Merge detected, starting tests...');
      break;
  }
};

React Hook Example

typescript
import { useEffect, useState } from 'react';

interface OpenQAEvent {
  type: string;
  [key: string]: any;
}

export function useOpenQA() {
  const [events, setEvents] = useState<OpenQAEvent[]>([]);
  const [connected, setConnected] = useState(false);

  useEffect(() => {
    const ws = new WebSocket('ws://localhost:3000');
    
    ws.onopen = () => setConnected(true);
    ws.onclose = () => setConnected(false);
    
    ws.onmessage = (event) => {
      const data = JSON.parse(event.data);
      setEvents(prev => [...prev.slice(-99), data]);
    };
    
    return () => ws.close();
  }, []);

  return { events, connected };
}