hermes-bsd/tests/tools
teknium1 75317d82d0 fix(vision): narrow the fan-out cap to the CPU encode burst only
The original cap held a process-global slot across the WHOLE vision
analysis (image load + encode + LLM call) with a default of min(CPUs, 4).
That serialized legitimate multi-image workflows — "compare these 6
screenshots", "read this 10-page scan", "analyze every frame" — behind a
4-wide gate, and on the native fast path it even throttled calls that make
no LLM request at all. Excess calls queued (blocking acquire, nothing
dropped), but the latency hit on real fan-out was the wrong tradeoff.

The incident was CPU exhaustion, not call count: concurrent base64/resize
bursts saturated every core and left none to service the shared event loop
serving /api/status. So cap ONLY that:

- A dedicated, bounded ThreadPoolExecutor (_vision_cpu_executor) runs the
  encode/resize/dimension-check off the caller's loop, sized to the host's
  usable core count with NO fixed ceiling — the cap tracks the actual
  exhausted resource (cores), not a magic number. Excess encodes queue on
  the executor; cores stay free for the loop.
- The LLM call is deliberately OUTSIDE the executor, so multi-image
  workflows keep full request concurrency.
- Override via auxiliary.vision.max_concurrency / HERMES_VISION_MAX_CONCURRENCY
  (honored verbatim, including above core count); sub-1 ignored.
- _vision_concurrency_slot() is now a no-op shim for back-compat.

