mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
From the re-shot Russian screenshots:
- Translated: weather frame/imagery status errors, HUD summary provenance
("НЕДОСТУПНО: СУДА AIS ОНЛАЙН"), Bhote Koshi map labels, cockpit signal
distances (КМ). The HUD summary fields are separated with " · " in every
language, so the style name and view band no longer read as one phrase.
- Numbers follow the locale: cockpit altitude ("26 175"), precipitation.
- No breaks inside codes and dates: ADS-B and similar in layer rows,
Sentinel-2, cyclone issue dates (word joiner; the UI font has no U+2011),
no-break space after label colons in cyclone details.
- Layout: count lines under ALPR, short unavailable chip (context
"status chip"), roomier draw segments, tighter CCTV calibration chips,
two-line beat titles and media card titles, wrapping weather status.
- Wording: ru advisory is «сводка» (was «бюллетень»; "Advisory center" is
«Центр циклона по сводке»), Street View is «Просмотр улиц», OPACITY
«НЕПРОЗР.», synced «синхр.», Area «Зона»; the import dialog no longer says
"this scene" for several scenes. Glossary updated.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
252 lines
6.8 KiB
JavaScript
252 lines
6.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { readFileSync } from 'node:fs';
|
|
import {
|
|
HUD_SUMMARY_INSTRUCTIONS,
|
|
HUD_SUMMARY_UNCONFIGURED_CODE,
|
|
hudSummaryLayerContext,
|
|
hudTelemetryProvenance,
|
|
isHudSummaryUnconfigured,
|
|
keylessHudSummaryResponse,
|
|
} from './hudSummaryResponse.js';
|
|
import { openAiRealtimeProxy } from '../vite.config.js';
|
|
|
|
const UNCONFIGURED_PAYLOAD = {
|
|
configured: false,
|
|
code: HUD_SUMMARY_UNCONFIGURED_CODE,
|
|
error: null,
|
|
summary: null,
|
|
};
|
|
|
|
function installOpenAiRoutes() {
|
|
const routes = new Map();
|
|
openAiRealtimeProxy().configureServer({
|
|
middlewares: {
|
|
use(path, handler) {
|
|
routes.set(path, handler);
|
|
},
|
|
},
|
|
});
|
|
return routes;
|
|
}
|
|
|
|
function invokeRoute(
|
|
handler,
|
|
{ method = 'GET', url = '/', remoteAddress = '127.0.0.1' } = {},
|
|
) {
|
|
return new Promise((resolve, reject) => {
|
|
const headers = new Map();
|
|
const req = {
|
|
method,
|
|
url,
|
|
headers: {},
|
|
socket: { remoteAddress },
|
|
};
|
|
const res = {
|
|
statusCode: 200,
|
|
setHeader(name, value) {
|
|
headers.set(String(name).toLowerCase(), String(value));
|
|
},
|
|
end(body = '') {
|
|
resolve({
|
|
statusCode: this.statusCode,
|
|
headers: Object.fromEntries(headers),
|
|
body: body ? JSON.parse(String(body)) : null,
|
|
});
|
|
},
|
|
};
|
|
Promise.resolve(handler(req, res)).catch(reject);
|
|
});
|
|
}
|
|
|
|
test('builds an HTTP-success capability response only for a blank key', () => {
|
|
assert.deepEqual(keylessHudSummaryResponse(undefined), {
|
|
statusCode: 200,
|
|
payload: UNCONFIGURED_PAYLOAD,
|
|
});
|
|
assert.deepEqual(keylessHudSummaryResponse(' '), {
|
|
statusCode: 200,
|
|
payload: UNCONFIGURED_PAYLOAD,
|
|
});
|
|
assert.equal(keylessHudSummaryResponse('configured-key'), null);
|
|
});
|
|
|
|
test('recognizes only the exact deliberate no-key fallback response', () => {
|
|
assert.equal(isHudSummaryUnconfigured(200, UNCONFIGURED_PAYLOAD), true);
|
|
assert.equal(isHudSummaryUnconfigured(503, UNCONFIGURED_PAYLOAD), false);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, {
|
|
...UNCONFIGURED_PAYLOAD,
|
|
error: 'provider failed',
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, {
|
|
...UNCONFIGURED_PAYLOAD,
|
|
summary: 'Unexpected provider output',
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, {
|
|
...UNCONFIGURED_PAYLOAD,
|
|
configured: true,
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, {
|
|
...UNCONFIGURED_PAYLOAD,
|
|
unexpected: true,
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, {
|
|
code: HUD_SUMMARY_UNCONFIGURED_CODE,
|
|
}),
|
|
false,
|
|
);
|
|
});
|
|
|
|
test('does not hide real provider and HTTP failures', () => {
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(502, {
|
|
code: HUD_SUMMARY_UNCONFIGURED_CODE,
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(isHudSummaryUnconfigured(503, UNCONFIGURED_PAYLOAD), false);
|
|
assert.equal(
|
|
isHudSummaryUnconfigured(200, { error: 'provider failed' }),
|
|
false,
|
|
);
|
|
});
|
|
|
|
test('the installed keyless HUD route stays successful after the voice quota is exhausted', async () => {
|
|
const previousKey = process.env.OPENAI_API_KEY;
|
|
const previousLimit = process.env.GEV_RATELIMIT_OPENAI_PER_MIN;
|
|
process.env.OPENAI_API_KEY = '';
|
|
process.env.GEV_RATELIMIT_OPENAI_PER_MIN = '1';
|
|
try {
|
|
const routes = installOpenAiRoutes();
|
|
const token = routes.get('/api/realtime/token');
|
|
const hud = routes.get('/api/openai/hud-summary');
|
|
assert.equal(typeof token, 'function');
|
|
assert.equal(typeof hud, 'function');
|
|
|
|
const firstToken = await invokeRoute(token);
|
|
const secondToken = await invokeRoute(token);
|
|
assert.equal(firstToken.statusCode, 503);
|
|
assert.deepEqual(firstToken.body, { error: 'OPENAI_API_KEY is not set' });
|
|
assert.equal(secondToken.statusCode, 429);
|
|
|
|
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
const response = await invokeRoute(hud, { method: 'POST' });
|
|
assert.equal(response.statusCode, 200);
|
|
assert.equal(
|
|
response.headers['content-type'],
|
|
'application/json; charset=utf-8',
|
|
);
|
|
assert.equal(response.headers['cache-control'], 'no-store');
|
|
assert.deepEqual(response.body, UNCONFIGURED_PAYLOAD);
|
|
}
|
|
} finally {
|
|
if (previousKey === undefined) delete process.env.OPENAI_API_KEY;
|
|
else process.env.OPENAI_API_KEY = previousKey;
|
|
if (previousLimit === undefined)
|
|
delete process.env.GEV_RATELIMIT_OPENAI_PER_MIN;
|
|
else process.env.GEV_RATELIMIT_OPENAI_PER_MIN = previousLimit;
|
|
}
|
|
});
|
|
|
|
test('HUD summary context and telemetry tag carry chip-identical feed-state', () => {
|
|
const now = 1_000_000;
|
|
const layers = [
|
|
{
|
|
id: 'flights',
|
|
name: 'Live Flights',
|
|
enabled: true,
|
|
stats: {
|
|
stale: true,
|
|
count: 12,
|
|
lastUpdate: now - 240_000,
|
|
source: 'OpenSky Network',
|
|
},
|
|
},
|
|
{
|
|
id: 'earthquakes',
|
|
name: 'Earthquakes',
|
|
enabled: false,
|
|
stats: { count: 3, lastUpdate: now },
|
|
},
|
|
];
|
|
const context = hudSummaryLayerContext(layers, { now });
|
|
assert.deepEqual(context.enabledLayerLabels, ['Live Flights']);
|
|
assert.equal(context.enabledLayers[0].feedState, 'stale');
|
|
assert.equal(context.feedProvenance.overall, 'stale');
|
|
assert.deepEqual(hudTelemetryProvenance(layers, { now }), {
|
|
state: 'stale',
|
|
names: ['Live Flights'],
|
|
});
|
|
assert.equal(
|
|
hudTelemetryProvenance(
|
|
[
|
|
{
|
|
id: 'flights',
|
|
name: 'Live Flights',
|
|
enabled: true,
|
|
stats: { count: 4, lastUpdate: now },
|
|
},
|
|
],
|
|
{ now },
|
|
),
|
|
null,
|
|
);
|
|
});
|
|
|
|
test('HUD summary instructions require non-nominal feedState in the five words', () => {
|
|
assert.match(
|
|
HUD_SUMMARY_INSTRUCTIONS,
|
|
/five words MUST include that feedState token/,
|
|
);
|
|
assert.match(
|
|
HUD_SUMMARY_INSTRUCTIONS,
|
|
/STALE, DEGRADED, FALLBACK, LOADING, or UNAVAILABLE/,
|
|
);
|
|
assert.match(HUD_SUMMARY_INSTRUCTIONS, /feedProvenance/);
|
|
});
|
|
|
|
test('the HUD proxy uses the shared provenance instructions', () => {
|
|
const local = readFileSync(
|
|
new URL('../server/providers/openai/hud-summary.js', import.meta.url),
|
|
'utf8',
|
|
);
|
|
assert.match(local, /HUD_SUMMARY_INSTRUCTIONS/);
|
|
assert.doesNotMatch(local, /enabled-layer text labels/);
|
|
});
|
|
|
|
test('AI summaries missing a non-nominal provenance token fall back deterministically', async () => {
|
|
const { hudSummaryMatchesProvenance } =
|
|
await import('./hudSummaryResponse.js');
|
|
assert.equal(
|
|
hudSummaryMatchesProvenance('Austin flights operating normally today', {
|
|
overall: 'stale',
|
|
}),
|
|
false,
|
|
);
|
|
assert.equal(
|
|
hudSummaryMatchesProvenance('Austin stale flights over downtown', {
|
|
overall: 'stale',
|
|
}),
|
|
true,
|
|
);
|
|
assert.equal(
|
|
hudSummaryMatchesProvenance('Austin flights operating normally today', {
|
|
overall: 'nominal',
|
|
}),
|
|
true,
|
|
);
|
|
});
|