- Cut broad render fanout across the app by replacing shared-store whole-object subscriptions with leaf selectors, memoizing hot chrome boundaries, and isolating disabled global providers from live session/message state. This keeps header controls, composer toolbars, side panels, and other non-hot UI surfaces from repainting on every assistant update or keystroke. - Rework sidebar session ordering so recent, project groups, and worktree groups derive from one ordering source while avoiding streaming-time thrash. The sidebar now uses a stabilized session snapshot, preserves structural identity for unchanged rows, reads live row status/details per session, and applies a one-shot sort bump on idle->busy instead of continuously resorting during activity. - Fix chat/input scroll instability by separating viewport-resize handling from message-growth handling, disabling conflicting native scroll anchoring, and stopping textarea autosize from collapsing on every growth keystroke. This removes the multiline typing jiggle during streaming and reduces unnecessary composer rerenders. - Also gate voice context wiring behind voice-mode enablement and codify the learned render/scroll/order anti-patterns in AGENTS.md so future changes avoid the same classes of regressions.
31 lines
762 B
TypeScript
31 lines
762 B
TypeScript
import React from 'react';
|
|
import { useVoiceContext } from '@/hooks/useVoiceContext';
|
|
import { useConfigStore } from '@/stores/useConfigStore';
|
|
|
|
const VoiceContextBridge = React.memo(function VoiceContextBridge() {
|
|
useVoiceContext();
|
|
return null;
|
|
});
|
|
|
|
/**
|
|
* Provider component that initializes voice context sync.
|
|
* Wrap the app with this to enable voice session awareness.
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* <VoiceProvider>
|
|
* <App />
|
|
* </VoiceProvider>
|
|
* ```
|
|
*/
|
|
export function VoiceProvider({ children }: { children: React.ReactNode }) {
|
|
const voiceModeEnabled = useConfigStore((state) => state.voiceModeEnabled);
|
|
|
|
return (
|
|
<>
|
|
{voiceModeEnabled ? <VoiceContextBridge /> : null}
|
|
{children}
|
|
</>
|
|
);
|
|
}
|