OpenQAOpenQA
API Reference

WebSocket Events

Real-time events for monitoring OpenQA activity via WebSocket.

Connection

javascript
1const ws = new WebSocket('ws://localhost:3000');
2 
3ws.onopen = () => {
4 console.log('Connected to OpenQA');
5};
6 
7ws.onmessage = (event) => {
8 const data = JSON.parse(event.data);
9 console.log('Event:', data.type, data);
10};
11 
12ws.onclose = () => {
13 console.log('Disconnected from OpenQA');
14};

Event Types

EVENTintelligence-complete

Phase 0 — Project Intelligence analysis finished. Fires before any test runs.

Payload
{
  "type": "intelligence-complete",
  "intelligence": {
    "domain": "fintech",
    "riskLevel": "critical",
    "regulatoryContext": ["PCI-DSS", "GDPR"],
    "mandatoryChecks": [...],        // 7 checks
    "suggestedSpecialists": ["auth-tester", "xss-tester", "sql-injection"],
    "dynamicAgentBlueprints": [...], // agents invented for this project
    "testingStrategy": {
      "depth": "exhaustive",
      "estimatedSessionMinutes": 90
    }
  }
}
EVENTkanban-seeded

Proactive Kanban tickets were created from the intelligence report. Fires after intelligence-complete.

Payload
{
  "type": "kanban-seeded",
  "count": 9,
  "tickets": [
    { "id": "ticket_001", "title": "[SECURITY] SQL injection on payment forms", "priority": "critical" },
    { "id": "ticket_002", "title": "QA Strategy: fintech (critical risk)", "priority": "high" },
    ...
  ]
}
EVENTthinking

Brain is processing/thinking in the ReAct loop

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
1const ws = new WebSocket('ws://localhost:3000');
2 
3ws.onmessage = (event) => {
4 const data = JSON.parse(event.data);
5 
6 switch (data.type) {
7 // ── Phase 0: Intelligence ──────────────────────────────
8 case 'intelligence-complete':
9 console.log('🔍 Domain:', data.intelligence.domain);
10 console.log('⚠️ Risk:', data.intelligence.riskLevel);
11 console.log('📜 Regulations:', data.intelligence.regulatoryContext.join(', '));
12 break;
13 
14 case 'kanban-seeded':
15 console.log(`🗂️ ${data.count} strategic tickets created on Kanban`);
16 break;
17 
18 // ── Phase 1: Analysis ──────────────────────────────────
19 case 'analysis-complete':
20 console.log('📊 Analysis done:', data.suggestedTests.length, 'tests suggested');
21 break;
22 
23 // ── Phase 2: ReAct loop ────────────────────────────────
24 case 'thinking':
25 console.log('🧠 Brain:', data.thought);
26 break;
27 
28 case 'test-generated':
29 console.log('🧪 New test:', data.test.name);
30 break;
31 
32 case 'agent-created':
33 console.log('🤖 New agent:', data.agent.name);
34 break;
35 
36 case 'test-started':
37 console.log('▶️ Running:', data.name);
38 break;
39 
40 case 'test-completed':
41 const icon = data.status === 'passed' ? '✅' : '❌';
42 console.log(`${icon} ${data.name}: ${data.status}`);
43 break;
44 
45 case 'bug-found':
46 console.log('🐛 Bug found:', data.bug.title);
47 break;
48 
49 case 'session-complete':
50 console.log(`📊 Session complete: ${data.testsPassed}/${data.testsRun} passed`);
51 break;
52 
53 case 'git-merge':
54 console.log('🔀 Merge detected, starting tests...');
55 break;
56 }
57};

React Hook Example

typescript
1import { useEffect, useState } from 'react';
2 
3interface OpenQAEvent {
4 type: string;
5 [key: string]: any;
6}
7 
8export function useOpenQA() {
9 const [events, setEvents] = useState<OpenQAEvent[]>([]);
10 const [connected, setConnected] = useState(false);
11 
12 useEffect(() => {
13 const ws = new WebSocket('ws://localhost:3000');
14 
15 ws.onopen = () => setConnected(true);
16 ws.onclose = () => setConnected(false);
17 
18 ws.onmessage = (event) => {
19 const data = JSON.parse(event.data);
20 setEvents(prev => [...prev.slice(-99), data]);
21 };
22 
23 return () => ws.close();
24 }, []);
25 
26 return { events, connected };
27}