@@ -129,6 +129,9 @@ def code_print(
129129
130130spinners = cycle (SPINNER_TYPES )
131131
132+ # Track whether a progress bar is already active to prevent nested Live displays
133+ _progress_bar_active = False
134+
132135
133136@contextmanager
134137def progress_bar (
@@ -138,28 +141,38 @@ def progress_bar(
138141
139142 If revert_to_print is True, falls back to printing a single logger.info message
140143 instead of showing a progress bar.
144+
145+ If a progress bar is already active, yields a dummy task ID to avoid Rich's
146+ LiveError from nested Live displays.
141147 """
148+ global _progress_bar_active
149+
142150 if is_LSP_enabled ():
143151 lsp_log (LspTextMessage (text = message , takes_time = True ))
144152 yield
145153 return
146154
147- if revert_to_print :
148- logger .info (message )
155+ if revert_to_print or _progress_bar_active :
156+ if revert_to_print :
157+ logger .info (message )
149158
150159 # Create a fake task ID since we still need to yield something
151160 yield DummyTask ().id
152161 else :
153- progress = Progress (
154- SpinnerColumn (next (spinners )),
155- * Progress .get_default_columns (),
156- TimeElapsedColumn (),
157- console = console ,
158- transient = transient ,
159- )
160- task = progress .add_task (message , total = None )
161- with progress :
162- yield task
162+ _progress_bar_active = True
163+ try :
164+ progress = Progress (
165+ SpinnerColumn (next (spinners )),
166+ * Progress .get_default_columns (),
167+ TimeElapsedColumn (),
168+ console = console ,
169+ transient = transient ,
170+ )
171+ task = progress .add_task (message , total = None )
172+ with progress :
173+ yield task
174+ finally :
175+ _progress_bar_active = False
163176
164177
165178@contextmanager
0 commit comments