Commit Graph
540 Commits
Author SHA1 Message Date
Said TurkseverandClaude Opus 5.5 f7456f2436 fix(ui): floating windows stack above the docked rail panels
A floating window restored after a reload had no z-index, and the z ladder
renumbered from 101, so the docked DISPLAY panel (#pp-toggles, z 110) painted
over it. The ladder now starts at 111 (PANEL_Z_FLOATING_FLOOR), a restored
window is promoted like a lifted one, docking drops the promotion, and
floating panels get a CSS floor of 111. Tests fail on the old code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 00:58:43 +01:00
Said TurkseverandClaude Opus 5.5 e6c2c812f9 fix(street-level): fit the whole photo on phones
At phone width the right rail is the band between mid-screen and the credit
line, so a 16:10 viewer plus its bar and caption was cut off. Below 720 px
the viewer's height is derived from that band (clamped 110-320 px); floating
and expanded viewers reset to auto height. The QA harness checks the photo
and caption fit at 390x844, and CURRENT-STATE documents the docking rules
and phone sizing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-25 21:18:40 +01:00
Said TurkseverandClaude Opus 5.5 6207e4144e fix(street-level): review round — safer docking, mount retry, provider fallthrough
- Only a user's own collapse docks a floating window; cockpit entry,
  restores and the Cyber accordion no longer dock it or delete its saved
  place, and the accordion leaves floating windows alone.
- The viewer host records an adapter as active only after its mount
  succeeds, so a library that failed to load once is retried; concurrent
  opens share one mount, and unmounting mid-mount leaves nothing active.
- openNearest tries every active provider; one provider's error (no key,
  offline) no longer hides the others' imagery.
- The SINCE readout shows its cut-off date as soon as the committed value
  matches the thumb, even while the slider keeps focus.
- A floating window that was only dragged is bounded to the viewport and
  scrolls instead of running off-screen.
- getStats summarises coverage (summarizeCoverage) instead of building a
  full UI snapshot every second; disable() uses credits.hideAll(); smaller
  cleanups in the viewer host and sequence snapshot.
- Unit tests: panel docking and header double press, viewer-host mount
  retry/sharing/cancel, coverage summary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-25 20:56:12 +01:00
Said TurkseverandClaude Opus 5.5 5877f24f0b feat(street-level): movable, simplified panel with the photo first
- The viewer opens at the top of the panel, under the header, so the photo
  is on screen without scrolling; its tools (EXPAND, FIT/FILL, FOLLOW, close)
  sit in a bar above the image, clear of the provider's own overlays, and the
  caption wraps instead of truncating.
- No separate ON/OFF or OPEN NEAREST PHOTO buttons: the header pill is the
  layer switch, and a provider chip is lit only while the layer is on (the
  last lit chip switches the layer off).
- SINCE is a stepped slider (any date to the last month) whose readout names
  the cut-off date and is announced via aria-valuetext.
- The panel floats and resizes (portable spec); in a resized window the
  viewer takes the spare height and only the settings scroll. SHRINK after
  EXPAND, collapsing, or a header double-click docks it at its default size.
- FIT/FILL tooltips say what they do.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-25 20:45:17 +01:00
Said TurkseverandClaude Opus 5.5 c69dd2e89c fix(ui): portable panels survive reloads and answer a real double-click
- The rail's startup move of panels into #right-context-rail cleared every
  panel's inline position, so a window restored as floating dropped back to
  its rail place after a reload. Floating panels now keep their geometry.
- A header double-click never snapped a floating panel back in a real
  browser: the drag handler's pointerdown preventDefault() suppresses the
  mouse events a native dblclick is built from. Two presses within 400 ms and
  6 px (no drag between) are now detected in pointerdown itself.
- Portable specs can ask to dock when collapsed (dockOnCollapse), and
  PanelChrome exposes dockPanel(). Street Level opts in as a portable panel
  (min 320 x 280) with dockOnCollapse.
