Commit Graph
100 Commits
Author SHA1 Message Date
Sameh Khamis 3f6fe69c57 build(docker): keep keys out of the image and run as non-root by default
The build context excluded only .env, so .env.local and the like or
pinokio/ENVIRONMENT would be baked into image layers; exclude every dotenv
file except .env.example, plus local state and QA output. Pin the base to
CI's Node 24.14.0 by digest, default to the image's node user, and correct
the HOST comment. Log the trusted peers as the operator's when set. README
notes that MCP and ChatGPT sign-in voice are unavailable under Docker, and
how to trust no gateway when widening the publish.
2026-10-15 13:07:00 -07:00
Sameh Khamis a4e2325ded Merge branch 'main' into docker-support 2026-10-15 12:34:50 -07:00
Sameh Khamis 86c6c14beb Merge branch 'main' into fix/overpass-cache-tracks-upstream 2026-10-15 10:59:55 -07:00
Sameh Khamis c42b072e99 fix(overpass): tag caches by the sorted upstream set and cover installations
Uses a full SHA-256 of the sorted instance list, so reordering the same
instances for failover keeps the cache. Adds the installation-cache repoint
test (tagged, reordered, repointed, untagged, unconfigured) and the changelog
and current-state notes.
2026-10-15 10:48:38 -07:00
Sameh Khamis 4ede4ebbcd Merge branch 'main' into fix/overpass-cache-tracks-upstream 2026-10-15 10:47:46 -07:00
Sameh Khamis cfcd2a636f Merge branch 'main' into feat/bikeshare-detroit-mogo 2026-10-15 10:47:45 -07:00
Sameh Khamis 56ca8fd922 Merge branch 'main' into contrib/gods-026-map-subscription-ownership-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 21:11:47 -07:00
Sameh Khamis 20730e5ec5 Merge branch 'main' into contrib/gods-025-asset-stream-cancellation-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 19:54:24 -07:00
Sameh Khamis b9fa0eedcc fix(maps): stop all delivery once the controller is destroyed
A listener could destroy the controller and re-subscribe one still pending in
the snapshot, which then ran. Delivery now stops at destruction and a destroyed
controller takes no listeners. Adds ordering tests for adds, duplicates and
re-adds during delivery, and moves the current-state note after the section
intro.
2026-10-14 19:23:46 -07:00
Sameh Khamis bf4edb5bdb fix(director): discard an asset cancelled during reader cleanup
The finally block awaits reader.cancel(), so a cancel arriving there still let
the bytes return. Rechecks the signal after cleanup, with a test that keeps the
caller's abort reason, and wraps the current-state note.
2026-10-14 19:23:12 -07:00
Sameh Khamis 6a7b89e436 test(firms): cover both coordinate bounds and blank values on each axis
Documents the adapter's skip rule and cross-references the two checks, which
sit in separate packages (provider parser and fire layer).
2026-10-14 19:21:57 -07:00
Sameh Khamis 69a84c47a1 Merge branch 'main' into contrib/gods-026-map-subscription-ownership-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 19:21:11 -07:00
Sameh Khamis d42f5d4fd2 Merge branch 'main' into contrib/gods-025-asset-stream-cancellation-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 19:21:10 -07:00
Sameh Khamis 493b154a6b Merge branch 'main' into contrib/gods-023-firms-coordinate-evidence-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 19:21:08 -07:00
Sameh Khamis 2b53af71ab Merge branch 'main' into contrib/gods-019-terrain-warm-batch-lru-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 18:54:35 -07:00
Sameh Khamis 4a2c6ff7f6 Merge branch 'main' into contrib/gods-015-imagery-box-missing-edge-20261011-reviewed 2026-10-14 18:44:19 -07:00
Sameh Khamis b4aa61d6ef fix(terrain): keep a batch's warm points when its own fetches evict them
A warm entry could be evicted by the same call's later fetches and then
reported unresolved. The call now remembers warm hits as it does fetched ones.
Moves the batch LRU test beside the existing cache tests and folds the docs
note into the section's eviction paragraph.
2026-10-14 20:11:50 -04:00
Sameh Khamis 6ffbf7f524 fix(imagery): refuse blank box edges at every conversion
Share-link integers and Cesium radians were converted before normalizeBox
checked them, so a blank edge still became 0°. Edges are now accepted only as
numbers or non-blank numeric strings, which also refuses [] and {}. Tests cover
all four edges through validateBox, dequantizeBox, boxFromRectangle and
searchHls.
2026-10-14 20:11:39 -04:00
Sameh Khamis 7e6ab49815 Merge branch 'main' into contrib/gods-011-street-level-unique-tiles-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 17:03:46 -07:00
Sameh Khamis 84714030c8 test: show a capped overview no longer holds repeat tiles
Adds a case that fails before de-duplication (a 24-slot overview held repeats
and reported itself truncated) and says why the date-line halves overlap.
2026-10-14 16:35:47 -07:00
Sameh Khamis 51d335b1db test: check the route cap at exactly 200 turns
The existing "route that fits" case used 199 steps, which is how the
off-by-one went unnoticed. Folds the docs note into the existing cap sentence
and makes the changelog entry specific.
2026-10-14 16:35:10 -07:00
Sameh Khamis c07b71a443 Merge branch 'main' into contrib/gods-011-street-level-unique-tiles-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 16:34:46 -07:00
Sameh Khamis 7cc6199245 Merge branch 'main' into contrib/gods-009-route-cap-truthfulness-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 16:34:45 -07:00
Sameh Khamis 2befda5286 Merge branch 'main' into contrib/gods-006-weather-missing-observations-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 16:03:41 -07:00
Sameh Khamis 47a35f9816 Merge branch 'main' into contrib/gods-005-tool-schema-codepoints-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 15:54:52 -07:00
Sameh Khamis e2ceed95a4 Merge branch 'main' into contrib/gods-002-director-dateline-seek-20261011-reviewed 2026-10-14 15:38:47 -07:00
Sameh Khamis 5be2185dc7 fix(weather): treat a missing code as unavailable in cloud effects too
Number(null) is 0, so the cockpit cloud profile treated a missing weather code
as clear but available. The briefing's three checks now share one helper, and
the current-state note is its own bullet instead of folding into the route one.
2026-10-14 15:06:52 -07:00
Sameh Khamis c12938cd05 perf(tools): stop counting string code points once the bounds are decided
Strings without length bounds are not counted, and counting stops at the
larger bound, so a huge tool argument costs no more than its limit.
2026-10-14 15:05:53 -07:00
Sameh Khamis cbefd529f9 fix(director): turn heading and roll the short way for any authored angle
A single % made the seek delta negative when the target angle was more than
540° below the start, so 350° to -350° turned 340° through 180°. Uses the
same double modulo as playback, and adds tests for exact ±180° endpoints and
a near-antipodal seek.
2026-10-14 15:05:09 -07:00
Sameh Khamis a7e5f341ab Merge branch 'main' into contrib/gods-006-weather-missing-observations-20261011-reviewed 2026-10-14 15:03:20 -07:00
Sameh Khamis d74556a801 Merge branch 'main' into contrib/gods-005-tool-schema-codepoints-20261011-reviewed 2026-10-14 15:03:19 -07:00
Sameh Khamis b80ef27eb9 Merge branch 'main' into contrib/gods-002-director-dateline-seek-20261011-reviewed 2026-10-14 15:03:18 -07:00
Sameh Khamis a9c41e7c3e Merge branch 'main' into fix/recent-imagery-qa-relative-layout-20261003 2026-10-14 14:29:12 -07:00
Sameh Khamis 8daaa065d2 qa: log the Recent Imagery gate's stability mode and document its flag 2026-10-14 14:16:30 -07:00
Sameh Khamis cb2ead3c16 Merge branch 'main' into fix/recent-imagery-qa-relative-layout-20261003 2026-10-14 14:12:59 -07:00
Sameh Khamis 7a9463bf2f Merge branch 'main' into fix/qa-stale-mutation-anchors 2026-10-14 14:12:55 -07:00
Sameh Khamis ffbd91c209 Merge branch 'main' into docs/pinokio-browser-performance 2026-10-14 12:33:46 -07:00
Sameh Khamis bea32dcfae Merge branch 'main' into docs/voice-backend-contract 2026-10-14 12:23:58 -07:00
Sameh Khamis 4cd7200fe4 docs: attribute the Pinokio stutter report accurately
The workaround came from one Pinokio 8.2.0 user who did not state an OS, and a
single report suggests rather than isolates the embedded-browser cause.
2026-10-14 12:00:16 -07:00
Sameh Khamis afb3a92914 docs: say what the connection reads from the voice credential
It reads the token, model, transcription model and tier for diagnostics and
cost accounting, so the credential is not opaque to it. Also lists requestToken's
authMode option in APPLICATION.md.
2026-10-14 11:59:51 -07:00
Sameh Khamis 85754bcf50 test: say which CI job and which files the discovery guard covers 2026-10-14 11:59:14 -07:00
Sameh Khamis cefae76638 Merge branch 'main' into docs/pinokio-browser-performance 2026-10-14 11:59:04 -07:00
Sameh Khamis af95f957ec Merge branch 'main' into docs/voice-backend-contract 2026-10-14 11:59:03 -07:00
Sameh Khamis 3bc41cc12a Merge branch 'main' into fix/unit-runner-discovers-server-tests 2026-10-14 11:59:00 -07:00
Sameh Khamis f6ae1ecdd1 Merge branch 'main' into fix/right-rail-css-hidden-panel-20261003
# Conflicts:
#	CHANGELOG.md
2026-10-14 11:27:31 -07:00
Sameh Khamis aa32d4d588 Merge branch 'main' into fix/right-rail-css-hidden-panel-20261003 2026-10-14 11:20:20 -07:00
Sameh Khamis c7c63a00ce Merge branch 'main' into contrib/gods-001-coordinate-empty-components-20261011-reviewed 2026-10-14 11:20:19 -07:00
Sameh Khamis 6f0d1bb35f fix(ui): keep panels the right rail hides itself in its layout
Exclusive presentation hides collapsed right-rail panels with display: none.
Skipping every display: none panel also skipped those, so panels the rail had
auto-collapsed stayed collapsed after the HUD was hidden or left Tactical.
Only panels hidden by other CSS are skipped now. Adds the changelog and
current-state notes.
2026-10-14 11:07:18 -07:00
Sameh Khamis fba4517ce1 Merge branch 'main' into fix/right-rail-css-hidden-panel-20261003 2026-10-14 11:06:20 -07:00
Sameh Khamis db8e1ad7cb Merge branch 'main' into contrib/gods-001-coordinate-empty-components-20261011-reviewed
# Conflicts:
#	CHANGELOG.md
2026-10-14 11:06:17 -07:00
Sameh Khamis c34cef559d Merge branch 'main' into fix/cctv-hls-insecure-context 2026-10-14 11:06:10 -07:00
Sameh Khamis 27a986f40f Accept authoritative empty vessel coverage without an outage 2026-10-09 20:50:19 -07:00
Sameh Khamis eacfc1b06a Persist explicit provider toggles through the layer state coordinator 2026-10-09 19:09:30 -07:00
Sameh Khamis 3ba8c6d61b Use a neutral compact switch codec and clarify provider size limits 2026-10-09 18:47:04 -07:00
Sameh Khamis fbe118aab9 Merge branch 'refactor/route-imagery-sources' into fix/street-level-provider-sharing 2026-10-09 18:44:12 -07:00
Sameh Khamis 8d7c47ec39 Merge branch 'feat/optional-catalog-sources' into refactor/route-imagery-sources
# Conflicts:
#	CHANGELOG.md
2026-10-09 18:44:07 -07:00
Sameh Khamis 161a3a796a Keep source availability in the catalog and cover absent military acquisition 2026-10-09 18:43:44 -07:00
Sameh Khamis 7b1b2df764 Preserve custom Street Level provider switches in shared state 2026-10-09 17:53:47 -07:00
Sameh Khamis 3b840ebdf3 Merge branch 'feat/optional-catalog-sources' into refactor/route-imagery-sources
# Conflicts:
#	CHANGELOG.md
#	docs/CURRENT-STATE.md
2026-10-09 17:50:12 -07:00
Sameh Khamis b78ff7a915 Use shared availability for an empty Street Level provider list 2026-10-09 17:49:58 -07:00
Sameh Khamis 0d9bfdf9de Merge branch 'fix/optional-street-level-providers' into feat/optional-catalog-sources 2026-10-09 17:49:41 -07:00
Sameh Khamis 893294c7d4 Assert Street Level expansion timeout and document provider precedence 2026-10-09 17:49:26 -07:00
Sameh Khamis 99988cb348 Separate route and recent imagery acquisition from application assembly 2026-10-09 17:42:00 -07:00
Sameh Khamis 5756ae92a8 Make catalog feed configuration optional and explicit 2026-10-09 17:35:38 -07:00
Sameh Khamis 1ee07468c4 Explain empty imagery configuration in Street Level controls 2026-10-09 17:21:31 -07:00
Sameh Khamis 940b277460 Allow optional Street Level provider composition 2026-10-09 17:18:49 -07:00
Sameh Khamis cb1d008505 docs(state): scope caption metering to API-key voice sessions 2026-10-08 11:20:03 -07:00
Sameh KhamisandClaude Opus 5.5 f5c4f3fda3 fix(qa): restore Google 3D before switching Street View off in gate cleanup
The Street View step's cleanup switched the Street View chip off after the
step had left Google 3D, where the chip is hidden by design. The click then
threw "failed to find element", replacing the step's real result (here, a
Google key refusal) with a selector error. Return to Google 3D first, then
switch the chips and restore the original map.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 11:05:43 -07:00
Sameh Khamis 30cc16052a docs(changelog): credit #621 and #653 for ChatGPT OAuth voice 2026-10-08 11:03:23 -07:00
Sameh Khamis 8979d159bb docs(voice): note the Windows Codex login workaround 2026-10-08 11:03:18 -07:00
Sameh Khamis d32cc71682 docs(security): document the Codex sign-in boundary for OAuth voice
Add the Codex auth.json credential to the secrets table and describe the
loopback-only OAuth routes, the codex login launch and its limits.
2026-10-08 11:03:12 -07:00
Sameh Khamis d587249ce9 fix(setup): stop presenting ChatGPT OAuth as the default voice fallback
Doctor and dev-fresh told every user without an OpenAI key that voice could
use ChatGPT OAuth, whether or not Codex was installed. Say voice is off
until a key is added or a Codex sign-in is selected, and mark that path
experimental.
2026-10-08 11:02:52 -07:00
Sameh Khamis 3fa5bb7f5f fix(voice): start codex login without the server's provider secrets
The login child inherited the whole server environment, including
OPENAI_API_KEY and every other provider credential. Pass only what Codex
needs to find its home, open a browser and reach OpenAI through a proxy.
2026-10-08 11:02:12 -07:00
Sameh Khamis c99653047f fix(voice): count OAuth caption transcriptions instead of pricing them
Voice-card captions from main priced transcription usage into the API-key
dollar meter. In a ChatGPT OAuth session that could trip the $2 warning or
$5 cap while the readout said COST UNKNOWN. Count them with the session's
other OAuth usage instead.
2026-10-08 11:01:43 -07:00
Sameh Khamis fb1596d2f1 Merge main into PR #621 (ChatGPT OAuth for Realtime voice)
Resolve conflicts with the voice-core captions, panel resize and MCP
panel key changes by keeping both sides.
2026-10-08 11:00:54 -07:00
Sameh KhamisandClaude 4f2b304ea3 docs: note tile origin follows tileJsonUrl and credit #935
Co-Authored-By: Claude <[email protected]>
2026-10-08 10:44:56 -07:00
Sameh Khamis 563ca10d26 Merge main into PR #935 2026-10-08 10:44:12 -07:00
Sameh KhamisandClaude Opus 5.5 84f634efb0 fix(street-level): pause Street View details retries after a failure
Maintainer follow-up to #966 review:

