docs/panels/airline-intel.mdx
The Airline Intelligence panel (internal id airline-intel) is the dashboard's civil-aviation command surface. It tracks a user-curated watchlist of airports and routes, surfaces delay and cancellation severity, tracks specific aircraft, and can quote real-time flight prices across a date grid. Built as six tabs so each aspect renders on its own without cross-panel context switching.
Six tabs under a shared airport + route watchlist control:
| Tab id | Shows |
|---|---|
ops | Airport ops summary per watchlist airport — delay / cancellation severity via FlightDelaySeverity (normal / minor / moderate / major / severe, colour-bucketed). |
flights | Live flight instances at watched airports, with per-flight status badges (scheduled / boarding / departed / airborne / landed / arrived / cancelled / diverted / unknown) and delay stats. |
airlines | Per-carrier ops: CarrierOps — delay rate, cancellation rate, on-time performance. |
tracking | Live aircraft positions (PositionSample[]) for tracked tails, plus an individual-flight status lookup. |
news | Aviation-relevant news items (AviationNewsItem[]). |
prices | Google Flights quotes for a specific itinerary and a date-grid of cheapest-day prices across a range. |
TABS is declared as ['ops', 'flights', 'airlines', 'tracking', 'news', 'prices'] as const in src/components/AirlineIntelPanel.ts:54. Watchlist comes from aviationWatchlist.get() — the first 8 airports and the first route are seeded on mount.
Panel id is airline-intel; canonical component is src/components/AirlineIntelPanel.ts. Title resolves from i18n (panels.airlineIntel).
priority: 2), tech (priority: 2), finance (priority: 2), and commodity (priority: 2) variants. Not present in the happy variant. Source: 'airline-intel' entries in FULL_PANELS (:104), TECH_PANELS (:280), FINANCE_PANELS (:471), and COMMODITY_PANELS in src/config/panels.ts.The panel uses @/services/aviation, which wraps the generated
AviationServiceClient. Flight-delay alerts can arrive through bootstrap
hydration first; the tab-specific calls below are direct REST RPCs.
| Capability | Endpoint | Panel path |
|---|---|---|
| Airport delay alerts | GET /api/aviation/v1/list-airport-delays | Bootstrap-backed disruption layer and service fallback. |
| Airport ops summaries | GET /api/aviation/v1/get-airport-ops-summary | ops tab for watched airports. |
| Airport flight instances | GET /api/aviation/v1/list-airport-flights | flights tab for one watched airport. |
| Carrier delay / cancellation rollups | GET /api/aviation/v1/get-carrier-ops | airlines tab for watched airports. |
| Specific flight status | GET /api/aviation/v1/get-flight-status | tracking tab lookup. |
| Aircraft position tracking | GET /api/aviation/v1/track-aircraft | tracking tab and civil-airspace map workflows. |
| YouTube live stream metadata | GET /api/aviation/v1/get-youtube-live-stream-info | Service RPC for aviation live-stream metadata; not part of the six-tab auto-refresh loop. |
| Legacy flight price quotes | GET /api/aviation/v1/search-flight-prices | Direct quote search path with provider/degraded-state metadata. |
| Aviation news | GET /api/aviation/v1/list-aviation-news | news tab. |
| Google Flights itinerary search | GET /api/aviation/v1/search-google-flights | prices tab explicit search. |
| Google Flights date grid | GET /api/aviation/v1/search-google-dates | prices tab cheapest-date grid. |
Three distinct refresh paths in src/components/AirlineIntelPanel.ts:
setInterval (5 * 60_000) that calls refresh(), which reloads the ops tab and the currently-active tab. Source: the constructor around line 173 (setInterval(() => void this.refresh(), 5 * 60_000)).ops, flights, airlines, tracking, or news triggers loadTab(tab) only when that tab's cache is empty. Repeated switches to an already-loaded tab repaint from memory without a refetch.prices tab is deliberately excluded from both the tab-switch and auto-refresh paths. Prices load only on an explicit search-button click (the refresh() helper skips prices with if (this.activeTab !== 'prices') void this.loadTab(this.activeTab) around line 291; the tab-switch guard is commented prices tab: never auto-fetch — only on explicit search button click around line 287).Free. No premium flag in any variant registration. RPCs are public.
tracking tab complements.