- qa-panel-resize: the panel reader returns right/bottom (s/e handle points
  were NaN), counts only visible rail panels like the rail does, parks the
  window clear of the voice dock before the resize loop, and names the
  element under the pointer when an assertion fails.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-25 20:45:17 +01:00
Said TurkseverandClaude Opus 5.5 768f256720 Merge pr/panel-resize into pr/mapillary-layer
Bring in portable, resizable rail panels. The Street Level rail rules get
the same :not(.panel-floating) guard as CCTV's so the panel can float too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-25 19:49:01 +01:00
Said TurkseverandClaude Fable 5.1 33ee9bf23e docs(street-level): README, DATA_SOURCES, CURRENT-STATE, SECURITY, CHANGELOG
Describe the provider-neutral layer, the PROVIDERS chip row, the shared
filter and its share-link options, and how a new provider registers.
Drop every mention of the removed plain-English query and Anthropic key.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 18:37:42 +01:00
Said TurkseverandClaude Fable 5.1 28e6a1faa7 feat(street-level): provider contract with Mapillary as the first provider
Street Level is now a provider-neutral layer modelled on the iD editor's
photo overlay. The core owns what every imagery provider shares: the
enable state and a switch per provider, the imagery filter (360°/flat and
captured-since in relative days), one click handler routed by pick prefix,
one viewer host that mounts whichever provider's viewer adapter owns the
open image, the position marker, camera follow, one on-globe credit per
active provider, and share-link parameters (one bit per provider plus the
filter). Providers implement the contract in registry.js: coverage,
sequences, nearest-image lookup and a viewer adapter emitting a common
pose. Mapillary is the only registered provider; Google Street View,
KartaView and Panoramax slot in beside it.

Panel: a PROVIDERS chip row (one chip per registered provider, keyless
chips read as errors), relative-day SINCE options, a provider-neutral
caption whose link label follows the provider, and no vendor mark in the
header. The panel inner is a rail scroller like CCTV's.

