merge: sync feature/N7Web into feature/N7Web-Tech

# Conflicts:
#	apps/web-console/service-worker.js
#	src/cognitive_agent/application/mode_profile.py
#	src/cognitive_agent/application/mode_scene_catalog.py
#	src/cognitive_agent/application/seat_service.py
#	tests/e2e/test_seat_web_api.py
#	tests/unit/test_assistant_frontend_contract.py
#	tests/unit/test_vue_frontend_contract.py
This commit is contained in:
Miayui
2026-09-17 11:16:48 +08:00
31 changed files with 2925 additions and 127 deletions
@@ -0,0 +1,103 @@
from __future__ import annotations
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
WEB = ROOT / "apps" / "web-console"
def source(name: str) -> str:
return (WEB / name).read_text(encoding="utf-8")
def section(content: str, start: str, end: str) -> str:
start_index = content.index(start)
end_index = content.index(end, start_index)
return content[start_index:end_index]
def test_vehicle_twin_renders_on_demand_and_throttles_hotspot_layout() -> None:
app = source("app.js")
animation = section(app, " function animate(timestamp = 0) {", " setTwinSelection(")
assert "function requestRender({ hotspots = true, settleFrames = 36 } = {})" in app
assert "if (twinNeedsAnimation(twin)) queueTwinFrame();" in animation
assert "window.requestAnimationFrame(animate)" not in animation
assert "document.visibilityState !== \"visible\"" in app
assert "new IntersectionObserver" in app
assert "timestamp - twin.hotspotLastLayoutAt >= 100" in animation
assert "hotspotMetrics: new Map()" in app
assert "label?.offsetWidth" in app
assert "renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 1.5))" in app
def test_unchanged_vehicle_state_skips_dom_and_device_panel_rebuilds() -> None:
app = source("app.js")
console = source("console-v2.js")
seat_render = section(app, "function renderSeatState(actuatorState) {", "\nfunction renderDomainState")
assert "vehicleRenderFingerprint(mergedActuatorState)" in seat_render
assert "renderFingerprint === state.seatRenderFingerprint" in seat_render
assert "resetSeatState();" not in seat_render
assert 'new CustomEvent("cognitive-agent:vehicle-state-rendered"' in app
assert '"cognitive-agent:vehicle-state-rendered"' in console
assert "observe(cabinBand" not in console
assert "observe(stateBand" not in console
assert 'if (!panelVisible("devices"))' in console
assert "renderSyncedDevices({ force: true })" in console
def test_nfc_polling_keeps_its_frequency_without_rendering_hidden_surfaces() -> None:
extension = source("self-extension.js")
assert "const NFC_POLL_INTERVAL_MS = 700" in extension
assert "currentNfcDialogFingerprint()" in extension
assert "if (!force && !dialog.open)" in extension
assert "renderFingerprint === nfcDialogFingerprint" in extension
assert 'panel?.classList.contains("is-collapsed")' in extension
assert "renderFingerprint === unifiedExtensionFingerprint" in extension
assert '"cognitive-agent:side-panel-visibility"' in extension
def test_hidden_energy_monitor_samples_without_repainting() -> None:
monitor = source("energy-monitor.js")
assert "SAMPLE_INTERVAL_MS = 1000" in monitor
assert "() => sampleNow({ render: monitor.open })" in monitor
assert "if (next)" in monitor
assert "renderMonitor();" in section(monitor, " function setOpen(open) {", "\n function selectSeries")
def test_high_frequency_fields_and_hotspots_do_not_add_compositor_blur() -> None:
theme = source("codepen-glass-theme.css")
field_rule = section(
theme,
"body.console-v2 :is(input, textarea, select),",
"body.console-v2 :is(input, textarea, select):focus",
)
assert "backdrop-filter" not in field_rule
assert "body.console-v2 .v2-twin-device-popover {" in theme
shared_hotspot_rule = section(
theme,
"body.console-v2 .v2-twin-hotspot-label,",
"body.console-v2 .v2-twin-device-popover {\n -webkit-backdrop-filter",
)
assert "backdrop-filter" not in shared_hotspot_rule
def test_performance_assets_have_a_new_cache_generation() -> None:
html = source("index.html")
worker = source("service-worker.js")
for asset in (
"/app.js?v=dual-seat-145-n7-dispatch",
"/console-v2.js?v=local-first-77-performance",
"/self-extension.js?v=pet-settings-53-performance",
"/energy-monitor.js?v=energy-monitor-5-performance",
):
assert asset in html
assert f'"{asset}"' in worker
assert 'const CACHE_VERSION = "cognitive-agent-pad-v322-tech-n7-dispatch"' in worker
assert '"/codepen-glass-theme.css?v=creative-cloud-6-performance"' in worker