Tests assert: resolver defaults to host cores with no ceiling; env/config
override (incl. above cores); sub-1 rejection; the executor is dedicated and
core-sized; encode runs on a vision-encode thread; and crucially that encode
bursts are bounded to the cap while the analyses themselves stay fully
concurrent (calls_peak > cap).
2026-06-29 01:27:10 -07:00
..
__init__.py
conftest.py
test_accretion_caps.py
test_ansi_strip.py
test_approval.py fix(approvals): warn and default to manual on unknown approvals.mode 2026-06-28 19:04:18 -07:00
test_approval_heartbeat.py
test_approval_interrupt.py test(approval): regression for interrupt-unblocks-approval; AUTHOR_MAP 2026-06-21 13:33:48 -07:00
test_approval_plugin_hooks.py
test_async_delegation.py feat(delegation): background fan-out — parallel subagents, one consolidated return (#49734) 2026-06-20 11:27:12 -07:00
test_base_environment.py fix(environments): use $BASHPID for atomic snapshot temp + harden failure path 2026-06-28 02:08:57 -07:00
test_blueprints.py refactor(cron): rebrand Cron Recipes -> Automation Blueprints 2026-06-11 10:49:47 -07:00
test_browser_camofox.py fix(browser): force secret-pattern redaction on browser_type display 2026-06-25 22:02:22 -07:00
test_browser_camofox_auth.py fix(browser): send Authorization header in Camofox HTTP calls when CAMOFOX_API_KEY is set 2026-06-29 01:26:24 -07:00
test_browser_camofox_ensure_tab.py fix(tools): send listItemId instead of sessionKey in Camofox tab creation 2026-06-29 01:26:24 -07:00
test_browser_camofox_persistence.py test(camofox): accept headers= kwarg in persistence test mocks 2026-06-29 01:26:24 -07:00
test_browser_camofox_state.py
test_browser_camofox_timeout.py fix(tools): read browser.command_timeout in Camofox HTTP client 2026-06-29 01:26:24 -07:00
test_browser_cdp_override.py
test_browser_cdp_tool.py
test_browser_chromium_autoinstall.py feat(browser): auto-install Chromium binary on local cold-start failure 2026-06-28 12:25:15 -05:00
test_browser_chromium_check.py fix(windows): cover remaining console-flash spawn legs (#54417) 2026-06-28 13:49:08 -07:00
test_browser_cleanup.py
test_browser_cloud_fallback.py
test_browser_cloud_provider_cache.py
test_browser_console.py
test_browser_content_none_guard.py
test_browser_eval_ssrf.py fix(browser): close eval return-value SSRF bypass (sibling of #44731) 2026-06-28 02:42:01 -07:00
test_browser_eval_supervisor_path.py
test_browser_get_images_ssrf.py fix(browser): extend private-network guard to browser_get_images 2026-06-28 14:25:10 -07:00
test_browser_hardening.py revert(windows): roll back terminal-popup PRs #53791 #53810 #53829 (#53853) 2026-06-27 15:59:00 -07:00
test_browser_homebrew_paths.py fix(windows): cover remaining console-flash spawn legs (#54417) 2026-06-28 13:49:08 -07:00
test_browser_hybrid_routing.py
test_browser_lightpanda.py
test_browser_open_timeout.py test(browser): cover open timeout diagnostics and failed navigate title 2026-06-28 12:14:21 -05:00
test_browser_orphan_reaper.py fix(browser): verify daemon identity before orphan reaper kills a PID (#14073) 2026-06-21 15:23:47 -07:00
test_browser_secret_exfil.py
test_browser_snapshot_ssrf.py fix(browser): allow local sidecar sessions to bypass SSRF guard 2026-06-28 02:42:01 -07:00
test_browser_ssrf_local.py fix(browser): enable SSRF guard when terminal runs in container 2026-06-21 07:26:18 -07:00
test_browser_supervisor.py
test_browser_supervisor_healthcheck.py
test_browser_type_redaction.py fix(browser): force secret-pattern redaction on browser_type display 2026-06-25 22:02:22 -07:00
test_budget_config.py fix(agent): scale tool-output budget to the model context window (#23767) 2026-06-21 17:46:38 +05:30
test_checkpoint_manager.py
test_clarify_gateway.py fix: accept typed clarify choice replies 2026-06-28 04:13:19 -07:00
test_clarify_tool.py fix(clarify): unwrap dict choices at the source so every surface gets clean text 2026-06-19 06:31:08 -07:00
test_clipboard.py
test_code_execution.py fix(security): quote HERMES_TIMEZONE in remote code execution to prevent shell injection 2026-06-21 16:55:12 -07:00
test_code_execution_modes.py
test_code_execution_windows_env.py
test_command_guards.py fix(approval): honor glob command allowlist entries (#43051) 2026-06-18 12:48:36 +10:00
test_computer_use.py Merge remote-tracking branch 'origin/main' into pr-50994 2026-06-22 18:48:07 -05:00
test_computer_use_capture_routing.py feat(computer_use): cross-platform cua-driver (macOS/Windows/Linux) 2026-06-22 06:42:30 -07:00
test_computer_use_vision_routing.py
test_config_null_guard.py
test_container_cwd_sanitize.py fix(file-tools): sanitize host/relative cwd override before it reaches container sandbox (#54447) (#54616) 2026-06-29 15:32:20 +10:00
test_credential_files.py fix(hermes-home): only honour legacy dir layout when it has content 2026-06-27 04:57:15 +05:30
test_credential_pool_env_fallback.py
test_cron_approval_mode.py
test_cron_prompt_injection.py fix(security): align cron invisible-unicode set with install-time scanner 2026-06-26 01:11:11 -07:00
test_cronjob_run_immediate.py fix(cron): execute job immediately on action='run' 2026-06-21 13:28:04 +05:30
test_cronjob_tools.py fix(cron): tell the user TUI/CLI cron jobs are local-only at create time (#51683) 2026-06-23 23:27:48 -07:00
test_cross_profile_guard.py
test_daytona_environment.py fix(daytona): quote single-upload mkdir parent path (#54440) 2026-06-28 14:33:03 -07:00
test_debug_helpers.py
test_delegate.py test(delegate): cover stale parent base_url inheritance for subagents 2026-06-27 03:59:36 +05:30
test_delegate_composite_toolsets.py
test_delegate_subagent_timeout_diagnostic.py feat(desktop): stream subagent activity into watch windows (#47060) 2026-06-16 14:30:11 -04:00
test_delegate_toolset_scope.py
test_discord_tool.py
test_docker_cgroup_limits.py fix(docker): gate resource limit flags on cgroup controller availability (#54516) 2026-06-29 11:01:08 +10:00
test_docker_config_migrate.py test(docker): assert boot migration keeps .env byte-identical across reboots 2026-06-24 15:23:23 +10:00
test_docker_environment.py fix(docker): gate resource limit flags on cgroup controller availability (#54516) 2026-06-29 11:01:08 +10:00
test_docker_find.py
test_docker_orphan_reaper_integration.py
test_dockerfile_immutable_install.py refactor(ci): faster docker builds via --link and chmod removal 2026-06-26 19:15:18 -07:00
test_dockerfile_node_modules_perms.py Harden hosted Docker install tree against self-modification (#47490) 2026-06-18 09:09:21 +10:00
test_dockerfile_pid1_reaping.py
test_env_passthrough.py fix(env-passthrough): fail closed when provider blocklist import fails 2026-06-28 02:05:43 -07:00
test_env_probe.py
test_execute_code_approval_cluster.py
test_feishu_tools.py
test_file_operations.py feat(search_files): headroom compression evaluation report + lossless densification (#47866) 2026-06-17 13:45:25 -07:00
test_file_operations_edge_cases.py
test_file_ops_cwd_tracking.py
test_file_read_guards.py fix(file): anchor device symlink guard to task cwd 2026-06-21 12:16:10 -07:00
test_file_staleness.py
test_file_state_registry.py
test_file_sync.py
test_file_sync_back.py
test_file_sync_perf.py
test_file_tools.py fix(file-ops): make preserved cwd reachable at write-time resolution (#26211) 2026-06-27 19:29:06 -07:00
test_file_tools_container_config.py fix(tools): respect session cwd in file tools 2026-06-15 14:00:42 +05:30
test_file_tools_cwd_resolution.py fix(file-ops): keep worktree isolation when restoring preserved cwd (#26211) 2026-06-27 19:29:06 -07:00
test_file_tools_live.py
test_file_tools_tilde_profile.py fix(file_tools): resolve tilde using profile home for file operations (#48552) 2026-06-23 03:17:47 +05:30
test_file_write_safety.py fix: use os.pathsep, add tests, update tips for multi-root support 2026-06-27 04:01:12 +05:30
test_find_shell.py fix(terminal): prefer $SHELL over bash for background process spawning (#42203) 2026-06-26 20:45:32 +05:30
test_force_dangerous_override.py
test_fuzzy_match.py fix(fuzzy-match): preserve boundary space after whitespace-normalized match 2026-06-26 01:55:27 +05:30
test_gateway_cwd_contract.py
test_hardline_blocklist.py
test_heartbeat_stale_thresholds.py
test_hermes_subprocess_env.py fix(security): centralize credential-safe subprocess env (#29157) 2026-06-27 20:45:31 -07:00
test_hidden_dir_filter.py
test_homeassistant_tool.py
test_image_generation.py krea 2026-06-25 12:38:33 -07:00
test_image_generation_artifacts.py feat(image-gen): add image-to-image / editing to image_generate (#48705) 2026-06-18 22:13:07 -07:00
test_image_generation_env.py
test_image_generation_image_to_image.py fix(tools): never let a model whitelist strip the prompt / source images 2026-06-19 16:59:54 -07:00
test_image_generation_plugin_dispatch.py
test_init_session_cwd_respect.py
test_interrupt.py
test_kanban_redaction.py fix(security): redact secrets in kanban tool payloads before persistence 2026-06-21 12:02:30 -07:00
test_kanban_tools.py refactor(kanban): fold worker/orchestrator skills into injected guidance (#50473) 2026-06-21 17:06:48 -07:00
test_lazy_deps.py
test_lazy_deps_durable_target.py test(lazy-deps): make durable-target tests network-free 2026-06-25 09:20:13 +10:00
test_line_ending_preservation.py
test_llm_content_none_guard.py feat(moa): expose MoA presets as selectable virtual models (#46081) 2026-06-25 13:52:06 -07:00
test_local_background_child_hang.py
test_local_env_blocklist.py fix(terminal): strip VIRTUAL_ENV/CONDA_PREFIX from terminal subprocess env 2026-06-28 01:04:20 +05:30
test_local_env_cwd_recovery.py
test_local_env_windows_msys.py
test_local_interrupt_cleanup.py
test_local_shell_init.py fix(coding): teach agents terminal env state persists 2026-06-11 19:50:08 -05:00
test_local_tempdir.py
test_managed_browserbase_and_modal.py
test_managed_media_gateways.py
test_managed_modal_environment.py
test_managed_tool_gateway.py
test_mcp_cancelled_error_propagation.py
test_mcp_capability_gating.py test(mcp): cover 'unknown method' ping keepalive fallback (#50028) 2026-06-21 16:02:56 +05:30
test_mcp_circuit_breaker.py fix(mcp): never permanently wedge the circuit breaker on a dead transport (#53599) 2026-06-27 04:39:54 -07:00
test_mcp_client_cert.py
test_mcp_dynamic_discovery.py
test_mcp_elicitation.py feat(tools): MCP elicitation handler with gateway-aware approval routing 2026-06-19 11:46:25 -07:00
test_mcp_empty_error_message.py
test_mcp_image_content.py
test_mcp_invalid_url.py
test_mcp_loop_profile_override.py fix(mcp): propagate HERMES_HOME override onto the MCP event loop (#44220) 2026-06-11 04:37:01 -07:00
test_mcp_oauth.py fix(mcp): suppress interactive OAuth stdin prompts during background discovery (#35927) 2026-06-27 04:59:23 +05:30
test_mcp_oauth_bidirectional.py
test_mcp_oauth_cold_load_expiry.py
test_mcp_oauth_integration.py fix(mcp): fail fast for noninteractive oauth without tokens 2026-06-15 04:22:07 -07:00
test_mcp_oauth_manager.py test(mcp): make invalid_client tests interactive under hermetic env 2026-06-26 00:35:27 -07:00
test_mcp_oauth_metadata.py
test_mcp_preflight_content_type.py fix(mcp): skip preflight content-type probe for OAuth servers 2026-06-28 04:47:39 -07:00
test_mcp_probe.py fix(mcp): preserve loop during probes 2026-06-14 02:09:45 -07:00
test_mcp_reconnect_signal.py
test_mcp_sse_transport.py
test_mcp_stability.py fix(mcp): skip killpg when child shares gateway's process group (#47134) 2026-06-24 00:52:18 +05:30
test_mcp_structured_content.py
test_mcp_tool.py refactor: remove agent-callable send_message tool (#47856) 2026-06-17 07:11:23 -07:00
test_mcp_tool_401_handling.py
test_mcp_tool_issue_948.py fix(mcp): run OSV malware preflight off the event loop with a bounded timeout (#29184) 2026-06-25 23:30:41 +05:30
test_mcp_tool_session_expired.py
test_mcp_utility_capability_gating.py
test_memory_tool.py fix(memory): skip drift guard for add (append-only) action (#42874) 2026-06-25 00:51:12 +05:30
test_memory_tool_import_fallback.py
test_memory_tool_schema.py feat(memory): batch operations for single-turn memory updates (#48507) 2026-06-18 10:19:33 -07:00
test_microsoft_graph_auth.py
test_microsoft_graph_client.py
test_modal_bulk_upload.py
test_modal_sandbox_fixes.py fix(terminal): require approval for host-bound Docker commands (#54483) 2026-06-29 11:35:41 +10:00
test_modal_snapshot_isolation.py
test_notify_on_complete.py fix(process): keep CLI drain dedup after poll goes read-only (#10156) 2026-06-21 11:11:23 -07:00
test_osv_check.py
test_parse_env_var.py
test_patch_failure_tracking.py
test_patch_parser.py
test_pr_6656_regressions.py
test_process_registry.py feat(desktop): live agent terminals + agent-driven tab close 2026-06-28 21:15:14 -05:00
test_read_extract.py feat(read): extract notebook and office documents (#37082) 2026-06-13 14:42:51 -07:00
test_read_loop_detection.py feat(search_files): headroom compression evaluation report + lossless densification (#47866) 2026-06-17 13:45:25 -07:00
test_refresh_agent_mcp_tools.py fix(mcp): address adversarial review round 2 (stale-publish race, parity holes) 2026-06-19 11:57:43 -07:00
test_registry.py
test_resolve_path.py
test_schema_sanitizer.py fix(tools): strip default from $ref nodes in tool schemas 2026-06-12 00:30:51 -05:00
test_search_budget_truncation.py fix(search): keep partial results on search timeout (#36142) 2026-06-13 14:35:21 -07:00
test_search_error_guard.py fix: warn on line-oriented newline search patterns 2026-06-20 23:23:47 -07:00
test_search_hidden_dirs.py
test_send_message_missing_platforms.py refactor(gateway): migrate slack/dingtalk/whatsapp/matrix/feishu/telegram/wecom/email/sms adapters to bundled plugins 2026-06-20 10:26:45 -07:00
test_send_message_react.py feat(messaging): expose action='unreact' in send_message + react dispatch tests 2026-06-12 01:07:38 -07:00
test_send_message_target_parse.py fix: harden WhatsApp target alias salvage 2026-06-15 05:51:47 -07:00
test_send_message_telegram_proxy.py
test_send_message_tool.py test+harden: modernize salvaged Matrix path for current plugin layout 2026-06-28 12:48:08 +05:30
test_session_search.py fix(session_search): demote cron below interactive sessions in discover ranking (#53597) 2026-06-27 04:41:22 -07:00
test_shared_container_task_id.py
test_signal_media.py refactor(gateway): migrate slack/dingtalk/whatsapp/matrix/feishu/telegram/wecom/email/sms adapters to bundled plugins 2026-06-20 10:26:45 -07:00
test_singularity_preflight.py
test_skill_env_passthrough.py
test_skill_improvements.py
test_skill_manager_tool.py fix(curator): fail closed on unverified skill deletes during consolidation (#53935) 2026-06-27 20:45:57 -07:00
test_skill_provenance.py
test_skill_size_limits.py
test_skill_usage.py fix(curator): protect external skills from background curation 2026-06-25 22:03:02 -07:00
test_skill_view_path_check.py
test_skill_view_traversal.py
test_skills_ast_audit.py
test_skills_guard.py
test_skills_hub.py fix(skills): replace string prefix check with strict path containment 2026-06-28 21:14:01 -07:00
test_skills_hub_browse_sh.py
test_skills_hub_clawhub.py fix(skills): let ClawHub index build walk past the 12s browse budget (#44500) 2026-06-11 18:03:11 -04:00
test_skills_list_modified_diff.py test(skills): cover list-modified + diff for bundled skills 2026-06-18 12:26:20 +05:30
test_skills_sync.py fix(skills): skip shadowing when external_dirs provides the skill 2026-06-27 21:07:53 -07:00
test_skills_tool.py fix(skills): ignore support docs in skill discovery 2026-06-16 13:08:34 -07:00
test_slash_confirm.py
test_smart_approval_injection.py fix(security): harden smart approval guard against prompt injection 2026-06-21 16:39:48 -07:00
test_spotify_client.py docs(spotify): document 6-month re-auth cycle and add client-level invalid_grant test 2026-06-20 23:23:47 -07:00
test_ssh_bulk_upload.py
test_ssh_environment.py
test_stage2_hook_seed_one_symlinks.py fix(docker): skip symlinked stage2 chown targets (#52789) 2026-06-26 12:09:52 +10:00
test_stage2_hook_symlink_chown.py fix(docker): skip symlinked stage2 chown targets (#52789) 2026-06-26 12:09:52 +10:00
test_subprocess_stdin_guard.py
test_symlink_prefix_confusion.py
test_sync_back_backends.py
test_terminal_compound_background.py
test_terminal_config_env_sync.py fix(terminal): bridge docker_extra_args to TERMINAL_DOCKER_EXTRA_ARGS in CLI + gateway (#50631) 2026-06-22 15:41:23 +10:00
test_terminal_exit_semantics.py
test_terminal_foreground_timeout_cap.py
test_terminal_none_command_guard.py
test_terminal_output_transform_hook.py fix(redact): stop DB-connstr redaction from corrupting code output (#33801) (#54061) 2026-06-28 01:15:39 -07:00
test_terminal_requirements.py
test_terminal_task_cwd.py fix(terminal): require approval for host-bound Docker commands (#54483) 2026-06-29 11:35:41 +10:00
test_terminal_timeout_output.py
test_terminal_tool.py test(terminal): cover sudo cache invalidation and multi-invocation piping 2026-06-25 23:08:48 +05:30
test_terminal_tool_pty_fallback.py
test_terminal_tool_requirements.py fix(tools): suppress transient check_fn flakes so subagents keep file/terminal tools 2026-06-27 19:29:00 -07:00
test_threaded_process_handle.py
test_threat_patterns.py fix(security): stop blocking AGENTS.md/SOUL.md that name an agent 'Praxis' (#52925) 2026-06-26 00:36:01 -07:00
test_tirith_security.py fix(security): add circuit breaker for tirith crashes to prevent agent hangs (#41400) 2026-06-26 15:26:08 +05:30
test_todo_tool.py
test_todo_tool_type_coercion.py fix(tools): defensive type coercion in todo_tool for malformed LLM input (#14185) 2026-06-25 23:42:42 +05:30
test_tool_backend_helpers.py
test_tool_output_limits.py
test_tool_result_storage.py
test_tool_search.py
test_transcription.py
test_transcription_command_providers.py
test_transcription_dotenv_fallback.py
test_transcription_plugin_dispatch.py
test_transcription_tools.py
test_tts_command_providers.py
test_tts_dotenv_fallback.py
test_tts_gemini.py
test_tts_kittentts.py
test_tts_max_text_length.py
test_tts_mistral.py
test_tts_opus_routing.py
test_tts_path_traversal.py
test_tts_piper.py feat(tts): expose speaker_id on built-in Piper provider 2026-06-19 07:04:58 -07:00
test_tts_plugin_dispatch.py
test_tts_speed.py
test_tts_xai_speech_tags.py feat(tts): add xAI TTS speed and optimize_streaming_latency config knobs 2026-06-19 07:26:56 -07:00
test_url_safety.py test(url-safety): cover IPv6 scope-ID strip + fail-closed in URL guards 2026-06-21 13:56:35 -07:00
test_video_analyze.py
test_video_generation_dispatch.py
test_video_generation_dynamic_schema.py
test_video_generation_tool_surface_matrix.py
test_vision_native_fast_path.py
test_vision_tools.py fix(vision): narrow the fan-out cap to the CPU encode burst only 2026-06-29 01:27:10 -07:00
test_voice_cli_integration.py
test_voice_mode.py
test_watch_patterns.py
test_web_providers.py revert(web): remove keyless Parallel search fallback (#46350) 2026-06-14 16:47:57 -07:00
test_web_providers_brave_free.py
test_web_providers_ddgs.py fix(ddgs): bound DuckDuckGo search with a wall-clock timeout (#36776) 2026-06-25 01:45:06 +05:30
test_web_providers_searxng.py revert(web): remove keyless Parallel search fallback (#46350) 2026-06-14 16:47:57 -07:00
test_web_providers_xai.py
test_web_tools_config.py revert(web): remove keyless Parallel search fallback (#46350) 2026-06-14 16:47:57 -07:00
test_web_tools_tavily.py
test_website_policy.py
test_whatsapp_send_message_media.py feat(send_message): native WhatsApp media delivery via Baileys bridge (#53598) 2026-06-27 04:40:05 -07:00
test_windows_compat.py fix(tools): use start_new_session instead of preexec_fn to prevent SIGSEGV in multi-threaded processes 2026-06-27 03:08:41 +05:30
test_windows_native_support.py revert(windows): roll back terminal-popup PRs #53791 #53810 #53829 (#53853) 2026-06-27 15:59:00 -07:00
test_write_approval.py fix(memory): honor configured char limits in the no-agent on-disk store 2026-06-23 03:10:53 +05:30
test_write_deny.py fix(file-safety): relax user-write deny policy (#45947) 2026-06-14 02:07:32 -07:00
test_x_search_tool.py
test_yolo_mode.py
test_zombie_process_cleanup.py fix(session): finalize owned SQLite session rows on AIAgent.close() 2026-06-21 11:35:09 -07:00