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
EVENT
intelligence-completePhase 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
}
}
}EVENT
kanban-seededProactive 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" },
...
]
}EVENT
thinkingBrain is processing/thinking in the ReAct loop
Payload
{
"type": "thinking",
"thought": "Analyzing checkout flow for potential vulnerabilities..."
}EVENT
analysis-completeApplication analysis finished
Payload
{
"type": "analysis-complete",
"understanding": "E-commerce app with user auth...",
"suggestedTests": ["Test cart persistence", ...],
"risks": ["Cart race conditions", ...]
}EVENT
test-generatedA new test was generated
Payload
{
"type": "test-generated",
"test": {
"id": "test_001",
"name": "test_checkout_flow.spec.ts",
"type": "e2e"
}
}EVENT
agent-createdA new dynamic agent was created
Payload
{
"type": "agent-created",
"agent": {
"id": "agent_001",
"name": "Checkout Flow Tester",
"purpose": "Test checkout with various payment methods"
}
}EVENT
test-startedA test execution started
Payload
{
"type": "test-started",
"testId": "test_001",
"name": "test_checkout_flow.spec.ts"
}EVENT
test-completedA test execution completed
Payload
{
"type": "test-completed",
"testId": "test_001",
"name": "test_checkout_flow.spec.ts",
"status": "passed",
"duration": 2300
}EVENT
bug-foundA bug was discovered
Payload
{
"type": "bug-found",
"bug": {
"id": "bug_001",
"title": "XSS vulnerability in search",
"severity": "high",
"testId": "test_002"
}
}EVENT
session-completeA test session finished
Payload
{
"type": "session-complete",
"sessionId": "session_abc123",
"testsRun": 15,
"testsPassed": 13,
"testsFailed": 2,
"bugsFound": 1,
"duration": 1800000
}EVENT
git-mergeA merge to main branch was detected
Payload
{
"type": "git-merge",
"source": "github",
"branch": "feature/checkout-fix",
"commit": "abc123",
"author": "developer@example.com"
}EVENT
git-pipeline-successA 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}