feat: SSE streaming for LLM responses
Summary
- ServiceTreeProxy now uses AuthInterceptor HTTP client (fixes 401 on categories API)
- Thread authenticated httpClient through SidebarComponent, ServiceTreePanel
- Add localhost→10.0.2.2 URL rewrite for emulator Chrome Custom Tab
- Use genie-app client ID for consistent token validation
- Fix weather service null crash from ipapi.co rate limit
- Show spinner during entire SSE streaming response
- Extract iss_sub userId from ID token for profile/account screens
- Fix UserProfileProxy endpoint from /api/ to /api/me
What Works
-
Vue app OIDC login and QuickHelp responses -
Flutter app OIDC login via emulator CCT -
SSE streaming from Flutter app with spinner indicator -
Both apps run concurrently with nginx dual server blocks -
SSE stream (POST /api/queries/stream) returns 200 from both apps
What's Still Broken
-
UserProfileScreen — ProviderScope.containerOf(context) fails in initState flow. Needs proper Riverpod refactoring to inject auth httpClient. -
7 proxies create ApiService() without auth: admin_dashboard_proxy, analytics_proxy, chatbot_proxy, chat_history_proxy, document_file_proxy, label_proxy, weather_proxy — all need auth httpClient injection (same pattern as ServiceTreeProxy fix)
Edited by david-full