fix: improve stdout/stderr handling in delegate_task function

- Saved and restored stdout/stderr to prevent redirection issues in child threads, ensuring consistent output during task delegation.
- Enhanced reliability of output handling in concurrent execution scenarios.
This commit is contained in:
teknium1
2026-02-24 04:13:32 -08:00
parent cc6bea8b90
commit fd76ff60ac

View File

@@ -21,6 +21,7 @@ import io
import json import json
import logging import logging
import os import os
import sys
import time import time
from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
@@ -253,6 +254,11 @@ def delegate_task(
completed_count = 0 completed_count = 0
spinner_ref = getattr(parent_agent, '_delegate_spinner', None) spinner_ref = getattr(parent_agent, '_delegate_spinner', None)
# Save stdout/stderr before the executor — redirect_stdout in child
# threads races on sys.stdout and can leave it as devnull permanently.
_saved_stdout = sys.stdout
_saved_stderr = sys.stderr
with ThreadPoolExecutor(max_workers=MAX_CONCURRENT_CHILDREN) as executor: with ThreadPoolExecutor(max_workers=MAX_CONCURRENT_CHILDREN) as executor:
futures = {} futures = {}
for i, t in enumerate(task_list): for i, t in enumerate(task_list):
@@ -300,6 +306,10 @@ def delegate_task(
except Exception: except Exception:
pass pass
# Restore stdout/stderr in case redirect_stdout race left them as devnull
sys.stdout = _saved_stdout
sys.stderr = _saved_stderr
# Sort by task_index so results match input order # Sort by task_index so results match input order
results.sort(key=lambda r: r["task_index"]) results.sort(key=lambda r: r["task_index"])