Enforce web interface staging to always refresh

This commit is contained in:
2025-10-26 03:50:05 -06:00
parent d7a263afee
commit 016568c248

View File

@@ -12,7 +12,7 @@ import logging
import os import os
import shutil import shutil
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Set from typing import Any, Dict
from .server import EngineContext, create_app from .server import EngineContext, create_app
@@ -22,25 +22,18 @@ DEFAULT_PORT = 5001
def _project_root() -> Path: def _project_root() -> Path:
"""Locate the repository root regardless of runtime staging depth.""" """Locate the repository root by discovering the Borealis bootstrap script."""
current = Path(__file__).resolve().parent current = Path(__file__).resolve().parent
# Prefer an explicit sentinel (Borealis.ps1) so running from the staged
# Engine runtime still discovers the true project root one level higher.
for candidate in (current, *current.parents): for candidate in (current, *current.parents):
if (candidate / "Borealis.ps1").is_file(): if (candidate / "Borealis.ps1").is_file():
return candidate return candidate
# Fallback: if we're inside ``<root>/Engine/Data/Engine`` the parent of the raise RuntimeError(
# ``Engine`` directory is the project root. "Unable to locate the Borealis project root; Borealis.ps1 was not found "
for candidate in current.parents: "in any parent directory."
if candidate.name.lower() == "engine" and (candidate.parent / "Borealis.ps1").is_file(): )
return candidate.parent
# Last resort mirrors the previous behaviour (two levels up) so we don't
# regress in unforeseen layouts.
return current.parents[1]
def _build_runtime_config() -> Dict[str, Any]: def _build_runtime_config() -> Dict[str, Any]:
@@ -58,43 +51,20 @@ def _stage_web_interface_assets(logger: logging.Logger) -> None:
engine_web_root = project_root / "Engine" / "web-interface" engine_web_root = project_root / "Engine" / "web-interface"
legacy_source = project_root / "Data" / "Server" / "WebUI" legacy_source = project_root / "Data" / "Server" / "WebUI"
package_json = engine_web_root / "package.json"
src_dir = engine_web_root / "src"
if package_json.is_file() and src_dir.is_dir():
return
if not legacy_source.is_dir(): if not legacy_source.is_dir():
logger.warning(
"Legacy WebUI source missing; unable to stage Engine web interface from %s",
legacy_source,
)
return
engine_web_root.mkdir(parents=True, exist_ok=True)
preserved: Set[str] = {".gitignore", "README.md"}
for child in engine_web_root.iterdir():
if child.name in preserved:
continue
if child.is_dir():
shutil.rmtree(child, ignore_errors=True)
else:
try:
child.unlink()
except FileNotFoundError:
continue
for item in legacy_source.iterdir():
destination = engine_web_root / item.name
if item.is_dir():
shutil.copytree(item, destination, dirs_exist_ok=True)
else:
shutil.copy2(item, destination)
if not package_json.is_file() or not src_dir.is_dir():
raise RuntimeError( raise RuntimeError(
f"Failed to stage Engine web interface assets into {engine_web_root}" f"Engine web interface source missing: {legacy_source}"
)
if engine_web_root.exists():
shutil.rmtree(engine_web_root)
shutil.copytree(legacy_source, engine_web_root)
index_path = engine_web_root / "index.html"
if not index_path.is_file():
raise RuntimeError(
f"Engine web interface staging failed; missing {index_path}"
) )
logger.info( logger.info(