- A failed panorama-details lookup now waits DETAILS_RETRY_COOLDOWN_MS
  (5 s) per panorama before a view event can retry it, so dragging the
  view after a failure no longer issues a lookup on every pov change. A
  success clears the pause; one panorama's failure does not delay another.
- SECURITY.md notes that allowing maps.googleapis.com in script-src also
  trusts its JSONP endpoints, an accepted limitation alongside the
  existing 'unsafe-eval' allowance.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 10:38:01 -07:00
Sameh Khamis 64a0200ea8 Merge main after MCP port correction 2026-10-07 15:24:15 -07:00
Sameh Khamis acda360cf0 fix(mcp): serialize shared panel key repair and credit report 2026-10-07 15:12:44 -07:00
Sameh Khamis 7592718415 Merge remote-tracking branch 'origin/main' into integration/mcp-panel-key-pr958 2026-10-07 15:10:44 -07:00
Sameh Khamisandshirunjies8-png 2d3d99864b docs: credit both contributors for MCP port correction
Credit the equivalent contribution in PR #959 alongside PR #934, while preserving the original PR author's commits.

Co-authored-by: shirunjies8-png <[email protected]>
2026-10-07 14:37:10 -07:00
Sameh Khamis 700e54401d Merge remote-tracking branch 'origin/main' into integration/mcp-port-pr934 2026-10-07 14:36:58 -07:00
Sameh Khamis b5cb75bcf9 fix(voice): resolve follow-up review edge cases 2026-10-07 14:21:46 -07:00
Sameh Khamis 1594db9497 Merge main into feat/voice-core and reconcile layer capabilities 2026-10-07 13:14:31 -07:00
Sameh Khamis ae1b6abda1 fix(voice): omit tool result content from debug logs 2026-10-07 12:00:29 -07:00
Sameh Khamis 0b3bed3bfa docs: clarify risk-based community PR review 2026-10-07 11:17:58 -07:00
Sameh Khamis bff921ccb3 fix(flights): start a new grounded aircraft on the floor under its delayed position
The fleet draws a grounded contact at its delayed position lifted onto the floor under it, but a new billboard was created at the delayed position without that lift. A taxiing aircraft whose reported fix sat lower than the ground under its delayed position started on the fix's floor and then rose on the next fleet tick. Creation now applies the same floor the fleet pass does.
2026-10-06 13:42:37 -07:00
Sameh Khamis d9737d94f2 fix(military): start new contacts at their delayed display position
The military fleet also renders behind real time and projects a fresh contact's first fix back to that delayed time, but its billboard was created at the raw fix. A new contact therefore appeared ahead of where the next fleet tick put it and jumped back. The snapshot renderer now receives the layer's motion and creates the billboard at the dead-reckoned delayed position.
2026-10-06 12:01:56 -07:00
Sameh Khamis 7b328232ed fix(flights): start new aircraft at their delayed display position
The fleet renders behind real time, so a newly seen aircraft is displayed at its fix projected back to that delayed time. Its billboard was created at the raw fix instead, so it appeared ahead of where the next fleet tick put it and then jumped back about one render delay of travel before moving forward.
2026-10-06 11:46:34 -07:00
Sameh Khamis f86d1c3296 fix: recover near-view places through the application's place search 2026-10-05 19:27:36 -07:00
Sameh Khamis a2f61d4def feat: load Google 3D with short-lived server tokens
Without a browser key, the app asks its server for a short-lived Google
access token (GET /api/google/tiles-token, answering accessToken and
expiresAt) and loads Photorealistic 3D Tiles directly with it as a
header. A tile refused for an expired token gets a renewed one and is
retried once. A server that does not offer tokens changes nothing: the
app continues through ion or the keyless globe as before.
2026-10-04 10:49:06 -07:00
Sameh Khamis b0483dc546 test: name the vessel provider in the feed-failure QA fixture
The fixture answers /api/vessels without X-Feed-Source, so the source
fell back to the feed's name and the attribution check failed. Send
AISStream as the bundled server does.
2026-10-03 23:20:42 -07:00
Sameh Khamis 60644c5f5d feat: name live feed routes and sources for what they serve
The flight, military and vessel feeds were named after the providers the
bundled server uses (/api/opensky, /api/adsblol/mil, /api/ais-live and
their track routes; createOpenSkySource, createAdsbLolSource,
createAisStreamSource). Any server should be able to answer a feed from
its own provider, so the feeds are now:

  /api/flights   /api/flights/track?icao24=
  /api/military  /api/military/track?hex=
  /api/vessels   /api/vessels/track?mmsi=

