Commit Graph
844 Commits
Author SHA1 Message Date
German KhokhlovandClaude Opus 5.5 c493eb0126 Merge remote-tracking branch 'origin/main' into german/hal-642-ja
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 14:11:56 +04:00
German KhokhlovandClaude Opus 5.5 a60ba928cc Merge remote-tracking branch 'origin/main' into german/hal-638-fr
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 14:11:35 +04:00
Sameh Khamis f69e9bba8b Update Vite and Puppeteer, and remove the unused screenshot helper 2026-10-28 22:35:08 -07:00
Sameh Khamis c1f60cb7e7 Cut the Google requests the HUD summary makes on its own
The HUD builds place context for its AI summary whenever the camera
settles, and each build paid for up to four reverse geocodes plus a Nearby
Places search, even when no OpenAI key was configured to use them.

- Ask GET /api/openai/hud-summary/status once; with no summary configured,
  or after an unconfigured reply, make no place lookups for the page.
- Reverse-geocode at most two points: the view center and one viewport
  point.
- Reuse a lookup until the view center moves a quarter of the visible
  width, the camera's distance to it doubles or halves, or the camera
  crosses a lookup height. The reused points are asked again, so only a
  timeout, failure or empty answer spends.
- Repaint the last AI reply when a small pan leaves the context unchanged.

Cached-only hosts and voice context lookups are unchanged.
2026-10-28 14:59:33 -07:00
Said Turksever 71574179a2 test(qa): skip the seek visibility check outside a Vite dev server
__gevQaRegisterLayer exists only in dev builds; against vite preview the
check threw and the remaining director checks never ran.
2026-10-28 14:35:01 +00:00
Said Turksever b731adea49 Merge remote-tracking branch 'upstream/main' into pr1374-fix 2026-10-28 14:28:38 +00:00
German KhokhlovandClaude Opus 5.5 858ce827e5 i18n(pt): apply review round 2
Three-model review (astra, sol, fable), round 2: 29 of 30 findings
applied, one of them in part.

- pt: FIRMS «mais recente há», CCTV «cruzamentos», degraded radio
  directory, «{layers}: ativação recente» for any layer list, «Sem
  imagem», NIVELADO, AJUSTA-SE, quoted Provider Settings, V/S kept on
  the ADS-B card, no-break space in «(24 h)» / «(30 d)», and more
  (see docs/translations/pt.md).
- Malformed cyclone snapshot is now a catalog message (all locales).
- Markup supports data-i18n-context; the radio STATION TAG option uses
  "radio tag|All", so it no longer flips gender when the list loads.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 17:57:51 +04:00
German KhokhlovandClaude Opus 5.5 9f71a62d12 i18n(fr): ship French in the language picker
- Register fr: catalog in CATALOGS, LOCALES and LOCALE_NAMES (Français);
  any fr-* browser tag (fr-CA, fr-BE, fr-CH) maps to it.
- package-boundaries.json lists fr.json next to the other catalogs.
- Picker and locale tests cover the new row and its local names.
- docs/translations/fr.md: style, typography, plurals and glossary;
  TRANSLATORS.md and CURRENT-STATE.md list French as shipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:00:14 +04:00
German KhokhlovandClaude Opus 5.5 ed40201481 i18n(ja): ship Japanese
- Register ja: CATALOGS, LOCALES, LOCALE_NAMES (日本語) and the package
  boundaries; ja and ja-JP tags select it.
- Japanese unit words follow the number directly, as in the catalog:
  formatQuantity writes 5分 and 1時間5分 (km and kt keep the space), and
  formatRelativeTime drops the space CLDR puts in 5 分前.
- Tests: locale tags, picker order, Intl output, durations and the
  ramp/exit/lane wording in Japanese.
- docs/translations/ja.md: style, units, plurals and glossary; ja added to
  TRANSLATORS.md and CURRENT-STATE.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:59:32 +04:00
