feat: make mode creation preview-only and cache-safe
This commit is contained in:
@@ -986,6 +986,17 @@ operations:
|
||||
vite_entry = (web_console_root / "src" / "main.js").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
runtime_manifest_path = web_console_root / "dist" / "runtime-assets.json"
|
||||
runtime_manifest = (
|
||||
json.loads(runtime_manifest_path.read_text(encoding="utf-8"))
|
||||
if runtime_manifest_path.is_file()
|
||||
else {"assets": {}}
|
||||
)
|
||||
runtime_assets = runtime_manifest.get("assets", {})
|
||||
|
||||
def runtime_url(file_name: str, source_url: str) -> str:
|
||||
hashed = runtime_assets.get(file_name)
|
||||
return f"/{hashed}" if hashed else source_url
|
||||
with self.opener.open(f"{self.base_url}/app.js?v=dual-seat-145-n7-dispatch", timeout=3) as response:
|
||||
app_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
@@ -1021,7 +1032,7 @@ operations:
|
||||
) as response:
|
||||
extension_styles = response.read().decode("utf-8").replace("\r\n", "\n")
|
||||
with self.opener.open(
|
||||
f"{self.base_url}/assistant-chat.js?v=codex-assistant-34", timeout=3
|
||||
f"{self.base_url}/assistant-chat.js?v=codex-assistant-35", timeout=3
|
||||
) as response:
|
||||
assistant_script = response.read().decode("utf-8")
|
||||
with self.opener.open(
|
||||
@@ -1072,19 +1083,31 @@ operations:
|
||||
self.assertIn("CMD 0x431 · FB 0x41A · CH1", template)
|
||||
self.assertIn("CMD 0x431 · FB 0x388 · CH1", template)
|
||||
self.assertNotIn("透明车体 · 实体设备", template)
|
||||
self.assertIn('src="/app.js?v=dual-seat-145-n7-dispatch"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("app.js", "/app.js?v=dual-seat-145-n7-dispatch")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../styles.css";', vite_entry)
|
||||
self.assertNotIn('class="vehicle-system-hud"', template)
|
||||
self.assertIn('src="/console-v2.js?v=local-first-77-performance"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("console-v2.js", "/console-v2.js?v=local-first-77-performance")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../console-v2.css";', vite_entry)
|
||||
self.assertIn('src="/speech-input.js?v=sensevoice-13"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("speech-input.js", "/speech-input.js?v=sensevoice-13")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../speech-input.css";', vite_entry)
|
||||
self.assertIn('id="speechDictationButton"', template)
|
||||
self.assertIn('class="speech-waveform"', template)
|
||||
self.assertIn('<body class="console-v2">', html)
|
||||
self.assertIn('id="v2BootScreen"', template)
|
||||
self.assertIn('正在加载车机控制与实时状态', template)
|
||||
self.assertIn('src="/self-extension.js?v=nfc-mqtt-56"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("self-extension.js", "/self-extension.js?v=nfc-mqtt-56")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../self-extension.css";', vite_entry)
|
||||
self.assertNotIn("self-calibration", template)
|
||||
self.assertNotIn("self-repair", template)
|
||||
@@ -1093,9 +1116,15 @@ operations:
|
||||
self.assertIn('aria-label="发送消息"', template)
|
||||
self.assertIn('id="assistantTranscript"', template)
|
||||
self.assertIn('import "../assistant-chat.css";', vite_entry)
|
||||
self.assertIn('src="/assistant-chat.js?v=codex-assistant-34"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("assistant-chat.js", "/assistant-chat.js?v=codex-assistant-35")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../energy-monitor.css";', vite_entry)
|
||||
self.assertIn('src="/energy-monitor.js?v=energy-monitor-5-performance"', html)
|
||||
self.assertIn(
|
||||
f'src="{runtime_url("energy-monitor.js", "/energy-monitor.js?v=energy-monitor-5-performance")}"',
|
||||
html,
|
||||
)
|
||||
self.assertIn('import "../codepen-glass-theme.css";', vite_entry)
|
||||
self.assertEqual(extension_control_status["source_label"], "车端 MQTT")
|
||||
self.assertIn("action_statuses", extension_control_status)
|
||||
@@ -1384,23 +1413,46 @@ operations:
|
||||
self.assertIn("CAN 指令已提交,等待车辆状态确认", console_script)
|
||||
self.assertIn('canvas.addEventListener("webglcontextlost"', app_script)
|
||||
self.assertIn('"cognitive-agent:module-change"', app_script)
|
||||
self.assertIn(
|
||||
'const CACHE_VERSION = "cognitive-agent-pad-v328-nfc-mqtt"',
|
||||
service_worker,
|
||||
)
|
||||
self.assertIn('/console-v2.css?v=delivery-state-69', service_worker)
|
||||
self.assertIn('/console-v2.js?v=local-first-77-performance', service_worker)
|
||||
self.assertIn('/assistant-chat.css?v=codex-assistant-29', service_worker)
|
||||
self.assertIn('/assistant-chat.js?v=codex-assistant-34', service_worker)
|
||||
self.assertIn('/energy-monitor.css?v=energy-monitor-5-dialog-size', service_worker)
|
||||
self.assertIn('/energy-monitor.js?v=energy-monitor-5-performance', service_worker)
|
||||
self.assertIn('"/app.js?v=dual-seat-145-n7-dispatch"', service_worker)
|
||||
self.assertIn('/firmware-workbench-entry.css?v=2', service_worker)
|
||||
self.assertIn('/firmware-workbench-entry.js?v=3', service_worker)
|
||||
self.assertIn('/firmware-workbench-theme.js?v=1', service_worker)
|
||||
if runtime_assets:
|
||||
self.assertIn(
|
||||
f'const CACHE_VERSION = "cognitive-agent-pad-build-{runtime_manifest["build_hash"]}"',
|
||||
service_worker,
|
||||
)
|
||||
for asset_name in (
|
||||
"console-v2.css",
|
||||
"console-v2.js",
|
||||
"assistant-chat.css",
|
||||
"assistant-chat.js",
|
||||
"energy-monitor.css",
|
||||
"energy-monitor.js",
|
||||
"app.js",
|
||||
"firmware-workbench-entry.css",
|
||||
"firmware-workbench-entry.js",
|
||||
"firmware-workbench-theme.js",
|
||||
):
|
||||
self.assertIn(f'/{runtime_assets[asset_name]}', service_worker)
|
||||
else:
|
||||
self.assertIn(
|
||||
'const CACHE_VERSION = "cognitive-agent-pad-v329-mode-preview"',
|
||||
service_worker,
|
||||
)
|
||||
self.assertIn('/console-v2.css?v=delivery-state-69', service_worker)
|
||||
self.assertIn('/console-v2.js?v=local-first-77-performance', service_worker)
|
||||
self.assertIn('/assistant-chat.css?v=codex-assistant-30', service_worker)
|
||||
self.assertIn('/assistant-chat.js?v=codex-assistant-35', service_worker)
|
||||
self.assertIn('/energy-monitor.css?v=energy-monitor-5-dialog-size', service_worker)
|
||||
self.assertIn('/energy-monitor.js?v=energy-monitor-5-performance', service_worker)
|
||||
self.assertIn('"/app.js?v=dual-seat-145-n7-dispatch"', service_worker)
|
||||
self.assertIn('/firmware-workbench-entry.css?v=2', service_worker)
|
||||
self.assertIn('/firmware-workbench-entry.js?v=3', service_worker)
|
||||
self.assertIn('/firmware-workbench-theme.js?v=1', service_worker)
|
||||
self.assertIn('/firmware-workbench.html', service_worker)
|
||||
self.assertIn('"/speech-input.js?v=sensevoice-13"', service_worker)
|
||||
self.assertIn('"/speech-input.css?v=sensevoice-7"', service_worker)
|
||||
if runtime_assets:
|
||||
self.assertIn(f'"/{runtime_assets["speech-input.js"]}"', service_worker)
|
||||
self.assertIn(f'"/{runtime_assets["speech-input.css"]}"', service_worker)
|
||||
else:
|
||||
self.assertIn('"/speech-input.js?v=sensevoice-13"', service_worker)
|
||||
self.assertIn('"/speech-input.css?v=sensevoice-7"', service_worker)
|
||||
self.assertIn('"/speech-audio-worklet.js?v=sensevoice-5"', service_worker)
|
||||
self.assertIn('fetch("/api/speech/preview"', speech_script)
|
||||
self.assertIn('fetch("/api/speech/transcribe"', speech_script)
|
||||
|
||||
Reference in New Issue
Block a user