with createFlightSource, createMilitarySource and createVesselSource. The
old routes are removed. Each server names its provider in X-Feed-Source
(the bundled server sends OpenSky Network, adsb.lol and AISStream, so its
attribution is unchanged) and the military feed's cache state and age in
X-Feed-Cache and X-Feed-Age-Ms. Sources report the provider the server
names and fall back to the feed's name.
2026-10-03 23:10:32 -07:00
Sameh Khamis e8e49a49e0 feat: ask for vessels by area
The vessel source accepts an optional area and sends it as lat, lon and
radius_km. The vessel layer asks for the area the camera shows (centered
on the middle of the screen, sized by camera height), or every vessel
from high enough up, and asks again when the view moves or zooms by a
quarter of that radius. vessels_in_area names its area too. Servers that
hold every vessel may ignore the area; callers still keep only what is
inside it.
2026-10-03 22:44:45 -07:00
Sameh Khamis a2099358fd chore: classify the tools/panel export
Add the tools-panel boundary group for the new export.
2026-10-03 21:20:04 -07:00
Sameh Khamis ee05e922c0 feat: export the globe panel for MCP servers
MCP servers that compose Core's tools can now serve the globe panel:
@gods-eye-view/core/tools/panel exports createGlobePanelResource,
panelRuntime, GLOBE_PANEL_URI and PANEL_BASE. The local MCP server uses
the same entry point.
2026-10-03 21:17:47 -07:00
Sameh Khamis f752b5eea1 fix: resolve bundled data URLs when used, not at import
The submarine cable source and the infrastructure data URLs built their
asset URLs from import.meta.url while the module loaded. Importing the
tool services therefore failed in runtimes without a usable module URL,
even for tools that never read those files. Build the URLs when they are
read; Vite still rewrites them in browser builds.
2026-10-03 18:47:31 -07:00
Sameh Khamis 80fc8f0e1c chore(release): prepare v0.2.1
Date the changes since v0.2.0 as 0.2.1, move the live CCTV video entry
into the 0.2.0 section where it shipped, and align the package metadata.
2026-10-02 22:19:04 -07:00
Sameh KhamisandClaude Opus 5.5 9c87fabf88 build: ship each bundled data pack once
loadBundledJson's callers passed a literal JSON import as a Node fallback,
which made the production build emit a JavaScript copy of every pack beside
the JSON the browser fetches. The loader now reads file: URLs itself under
Node (through process.getBuiltinModule, synchronously, as promptly as the
cached import it replaces), and the callers pass only the URL. On a Node too
old to provide getBuiltinModule it says that Node 24.14 or newer is needed.
dist/ drops from 54 MB to 42 MB. A test keeps app code from importing a pack
as a module.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-02 21:08:11 -07:00