Commit Graph
3498 Commits
Author SHA1 Message Date
Sameh Khamis 447cc08783 fix(flights): a stalled feed dims the tracked aircraft as STALE
When the whole feed backs off, no poll counts a miss, so the tracked
aircraft read STALE at full brightness while no newer position came in.
It now takes the same stale fade as a missed update, in the flights and
military layers.
2026-11-10 13:03:15 -08:00
Sameh Khamis c87510fd2e Merge pull request #1574 from IMBrandao/feat/transit-icon-heading
feat(transit): give vehicle icons a readable front, and none without a course
2026-11-10 12:36:09 -08:00
Sameh Khamis 05daaf267a Merge branch 'main' into feat/transit-icon-heading 2026-11-10 12:24:46 -08:00
Sameh Khamis 3da4204e97 Merge pull request #1655 from bilawalsidhu/sameh/route-corridor
fix(flights): a long flight keeps its route up to 15% of its length off the great circle
2026-11-10 11:53:33 -08:00
Sameh Khamis d1cd7f63ef Merge branch 'main' into sameh/route-corridor 2026-11-10 11:45:29 -08:00
Sameh Khamis 9947c6b2e5 Merge pull request #1654 from bilawalsidhu/sameh/flight-trails
feat(flights): trails split at gaps and follow the aircraft; a lost aircraft coasts, then reads SIGNAL LOST
2026-11-10 11:43:22 -08:00
Sameh Khamis b97b49cf1d docs(changelog): long-route corridor (#1655) 2026-11-10 11:37:14 -08:00
Sameh Khamis 486a78ad8e fix(flights): a long flight keeps its route when it is up to 15% of the route's length off the great circle
The route check allowed 200 km off the great circle between the airports, so a
coast-to-coast flight routed a few hundred kilometres around weather lost its
origin and destination (JFK–SFO over Kansas, 384 km south). The tolerance is
now 200 km or 15% of the route's length, whichever is larger: 623 km for
JFK–SFO, and still 200 km for a short hop, so a wrong leg stays hidden.
2026-11-10 11:37:04 -08:00
Sameh Khamis 8e25105a6c docs(changelog): flight trails and SIGNAL LOST (#1654) 2026-11-10 11:33:14 -08:00
Sameh Khamis 8fec5a76bf feat(flights): a tracked flight's trail splits at gaps, follows the drawn aircraft, and a lost aircraft coasts then reads SIGNAL LOST
The trail no longer joins a day of history into one line. It lifts the pen
across a gap of more than 48 minutes, an implied speed over 1,500 kt, or a
report without altitude (a parked aircraft within 0.1 nm for under 3 h stays
joined), and every history point is kept as its own segment. History never
gets an invented altitude. The live end is the path the aircraft was drawn
along, thinned to its shape, so it no longer cuts corners through turns; a
late report trims what was drawn after it. Old segments are frozen in chunks,
so a 2,000-point trail costs about 0.1 ms a frame.

A tracked aircraft that misses an update shows STALE and is dimmed. It keeps
flying on its last speed and heading for five minutes (at most 1,500 kt),
then stops, dimmed, labelled SIGNAL LOST with the time since its last report,
and is kept for ten minutes after that report so the camera keeps its target.
Aircraft on or near known ground hold at their last report instead of
coasting. Military flights follow the same rules.
2026-11-10 11:30:59 -08:00
Sameh Khamis 66a8ff06cb Merge pull request #1650 from bilawalsidhu/sameh/firms-window-label
fix(firms): label a snapshot that ends at a set time with that time, not LIVE
2026-11-10 10:44:53 -08:00
Sameh Khamis 6eb0729832 fix(firms): translate the snapshot-end label for Hebrew 2026-11-10 10:35:16 -08:00
Sameh Khamis bb45aacb24 Merge branch 'main' into sameh/firms-window-label 2026-11-10 10:27:01 -08:00
German Khokhlov c733e4d2ad Merge pull request #1594 from meirm/feat/hebrew-i18n
i18n(he): complete and ship Hebrew
2026-11-10 21:47:12 +04:00
German Khokhlov 59ac26ed8c Merge branch 'main' into feat/hebrew-i18n 2026-11-10 21:37:45 +04:00
Mazeyar Moeini Feizabadi 9c0c85fd83 Merge pull request #1651 from bilawalsidhu/codex/discord-merged-pr-announcements
Announce merged PRs in Discord #contributions
2026-11-10 18:35:11 +01:00
German Khokhlov b6c2ba379b i18n(he): translate the photo credit added on main 2026-11-10 21:26:15 +04:00
German Khokhlov 2919e90c63 Merge branch 'main' into feat/hebrew-i18n 2026-11-10 21:24:21 +04:00
German Khokhlov 7571e42556 i18n(he): apply the second translation review
- RECORD is «רשומה», a record rather than a recording.
- Time abbreviations end in the geresh again (דק׳, שנ׳, שע׳, ימ׳), and the
  counted forms agree with 1.
- Numbers after a Latin name, ordinals and units keep their order in RTL.
- Meaning, agreement and domain terms fixed across the catalog: cyclone
  advisories and storm centre, sensor swath, track-up, cinematic, tropical
  depression, pilot and sailing vessels, chips, metered billing, radio static,
  airspace, NOT AN ALL-CLEAR, and the remaining review items.
- LOOK and OFF-NADIR are translated; {value} KM stays Latin as an instrument
  readout, like KM/S.
- rtl.css shares the Arabic and Hebrew letter-spacing reset and drops the
  duplicated Arabic rules; he.md and its glossary follow the catalog.
2026-11-10 21:23:28 +04:00
Mazeyar Moeini Feizabadi c9559955f0 ci: announce merged PRs in Discord 2026-11-10 17:57:37 +01:00
Sameh Khamis 4ef0869a87 fix(firms): drop LIVE from the row's source and the voice answer for a snapshot that ends at a set time
The catalog source 'NASA FIRMS · LIVE' still led the row; getStats() now
names the source 'NASA FIRMS' for such a snapshot. get_active_fires says
"in the 24 hours to" its end and reports window_end. The end is checked
to be a printable time, cleared under KEY REQUIRED, the test moves next
to the layer, and the changelog and CURRENT-STATE describe it.
2026-11-10 08:19:40 -08:00
Sameh Khamis 43706b8dd0 fix(firms): label a snapshot that ends at a set time with that time, not LIVE
A FIRMS source may answer the 24 hours to a set time, naming its end as
`at` (epoch ms). The layer row then reads "24 h to MM-DD HH:MM UTC"
instead of "LIVE · updated ...", and getStats() reports `at`. A
snapshot without `at` (the trailing 24 hours to now, as the dev proxy
serves) keeps the LIVE label. Translated in every catalog.
2026-11-10 08:11:58 -08:00
German Khokhlov 9cfac35e38 Merge pull request #1280 from bilawalsidhu/codex/fix-tool-display-text
fix(tools): bound untrusted display text at output boundaries
2026-11-10 16:29:25 +04:00
German Khokhlov 353eebf224 refactor(tools): normalize ALPR text once, in the records
Every camera find_alpr_cameras returns comes from the tile source, which builds
it through normalizeAlprNode, so the tags are already one line and capped.
Drop the second pass in the tool, its duplicate test and the boundary entry,
and the function check normalizeDisplayText never sees.
2026-11-10 15:37:16 +04:00
German Khokhlov 12a5630991 docs: tighten the display-text notes
Name routeId among the canonical analyst IDs in CURRENT-STATE, say what the
changelog entry changes for users, and drop the comment that repeated the
canonical-field doc.
2026-11-10 15:34:32 +04:00
German Khokhlov 3521c96172 Merge remote-tracking branch 'origin/main' into codex/fix-tool-display-text 2026-11-10 14:32:55 +04:00
German Khokhlov 1b010fe328 fix(voice): keep transit route IDs out of display-text normalization
A follow-up analyst_query filters on the routeId it was handed back, so a
route ID with repeated spaces or over 180 characters must stay byte-for-byte
raw like the other canonical fields.
2026-11-10 14:31:28 +04:00
German Khokhlov 5874773ad9 Merge pull request #1577 from bilawalsidhu/german/vessel-callout-under-card
Hide a vessel's detection callout while its own card paints
2026-11-10 14:23:33 +04:00
German Khokhlov 20d58cf888 Report zero queued alpha for an entry the yield pass hid
getQueuedOverlayEntryAlpha now returns 0 for a yielding entry that
declutterYieldingEntries marked collisionHidden this frame. That pass runs
before custom lanes, so they no longer read full opacity for an entry that
will not paint.
2026-11-10 14:06:24 +04:00
German Khokhlov 0af33707da fix(voice): restore the globe-rotation import a main merge dropped
The earlier main merge replaced `import { interruptGlobeRotation } from
'../cameraVerbs.js'` with the displayText import while keeping the
`interruptGlobeRotation('voice-zoom-intent')` call, so voice zoom actions
threw ReferenceError. The same merge replaced main's Overpass reservation
paragraph in docs/CURRENT-STATE.md; restore it next to the new text.
2026-11-10 13:58:48 +04:00
German Khokhlov 39246adaf7 Merge remote-tracking branch 'origin/main' into codex/fix-tool-display-text
Conflicts:
- docs/CURRENT-STATE.md: keep main's hidden-tab polling paragraph and the
  display-text normalization paragraph.
- scripts/package-boundaries.json: keep main's voice panel and text chat
  modules and add src/data/displayText.js.
- src/voice/gevActions.test.mjs: keep main's set_panel_open and partial
  analyst card tests and the display-text tests.
2026-11-10 13:58:41 +04:00
German Khokhlov 8eb0173940 Merge branch 'main' into german/vessel-callout-under-card 2026-11-10 12:47:09 +04:00
Sameh Khamis bb40ac5e54 Merge pull request #1647 from bilawalsidhu/sameh/flight-photo
Show the tracked aircraft's Planespotters photo in Contacts
2026-11-09 21:21:22 -08:00
Sameh Khamis 9fe27c2d75 Merge branch 'main' into sameh/flight-photo 2026-11-09 21:13:16 -08:00
Sameh Khamis c620fac9dc Merge pull request #1645 from bilawalsidhu/sameh/traffic-lines-one-build
perf(traffic): build road lines one set at a time
2026-11-09 20:41:55 -08:00
Sameh Khamis a904562f0f Changelog fragment for #1647 2026-11-09 20:36:34 -08:00
Sameh Khamis 1a8defbfc8 feat(flights): show the tracked aircraft's Planespotters photo in Contacts
Tracking a civil flight asks Planespotters for that aircraft's photo, once
per aircraft, straight from the browser. The CONTEXT panel's CONTACTS view
shows it under the flight's name with the photographer's credit, as a plain
link to the photo's page. Only images on plnspttrs.net and pages on
www.planespotters.net are ever shown or linked. Military aircraft and a
converted TR-3B are never looked up.

Flight lookups (type, route, photo) whose source failed temporarily are
asked again after a 60-second cool-down; an answer, found or not, and a
permanent refusal stay final for the session. A route belongs to the
callsign it was looked up for, so a callsign change drops the old route.

Browser QA scripts that track a flight answer the photo lookup themselves,
so they never call the third party.
2026-11-09 20:36:03 -08:00
Sameh Khamis b996e35b0c docs(changelog): traffic lines build one set at a time 2026-11-09 20:31:53 -08:00
Sameh Khamis 4dc51927bc perf(traffic): build road lines one set at a time
With Lines on, every progressive paint of a loading city rebuilt all road
lines: up to three ground-line primitives for as many as 1,500 roads, built
asynchronously. Builds started faster than they finished, and each kept the
set it replaced in the scene until it was ready, so sets piled up.

One set now builds at a time. A rebuild asked for while lines are building
replaces the one waiting, and the newest starts when the build finishes.
Lines replaced by a finished build are removed before the next one starts.
Turning Lines off removes the lines at once and drops the waiting rebuild.
2026-11-09 20:31:28 -08:00
Sameh Khamis 78c5b6c245 Merge pull request #1641 from bilawalsidhu/sameh/draw-shape
Applications can take the pointer for their own tool
2026-11-09 17:38:26 -08:00
Sameh Khamis 28907caf7b Merge branch 'main' into sameh/draw-shape 2026-11-09 17:30:15 -08:00
Sameh Khamis a7f96313e9 feat(pointer): an application's own tool can take the pointer
createApplicationTools returns pointer: claim(owner) takes the pointer as
Draw does and returns its lease, or null while another tool holds it;
release(lease) gives it back; isFree() lets the application's own click
handlers yield, as the layers' do. This replaces drawShape, which this
branch added: Draw is as it was.
2026-11-09 16:56:59 -08:00
Sameh Khamis da134328ef Merge pull request #1642 from bilawalsidhu/sameh/transit-floor-fix
Keep vehicles off rooftops and bridge decks by reading the 3D-tile surface where each vehicle is
2026-11-09 15:12:25 -08:00
Sameh Khamis 09520bc34c Changelog fragment for #1642 2026-11-09 14:54:51 -08:00
Sameh Khamis 9bce41d3c6 Read the mesh floor where transit vehicles and grounded flights actually are
With readings kept per point, the floor a vehicle gets depends on which point
is probed and where it is read. Transit offered the sampler the first point of
each vehicle's path in a cell, usually its oldest fix there, so a vehicle that
stayed in one cell never had its current spot probed. It now offers the latest
point of the path in each cell, and the newest fix in the vehicle's own cell
(the selected vehicle's history is walked newest first).

The grounded-flight display clamp read the floor at its sticky cell's centre,
which now answers from the reading nearest the centre, not the contact. It
reads at the contact's own position, held inside the sticky cell so boundary
hysteresis still applies.
2026-11-09 14:51:35 -08:00
Sameh Khamis 04b8c856ad Keep vehicles off rooftops and bridge decks: probe the mesh where the vehicle is
On the photoreal stack the rendered-mesh floor took one probe at each coarse
cell's centre (0.001 degrees) and kept it for the session. A centre on a roof
passed the +80 m DEM window and lifted every vehicle in the cell to roof height
(a Haymarket bus drew 23.5 m above the street, on the garage roof); a centre in
the river put Red Line trains on the Longfellow Bridge 6-9 m under the deck.

The sampler now probes at the caller's point. A cell with a reading is probed
again only at spots about 17 m apart from earlier ones, eight at most, and a
spot refused only because the cell's DEM prior was cold is tried again later.
The floor keeps each reading that passes the gate at the point it was taken
(two within about 5 m keep the lower; sixteen at most per cell) and answers a
read from the reading nearest the asked point, so a viaduct and the street
beside it in one cell keep their own heights.
2026-11-09 14:51:35 -08:00
Meir Michanie f79ceb690f i18n(he): apply review (#1594)
Before merging: singular 'one' forms from the review table (44 entries),
counters keep their order across the slash (מתוך, as Arabic المن), the
lightning layer says ברקים (the legend now counts ברק strikes, the help
text keeps 110°E Latin), configured-elsewhere keys are promised
untouched, Punk is פאנק רוק, dock/panel side labels follow the mirrored
layout, and the HUD-summary English guard covers he (NON_LATIN_LOCALES,
tested) — documented in Adding a language along with format-scope.

Suggestions and nits: restricted is מוגבל, stage recovery is החבה not
שחזור, voice-inactivity names the behavior, lane directions use
attributes (השמאלי) and around is לאחור, Ironbow and KM/S stay Latin in
same-as-english, {age} no longer doubles לפני, typos and garbled words
fixed (תנאים, ידנית, ודאות, מקלט, זמניים, ערוץ 14, מעונן חלקית, אין אות
קריאה, Tab לתצוגה מקדימה, השאר ריק, היוועץ), counted units shortened
(שנ' דק' שע' ימ'), terminology unified (briefing תדריך, forecast תחזית,
course מהלך, אונייה, שריפה), rtl.css shares the mono redirect under
:is(:lang(ar), :lang(he)) and its comments match the rules,
worldOverlayTokens adds Noto Sans Hebrew to the canvas card fonts, he.md
gets the fraction-aware plural table, iw/iw-IL map to he (tested).
2026-11-09 14:41:36 -06:00
Meir Michanie 23609b94b6 i18n(he): follow main's place names 2026-11-09 14:41:36 -06:00
Meir Michanie 3dd89af354 i18n(he): follow main's orbital site focus
- Translate the 12 new strings: site standby and Live-Signal pings,
  releasing and keeping the camera on a subject, riding a satellite,
  the focus and return chips, unnamed mapped sites.
- OFF-NADIR stays as printed via same-as-english.
2026-11-09 14:41:36 -06:00
Meir Michanie e35f38df8c i18n(he): follow main's satellite classes, orbital and bridge views
- Rebase on origin/main and translate the 130 new strings: event-age
  filter, satellite class groups (STATIONS/IMAGING/TELECOM/STARLINK/
  PROBES/DEBRIS) with CelesTrak SATCAT context, TomTom traffic limits,
  the ship bridge view (look/hold/radar/SOG/COG), the orbital view
  (swath, off-nadir, TLE, sub-satellite point, nadir/track-up) and the
  world-time play speeds.
- Instrument readouts keep the Latin codes (LOOK/STBD/PORT, NM, NORAD,
  EPOCH, TLE, OFF-NADIR, STARLINK, EYE, SWATH variants) via
  same-as-english.
- Prune 3 entries whose English main replaced.
2026-11-09 14:41:36 -06:00