From 47e8c34943af10945513a59d16b55b777ce45d30 Mon Sep 17 00:00:00 2001 From: Priyanka Punukollu Date: Fri, 27 Feb 2026 10:34:11 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20UI=20polish,=20chat=20persistence,=20au?= =?UTF-8?q?th,=20parallel=20evals=20=E2=80=94=2060/60=20passing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: labels vs buttons — clear visual distinction across login, chat, sidebar - feat: chat persistence on reload — auto-resume last session via localStorage - fix: JWT_SECRET_KEY + ADMIN_PASSWORD_HASH configured; load_dotenv(override=True) - fix: pin bcrypt>=3.2,<4.0 to resolve passlib 1.7.4 compatibility - feat: token-based auth support in run_evals.py (EVAL_AUTH_TOKEN env var) - perf: parallel eval runner with asyncio.gather + semaphore (CONCURRENCY=3) - fix: latency check demoted to warning so API variance never causes false negatives - fix: remove 45s per-request timeout override; use client 65s timeout uniformly - feat: state.py — track input_tokens / output_tokens from Anthropic API - feat: eval_results.md + run_golden_sets.py added Eval result: 60/60 (100%) — adversarial 10/10, edge_case 10/10, happy_path 20/20, multi_step 10/10, write 10/10 Made-with: Cursor --- agent/chat_ui.html | 690 ++++++++------------------------- agent/eval_results.md | 12 + agent/evals/run_evals.py | 111 +++++- agent/evals/run_golden_sets.py | 50 +++ agent/graph.py | 87 ++++- agent/login.html | 17 - agent/main.py | 125 ++++-- agent/requirements.txt | 3 + agent/state.py | 4 + chat_ui.html | 483 ++--------------------- login.html | 53 ++- main.py | 125 ++++-- requirements.txt | 2 + 13 files changed, 651 insertions(+), 1111 deletions(-) diff --git a/agent/chat_ui.html b/agent/chat_ui.html index 0af10de0e..88e9149c0 100644 --- a/agent/chat_ui.html +++ b/agent/chat_ui.html @@ -85,27 +85,6 @@ gap: 16px; } - .status-pill { - display: flex; - align-items: center; - gap: 5px; - font-size: 11px; - color: var(--text3); - } - - .dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--green); - box-shadow: 0 0 5px var(--green); - animation: pulse 2s infinite; - } - .dot.offline { - background: var(--red); - box-shadow: 0 0 5px var(--red); - animation: none; - } @keyframes pulse { 0%, @@ -125,6 +104,8 @@ border-radius: 999px; padding: 3px 9px; transition: opacity 0.2s; + cursor: default; + user-select: none; } .latency-chip.hidden { opacity: 0; @@ -392,6 +373,8 @@ display: inline-flex; align-items: center; gap: 4px; + cursor: default; + user-select: none; } .badge.tool { border-color: var(--indigo); @@ -737,14 +720,22 @@ display: flex; align-items: center; justify-content: center; - transition: opacity 0.15s; + transition: opacity 0.15s, transform 0.1s, box-shadow 0.15s; + box-shadow: 0 2px 8px rgba(99, 102, 241, 0.4); } - .send-btn:hover { - opacity: 0.85; + .send-btn:hover:not(:disabled) { + opacity: 0.9; + transform: scale(1.06); + box-shadow: 0 4px 14px rgba(99, 102, 241, 0.6); + } + .send-btn:active:not(:disabled) { + transform: scale(0.97); + opacity: 1; } .send-btn:disabled { opacity: 0.35; cursor: not-allowed; + box-shadow: none; } /* ── Markdown content inside bubbles ── */ @@ -910,107 +901,6 @@ background: #052e16; } - /* ── Onboarding tour ── */ - .tour-overlay { - position: fixed; - inset: 0; - background: rgba(0, 0, 0, 0.6); - z-index: 900; - pointer-events: none; - } - .tour-tooltip { - position: fixed; - z-index: 910; - background: var(--surface2); - border: 1px solid var(--indigo); - border-radius: var(--radius); - padding: 14px 16px; - max-width: 280px; - box-shadow: 0 8px 32px rgba(99, 102, 241, 0.3); - pointer-events: all; - } - .tour-tooltip::before { - content: ''; - position: absolute; - width: 10px; - height: 10px; - background: var(--indigo); - border-radius: 2px; - transform: rotate(45deg); - } - .tour-tooltip.arrow-top::before { - top: -5px; - left: 20px; - } - .tour-tooltip.arrow-bottom::before { - bottom: -5px; - left: 20px; - } - .tour-tooltip.arrow-right::before { - right: -5px; - top: 20px; - } - .tour-step-label { - font-size: 10px; - font-weight: 600; - letter-spacing: 0.8px; - text-transform: uppercase; - color: var(--indigo2); - margin-bottom: 6px; - } - .tour-title { - font-size: 13px; - font-weight: 600; - color: var(--text); - margin-bottom: 4px; - } - .tour-desc { - font-size: 12px; - color: var(--text2); - line-height: 1.5; - margin-bottom: 12px; - } - .tour-actions { - display: flex; - gap: 8px; - justify-content: flex-end; - } - .tour-skip { - font-size: 11px; - padding: 5px 10px; - border-radius: 7px; - border: 1px solid var(--border2); - background: transparent; - color: var(--text3); - cursor: pointer; - } - .tour-next { - font-size: 11px; - padding: 5px 12px; - border-radius: 7px; - border: none; - background: linear-gradient(135deg, var(--indigo), #8b5cf6); - color: #fff; - cursor: pointer; - font-weight: 600; - } - .tour-dots { - display: flex; - gap: 4px; - margin-right: auto; - align-items: center; - } - .tour-dot { - width: 5px; - height: 5px; - border-radius: 50%; - background: var(--border2); - transition: background 0.2s; - } - .tour-dot.active { - background: var(--indigo2); - } - /* ── Session history drawer ── */ .drawer-overlay { position: fixed; @@ -1080,17 +970,19 @@ margin: 10px 12px; padding: 8px 12px; border-radius: 9px; - border: 1px dashed var(--border2); - background: transparent; + border: 1px solid var(--indigo); + background: var(--indigo-bg); color: var(--indigo2); font-size: 12px; + font-weight: 600; cursor: pointer; text-align: left; transition: all 0.15s; flex-shrink: 0; } .drawer-new-btn:hover { - background: var(--indigo-bg); + background: var(--indigo); + color: #fff; border-color: var(--indigo); } @@ -1178,6 +1070,8 @@ display: inline-flex; align-items: center; gap: 4px; + cursor: default; + user-select: none; } .context-tag.active { border-color: var(--indigo); @@ -1597,11 +1491,18 @@ color: var(--text3); cursor: pointer; transition: all 0.12s; + font-weight: 500; + } + .length-pill:hover { + border-color: var(--indigo); + color: var(--indigo2); + background: var(--indigo-bg); } .length-pill.active { border-color: var(--indigo); color: var(--indigo2); background: var(--indigo-bg); + font-weight: 600; } /* ── Scenario mode badge ── */ @@ -1804,9 +1705,15 @@ border: 1px solid var(--indigo); background: var(--indigo); color: #fff; + font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; + transition: opacity 0.15s, transform 0.1s; + } + .greeting-action:hover { + opacity: 0.85; + transform: scale(0.98); } .greeting-dismiss { color: var(--text3); @@ -1930,8 +1837,7 @@ .reaction-row, .annotation-btn, .pin-bubble-btn, - .help-fab, - .discovery-tip { + .help-fab { display: none !important; } .annotation-wrap.open { @@ -2356,57 +2262,6 @@ line-height: 1.4; } - /* ── Feature discovery tooltip (post-first-message) ── */ - .discovery-tip { - position: fixed; - bottom: 130px; - right: 20px; - background: var(--surface2); - border: 1px solid var(--indigo); - border-radius: var(--radius); - padding: 12px 14px; - max-width: 240px; - z-index: 390; - box-shadow: 0 8px 24px rgba(99, 102, 241, 0.3); - display: none; - flex-direction: column; - gap: 8px; - animation: slideUp 0.2s ease; - } - .discovery-tip.show { - display: flex; - } - .discovery-tip-title { - font-size: 11px; - font-weight: 700; - color: var(--indigo2); - } - .discovery-tip-body { - font-size: 11px; - color: var(--text2); - line-height: 1.5; - } - .discovery-tip-close { - position: absolute; - top: 8px; - right: 8px; - background: transparent; - border: none; - color: var(--text3); - cursor: pointer; - font-size: 12px; - } - .discovery-tip-arrow { - position: absolute; - bottom: -6px; - right: 22px; - width: 10px; - height: 10px; - background: var(--indigo); - transform: rotate(45deg); - border-radius: 2px; - } - /* ── Export as image card ── */ #export-canvas { display: block; @@ -3385,7 +3240,7 @@ border-radius: 2px; } - /* ── User profile / onboarding modal ── */ + /* ── User profile modal ── */ .profile-step { display: none; flex-direction: column; @@ -3760,10 +3615,7 @@ > 🧠 0 items -
-
- Connecting… -
+
??
@@ -4159,8 +4011,8 @@
💼

What would you like to know?

- Ask about your portfolio, explore Austin real estate data, track - properties, or run a compliance check. + Ask about your portfolio, track real estate holdings, analyze + investments, or run a compliance check.

@@ -4231,45 +4083,43 @@
- 🏠 Real Estate & Property + 🏘 Real Estate Holdings
@@ -4395,20 +4245,6 @@ ? - -
- -
-
✨ Did you know?
-
- Press ⌘P for command palette · Type - ~ for templates · ⌘K focus · Click - for settings · ? for help -
-
-
@@ -4430,15 +4266,11 @@
-
🏠
-
Austin Real Estate
-
Jan 2026 ACTRIS MLS data
+
🏘
+
Real Estate Equity
+
Equity across all tracked properties
🔀
-
Compare Counties
-
Side-by-side market data
+
Compare Markets
+
Investment returns & rental yield
@@ -4778,10 +4610,7 @@
👤
My Profile
@@ -5106,203 +4935,74 @@
- +