German KhokhlovandClaude Opus 5.5 1146946207 i18n(uk): complete and ship Ukrainian
- Translate the remaining 1,895 strings for the current UI (Bhote Koshi
  event, weather, imagery, street level, directions, SDR, voice, scenes,
  import) and review meirm's 832 entries from #312: 134 edited for
  Ukrainian HUD terms (КУРС/ПЕЛ./ШЛЯХ/ПРИЗН., Л/П, ОНЛАЙН for LIVE,
  Cyrillic units КМ, ВУЗ, ФТ, МВт), vessel types, number agreement and
  the ʼ apostrophe throughout.
- Register uk: catalog, LOCALES, LOCALE_NAMES (Українська), package
  boundaries, same-as-English codes; picker and plural tests cover the
  four Ukrainian forms.
- docs/translations/uk.md: style, plurals, units and glossary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:57:54 +04:00
German KhokhlovandClaude Opus 5.5 dfa7ac98a7 i18n(de): complete and ship German
- Translate the remaining 1,868 strings in a neutral infinitive style (no
  Sie/du), with German compounds, decimal commas and CLDR one/other plurals.
- Review the #908 entries: knots are kn everywhere, the avionics codes BRG,
  CRS and DEST stay English like HDG and SPD, expand/collapse is
  ausklappen/einklappen, the radio toggle reads EIN/AUS, density SPARSE is
  DÜNN, the Thermal style is Wärmebild, German quotes in the shot prompt.
- Register de: catalog, LOCALES, LOCALE_NAMES (Deutsch), package boundaries,
  same-as-english (codes, product names, music genres, units).
- Tests: picker order and keyboard model with Deutsch, de/de-AT/de_CH
  normalization, browser de-DE resolves to German.
- docs/translations/de.md: style, plurals, units and glossary; TRANSLATORS.md
  and CURRENT-STATE.md list German.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:53:49 +04:00
