@@ -420,20 +420,22 @@ const App: React.FC = () => {
420420 const sidebar = useSidebar ( getUIPreferences ( ) . tocEnabled ) ;
421421
422422 // Sync sidebar open state when preference changes in Settings
423+ // biome-ignore lint/correctness/useExhaustiveDependencies: sidebar methods are stable
423424 useEffect ( ( ) => {
424425 if ( uiPrefs . tocEnabled ) {
425426 sidebar . open ( 'toc' ) ;
426427 } else {
427428 sidebar . close ( ) ;
428429 }
429- } , [ uiPrefs . tocEnabled , sidebar . close , sidebar . open ] ) ;
430+ } , [ uiPrefs . tocEnabled ] ) ;
430431
431432 // Clear diff view when switching away from versions tab
433+ // biome-ignore lint/correctness/useExhaustiveDependencies: isPlanDiffActive is read, not a trigger
432434 useEffect ( ( ) => {
433435 if ( sidebar . activeTab === 'toc' && isPlanDiffActive ) {
434436 setIsPlanDiffActive ( false ) ;
435437 }
436- } , [ sidebar . activeTab , isPlanDiffActive ] ) ;
438+ } , [ sidebar . activeTab ] ) ;
437439
438440 // Clear diff view on Escape key
439441 useEffect ( ( ) => {
@@ -467,19 +469,23 @@ const App: React.FC = () => {
467469 // Obsidian vault browser
468470 const vaultBrowser = useVaultBrowser ( ) ;
469471
470- const showVaultTab = useMemo ( ( ) => isVaultBrowserEnabled ( ) , [ ] ) ;
472+ // biome-ignore lint/correctness/useExhaustiveDependencies: recompute when user changes settings
473+ const showVaultTab = useMemo ( ( ) => isVaultBrowserEnabled ( ) , [ uiPrefs ] ) ;
474+ // biome-ignore lint/correctness/useExhaustiveDependencies: recompute when user changes settings
471475 const vaultPath = useMemo ( ( ) => {
472476 if ( ! showVaultTab ) return '' ;
473477 const settings = getObsidianSettings ( ) ;
474478 return getEffectiveVaultPath ( settings ) ;
475- } , [ showVaultTab ] ) ;
479+ } , [ showVaultTab , uiPrefs ] ) ;
476480
477481 // Clear active file when vault browser is disabled
482+ // biome-ignore lint/correctness/useExhaustiveDependencies: vaultBrowser.setActiveFile is stable
478483 useEffect ( ( ) => {
479484 if ( ! showVaultTab ) vaultBrowser . setActiveFile ( null ) ;
480- } , [ showVaultTab , vaultBrowser . setActiveFile ] ) ;
485+ } , [ showVaultTab ] ) ;
481486
482487 // Auto-fetch vault tree when vault tab is first opened
488+ // biome-ignore lint/correctness/useExhaustiveDependencies: vaultBrowser methods/state are read inside, not triggers
483489 useEffect ( ( ) => {
484490 if (
485491 sidebar . activeTab === 'vault' &&
@@ -490,14 +496,7 @@ const App: React.FC = () => {
490496 ) {
491497 vaultBrowser . fetchTree ( vaultPath ) ;
492498 }
493- } , [
494- sidebar . activeTab ,
495- showVaultTab ,
496- vaultPath ,
497- vaultBrowser . fetchTree ,
498- vaultBrowser . isLoading ,
499- vaultBrowser . tree . length ,
500- ] ) ;
499+ } , [ sidebar . activeTab , showVaultTab , vaultPath ] ) ;
501500
502501 const buildVaultDocUrl = React . useCallback (
503502 ( vp : string ) => ( path : string ) =>
@@ -842,6 +841,7 @@ const App: React.FC = () => {
842841 } ;
843842
844843 // Global keyboard shortcuts (Cmd/Ctrl+Enter to submit)
844+ // biome-ignore lint/correctness/useExhaustiveDependencies: handler functions are stable enough — wrapping in useCallback would be a larger refactor
845845 useEffect ( ( ) => {
846846 const handleKeyDown = ( e : KeyboardEvent ) => {
847847 // Only handle Cmd/Ctrl+Enter
@@ -923,9 +923,6 @@ const App: React.FC = () => {
923923 annotateMode ,
924924 origin ,
925925 getAgentWarning ,
926- handleAnnotateFeedback ,
927- handleApprove ,
928- handleDeny ,
929926 ] ) ;
930927
931928 const handleAddAnnotation = ( ann : Annotation ) => {
@@ -1042,6 +1039,7 @@ const App: React.FC = () => {
10421039 } ;
10431040
10441041 // Cmd/Ctrl+S keyboard shortcut — save to default notes app
1042+ // biome-ignore lint/correctness/useExhaustiveDependencies: handler functions are stable enough
10451043 useEffect ( ( ) => {
10461044 const handleSaveShortcut = ( e : KeyboardEvent ) => {
10471045 if ( e . key !== 's' || ! ( e . metaKey || e . ctrlKey ) ) return ;
@@ -1094,8 +1092,6 @@ const App: React.FC = () => {
10941092 pendingPasteImage ,
10951093 submitted ,
10961094 isApiMode ,
1097- handleDownloadAnnotations ,
1098- handleQuickSaveToNotes ,
10991095 ] ) ;
11001096
11011097 // Close export dropdown on click outside
0 commit comments