From 1a96d394266bd03887e3eda914a867d542018344 Mon Sep 17 00:00:00 2001 From: vee Date: Fri, 14 Aug 2026 09:56:22 +0800 Subject: [PATCH] feat: default users to safe virtual CAN execution --- apps/web-console/console-v2.js | 30 ++++++++++++------------------ apps/web-console/index.html | 2 +- apps/web-console/service-worker.js | 4 ++-- tests/e2e/test_seat_web_api.py | 11 ++++++++--- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/apps/web-console/console-v2.js b/apps/web-console/console-v2.js index f4cf524..279ea1c 100644 --- a/apps/web-console/console-v2.js +++ b/apps/web-console/console-v2.js @@ -346,7 +346,7 @@ configStack.append(gestureModelField); const userHardwareState = make("div", "v2-user-target-status", ` - 正在检查真实台架`); + 正在准备虚拟 CAN`); configStack.append(userHardwareState); if (providerField) { @@ -946,7 +946,7 @@ setModule("self-orchestration"); } setPage(0); - requestUserHardwareMode(); + requestUserSafeExecutionMode(); } else { const note = $("#v2ExecutionNote"); if (note) note.textContent = "管理员可切换虚拟 CAN、模拟台架与真实台架"; @@ -976,25 +976,19 @@ window.setTimeout(() => window.dispatchEvent(new Event("resize")), 180); } - function requestUserHardwareMode() { - const hardwareButton = $("#hardwareMode"); + function requestUserSafeExecutionMode() { + const dryRunButton = $('[data-execution-mode="dry_run"]'); const note = $("#v2ExecutionNote"); const userTarget = $(".v2-user-target-status"); const userTargetText = $("#v2UserTargetText"); const runButton = $("#runButton"); - if (!hardwareButton) return; - if (!hardwareButton.disabled) { - if (!hardwareButton.classList.contains("active")) hardwareButton.click(); - if (note) note.textContent = "user 演示固定使用真实台架"; - if (userTarget) userTarget.dataset.state = "ready"; - if (userTargetText) userTargetText.textContent = "执行目标:真实台架"; - if (runButton && !runButton.classList.contains("loading")) runButton.disabled = false; - } else if (note) { - note.textContent = "真实台架尚未就绪,服务端安全门禁保持锁定"; - if (userTarget) userTarget.dataset.state = "locked"; - if (userTargetText) userTargetText.textContent = "真实台架尚未就绪"; - if (runButton) runButton.disabled = true; - } + if (!dryRunButton) return; + if (!dryRunButton.classList.contains("active")) dryRunButton.click(); + if (note) note.textContent = "测试用户使用虚拟 CAN;真实台架仅由管理员显式启用"; + if (userTarget) userTarget.dataset.state = "ready"; + if (userTargetText) userTargetText.textContent = "执行目标:虚拟 CAN"; + if (runButton && !runButton.classList.contains("loading")) runButton.disabled = false; + syncExecutionSelector(); } function syncExecutionSelector() { @@ -1033,7 +1027,7 @@ $(".v2-sidebar-footer")?.classList.toggle("offline", !online); } syncExecutionSelector(); - if (ui.role === "user") requestUserHardwareMode(); + if (ui.role === "user") requestUserSafeExecutionMode(); } function setVehicleLinkState(connected) { diff --git a/apps/web-console/index.html b/apps/web-console/index.html index a5d661e..ff3258e 100755 --- a/apps/web-console/index.html +++ b/apps/web-console/index.html @@ -22,7 +22,7 @@ - + diff --git a/apps/web-console/service-worker.js b/apps/web-console/service-worker.js index 4428d8b..4d14852 100644 --- a/apps/web-console/service-worker.js +++ b/apps/web-console/service-worker.js @@ -1,4 +1,4 @@ -const CACHE_VERSION = "cognitive-agent-pad-v115"; +const CACHE_VERSION = "cognitive-agent-pad-v116"; const SHELL_CACHE = `${CACHE_VERSION}-shell`; const RUNTIME_CACHE = `${CACHE_VERSION}-runtime`; const APP_SHELL = [ @@ -10,7 +10,7 @@ const APP_SHELL = [ "/gesture-control.js?v=android-pad-7", "/pwa.js?v=android-pad-1", "/console-v2.css?v=desktop-refactor-106", - "/console-v2.js?v=desktop-refactor-34", + "/console-v2.js?v=desktop-refactor-35", "/self-extension.css?v=extension-18", "/self-extension.js?v=extension-20", "/self-calibration.css?v=calibration-10", diff --git a/tests/e2e/test_seat_web_api.py b/tests/e2e/test_seat_web_api.py index f2b4575..4942e30 100755 --- a/tests/e2e/test_seat_web_api.py +++ b/tests/e2e/test_seat_web_api.py @@ -184,7 +184,7 @@ operations: ) as response: gesture_script = response.read().decode("utf-8") with self.opener.open( - f"{self.base_url}/console-v2.js?v=desktop-refactor-34", timeout=3 + f"{self.base_url}/console-v2.js?v=desktop-refactor-35", timeout=3 ) as response: console_script = response.read().decode("utf-8") with self.opener.open( @@ -223,7 +223,7 @@ operations: self.assertIn('href="/styles.css?v=dual-seat-9"', html) self.assertIn('src="/gesture-control.js?v=android-pad-7"', html) self.assertNotIn('class="vehicle-system-hud"', html) - self.assertIn('src="/console-v2.js?v=desktop-refactor-34"', html) + self.assertIn('src="/console-v2.js?v=desktop-refactor-35"', html) self.assertIn('href="/console-v2.css?v=desktop-refactor-106"', html) self.assertIn('src="/self-extension.js?v=extension-20"', html) self.assertIn('href="/self-extension.css?v=extension-18"', html) @@ -285,7 +285,12 @@ operations: self.assertIn("function updateModeEdgeHints()", console_script) self.assertIn('classList.toggle("v2-twin-active", definition.index === 0)', console_script) self.assertIn('label: "执行结果与硬件回读"', console_script) - self.assertIn('userTargetText.textContent = "真实台架尚未就绪"', console_script) + self.assertIn("function requestUserSafeExecutionMode()", console_script) + self.assertIn('const dryRunButton = $(\'[data-execution-mode="dry_run"]\')', console_script) + self.assertIn('if (!dryRunButton.classList.contains("active")) dryRunButton.click()', console_script) + self.assertIn('userTargetText.textContent = "执行目标:虚拟 CAN"', console_script) + self.assertIn("真实台架仅由管理员显式启用", console_script) + self.assertNotIn("user 演示固定使用真实台架", console_script) self.assertIn('grid-template-columns: clamp(245px, 18.5vw, 310px)', console_styles) self.assertIn('.v2-control-switch {', console_styles) self.assertIn('.v2-module-switcher {', console_styles)