Merge upstream/main into fix/drone-airspace

Move the share-link token to 6 (3 is gnss-integrity), build altitude
ranges from LOWER/UPPER VAL, UOM and CODE, mark card and legend strings
for translation, rename the layer to Prohibited & Restricted Airspace,
move the changelog entry to changelog.d, and keep the layer voice-off
while the Realtime prompt is at its budget.
This commit is contained in:
Matt Van Horn committed 2026-10-27 05:06:05 -07:00
commit 4c2159a70a
1387 files changed
+160157 -23954

No files matched your search

+59 -25
View File
@@ -34,9 +34,43 @@ const AIRCRAFT_FIELDS = {
aircraftClass: ['t'],
military: ['f'],
onGround: ['f'],
squawk: ['t'],
emergency: ['f'],
emergencyKind: ['t'],
emergencySource: ['t'],
emergencyBroadcast: ['t'],
lastContactAtMs: ['ms'],
};
const layers = [
{
id: 'gnss-integrity',
aliases: [
'gnss integrity',
'navigation integrity',
'low navigation accuracy',
'gnss interference',
'gps interference',
'gps jamming',
'gnss',
],
context: false,
noQuery: 'navigation-integrity cells; no countable analyst records',
},
{
id: 's2-ghostmaps',
aliases: [
's2 ghostmaps',
'ghost maps',
'ghostmaps',
's2 underground',
's2 intel',
'intel picture',
'common intelligence picture',
],
context: false,
noQuery: 'published third-party intel placemarks; not analyst records',
},
{
id: 'flights',
track: true,
@@ -230,6 +264,24 @@ const layers = [
context: false,
noQuery: 'map overlay; no countable records',
},
{
id: 'air-quality',
aliases: ['air quality', 'aqhi', 'smog', 'air pollution'],
context: false,
query: {
fields: {
value: ['n', 'AQHI'],
band: ['t'],
scale: ['t'],
provider: ['t'],
name: ['t'],
zone: ['t'],
risk: ['t'],
observedMs: ['ms'],
},
timeField: 'observedMs',
},
},
{
id: 'traffic',
aliases: ['street traffic', 'road traffic', 'congestion'],
@@ -327,30 +379,6 @@ const layers = [
context: true,
query: { fields: { name: ['t'], class: ['t'], kind: ['t'] } },
},
{
id: 'drone-airspace',
aliases: [
'drone restrictions',
'drone airspace',
'no-fly zones',
'no fly zones',
'drones',
],
context: false,
query: {
fields: {
name: ['t'],
typeCode: ['t'],
type: ['t'],
lowerDesc: ['t'],
upperDesc: ['t'],
timesOfUse: ['t'],
agency: ['t'],
city: ['t'],
state: ['t'],
},
},
},
{
id: 'local-datacenters',
aliases: ['datacenters', 'data centers', 'data centres'],
@@ -396,6 +424,10 @@ const layers = [
export const VOICE_OFF_LAYERS = Object.freeze({
'bhote-koshi-2026': 'scene-driven event layer (control_scene)',
'bhote-koshi-locator': 'scene-driven event layer (control_scene)',
// The Realtime prompt is at its 52,000-character budget; voice toggle and
// query for this layer wait until there is room.
'drone-airspace':
'informational airspace layer; no room in the prompt budget',
});
const TYPE_NAMES = Object.freeze({
@@ -497,6 +529,8 @@ const SELF_EVIDENT_IDS = new Set([
'radio',
'wind',
'directions',
// The brand is already the layer id; all spoken aliases remain accepted.
's2-ghostmaps',
]);
/**
@@ -511,7 +545,7 @@ export function voiceLayerAliasHint() {
entry.toggle && entry.aliases.length && !SELF_EVIDENT_IDS.has(entry.id),
)
.map((entry) => `${entry.aliases.slice(0, 2).join('/')}→${entry.id}`)
.join('; ');
.join(';');
}
/** Field names that already carry their unit (altitudeM, speedKts, …). */