"""Streamlit Community Cloud entry point — public demo app. This is the file Streamlit Community Cloud auto-discovers when you deploy from this repository: leave the "Main file path" field at its default (``streamlit_app.py``) and it just works. Why this lives at the repo root, not in ``src/gui/``: Streamlit auto-detects sibling files inside a ``pages/`` directory next to the entry script and renders them as additional pages in the sidebar. The full product GUI's pages live in ``src/gui/pages/`` — pointing the Cloud at ``src/gui/app_demo.py`` would inadvertently expose every paid-product page in the demo's sidebar (or require URL-routing tricks to suppress them). Anchoring the entry script at the repo root means there is no ``pages/`` neighbour and the demo stays single-page by construction. The actual demo UI is defined once in ``src/gui/app_demo.py`` so local development still works the way it always did: streamlit run src/gui/app_demo.py # local dev, identical UX Cloud deploy uses this shim: streamlit run streamlit_app.py # what Cloud invokes """ from __future__ import annotations import sys from pathlib import Path # Put the repo root on sys.path so ``src.core`` and ``src.gui`` imports # resolve cleanly. The demo module does this itself for the local-dev # case, but the import order matters when this shim runs first on Cloud. _HERE = Path(__file__).resolve().parent if str(_HERE) not in sys.path: sys.path.insert(0, str(_HERE)) # Executing the demo module top-to-bottom is the simplest way to share # the UI between the two entry points without duplicating code or # refactoring the demo into a function (Streamlit's idiom is # script-as-page; converting it to a callable would fight the # framework). ``runpy`` runs the file in this script's namespace so # Streamlit's ``st.set_page_config`` / element registration sees the # correct module. import runpy runpy.run_path( str(_HERE / "src" / "gui" / "app_demo.py"), run_name="__main__", )