feat(fires): MODIS in Active Fires and a Fire Perimeters layer (#737)

Adds MODIS NRT to Active Fires and a keyless Fire Perimeters layer (NIFC WFIGS) with
InciWeb incident links, served through a capped, cached /api/fire-perimeters proxy.

Co-authored-by: Gustavo Beneduzi <[email protected]>
Co-authored-by: James Cooke <[email protected]>
This commit is contained in:
authored and GitHub committed 2026-09-23 21:21:52 -05:00
1 parent 4b56d0e917
commit f913066cf2
40 files changed
+3201 -26

No files matched your search

+3
View File
@@ -137,6 +137,7 @@ const schemas = [
'local-dams',
'telegeography-submarine-cables',
'local-firms',
'fire-perimeters',
'alpr-cameras',
'local-adsb',
],
@@ -170,6 +171,7 @@ const schemas = [
'local-dams',
'telegeography-submarine-cables',
'local-firms',
'fire-perimeters',
'alpr-cameras',
],
},
@@ -775,6 +777,7 @@ const schemas = [
'satellites',
'local-datacenters',
'local-dams',
'fire-perimeters',
],
},
},
+17 -3
View File
@@ -22,7 +22,7 @@ test('the complete Realtime tool payload pins the additive analyst, satellite an
assert.equal(
digest,
// Re-derived for the additive `local-adsb` set_layer_visibility value.
'07c2439e085cce9b9e1b36dfd01e2a688e66957db464c740627dd378536d904b',
'4de5c78425d8233794cfd37fdb797605ae93611ba71b7208f4d912b587a0e859',
);
});
@@ -85,12 +85,26 @@ test('all legacy action arguments are byte-identical after removing the delibera
const layers = legacy.find((tool) => tool.name === 'analyst_query').parameters
.properties.layers.items;
layers.enum = layers.enum.filter(
(key) => !['satellites', 'local-datacenters', 'local-dams'].includes(key),
(key) =>
![
'satellites',
'local-datacenters',
'local-dams',
'fire-perimeters',
].includes(key),
);
// Local ADS-B is an additive set_layer_visibility enum value.
const visibility = legacy.find((tool) => tool.name === 'set_layer_visibility')
.parameters.properties.layerId;
visibility.enum = visibility.enum.filter((key) => key !== 'local-adsb');
visibility.enum = visibility.enum.filter(
(key) => !['local-adsb', 'fire-perimeters'].includes(key),
);
for (const tool of legacy) {
for (const value of Object.values(tool.parameters.properties)) {
if (value.enum)
value.enum = value.enum.filter((key) => key !== 'fire-perimeters');
}
}
// Independently derived by executing trusted c9f9896 actionSchemas in the restricted container.
assert.equal(
createHash('sha256').update(JSON.stringify(legacy)).digest('hex'),
+3
View File
@@ -217,6 +217,9 @@ const LAYER_ALIASES = new Map([
['submarine cables', 'telegeography-submarine-cables'],
['cables', 'telegeography-submarine-cables'],
['telegeography', 'telegeography-submarine-cables'],
['fire perimeters', 'fire-perimeters'],
['perimeters', 'fire-perimeters'],
['wildfire perimeters', 'fire-perimeters'],
['firms', 'local-firms'],
['fires', 'local-firms'],
['active fires', 'local-firms'],