AIQ UI polish + bug fix - final#143
AIQ UI polish + bug fix - final#143AjayThorve merged 15 commits intoNVIDIA-AI-Blueprints:developfrom
Conversation
Refine the chat UI with lower-disruption header interactions, remove the unused Auto control, and align Data Sources copy with connection-focused wording. Made-with: Cursor
Rename Files empty-state heading and description, update footer text to connection-focused wording, and refine the research panel side toggle with a labelled vertical tab. Made-with: Cursor
Make Stop Researching always visible but disabled when idle, remove Hide label from close button, add Process Overview description to Plan tab, and default the research panel to the Plan tab on open. Made-with: Cursor
Swap the custom ThemeOption buttons for a KUI Select, add Monitor icon for system theme, rename section to 'UI Theme Options', and update label to 'System Theme (Auto)'. Made-with: Cursor
Complete the cleanup in the onError handler so that an unreachable backend properly patches the tracking message to failure, adds a banner, disconnects SSE, and resets streaming state — unblocking session deletion and export buttons. Made-with: Cursor
Keep data sources always visible below the collapsible, adjust spacing, and override spinner SVG width in the research panel toggle tab. Made-with: Cursor
Fix 2 SettingsPanel test failures from KUI Select rendering, remove unused Monitor icon, fix orphaned role=listitem in ChatThinking, and add regression tests for Auto button removal, Process Overview, and always-visible data sources. Made-with: Cursor
Greptile SummaryThis PR delivers a broad UI/UX polish pass across the AIQ frontend and closes a critical race condition in Key changes:
Confidence Score: 4/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant SSE as SSE Stream
participant onError as onError Handler
participant Health as Backend Health Check
participant Store as Chat Store (Zustand)
SSE->>onError: error event (e.g. connection lost)
onError->>Store: Read isDeepResearchStreaming & deepResearchStatus
alt already in terminal state (interrupted / failure) or not streaming
onError-->>SSE: no-op (guard exits early)
else streaming and not in terminal state
onError->>Health: checkBackendHealthCached()
alt Backend reachable (transient SSE error)
Health-->>onError: true
onError-->>SSE: return — allow SSE to retry
else Backend unreachable
Health-->>onError: false
onError->>Store: setCurrentStatus('error')
onError->>Store: patchConversationMessage(failure, isDeepResearchActive=false, showViewReport)
onError->>Store: addErrorCard('agent.deep_research_failed')
onError->>Store: addDeepResearchBanner('failure', jobId)
onError->>Store: stopAllDeepResearchSpinners()
onError->>SSE: clientRef.disconnect()
onError->>Store: setStreamLoaded(true)
onError->>Store: completeDeepResearch()
onError->>Store: setStreaming(false)
Note over Store: Session no longer stuck in active state
end
end
|
Replace the unsupported inline style prop on the Generate icon with class-based sizing so the component matches IconProps and passes TypeScript checks. Made-with: Cursor
Mark deep research status as error during unreachable-backend SSE cleanup and replace testid-based spinner CSS scoping with a stable class selector, with matching regression coverage. Made-with: Cursor
Avoid runtime imports of AIQConfig in plugin registration modules and keep the type hints behind TYPE_CHECKING so CI remains compatible across nat package layout changes. Made-with: Cursor
Create logo-triggered sessions as drafts and only persist them after first interaction (typing, sending, source toggles, or file upload), while updating the plan overview copy. Made-with: Cursor
This reverts commit 77e3dc0.
Block the logo new-session action while shallow chat streaming or HITL is active, but keep it available during deep research jobs. Made-with: Cursor
Pass workflow metadata through todo callbacks and ignore workflow-scoped todo artifacts in UI state updates so task lists only reflect top-level research todos. Made-with: Cursor
Summary
This PR delivers a broad UI/UX polish pass for the AIQ frontend, improves deep-research failure recovery, and closes several test and reliability gaps before review.
It includes app bar/navigation refinements, chat/input simplification, data source and file-copy updates, research-panel control improvements, settings-theme control refactor, and a critical deep-research race-condition fix that previously left sessions in a stuck "active" state.
What Changed
App Bar and Navigation
Automode button and cleaned up the composer action bar layout.Logo + AI-Qa new-session trigger.Sessionstext beside the hamburger icon for consistency with other nav items.Sessionswith tuned spacing.AppBarnew-session action throughMainLayoutusing the existinghandleNewSession()flow (URL sync + right-panel close behavior preserved).Data Sources and Files Copy/UI
All Sources->All ConnectionsIndividual Sources->Individual ConnectionsNo Filesheading.No Attached FilesAll attached files will be accessible to agents in this session unless removed.Attached files will be always available to agents until deleted.No Attached Filesstyling to match the section-label pattern used elsewhere.Research Panel UX
Show Researchlabel.Hidetext from the panel close button (icon-only close control).Stop Researchingalways visible and disabled when no active research is running.Stop Researchingleft-aligned near tab controls with improved spacing from report/tab controls.Plan Tab Content
Process Overviewsection aboveResearch Plan, with explanatory copy for:Settings Panel Theme Control
Select.Appearance->UI Theme OptionsSystem->System Theme (Auto)Deep Research Race/State Bug Fix (Critical)
Addressed a race where SSE failures could leave sessions in a falsely active state, causing:
Root cause
use-deep-research.tsonErrorpath performed partial cleanup only (error card + spinner stop), but did not perform terminal-state sync.Fix
When backend is unreachable in
onError, now performs full failure cleanup mirroring the terminal job-status path:This ensures session activity and export gating state become consistent after failure.
Test Coverage and Reliability Improvements
Added/updated tests across affected surfaces:
AppBar.spec.tsxMainLayout.spec.tsxDataSourcesPanel.spec.tsxFileSourcesTab.spec.tsxResearchPanel.spec.tsxShow Research)Stop Researchingalways-rendered/disabled-state coveragePlanTab.spec.tsxProcess Overviewrender coverageInputArea.spec.tsxChatThinking.spec.tsxuse-deep-research.spec.tsonErrortests:Validation
Executed focused and full validations during this branch:
Notes / Reviewer Context
Scope
Primary touched areas:
frontends/ui/src/features/layout/components/*(AppBar, MainLayout, DataSourcesPanel, FileSourcesTab, ResearchPanel, SettingsPanel, PlanTab, InputArea)frontends/ui/src/features/chat/hooks/use-deep-research.tsfrontends/ui/src/features/chat/components/ChatThinking.tsxfrontends/ui/src/app/globals.css(research-toggle spinner size override)