Skip to content

Copilot alerts

Copilot alerts are real, event-driven notifications written to Firestore by ARGUS backend services and surfaced in the operator’s Master Caution strip (bell icon in the toolbar). Unlike in-memory local warnings, these persist through refresh and propagate to every participant in the mission.

Where alerts come from

Backend services write to missions/{missionId}/copilot_alerts:

  • CAS agent — collision-avoidance logic. Writes when two aircraft come within configured proximity thresholds. Type cas.
  • argus-copilot — the LLM-backed mission intelligence worker. Writes when it correlates events the operator should know about.
  • argus-wifi-sensing (when deployed) — spectrum anomalies, interference warnings.
  • DJI HMS — health-management system alerts from docks. Translated into copilot alerts by argus-dji’s event-handler. Written with severity
    • code + human-readable message from the 448-entry DJI code dictionary.

All writers are server-side only — the webapp doesn’t write alerts directly, it only listens.

The Firestore listener

The operation component sets up a real-time listener scoped to the current session:

query(
collection(fs, 'missions', missionId, 'copilot_alerts'),
where('type', '==', 'cas'),
where('createdOn', '>', sessionStart),
orderBy('createdOn', 'desc'),
firestoreLimit(20)
)

Note the type === 'cas' filter — in the current build only CAS alerts surface in the console. Other alert types (HMS, wifi-sensing, copilot- driven) write to the same collection but aren’t yet routed to master caution. This is a limitation, not a design — the listener’s filter will broaden as more alert sources mature.

Alert shape

Each copilot_alert doc:

  • typecas, hms, copilot, etc.
  • severityinfo / warning / critical.
  • sourcecas / flag / system / drone / geofence / comms.
  • title + detail — strings.
  • location — optional lat/lng/alt for map integration.
  • createdOn — epoch ms.

Master-caution integration

On incoming alert, the listener calls MasterCautionService.pushAlert():

  1. Badge updates — the bell icon gains a count badge.
  2. Colour state — if severity is critical, the bell goes red with a subtle pulse; warning makes it amber.
  3. Audible tone — a short F-18-style caution tone plays for critical alerts (unless audio is muted globally).
  4. Blackbox record — every alert is written to the blackbox replay session so after-action review sees it.

Acknowledging alerts

From the master-caution menu (click the bell):

  • Per-alert click — dismisses that alert (your dismissal; others still see it).
  • Clear All — bulk dismiss.

Dismissal is per-user — the alert doc stays in Firestore so other participants still see it until they dismiss themselves. To permanently remove, an admin must delete the doc directly.

Silence / snooze

A silence for N minutes option suppresses new alerts of a class for N minutes. Useful when a wind warning is repeating every 10 s — mute it while you focus on a different task.

Click-jump from the menu

Alerts with a location field get a “go to” chip. Clicking:

  • Pans the map to the alert’s lat/lng.
  • Flashes a pulsing ring at the location for a few seconds.
  • Switches the map tile to the foreground if minimised.

Voice-command integration

Operators saying EMERGENCY (or any of the 43 EMERGENCY phrase variants — see Voice commands) during a PTT burst fire a critical master-caution alert directly from the client, with the speaker’s mapped position as the alert location. This is the one case where the webapp writes an alert (with a source: 'voice' tag) for immediate team-wide broadcast.

Aspirational items

  • Watchlist detection hits → copilot alert — YOLO finding a watchlist match would log a detection-hit alert. Plumbing exists; not wired yet.
  • Alert routing beyond CAS filter — listener will broaden.