diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 19dd2e0b..0a15af83 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -77,10 +77,21 @@ export const App: React.FC = () => { const inputFieldRef = useRef( null, ) as React.RefObject; - const [showBanner, setShowBanner] = useState(true); + // Persist the dismissal of the info banner across webview reloads + // Use VS Code webview state to avoid flicker on first render. + const [showBanner, setShowBanner] = useState(() => { + try { + const state = (vscode.getState?.() as Record) || {}; + return state.infoBannerDismissed !== true; // show unless explicitly dismissed + } catch { + return true; + } + }); const [editMode, setEditMode] = useState('ask'); const [thinkingEnabled, setThinkingEnabled] = useState(false); const [isComposing, setIsComposing] = useState(false); + // When true, do NOT auto-attach the active editor file/selection to message context + const [skipAutoActiveContext, setSkipAutoActiveContext] = useState(false); // Completion system const getCompletionItems = React.useCallback( @@ -168,6 +179,7 @@ export const App: React.FC = () => { setInputText, messageHandling, fileContext, + skipAutoActiveContext, vscode, inputFieldRef, isStreaming: messageHandling.isStreaming, @@ -646,7 +658,16 @@ export const App: React.FC = () => { setShowBanner(false)} + onDismiss={() => { + setShowBanner(false); + // merge with existing webview state so we don't clobber other keys + try { + const prev = (vscode.getState?.() as Record) || {}; + vscode.setState?.({ ...prev, infoBannerDismissed: true }); + } catch { + /* no-op */ + } + }} onLinkClick={(e) => { e.preventDefault(); vscode.postMessage({ type: 'openSettings', data: {} }); @@ -663,6 +684,7 @@ export const App: React.FC = () => { thinkingEnabled={thinkingEnabled} activeFileName={fileContext.activeFileName} activeSelection={fileContext.activeSelection} + skipAutoActiveContext={skipAutoActiveContext} onInputChange={setInputText} onCompositionStart={() => setIsComposing(true)} onCompositionEnd={() => setIsComposing(false)} @@ -672,6 +694,9 @@ export const App: React.FC = () => { onToggleEditMode={handleToggleEditMode} onToggleThinking={handleToggleThinking} onFocusActiveEditor={fileContext.focusActiveEditor} + onToggleSkipAutoActiveContext={() => + setSkipAutoActiveContext((v) => !v) + } onShowCommandMenu={async () => { if (inputFieldRef.current) { inputFieldRef.current.focus(); diff --git a/packages/vscode-ide-companion/src/webview/components/ui/InfoBanner.tsx b/packages/vscode-ide-companion/src/webview/components/ui/InfoBanner.tsx index d94b7af7..4aad6534 100644 --- a/packages/vscode-ide-companion/src/webview/components/ui/InfoBanner.tsx +++ b/packages/vscode-ide-companion/src/webview/components/ui/InfoBanner.tsx @@ -71,7 +71,7 @@ export const InfoBanner: React.FC = ({ {linkText}