German KhokhlovandClaude Opus 5.5 8269f0e4e6 i18n(pt): complete and ship Brazilian Portuguese
- Translate the remaining 1,868 strings (pt-BR, as in #909) and review the
  contributor entries: HUD codes BRG/SPD/RANGE stay as in the other
  languages, sentence-case layer and scene names, Space key named as on the
  keyboard, short PREV/NEXT/ON/OFF chips, and the CLDR many form (exact
  millions take «de») on every plural.
- Register pt: any pt tag (pt-BR, pt-PT) maps to it; the picker shows
  «Português (Brasil)».
- Codes, units and product names identical to English go to
  same-as-english.json.
- docs/translations/pt.md: style, plurals, units and glossary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:52:01 +04:00
German KhokhlovandClaude Opus 5.5 c4dfee6e5c i18n(it): ship Italian
- Register it: catalog in index.js, LOCALES and LOCALE_NAMES (Italiano);
  it-IT, it-CH and other it tags select it.
- List it.json with the other catalogs in package-boundaries.json.
- docs/translations/it.md: style, plurals and glossary; Italian in the
  shipped lists of TRANSLATORS.md and CURRENT-STATE.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 12:51:02 +04:00
German Khokhlov ba9db7fc41 Merge origin/main and sync Traditional Chinese catalog 2026-10-27 10:25:07 +04:00
German Khokhlov 8f16cf263b i18n: use zh-Hant for Chinese (Traditional) 2026-10-27 10:20:54 +04:00
Sameh Khamis 15de9d738c fix(i18n): mark style labels without loading the catalogs (#1421)
The style shaders and visualPresets imported msg() from src/i18n/index.js,
which loads every locale catalog. The share-view codec reads the styles'
defaults, so a server bundling the codec carried about 0.9 MB of
translations it never uses. They now import the catalog-free marker, as
other portable modules do; the codec's bundle drops from about 1 MB to
130 KB.
2026-10-26 16:54:01 -07:00
Sameh Khamis 3d9f153bc0 feat(share): export the share-view codec and link-path helpers (#1419)
* feat(share): export the share-view codec for host servers

Add `@gods-eye-view/core/share/view-codec` (src/share/viewCodec.js) as a
package export with its own boundary group. The codec is pure (no DOM, no
Cesium, no external dependencies), so a host's server can decode a
/share/<code> link, for example to describe the view in link previews.

* feat(share): export the share-link address helpers

Add `@gods-eye-view/core/share/link-path` (src/share/shareLinkPath.js), so a
host's server reads /share/<code> addresses the way the app does.
2026-10-26 16:20:23 -07:00
Sameh Khamis da02fd8645 feat(share): short /share/<code> links with a compact versioned view format (#1418)
* feat(share): add compact versioned share-view codec

Add a standalone codec for `#s=<base64url>` share links: a version byte
followed by protobuf-style tag-length-value fields. Settings equal to
their default are omitted and refilled from the same table on decode;
unknown fields are skipped by wire type, so new fields never break
older apps. Views are a place (camera) or a thing (an aircraft,
military aircraft, vessel or satellite to follow, with camera offset
and last-known fix); an unknown kind falls back to the camera.

The decoder bounds its input and rejects malformed payloads with a
reason instead of throwing. A converter maps the long form's parsed
state to and from the codec state; the long form is unchanged.

* fix(share): tighten codec decoding after review

Unknown detection mode and allocation names now fall back to their
defaults instead of reaching the lenient long-form migration. Future
panel values and style-parameter tokens are skipped rather than applied
or rejected, and layer options are accepted only under their owner
layer. Wrap longitudes before scaling, normalize negative zero, reuse
the layer-state tracking ID grammar, and align the format doc with the
decoder.

* feat(share): let a host share the link its own way

ShareLinkManager.buildLink() returns the current share link without
copying it, and copyLink() now copies exactly that. The share button
passes the link to an optional services.shareLink(url), which resolves
to 'shared', 'copied', 'cancelled' or false; 'cancelled' shows no toast
and 'shared' shows the new "Link shared" (es, ru, zh-CN). Without the
service the button copies as before.

* feat(share): open and make short /share/<code> links

The share button now makes `<app>/share/<code>` links with the compact
share-view code, and the app opens them at start-up through the same
restore pipeline as long links. Once the app next writes the address, the
share path is replaced (no new history entry) by the app's own address and
the live long-form hash, so a reload follows the live view. A host can pass
the code as `initialShareCode` instead. A code that fails to decode restores
nothing and shows "This share link can't be opened".

The code gains a trailing CRC-8 check byte, so any single mistyped
character is rejected instead of opening a different view. Thing views no
longer store a camera: it is derived from the entity's last-known fix and
the follow offset on a sphere, the entity kind is implied by the id's
field, and the followed entity's layer bit is implied; an aircraft followed
from the app's own camera is a 42-character code. The `#s=` hash form is
gone.

While the camera follows an aircraft, military aircraft or satellite, the
link is a thing view with the camera's offset and the entity's position.
Opening one turns the layer on and follows the entity through the existing
shared-follow restore, then swings the camera round to the shared offset; a
vessel view selects the vessel once the vessel feed has it. If the entity
is not reporting within its window, the view stays at its last-known fix
and says so. The panel and style-parameter tables now come from the codec,
and a host share hook that returns a plain value or throws still gets a
toast.

* fix(share): encode style settings against the style's own look

Settings a style applies when selected (bloom, sharpen, HUD, detection,
celestial ring and the style's shader parameters) now default, per field,
to what that style applies in a fresh session, read from the tables the
app applies (the first-load baseline, the style presets and the shader
defaults). The encoder compares against the view's style and the decoder
fills omitted settings from the decoded style, so a view that keeps its
style's look costs only its camera and style. The previous defaults did not
match a fresh session (sharpen, HUD and detection were off), so every link
paid for them, and a style's own shader parameters were always written.

A test pins the per-style defaults as frozen v1 meanings. A followed
aircraft in Noir is now 44 characters and the real long-link example 39.

* docs: changelog for #1418
2026-10-26 15:31:51 -07:00
Sameh Khamis c533b1994c Merge main and preserve voice panel and GhostMaps schema coverage 2026-10-26 08:52:03 -07:00
Sameh Khamis 074e272356 fix(voice): recover idle timers and retire panel audio observers 2026-10-26 08:42:41 -07:00
Sameh Khamis aeee3652ce Merge PR #1299 with current main for validation 2026-10-26 08:39:16 -07:00
Mazeyar Moeini Feizabadi 9496ee4d64 fix: complete GhostMaps locale and voice integration with current main 2026-10-26 16:29:48 +01:00
Mazeyar Moeini Feizabadi 4da002bd42 Merge current main into S2 GhostMaps and preserve updated import and voice behavior 2026-10-26 16:25:49 +01:00
Mazeyar Moeini Feizabadi 4a18af5426 fix: address GhostMaps resource and source ownership review findings 2026-10-26 16:24:34 +01:00
Alex O'Neill 01c35a2c11 Merge branch 'main' into codex/fix-seek-layer-state 2026-10-26 13:06:49 +00:00
Bilawal SidhuandBilawal Sidhu a3a19883b4 feat: add Scope controls and conditional HUD text backplates (#1410)
* feat: add scope controls and conditional HUD backplates

* docs: assign scope changelog to PR 1410

* fix: stabilize title backplate and brighten secondary labels

---------

Co-authored-by: Bilawal Sidhu <[email protected]>
2026-10-26 00:24:27 -05:00
Rudy Mizrahi Celekli a15fdd3134 fix(hud): carry rounded DMS seconds into the minutes (#1339)
Carry rounded HUD coordinate seconds into minutes and degrees.

Contribution by @rudycelekli.
2026-10-25 17:59:09 -07:00
Sameh Khamis 2006c035d9 chore: remove four modules nothing in the app uses (#1403)
* chore: remove four modules nothing in the app uses

src/app/sourceSlot.js re-exported src/sources/sourceSlot.js, which every
caller imports directly. src/data/flowTiles.js and src/data/issPass.js were
reached only by their own tests. src/data/localGeojson.js wrapped
localGeojsonCore.js with the app's services, which the catalog already
passes itself. The local GeoJSON layer tests now build layers the way the
catalog does, so they keep covering localGeojsonCore.js; only the test of
the wrapper's own default host goes. Boundary lists, format scope and docs
drop the removed paths.

* docs: changelog for #1403
2026-10-25 17:21:41 -07:00
Sameh Khamis 1ad472fecf fix(awareness): register and document bearing presentation 2026-10-25 14:08:32 -07:00
Alex O'Neill b918939b99 Merge remote-tracking branch 'fork/codex/fix-seek-layer-state' into codex/fix-seek-layer-state 2026-10-25 19:55:02 +00:00
Alex O'NeillandClaude Opus 5.5 b900fb8410 fix(director): reconcile only stale layers on same-shot seeks
Compare declared visibility with the manager's effective intent, and treat
in-flight transitions as stale so a toggle or superseded LOAD rollback that
is still settling cannot slip past the check. Reconcile only those layers
inside the lightweight seek instead of rebuilding the shot, and report a
refusal without resetting the seek position or camera.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 19:54:51 +00:00
Alex O'Neill cdb6bd0716 Merge branch 'main' into codex/fix-seek-layer-state 2026-10-25 19:39:36 +00:00
quanticsoul4772 69fba2ebbe fix(perf): free a turned-off layer's entities that Cesium keeps (#1367)
Release stale Cesium command references after disabling a layer while preserving current-frame commands.

Contribution by @quanticsoul4772.
2026-10-25 12:36:50 -07:00
quanticsoul4772 91144e88ad perf(models): aircraft models skip Cesium's dynamic environment map (#1366)
Skip per-aircraft dynamic environment maps while retaining default model lighting.

Contribution by @quanticsoul4772.
2026-10-25 08:08:43 -07:00
Said Turksever 60ec1f962b Merge branch 'main' into codex/fix-hidden-tab-polling 2026-10-24 23:51:23 +01:00
Alex O'Neill 1644acd2a3 fix(director): restore layer visibility on same-shot seeks 2026-10-24 23:05:56 +01:00
quanticsoul4772andSameh Khamis 1c234ce027 fix(opensky): load OAuth credential files and retire Basic auth (#1229)
Read OpenSky OAuth credentials from OPENSKY_CREDENTIALS_FILE and stop sending retired Basic authentication. Update setup diagnostics and guidance.

Keep credential-file warnings free of parser excerpts and filesystem error details, cover both failure paths with a regression test, and use a launcher-compatible absolute path example.

Original contribution by quanticsoul4772, with credential-warning and documentation follow-up by Sameh Khamis.

Co-authored-by: quanticsoul4772 <[email protected]>
Co-authored-by: Sameh Khamis <[email protected]>
2026-10-24 08:25:42 -07:00
manjunath 5c3b66c263 feat(voice): reconcile preview and settings with main
add the shared Voice Preview and Settings panel with browser-local preview
and inactivity preferences, keyboard controls and responsive positioning

preserve main’s Rotation and Context behavior, clarify panel routing and
refresh schema pins within the unchanged prompt limit
2026-10-24 15:20:15 +05:30
Sameh Khamis 8d454bf7f1 fix: improve mobile contact selection and context drawers (#1338)
Improve coarse-pointer contact selection, reveal tracked aircraft through Contacts, support downward drawer dismissal, and enlarge the mobile logo.
2026-10-23 15:05:23 -07:00
manjunath22466 b2fb4a261e feat(camera): add globe rotation (#1225)
Add continuous globe rotation with direction and speed controls, viewport fit checks, camera ownership handoff, and voice refusal guards.
2026-10-23 14:51:42 -07:00
6b3e8bada3 i18n: add Traditional Chinese (zh-TW)
Add a complete Taiwan Traditional Chinese catalog, locale selection,
Chinese readout formatting, translation notes and regression coverage.
Seed translations from #724 and #652 and adapt the zh-CN catalog.

Co-authored-by: caxer <[email protected]>
Co-authored-by: tbdavid2019 <[email protected]>
Co-authored-by: Enzo Abyie <[email protected]>
Co-authored-by: EDIT-Aeterna <[email protected]>
2026-10-23 22:52:48 +04:00
Sameh Khamis 8cdd184a90 feat(street-level): provider exports and a Mapillary Graph endpoint for hosts (#1324)
* feat(street-level): export the KartaView and Panoramax providers

A host that composes Street Level with its own provider list can already
import the Mapillary and Google Street View providers; KartaView and Panoramax
were reachable only through the default list, which needs a Mapillary source.
Exporting them lets a host offer the keyless providers without Mapillary.

* chore: changelog entry for the Street Level provider exports

* feat(street-level): send Mapillary Graph lookups to a source endpoint

A Mapillary source can take a graphEndpoint, a Graph API base that adds
the token itself. Its sequence lookups go there through the source's
transport, and the photo viewer uses MapillaryJS's stock GraphDataProvider
at that endpoint, so a host that proxies Mapillary needs no client token in
the page. Without it, behaviour is unchanged: direct Graph API calls with
the client token.
2026-10-23 07:47:57 -07:00
Said Turksever a4f9b5e925 Merge branch 'main' into codex/fix-space-provider-cooldowns 2026-10-23 14:39:06 +01:00
Said Turksever 3af42082b1 Merge branch 'main' into codex/fix-traffic-render-hold 2026-10-23 12:59:46 +01:00
Said TurkseverandClaude Opus 5.5 1b7498820f Remove the unused trafficLogs collector from Traffic QA
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 12:12:27 +01:00
Said Turksever d8dce93ff4 Merge remote-tracking branch 'origin/main' into fix/1281
# Conflicts:
#	docs/CURRENT-STATE.md
2026-10-23 12:12:27 +01:00
Said TurkseverandClaude Opus 5.5 0caffd8b70 Merge origin/main into codex/fix-space-provider-cooldowns
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-23 12:09:31 +01:00
Said Turksever be44f523e0 Merge remote-tracking branch 'origin/main' into fix/1282
# Conflicts:
#	docs/CURRENT-STATE.md
2026-10-23 12:09:26 +01:00
Said Turksever 17864965d9 Merge remote-tracking branch 'origin/main' into fix/1268
# Conflicts:
#	docs/CURRENT-STATE.md
2026-10-23 12:09:23 +01:00
Sameh Khamis 10bb2c6a36 test(qa): open the phone tab sheets in phone-width harness checks
At 720px and narrower the panels live in the phone shell's tab sheets, so the
camera, scene and map-source tray harnesses open the matching tab (from the
keyboard where they check focus rings) before measuring, wait for the shell to
follow a viewport change, measure the container that actually scrolls, and run
the pin and compact-wing checks at 800px where the narrow desktop dock still
exists.
2026-10-22 22:09:37 -07:00