From cff60dcf3e43f4aab5c28d8a2d313d0dfce4703b Mon Sep 17 00:00:00 2001 From: Carl Niklas Rydberg Date: Sat, 14 Feb 2026 21:36:51 +0100 Subject: [PATCH] feat(ui): add backend meta/version status and refresh check --- app.py | 17 +++++++++++++++++ ui/assets/app.js | 13 +++++++++++++ ui/assets/styles.css | 9 +++++++++ ui/index.html | 2 ++ 4 files changed, 41 insertions(+) diff --git a/app.py b/app.py index 2a0dc79..c5276a4 100644 --- a/app.py +++ b/app.py @@ -26,6 +26,8 @@ from gremlin_python.driver.serializer import GraphSONSerializersV3d0 from dotenv import load_dotenv APP_NAME = "concept-api" +APP_VERSION = os.getenv("APP_VERSION", "dev-local") +APP_STARTED_AT_UTC = datetime.now(timezone.utc).isoformat() # Keep env loading behavior aligned with connectivity_check.py. load_dotenv() @@ -1881,6 +1883,21 @@ async def startup(): await es_ensure_index() +@app.get("/meta") +async def meta(): + return { + "app_name": APP_NAME, + "version": APP_VERSION, + "started_at_utc": APP_STARTED_AT_UTC, + "features": { + "assistant_chat": True, + "assistant_learn": True, + "assistant_tasks_ai": True, + "assistant_ui": True, + }, + } + + @app.get("/ui", include_in_schema=False) async def assistant_ui(): index_html = UI_DIR / "index.html" diff --git a/ui/assets/app.js b/ui/assets/app.js index 7830555..1a228e3 100644 --- a/ui/assets/app.js +++ b/ui/assets/app.js @@ -49,6 +49,17 @@ async function apiPost(path, payload) { return r.json(); } +async function loadMeta() { + const status = document.getElementById("metaStatus"); + status.textContent = "backend: checking..."; + try { + const data = await apiGet("/meta", {}); + status.textContent = `backend: ${data.version} @ ${new Date(data.started_at_utc).toLocaleTimeString()}`; + } catch (e) { + status.textContent = "backend: unreachable/old"; + } +} + function renderRows(target, rows, formatter) { target.innerHTML = ""; if (!rows || rows.length === 0) { @@ -206,6 +217,7 @@ async function sendChat() { } document.getElementById("saveConfig").addEventListener("click", saveConfig); +document.getElementById("refreshMeta").addEventListener("click", loadMeta); document.getElementById("loadInbox").addEventListener("click", loadInbox); document.getElementById("loadTasks").addEventListener("click", loadTasks); document.getElementById("makeDraft").addEventListener("click", makeDraft); @@ -213,3 +225,4 @@ document.getElementById("saveLearn").addEventListener("click", saveLearn); document.getElementById("sendChat").addEventListener("click", sendChat); loadConfig(); +loadMeta(); diff --git a/ui/assets/styles.css b/ui/assets/styles.css index fd4c6f4..a12b1b0 100644 --- a/ui/assets/styles.css +++ b/ui/assets/styles.css @@ -65,6 +65,15 @@ body { flex-wrap: wrap; } +.badge { + font-size: 12px; + color: #0f3f3b; + background: #e7f4f2; + border: 1px solid #b8dfd9; + border-radius: 999px; + padding: 5px 9px; +} + input, textarea, button { diff --git a/ui/index.html b/ui/index.html index 03f8194..3a07f36 100644 --- a/ui/index.html +++ b/ui/index.html @@ -11,8 +11,10 @@

Assistant Console

+ backend: unknown +