Tests cover the registry, params codec, filter, pick router, UI-state
composition, the provider definition and coverage-tile decoding; the QA
harness switches the provider off and on and checks the filter.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 18:34:09 +01:00
Said TurkseverandClaude Fable 5.1 2dbc684fb1 refactor(street-level): rename the Mapillary layer to street-level
Pure move: the layer id, panel id, CSS prefix, classes, exports and config
paths become provider-neutral (street-level, #street-level-panel, sl-);
the Mapillary-specific modules move under providers/mapillary/. Behaviour
is unchanged. The two sprite collections now register under distinct ids
instead of overwriting each other under 'mapillary'.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 18:13:53 +01:00
Said TurkseverandClaude Fable 5.1 547b706f67 refactor(mapillary): remove the plain-English query feature
Street Level is imagery only from here on: coverage, sequences and the
embedded viewer. The Claude planner, map-feature and traffic-sign tiles,
the NDJSON feature stream, sprites, detection outlines and analyst records
go, along with @anthropic-ai/sdk, zod and the Anthropic key entry.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 18:08:43 +01:00
Said TurkseverandClaude Fable 5.1 9ba6f96d87 Merge upstream/main into pr/mapillary-layer
Upstream took share token '2' for fire perimeters, so Street Level moves to
'3'. mapillary-js joins upstream's optimizeDeps include list instead of
overriding it; catalog and registry tests count the new upstream layers.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 17:58:27 +01:00
Said TurkseverandClaude Fable 5.1 7f65a32877 ui(mapillary): drop the keyless empty state
The panel no longer shows a separate keyless call-to-action; the fieldset
gate and the layer-row tooltip already cover the missing-key case. The
planner flag is tri-state (null until status answers).

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-25 17:51:58 +01:00
Sameh Khamis b210ab0fe4 Merge pull request #643 from ch-bas/fix/heading-confidence-consumers
fix(cctv): surface heading confidence — estimated bearings are now visible (fixes #639)
2026-09-24 22:50:38 -07:00
Sameh KhamisandClaude Opus 5.5 00235365c3 build: register headingConfidence.js with the CCTV package boundaries (#643)
main's boundary manifest now requires every module to be owned; add the new
helper beside presentation.js in cctv-layer and the two application groups.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:46:58 -07:00
Sameh KhamisandClaude Opus 5.5 303429a421 docs: record estimated CCTV bearings in CHANGELOG and CURRENT-STATE (#643)
Credit the contributor and describe the HUD tag, dashed wireframe and
calibration precedence for #639.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:44:30 -07:00
Sameh KhamisandClaude Opus 5.5 9a971fef50 Merge main into pr-643
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:44:16 -07:00
Sameh Khamis 818b654812 Merge pull request #665 from daikaginza/fix/traffic-road-error-diagnosis
fix(traffic): say which upstream declined a road load (refs #661)
2026-09-24 22:41:49 -07:00
Sameh KhamisandClaude Opus 5.5 31224d8bd2 fix(traffic): name the proxy's own 502/503 accurately (#665)
502 (every mirror unreachable) and 503 (the local limiter, before any mirror
is asked) come from our proxy, so they no longer read as a mirror refusing
the query. Credit the fix in CHANGELOG and note the mapping in CURRENT-STATE.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:36:53 -07:00
Sameh KhamisandClaude Opus 5.5 5472e54f73 Merge main into pr-665
Resolve the CHANGELOG conflict by keeping both sides' entries.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:36:35 -07:00
Sameh Khamis 80126a7aaa Merge pull request #594 from Lob26/fix/terrain-height-cache-bound
fix(terrain): bound the client terrain-height cache with LRU eviction (closes #327)
2026-09-24 22:28:13 -07:00
Sameh KhamisandClaude Opus 5.5 95f0664e4e docs: credit the terrain-height cache bound in CHANGELOG (#594)
Move the entry to the top of the changelog, where main's newer entries had
left it behind, and credit the contributor.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:23:48 -07:00
Sameh KhamisandClaude Opus 5.5 714d3dd1bb Merge main into pr-594
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:23:42 -07:00
Sameh Khamis a96cb09bc9 Merge pull request #688 from ethanstoner/fix/cctv-media-idle-deadline
fix(cctv): bound media bodies with an idle deadline
2026-09-24 22:21:53 -07:00
Sameh KhamisandClaude Opus 5.5 12bf66ef6f docs: credit the CCTV idle-deadline fix in CHANGELOG (#688)
Move the entry to the top of the changelog, where main's newer entries had
left it behind, and credit the contributor.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:17:28 -07:00
Sameh KhamisandClaude Opus 5.5 9b1c75e539 Merge main into pr-688
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:17:12 -07:00
Sameh Khamis e16a1a7f7e Merge pull request #722 from Raushankumar0720/fix/track-proxy-oversized-response
fix(live): return 502 and stop caching oversized track responses as 200 (fixes #720)
2026-09-24 22:14:01 -07:00
Sameh KhamisandClaude Opus 5.5 3a23dc393d fix(live): cache the oversized-track 502 like other upstream errors (#722)
Keep the new 502, but store it in the 60 s cache as the proxy already does
for 404/429: /tracks/all costs OpenSky credits, so an oversized track must
not be re-downloaded on every reselect. Update the regression test and
credit the fix in CHANGELOG.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:09:17 -07:00
Sameh KhamisandClaude Opus 5.5 0d58d6e1c4 Merge main into pr-722
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:08:54 -07:00
Sameh Khamis d508a406dc Merge pull request #694 from abogaart/fix/macos-chmod-absolute-path
fix: spawn Apple /bin/chmod by absolute path when hardening credentials
2026-09-24 22:06:27 -07:00
Sameh KhamisandClaude Opus 5.5 f631d5428b docs: changelog entry for the macOS chmod fix (#694)
Credit the fix in CHANGELOG and tidy the wording of its inline comment.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:01:56 -07:00
Sameh KhamisandClaude Opus 5.5 fb8a93752f Merge main into pr-694
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 22:01:50 -07:00
Sameh Khamis a28327b890 Merge pull request #705 from KnottyDyes/fix/ipad-metal-model-atmosphere
fix(render): keep Cesium's model atmosphere off Apple Metal
2026-09-24 21:59:30 -07:00
Sameh KhamisandClaude Opus 5.5 20a03aad87 fix(render): release the atmosphere probe's WebGL context
Lose the throwaway WebGL2 probe context right after the link probe instead
of leaving it for GC; browsers (Safari especially) cap live contexts. Note
that affected devices also lose globe-basemap fog, credit the changelog
entry and move it to the top.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 21:53:06 -07:00
Sameh KhamisandClaude Opus 5.5 351b5fcaa4 Merge main into pr-705
Resolve the CHANGELOG conflict with Fire Perimeters (#737) by keeping both
entries.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-24 21:52:39 -07:00
Bilawal SidhuandBilawal Sidhu ce671ce500 fix(data): load bundled region packs in the browser; bound region lookups (#743)
The Natural Earth and neighborhood packs were loaded with a JSON-attributed
import(). The Vite dev server answers that request with a JavaScript module,
which the browser rejects, so every analyst region scope failed and fell
through to a geocode lookup that could take 12-28 s.

- src/data/bundledJson.js fetches the pack from a new URL(..., import.meta.url)
  asset in the browser; under Node the caller's attributed import runs.
- resolveRegionRingForQuery caps the geocode + admin-boundary rung at 3 s and
  returns { error: 'region-timeout' }; the lookup keeps running and fills the
  cache. The analyst query reports it as code 'region-timeout'. The Nepal
  locator opts out of the budget.
- Unit tests for the loader, the timeout and the analyst error; the behavior
  harness checks the Gulf of Mexico scope and retries Texas on region-timeout.

Co-authored-by: Bilawal Sidhu <[email protected]>
2026-09-24 01:52:41 -05:00
Raushankumar0720 b22dd34f45 Merge remote-tracking branch 'upstream/main' into fix/track-proxy-oversized-response 2026-09-24 09:19:33 +05:30
513dc87a0e feat(hud): Cyber HUD theme with GPU contact sonar (#706)
Add the opt-in Cyber HUD layout with coordinated map and cockpit panel
styling, GPU-only contact sonar (rings, range, power, opacity, sector) with
native-rendering fallback, and set_cyber_sonar voice controls. Sonar visual
style inspired by kk376's tactical naval sonar (#214).

Co-authored-by: Sameh Khamis <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-23 20:31:56 -07:00
f913066cf2 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]>
2026-09-23 21:21:52 -05:00
Bilawal SidhuandBilawal Sidhu 4b56d0e917 fix(radio): restore the Radio QA harness and the row refresh it depended on (#736)
The harness called the compatibility facade's private _refreshTogglePanel,
which the layer-lifecycle refactor removed; Transit and Directions call
refreshLayerStats() on the bare lifecycle, which lacked it, so their rows
only repainted on the next tick. Add refreshLayerStats() to the lifecycle
and use it from the harness. With the crash gone, two further checks ran:
the selected-entity paint wait now also waits for Radio's own reveal, and
on phones the title bar sits 16 px from the top so both broadcast waves
stay on-screen.

Co-authored-by: Bilawal Sidhu <[email protected]>
2026-09-23 19:51:56 -05:00
1fc795577a feat(sdr): local receivers — browser RTL-SDR, Local ADS-B layer and decoder feeds (#732)
Adds a Local ADS-B layer fed by your own receivers: a browser WebUSB
RTL-SDR (with FM listening) and local 1090/978 MHz decoder feeds
(LOCAL_RECEIVER_FEEDS, local and private addresses only). Local aircraft
draw in magenta with class, silhouettes, 3D models, trails and a position
sanity filter; the click card names the band and input that heard them.

Builds on Sameh Khamis's SDR prototype and the initial GEV port by
Mazeyar Moeini Feizabadi (#134); the decoder-feed design follows the
notes on #57. Closes #57.

Co-authored-by: Sameh Khamis <[email protected]>
Co-authored-by: Mazeyar Moeini Feizabadi <[email protected]>
2026-09-23 16:00:53 -05:00
Bilawal SidhuandBilawal Sidhu 143cffd7ca fix(ui): keep panel scroll position through rail layout passes (#731)
The right-rail layout pass lifts the Context, CCTV, Weather and Recent
Imagery panel scrollers to measure their natural heights, which clamps
their scroll offset to zero, but it only restored scrollers tagged
data-rail-scroller. A layer that refreshes its Layers-panel row every
second snapped the Context panel back to the top while scrolling. Tag
every lifted scroller and pin the pairing with a test that reads the
measuring CSS.

Co-authored-by: Bilawal Sidhu <[email protected]>
2026-09-23 15:55:41 -05:00
Bilawal Sidhu 005254fcd1 fix(weather): upright N. America cloud tiles; lift shells over coarse 3D tiles (#730) 2026-09-23 14:49:39 -05:00
Said TurkseverandClaude Fable 5.1 10a00873ca test(mapillary): rail order now includes upstream's weather and recent-imagery panels
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 19:12:57 +01:00
Said TurkseverandClaude Fable 5.1 1c3d96542f fix(mapillary): free share token after upstream took 'y'; markup test follows the rail insert loop
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 19:08:27 +01:00
Said TurkseverandClaude Fable 5.1 817716f0c1 Merge upstream/main into pr/mapillary-layer
Twenty layers now (weather, wind, cyclones and recent imagery landed
upstream); Street Level sits after Recent Imagery in the right rail and the
Cameras group, and the rail CSS names it beside the other panels.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 19:05:59 +01:00
Said TurkseverandClaude Fable 5.1 11603729dc Merge upstream/main into pr/panel-resize
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 19:00:18 +01:00
Said TurkseverandClaude Fable 5.1 d3390b6961 test(mapillary): harness accepts images without a creator name and dumps state on caption timeouts
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 18:48:58 +01:00
Sean ArmstrongandClaude Opus 5 b456eb8ff1 fix(render): keep Cesium's model atmosphere off Apple Metal
iPad and iPhone show "An error occurred while rendering. Rendering has
stopped." on load. Cesium's AtmosphereStageVS calls
czm_computeGroundAtmosphereScattering with its `out` parameters bound
directly to varyings:

    czm_computeGroundAtmosphereScattering(
        v_positionWC, lightDirection,
        v_atmosphereRayleighColor, v_atmosphereMieColor,
        v_atmosphereOpacity);

ANGLE's Metal backend wraps each `out` argument in an ANGLE_out(...)
helper taking `thread T &`, but vertex-output members live in
`__metal_generic` and cannot bind to `thread`, so the program fails to
LINK and Cesium tears down the render loop.

This is the only shader in Cesium that binds varyings to `out` params --
SkyAtmosphere (czm_computeScattering) and the ground-atmosphere fragment
path both route through locals, so they are unaffected and stay on.

ModelSceneGraph.configurePipeline attaches the stage under a single
condition, `fog.enabled && fog.renderable`, so clearing `fog.renderable`
keeps the broken program from ever being built.

`renderable` rather than `enabled` is deliberate: Fog.update returns
early when `enabled` is false and forfeits the density that drives 3D
Tiles screen-space-error scaling, and visualSettings saves/restores
`fog.enabled` around IR boost, which would resurrect the broken shader
mid-session.

Detection is a WebGL2 link probe of the same out-param/varying pattern,
so a future driver fix silently restores the effect with no code change,
OR'd with iOS/iPadOS platform detection as a backstop for when no probe
context can be created. iPadOS desktop mode is identified by the
Macintosh UA token plus maxTouchPoints > 1, since real Macs report zero
and navigator.platform is deprecated.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HoRD3yHVgfTHeikTmsUoHf
2026-09-23 09:25:16 -06:00
Said TurkseverandClaude Fable 5.1 d6b3bd57a9 docs(mapillary): README, SECURITY, DATA_SOURCES, CURRENT-STATE, CHANGELOG
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 15:44:32 +01:00
Said TurkseverandClaude Fable 5.1 0c398e8696 chore(mapillary): package exports, boundary groups, format scope
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-23 15:44:32 +01:00