@@ -524,6 +524,25 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
524524 */
525525 setImmediate ( async ( ) => {
526526 let failureStage = 'nativeFinder' ;
527+ // Watchdog: fires if setup hasn't completed within 120s, indicating a likely hang
528+ const SETUP_HANG_TIMEOUT_MS = 120_000 ;
529+ let hangWatchdogActive = true ;
530+ const clearHangWatchdog = ( ) => {
531+ if ( ! hangWatchdogActive ) {
532+ return ;
533+ }
534+ hangWatchdogActive = false ;
535+ clearTimeout ( hangWatchdog ) ;
536+ } ;
537+ const hangWatchdog = setTimeout ( ( ) => {
538+ if ( ! hangWatchdogActive ) {
539+ return ;
540+ }
541+ hangWatchdogActive = false ;
542+ traceError ( `Setup appears hung during stage: ${ failureStage } ` ) ;
543+ sendTelemetryEvent ( EventNames . SETUP_HANG_DETECTED , start . elapsedTime , { failureStage } ) ;
544+ } , SETUP_HANG_TIMEOUT_MS ) ;
545+ context . subscriptions . push ( { dispose : clearHangWatchdog } ) ;
527546 try {
528547 // This is the finder that is used by all the built in environment managers
529548 const nativeFinder : NativePythonFinder = await createNativePythonFinder ( outputChannel , api , context ) ;
@@ -566,6 +585,7 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
566585 sendTelemetryEvent ( EventNames . EXTENSION_MANAGER_REGISTRATION_DURATION , start . elapsedTime , {
567586 result : 'success' ,
568587 } ) ;
588+ clearHangWatchdog ( ) ;
569589 try {
570590 await terminalManager . initialize ( api ) ;
571591 sendManagerSelectionTelemetry ( projectManager ) ;
@@ -578,6 +598,7 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
578598 traceError ( 'Post-initialization tasks failed:' , postInitError ) ;
579599 }
580600 } catch ( error ) {
601+ clearHangWatchdog ( ) ;
581602 traceError ( 'Failed to initialize environment managers:' , error ) ;
582603 sendTelemetryEvent (
583604 EventNames . EXTENSION_MANAGER_REGISTRATION_DURATION ,
0 commit comments