Skip to content

WebSocket Events ​

Connect to the daemon WebSocket for real-time updates. The GUI and chat gateways both use this connection to stay in sync.

ws://localhost:31415

Connection ​

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

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

On connection, the server immediately sends a state message with the full agent registry. Subsequent messages push incremental updates.

Origin verification

The WebSocket server verifies the Origin header and only accepts connections from localhost origins. This matches the REST API's CORS policy. Connections without an origin (CLI/native clients) are always allowed.

State Sync ​

state ​

Fired on any agent registry change — spawn, update, remove, status change. Contains the full agent list.

json
{
  "type": "state",
  "data": [
    {
      "id": "ab12cd34",
      "name": "backend-1",
      "role": "backend",
      "status": "running",
      "provider": "claude-code",
      "model": "claude-sonnet-4-6",
      "scope": ["src/api/**"],
      "tokensUsed": 45000,
      "contextUsage": 0.45,
      "spawnedAt": "2026-04-09T10:00:00Z"
    }
  ]
}

Agent Events ​

agent:output ​

Fired when an agent writes structured output to stdout. High-frequency — used by the GUI for real-time activity feeds.

json
{
  "type": "agent:output",
  "agentId": "ab12cd34",
  "data": {
    "type": "activity",
    "subtype": "assistant",
    "data": "Refactoring the auth middleware..."
  }
}

Output subtypes: assistant (AI text), tool (tool use), result (final output), usage (token counts).

agent:exit ​

Fired when an agent process exits.

json
{
  "type": "agent:exit",
  "agentId": "ab12cd34",
  "code": 0,
  "signal": null,
  "status": "completed"
}

Status values: completed (code 0), crashed (non-zero code), killed (signal termination).

Rotation Events ​

rotation:start ​

Fired when context rotation begins.

json
{
  "type": "rotation:start",
  "agentId": "ab12cd34",
  "agentName": "backend-1"
}

rotation:complete ​

Fired when rotation finishes — old agent killed, new agent spawned with handoff brief.

json
{
  "type": "rotation:complete",
  "agentId": "ef56gh78",
  "agentName": "backend-1",
  "oldAgentId": "ab12cd34",
  "tokensSaved": 45000
}

rotation:failed ​

Fired when rotation fails.

json
{
  "type": "rotation:failed",
  "agentId": "ab12cd34",
  "error": "Failed to spawn replacement agent"
}

Approval Events ​

approval:request ​

Fired when an agent triggers a scope violation that needs human review.

json
{
  "type": "approval:request",
  "data": {
    "id": "approval-1712678400-1",
    "agentId": "ab12cd34",
    "agentName": "backend-1",
    "action": {
      "type": "scope_violation",
      "description": "Agent tried to modify src/auth.js (owned by frontend-1)"
    },
    "status": "pending",
    "requestedAt": "2026-04-09T12:00:00Z"
  }
}

approval:resolved ​

Fired when an approval is approved or rejected.

json
{
  "type": "approval:resolved",
  "data": {
    "id": "approval-1712678400-1",
    "status": "approved",
    "resolvedAt": "2026-04-09T12:01:00Z"
  }
}

Conflict Events ​

conflict:detected ​

Fired when an agent attempts to modify a file owned by another agent.

json
{
  "type": "conflict:detected",
  "data": {
    "agentName": "backend-1",
    "filePath": "src/index.js",
    "ownerName": "frontend-1"
  }
}

Journalist Events ​

journalist:cycle ​

Fired when the Journalist completes a synthesis cycle.

json
{
  "type": "journalist:cycle",
  "data": {
    "cycleCount": 3,
    "lastCycleTime": "2026-04-09T12:02:00Z",
    "lastSynthesis": "Backend API refactored, frontend components updated..."
  }
}

Team Events ​

team:created ​

json
{
  "type": "team:created",
  "team": { "id": "ab12cd34", "name": "Backend Squad" }
}

team:updated ​

json
{
  "type": "team:updated",
  "team": { "id": "ab12cd34", "name": "API Team" }
}

