Use a counter key prop that increments each time the dialog opens, ensuring
a fresh component instance with cleared file input, parsed data, and errors.
Skip pendingSuggestions in mergedMessages and previousMutationSuggestions
rendering when activeSessionId is null. Also fix empty state check to not
consider API suggestions as content when no session is active.
Add katex, remark-math, and rehype-katex packages. Configure both
ReactMarkdown instances with rehypeKatex plugin so inline ($...$)
and block ($$...$$) LaTeX math renders properly in chat bubbles.
- MutationSuggestionCard: call onResolved immediately on approve/reject so
resolvedIds is set even if component unmounts before dismiss timer fires.
Invalidate mutations list query to refresh pendingSuggestions.
- AIChatPanel: use explicit null checks instead of falsy for oldValue/newValue
so empty-string fields (e.g. decompiledCode) render correctly. Remove
resolvedIds filter from streaming mutationSuggestions — the card manages
its own lifecycle internally.
- CodeViewer: auto-switch to assembly tab when selecting a function that has
no pseudocode (derived effectiveTab via useMemo).
Cards now fade out and disappear 1.5s after being approved or rejected.
Added resolvedIds tracking in AIChatPanel to prevent cards from
reappearing in previousMutationSuggestions after resolution.
onRenameApplied now called on reject too (was only on approve).
- Add ThemeProvider with localStorage persistence and default dark theme
- Add ThemeToggle (sun/moon) to the header's right corner
- Restructure index.css: light palette in :root, dark palette in .dark
- Apply stored theme in index.html to avoid flash on load
- Fix mislabeled "Create/Edit Home" text in WorkspaceDialog to "Workspace"