hermes-bsd/tools
Teknium 008860a23f fix(approval): close remaining prompt_toolkit deadlock vectors (#15216)
PR #13734 fixed the concurrent-tool-executor vector (ThreadPoolExecutor
workers didn't inherit the CLI's TLS approval callback). Two vectors
remained that could still land in the deadlocking input() fallback:

1. _spawn_background_review spawns a raw threading.Thread with no
   approval callback installed, so any dangerous-command guard the
   review agent trips falls back to input() -> deadlock against the
   parent's prompt_toolkit TUI (same class as delegate_task subagents,
   fixed in 023b1bff1 / #15491). Install a _bg_review_auto_deny
   callback at thread start, clear on finally.

2. prompt_dangerous_approval's fallback unconditionally spawned a
   daemon thread calling input() when approval_callback was None.
   That fallback can never succeed under prompt_toolkit because the
   user's Enter goes to pt's raw-mode stdin capture. Detect an active
   pt Application via get_app_or_none() and fail closed (deny + log)
   instead, so future threads that forget to install a callback
   degrade gracefully instead of hanging 60s invisibly.

Regression guards:
- tests/run_agent/test_background_review.py verifies the review
  worker thread sees a callable auto-deny callback mid-run and that
  the slot is cleared in the finally block.
- tests/tools/test_approval.py TestFailClosedUnderPromptToolkit
  verifies prompt_dangerous_approval returns 'deny' fast under a
  mocked pt Application, and that a real callback still wins over
  the guard.
2026-04-27 06:42:32 -07:00
..
browser_providers
environments
neutts_samples
__init__.py
ansi_strip.py
approval.py
binary_extensions.py
browser_camofox.py
browser_camofox_state.py
browser_cdp_tool.py
browser_dialog_tool.py
browser_supervisor.py
browser_tool.py
budget_config.py
checkpoint_manager.py
clarify_tool.py
code_execution_tool.py
credential_files.py
cronjob_tools.py
debug_helpers.py
delegate_tool.py
discord_tool.py
env_passthrough.py
feishu_doc_tool.py
feishu_drive_tool.py
file_operations.py
file_state.py
file_tools.py
fuzzy_match.py
homeassistant_tool.py
image_generation_tool.py
interrupt.py
managed_tool_gateway.py
mcp_oauth.py
mcp_oauth_manager.py
mcp_tool.py
memory_tool.py
mixture_of_agents_tool.py
neutts_synth.py
openrouter_client.py
osv_check.py
patch_parser.py
path_security.py
process_registry.py
registry.py
rl_training_tool.py
schema_sanitizer.py
send_message_tool.py
session_search_tool.py
skill_manager_tool.py
skills_guard.py
skills_hub.py
skills_sync.py
skills_tool.py
terminal_tool.py
tirith_security.py
todo_tool.py
tool_backend_helpers.py
tool_output_limits.py
tool_result_storage.py
transcription_tools.py
tts_tool.py
url_safety.py
vision_tools.py
voice_mode.py
web_tools.py
website_policy.py
xai_http.py
yuanbao_tools.py