team:deleted ​

json
{
  "type": "team:deleted",
  "teamId": "ab12cd34",
  "movedTo": "default-team-id"
}

Schedule Events ​

schedule:execute ​

Fired when a scheduled agent is spawned by the cron scheduler.

json
{
  "type": "schedule:execute",
  "scheduleId": "ab12cd34",
  "agentId": "ef56gh78"
}

Gateway Events ​

gateway:status ​

Fired when any gateway connects, disconnects, or is updated. Contains the full list of gateways.

json
{
  "type": "gateway:status",
  "data": [
    {
      "id": "telegram-abc123",
      "type": "telegram",
      "connected": true,
      "enabled": true,
      "chatId": "123456789"
    }
  ]
}

Other Events ​

phase2:spawned ​

Fired when a QC agent is auto-spawned after all phase 1 builders complete.

json
{
  "type": "phase2:spawned",
  "agentId": "ab12cd34",
  "name": "qc-senior-dev",
  "role": "fullstack"
}

qc:activated ​

Fired when the QC threshold is reached (4+ agents by default).

json
{
  "type": "qc:activated",
  "agentCount": 4
}

file:changed ​

Fired when a watched file is modified (editor integration, 300ms debounce).

json
{
  "type": "file:changed",
  "path": "src/index.js",
  "timestamp": 1712678400000
}

Classifier Events ​

classifier:update ​

Fired every 20 events once the classifier has 40+ data points for an agent. Powers mid-session downshift suggestions in the GUI.

json
{
  "type": "classifier:update",
  "agentId": "ab12cd34",
  "tier": "light",
  "eventCount": 60
}

Tier values: light, medium, heavy.

Coordination Events ​

coordination:declared ​

Fired when an agent acquires an exclusive lock on shared resources via POST /api/coordination/declare.

json
{
  "type": "coordination:declared",
  "agentId": "ab12cd34",
  "operation": "npm install",
  "resources": ["package.json", "node_modules"]
}

coordination:completed ​

Fired when an agent releases a coordination lock via POST /api/coordination/complete or when the 10-minute TTL expires.

json
{
  "type": "coordination:completed",
  "agentId": "ab12cd34"
}

Memory Events (Layer 7) ​

memory:constraint:added ​

Fired when a new project constraint is added to persistent memory.

json
{
  "type": "memory:constraint:added",
  "hash": "a1b2c3d4e5f6"
}

memory:constraint:removed ​

Fired when a project constraint is removed by its hash.

json
{
  "type": "memory:constraint:removed",
  "hash": "a1b2c3d4e5f6"
}

memory:discovery:added ​

Fired when an agent records a successful error→fix pair to the discovery log.

json
{
  "type": "memory:discovery:added",
  "agentId": "ab12cd34",
  "role": "backend"
}

Rotation Reason Codes ​

The rotation:complete event's reason field can be any of:

ReasonTrigger
context_thresholdAdaptive threshold reached (context fullness)
quality_degradationQuality score dropped below threshold
natural_compactionProvider-managed context reset (no GROOVE action)
token_limit_exceededAgent burned more than safety.tokenCeilingPerAgent since spawn
runaway_velocity(removed in v0.27.2) — legacy rotations may still appear in saved history
manualUser-triggered via GUI or CLI

Listening for Specific Events ​

Filter events on the client side by checking the type field:

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

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  switch (msg.type) {
    case 'state':
      console.log(`${msg.data.length} agents`);
      break;
    case 'agent:exit':
      console.log(`Agent ${msg.agentId} ${msg.status}`);
      break;
    case 'approval:request':
      console.log(`Approval needed: ${msg.data.id}`);
      break;
    case 'rotation:complete':
      console.log(`Rotated: ${msg.oldAgentId} -> ${msg.agentId}`);
      break;
    case 'gateway:status':
      console.log(`${msg.data.length} gateways`);
      break;
  }
};

Last updated:

FSL-1.1-Apache-2.0