hermes-agent/tests/tools
victor-kyriazakos 6a7cf19302
fix(gateway,relay): stop frozen-preview finals and dropped idle-session delegation callbacks (#82592)
* fix(gateway): stop frozen-preview finals and dropped idle-session delegation callbacks

Two relay-plane delivery losses from the 2026-08-09 staging incident:

1. stream_consumer: the skip-redundant-finalize branch recorded _accumulated
   as the delivered turn-final payload even when the last ACKED edit was an
   earlier throttled preview snapshot, so delivered_final_matches reconciled
   True and the gateway suppressed the corrective final send — the user was
   left with a cut-off message ending in the streaming cursor. Extracted
   _mark_skip_redundant_finalize(): records the last acked wire payload
   (cursor-stripped), so a preview/final mismatch now returns False and the
   normal final send fires.

2. run.py: _classify_completion_target classified every ended parent session
   terminal unless it ended by compression. Idle/timeout session ends are the
   norm on scale-to-zero relay deployments and the chat route remains valid;
   completed async delegation results were terminally dropped. Ended parents
   now classify deliver unless the end was an explicit user boundary
   (session_reset / user_exit / session_switch).

* fix(relay): drain in-flight outbound frames before transport teardown

disconnect() failed every pending outbound future immediately with
'relay transport closed', so a trailing finalize edit racing turn
teardown was lost even though the connector socket could still serve
it. Bounded drain grace (5s) lets in-flight requests resolve; silent
connectors still tear down promptly. asyncio.wait (not gather+wait_for)
so a timeout doesn't cancel futures owned by the fail-remaining loop.

* fix(gateway): route completion injection through the alias-aware transport resolver

Third relay-plane delivery loss from the 2026-08-09 staging incidents: a
delegation batch completed while the gateway was up, the watcher drained
the event, and delivery vanished with no log line. _inject_watch_notification
resolved its adapter with a literal p.value == platform_name scan of
self.adapters — a relay-fronted gateway registers ONE adapter under
Platform.RELAY fronting N logical platforms, so 'slack' never matched and
the injection returned None ('no gateway route'), silently dropping the
completion. The handoff path already documents this exact trap and uses
resolve_delivery_transport; the injection path now does the same (native
wins; relay eligible only when it fronts the logical platform), with the
literal scan kept as fallback for stub runners and exotic platforms.

* fix(relay): clamp disconnect drain grace to the runner's adapter-disconnect budget

Review finding (JoaoMarcos44, #82592): a fixed 5.0s drain in front of the
three 1.0s sequential teardown awaits gives an 8.0s worst case inside the
runner's 5.0s asyncio.wait_for(adapter.disconnect()) — tripping it cancels
teardown mid-drain, skips the fail-pending loop, and leaves outbound
callers blocked until _OUTBOUND_TIMEOUT_S (30s). The effective grace is
now budget - 3*TEARDOWN - margin (env-aware via the same
HERMES_GATEWAY_ADAPTER_DISCONNECT_TIMEOUT the runner reads), so the drain
can never push teardown past its caller's budget; a budget too small for
any drain disables it cleanly.

* test(gateway): pin the final-send suppression contract across a behaviour matrix

The gateway skips its own final send when the stream consumer claims the turn
final already reached the user. Every incident in that family — #71643 (stale
finalize snapshot), #78541 (payload-less multi-message split), #82656 (frozen
preview left with a visible cursor) — is the same failure: the consumer claimed
delivery for text the platform never rendered, so the corrective send was
suppressed and the answer was lost with no retry.

Each was fixed with a scenario test pinned to one branch of
GatewayStreamConsumer.run(). The got_done handler now has five sibling branches
that each set the suppression flags and record a turn-final payload, and nothing
checks them as a group: a new branch, or a new early `return True` in
_send_or_edit, can reintroduce the class without failing a test.

Pin the invariant instead of the branch — if the consumer offers the gateway any
signal it would trust, the complete final text must have reached the wire — and
assert it across {edit always / dies / never / lies} x {send always / never} x
{fresh-final on / off} x {clean / interrupted stream}.

The adapter records only frames that actually rendered, so an ACK the platform
drops does not count as delivery. 24 honest-transport scenarios hold the
invariant as a hard assertion. The 16 lying-transport scenarios are checked too;
the single combination that still violates it is reported as an expected
failure documenting the open exposure rather than asserting it away.

Refs #82656

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(gateway,relay): prime relay egress routing for synthetic injections + cap stale completion replay

Defect #4 from the 2026-08-09 staging incidents (upgrade-robustness):
after every gateway restart the durable async-delegation replay injected
completions correctly (post-741663cf1) but their replies bounced at the
connector — 'slack egress declined: target not routed to an onboarded
tenant'. The relay adapter re-attaches tenant discriminators
(metadata.scope_id / metadata.user_id) from per-chat caches warmed ONLY by
inbound traffic; synthetic turns race those cold caches on every deploy,
scale-to-zero wake, and crash recovery.

- relay adapter: prime_routing_cache() — feeds a synthetic event's
  session-store origin through the same _capture_scope used for real
  inbound (never raises).
- run.py injection path: prime the resolved adapter before handle_message
  (duck-typed; native adapters unaffected).
- async_delegation: 48h staleness cap in restore_undelivered_completions —
  a pending completion older than the cap is terminally dropped (payload
  stays queryable) instead of re-run as a fresh full-context turn; the
  post-restart replay of a July session burned a 102K-token context.

Also carried: JoaoMarcos44's suppression behaviour-matrix harness
(cherry-picked from #82676, authorship preserved) — 39 passed + 1 xfail
(the documented ACK-then-drop transport-honesty residue).

* test: use recent timestamps in restored-ownership fixtures

test_restore_stamps_restored_flag persisted its completion with epoch-era
toy timestamps (dispatched_at=1.0), which the new 48h replay staleness cap
correctly classifies as stale — the fixture then exercised the cap instead
of the restored-flag contract (CI slice 4 failure). Timestamps are now
now-relative; the staleness behavior itself is pinned separately in
test_relay_injection_egress_priming.py.

* fix(gateway,relay): close four review findings on the relay delivery fixes

Review follow-ups on this branch (NousResearch#82592):

1. HIGH — classifier/resolver mismatch (falsely-acknowledged loss).
   _classify_completion_target now returns "deliver" for idle-ended
   parents, but _resolve_async_delegation_session still dropped every
   non-compression-ended pin: the durable row was acked at adapter
   acceptance, then the injection died inside the pipeline with no
   retry — strictly worse than the honest terminal drop on main, and
   the delivery leg defect #2's fix depends on did not exist. The
   resolver now retargets non-user-boundary ends (idle/timeout/
   lifecycle) to the chat's current session — session_entry already IS
   the routing key's current session for the same chat — while user
   boundaries (session_reset / new_session / user_exit /
   session_switch) stay fail-closed. Both sides share one module-level
   _USER_BOUNDARY_END_REASONS so the verdict and the routing decision
   cannot drift again; a coherence test asserts deliver-verdicts
   resolve non-None across representative end reasons.

2. HIGH — drain clamp missed adapter-level spend. The effective drain
   grace budgeted drain + 3x teardown, but RelayAdapter.disconnect
   spends revocation-monitor teardown + go_idle time BEFORE the
   transport drain inside the same runner wait_for; worst case still
   blew the budget and cancelled teardown mid-drain (skipping the
   fail-pending loop). The adapter now measures its own elapsed time
   and threads the REMAINING budget into
   transport.disconnect(budget_s=...); legacy/stub transports without
   the keyword fall back to the no-arg signature.

3. P1 — _request_response racing disconnect() could register a future
   after the fail-pending loop already ran, stranding the caller for
   the full _OUTBOUND_TIMEOUT_S (30s). Fail fast with the same
   "relay transport closed" error once _closing is set.

4. P1 — _build_process_event_source's last-resort reconstruction
   dropped scope_id, so a scoped relay completion whose session-store
   origin was unavailable primed no tenant discriminator and could
   still bounce off the connector's fail-closed egress guard.
   scope_id now threads through the reconstructed SessionSource, with
   a warning when a scoped chat reconstructs without one.

All four: RED reproduced with the fix reverted, GREEN after; relay/
delegation delivery families pass (43 + 71 + 179 across the touched
suites); full tests/gateway run shows only failures already failing
identically on merge base 2446c8bb6 (env/dep issues).

* fix(gateway,relay): make pending-frame failure cancellation-safe; persist completion routing origin

Two remaining review findings on this branch (NousResearch#82592):

1. Cancellation could strand outbound waiters past the fail-pending
   loop. transport.disconnect() failed pending futures only at the END
   of the drain + three teardown awaits; a cancellation landing
   mid-drain (the runner's wait_for budget, an outer cleanup deadline)
   skipped the loop entirely and left registered futures unresolved —
   their callers blocked until _OUTBOUND_TIMEOUT_S (30s). The budget
   threading added earlier shrinks the window but is not a hard
   guarantee. The fail-pending loop (and the going_idle ack failure)
   now run in a `finally`, so no exit path — normal, error, or
   cancelled — can leave a registered future unresolved. Idempotent:
   done futures are skipped, a second disconnect() pass is a no-op.

2. Durable completions did not persist their routing origin, so the
   scope_id threading in the fallback SessionSource reconstruction had
   nothing to carry on the exact path it exists for (restart replay
   with session store + source cache gone): the async-delegation event
   producers never populated scope_id and the durable rows never
   stored it. Dispatch now snapshots the originating turn's
   scope_id/user_id/user_name from the session context
   (_capture_routing_origin — a new HERMES_SESSION_SCOPE_ID contextvar
   bound by the gateway at session-bind time alongside the existing
   vars), stores them in the existing task_json payload (no schema
   migration), and re-attaches them to all three completion-event
   shapes (live single, live batch, crash-recovery rebuild). The
   gateway's fallback reconstruction then primes both discriminators
   after a restart.

Tests: cancellation mid-drain -> every pending future resolves with
"relay transport closed" (mutation: moving the loop out of the finally
goes RED); second-pass disconnect idempotence; end-to-end
dispatch -> owner-death recovery -> event carries scope_id -> fallback
SessionSource primes it (mutations: dropping the dispatch capture or
the task_json persistence both go RED); live completion event carries
the origin. 94 passed + 1 xfailed across the delivery/delegation
suites; tests/tools delegation family 73 passed (2 collection errors
pre-existing on merge base 2446c8bb6).

---------

Co-authored-by: joaomarcos <joaomarcosdias444@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Ben Barclay <ben@nousresearch.com>
2026-08-11 09:56:13 +10:00
..
__init__.py
conftest.py feat(browser): make Browser Use mode the default browser backend 2026-08-10 12:28:10 -07:00
test_accretion_caps.py
test_ansi_strip.py
test_approval.py
test_approval_config_readonly.py
test_approval_deny_rules.py
test_approval_interrupt.py
test_approval_mode_parity.py
test_approval_plugin_hooks.py
test_approved_command_clean_slate.py
test_async_delegation.py
test_async_delegation_fd_leak.py
test_audio_container.py
test_base_environment.py
test_blocked_command_guidance.py
test_blueprints.py
test_browser_camofox.py
test_browser_camofox_auth.py
test_browser_camofox_ensure_tab.py
test_browser_camofox_persistence.py
test_browser_camofox_private_page_guard.py
test_browser_camofox_state.py
test_browser_camofox_timeout.py
test_browser_cdp_override.py
test_browser_cdp_tool.py
test_browser_chromium_autoinstall.py
test_browser_chromium_check.py
test_browser_cleanup.py
test_browser_cloud_fallback.py
test_browser_cloud_provider_cache.py
test_browser_command_timeout_race.py
test_browser_console.py
test_browser_console_ssrf.py
test_browser_content_none_guard.py
test_browser_eval_ssrf.py
test_browser_eval_supervisor_path.py
test_browser_get_images_ssrf.py
test_browser_hardening.py
test_browser_headed_mode.py
test_browser_homebrew_paths.py
test_browser_hybrid_routing.py
test_browser_lightpanda.py
test_browser_open_timeout.py
test_browser_orphan_reaper.py
test_browser_private_page_action_guard.py
test_browser_secret_exfil.py
test_browser_snapshot_ssrf.py
test_browser_ssrf_local.py
test_browser_supervisor.py
test_browser_supervisor_healthcheck.py
test_browser_type_redaction.py
test_browser_use_cli.py feat(browser): make Browser Use mode the default browser backend 2026-08-10 12:28:10 -07:00
test_browser_use_session_expiry.py
test_budget_config.py
test_build_subprocess_env.py
test_checkpoint_manager.py
test_clarify_gateway.py
test_clarify_tool.py
test_clipboard.py test: convert the last host-OS fakes and guard double markers 2026-08-09 22:09:49 -04:00
test_code_execution.py test(tools): cover UTF-8 BOM input in json_parse sandbox helper 2026-08-08 12:32:23 -07:00
test_code_execution_modes.py
test_code_execution_windows_env.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_command_guards.py
test_computer_use.py
test_computer_use_approval_isolation.py
test_computer_use_capture_routing.py
test_computer_use_cua_0_9.py
test_computer_use_cua_0_10_permissions.py
test_computer_use_cua_backend_linux.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_computer_use_delivery_ladder.py
test_computer_use_null_pid_windows.py
test_computer_use_vision_routing.py
test_config_null_guard.py
test_container_cwd_sanitize.py
test_credential_files.py fix(docker): close the cold-container and multi-backend gaps in attachment delivery 2026-08-08 05:44:18 -07:00
test_credential_pool_env_fallback.py
test_cron_approval_mode.py
test_cron_prompt_injection.py
test_cronjob_run_background.py fix(cron): deliver manual runs on gateway loop 2026-08-06 23:14:55 -07:00
test_cronjob_run_immediate.py fix(cron): thread per-run prompt through cronjob(action='run') (#57331) 2026-08-06 23:14:55 -07:00
test_cronjob_tools.py
test_cross_profile_guard.py
test_daemon_pool.py
test_daytona_environment.py
test_debug_helpers.py
test_delegate.py feat(delegation): validate batch task quality before spawning children 2026-08-07 08:57:57 -07:00
test_delegate_apiserver_background.py
test_delegate_batch_validation.py fix: post-merge audit follow-ups for #81138/#81139/#81141/#81148 2026-08-08 05:21:09 -07:00
test_delegate_composite_toolsets.py
test_delegate_cost_footer.py feat(delegation): surface per-delegation cost in the result entry 2026-08-07 08:58:02 -07:00
test_delegate_kanban_isolation.py
test_delegate_output_schema.py test: use valid 2-task batches in schema-rejection tests 2026-08-07 09:07:42 -07:00
test_delegate_subagent_timeout_diagnostic.py
test_delegate_summary_budget.py
test_delegate_toolset_scope.py
test_delegation_live_log.py
test_denial_circuit_breaker.py
test_desktop_ui.py
test_discord_send_message_caption.py
test_discord_tool.py
test_docker_cgroup_limits.py
test_docker_config_migrate.py
test_docker_daemon_redirect.py
test_docker_environment.py
test_docker_find.py
test_docker_network_config.py
test_docker_orphan_reaper_integration.py
test_docker_rebootstrap_nous_session.py
test_docker_session_isolation.py fix(docker): per-session container isolation and session-scoped workspace mounts 2026-08-09 14:35:02 -07:00
test_dockerfile_immutable_install.py
test_dockerfile_node_modules_perms.py
test_dockerfile_pid1_reaping.py
test_ensure_task_env.py fix(tools): lazily bring up sandbox for vision_analyze reads 2026-08-07 09:11:48 -07:00
test_env_passthrough.py
test_env_probe.py
test_execute_code_approval_cluster.py
test_execution_flag_detection.py
test_fal_common.py
test_feishu_tools.py
test_file_operations.py feat(file-ops): clamp oversized lines in the shell pipeline before transport 2026-08-10 01:23:34 -07:00
test_file_operations_edge_cases.py feat(file-ops): clamp oversized lines in the shell pipeline before transport 2026-08-10 01:23:34 -07:00
test_file_ops_cwd_tracking.py
test_file_read_guards.py test: adapt read mocks and fifo guard test to the sentinel probe 2026-08-10 00:23:45 -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_sync_sigint.py
test_file_tools.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_file_tools_container_config.py
test_file_tools_cwd_resolution.py
test_file_tools_live.py
test_file_tools_tilde_profile.py
test_file_write_safety.py feat(security): protected agent-instruction files always require write approval 2026-08-07 08:58:38 -07:00
test_file_write_surrogate_roundtrip.py test(file_operations): pin early surrogate rejection over the backstop (#79178) 2026-08-08 12:31:19 -07:00
test_find_shell.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_flux3_video_tool.py
test_focus_pane_tool.py fix(agent): the desktop's tools reach it on remote and cloud backends too 2026-08-06 19:35:47 -06:00
test_force_dangerous_override.py
test_fuzzy_match.py
test_gateway_cwd_contract.py
test_generation_source_confinement.py fix(image_gen): confine generation source images to the terminal backend 2026-08-08 04:19:38 -07:00
test_gnu_long_option_abbreviation_bypass.py
test_hardline_blocklist.py
test_heartbeat_stale_thresholds.py
test_hermes_subprocess_env.py
test_hidden_dir_filter.py
test_homeassistant_tool.py
test_hook_output_spill.py
test_hub_lock_non_utf8_68053.py
test_image_generation.py Add more FAL models to nous portal (#82019) 2026-08-08 19:59:12 -04:00
test_image_generation_artifacts.py
test_image_generation_env.py
test_image_generation_image_to_image.py feat(media): default-on upscaling for sub-2MP image models (FAL + Krea) 2026-08-08 14:49:28 -07:00
test_image_generation_plugin_dispatch.py
test_image_source.py fix(vision): retry container exec-read for Docker cold-start, surface stderr (#76566) 2026-08-08 03:59:42 -07:00
test_init_session_cwd_respect.py
test_interrupt.py
test_kanban_comment_injection.py
test_kanban_redaction.py
test_kanban_tools.py feat(kanban): add split-brain decision-ownership contract to orchestrator guidance 2026-08-10 13:04:56 -07:00
test_lazy_deps.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_lazy_deps_durable_target.py fix(tools): preserve document extraction boundaries 2026-08-08 05:13:46 -07:00
test_lazy_deps_managed.py
test_line_ending_preservation.py
test_llm_content_none_guard.py
test_local_background_child_hang.py
test_local_cwd_permission_fallback.py
test_local_env_blocklist.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_local_env_cwd_recovery.py
test_local_env_relative_cwd.py
test_local_env_session_leak.py
test_local_env_windows_msys.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_local_interrupt_cleanup.py
test_local_shell_init.py
test_local_tempdir.py
test_managed_browserbase_and_modal.py test: stub EnvironmentConnectionError in environments.base module stub 2026-08-07 09:07:55 -07:00
test_managed_media_gateways.py
test_managed_modal_environment.py
test_managed_tool_gateway.py
test_mcp_bridge_single_failure.py
test_mcp_cancelled_error_propagation.py
test_mcp_capability_gating.py
test_mcp_circuit_breaker.py
test_mcp_client_cert.py
test_mcp_config_whitespace_warning.py
test_mcp_dashboard_oauth.py
test_mcp_discovery_cross_process.py
test_mcp_dynamic_discovery.py
test_mcp_elicitation.py
test_mcp_empty_error_message.py
test_mcp_failure_classification.py fix(mcp): let a server that 401s at startup come back after re-login 2026-08-08 02:21:36 -05:00
test_mcp_identity_header.py feat(kanban,mcp): orphaned-card reconciliation + per-server MCP identity header 2026-08-07 08:58:20 -07:00
test_mcp_image_content.py
test_mcp_initial_connect_shutdown.py fix(mcp): let a server that 401s at startup come back after re-login 2026-08-08 02:21:36 -05:00
test_mcp_invalid_url.py
test_mcp_lazy_start.py
test_mcp_list_pagination.py
test_mcp_loop_profile_override.py
test_mcp_oauth.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_mcp_oauth_bidirectional.py
test_mcp_oauth_cold_load_expiry.py
test_mcp_oauth_integration.py
test_mcp_oauth_manager.py
test_mcp_oauth_metadata.py
test_mcp_parked_self_probe.py
test_mcp_poll_loop_oom_integration.py
test_mcp_preflight_content_type.py
test_mcp_probe.py
test_mcp_rapid_drop_budget.py
test_mcp_reconnect_log_hygiene.py
test_mcp_reconnect_retry_reset.py
test_mcp_reconnect_signal.py
test_mcp_register_wakes_stale.py
test_mcp_resource_content.py
test_mcp_schema_cache.py
test_mcp_server_log_notifications.py test: read _MCP_LOGGING_CALLBACK_SUPPORTED via module after _ensure_mcp_sdk 2026-08-10 10:40:19 -07:00
test_mcp_sse_transport.py
test_mcp_stability.py
test_mcp_stdio_encoding_handler.py
test_mcp_stdio_init_timeout.py
test_mcp_stdio_watchdog.py
test_mcp_structured_content.py
test_mcp_tool.py feat(plugins): map portable Agent Plugins streamable-http entries into the native MCP runtime 2026-08-08 23:56:46 -07:00
test_mcp_tool_401_handling.py
test_mcp_tool_issue_948.py
test_mcp_tool_session_expired.py
test_mcp_transport_group_reconnect.py
test_mcp_trust_gating.py feat(mcp): trust-tier gating for write-capable MCP tools via readOnlyHint 2026-08-07 08:58:32 -07:00
test_mcp_utility_capability_gating.py
test_media_caption_split.py
test_memory_tool.py fix: finish the missing-encoding sweep — BOM-tolerant reads for user-edited stores 2026-08-08 12:32:23 -07:00
test_memory_tool_import_fallback.py
test_memory_tool_schema.py
test_microsoft_graph_auth.py
test_microsoft_graph_client.py
test_modal_bulk_upload.py
test_modal_sandbox_fixes.py
test_modal_snapshot_isolation.py
test_notify_on_complete.py
test_open_preview_tool.py fix(agent): the desktop's tools reach it on remote and cloud backends too 2026-08-06 19:35:47 -06:00
test_osv_check.py
test_parse_env_var.py
test_patch_already_applied.py
test_patch_failure_tracking.py
test_patch_multimatch_locations.py
test_patch_parser.py
test_patch_ws_diagnosis.py
test_pr_6656_regressions.py
test_process_registry.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_process_registry_write_stdin_surrogates.py fix(process_registry): surrogateescape-safe PTY stdin writes (#79178) 2026-08-08 12:31:19 -07:00
test_process_wait_clarity.py
test_read_binary_type_disclosure.py feat(file-ops): name the binary type in read_file refusals (magic-byte sniff) 2026-08-10 12:07:50 -07:00
test_read_extract.py feat(read): jq retrieval hint in notebook output truncation marker 2026-08-10 01:28:57 -07:00
test_read_file_utf8_binary_regression.py test(file-ops): end-to-end regression suite for the UTF-8-flagged-as-binary class 2026-08-08 12:34:06 -07:00
test_read_loop_detection.py
test_read_past_eof_note.py feat(tools): name the dead end — past-EOF and empty-file notes in read_file 2026-08-09 23:40:15 -07:00
test_read_preview_tool.py fix(agent): the desktop's tools reach it on remote and cloud backends too 2026-08-06 19:35:47 -06:00
test_read_shell_line_clamp.py feat(file-ops): clamp oversized lines in the shell pipeline before transport 2026-08-10 01:23:34 -07:00
test_read_special_file_guard.py feat(tools): stat-based special-file guard for read_file + readtool eval harness 2026-08-09 23:30:02 -07:00
test_read_unicode_filename_retry.py feat(tools): unicode-equivalent filename retry + near-miss suggestions in read_file 2026-08-09 23:35:07 -07:00
test_read_window_tool.py feat(agent): read_window_below tool — which OS window is underneath the desktop app 2026-08-08 12:17:50 -05:00
test_refresh_agent_mcp_tools.py
test_registry.py fix(tools): bound the exception text dispatch writes into its own log line 2026-08-08 14:56:38 +05:30
test_request_tool_approval.py
test_resolve_path.py
test_restored_delegation_ownership.py fix(gateway,relay): stop frozen-preview finals and dropped idle-session delegation callbacks (#82592) 2026-08-11 09:56:13 +10:00
test_sandbox_failure_hints.py
test_schema_sanitizer.py feat(mcp): collapse const-only anyOf/oneOf unions to property enums 2026-08-07 08:58:25 -07:00
test_search_auto_multiline.py
test_search_budget_truncation.py
test_search_error_guard.py
test_search_hidden_dirs.py
test_search_zero_match_and_multipath.py
test_self_repo_guard.py fix(tools): keep non-bash -c invocations covered by the shell guard 2026-08-08 14:56:38 +05:30
test_send_message_missing_platforms.py
test_send_message_react.py
test_send_message_slack.py
test_send_message_target_parse.py
test_send_message_telegram_proxy.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_send_message_tool.py
test_session_cwd_store.py
test_session_search.py
test_shared_container_task_id.py
test_shell_bypass_denylist.py
test_signal_media.py
test_singularity_preflight.py
test_skill_bundle_provenance.py
test_skill_env_passthrough.py
test_skill_improvements.py
test_skill_linter.py feat(skills): advisory SKILL.md convention linter on create 2026-08-08 11:12:27 -07:00
test_skill_manager_tool.py
test_skill_provenance.py
test_skill_size_limits.py
test_skill_usage.py
test_skill_view_dedup.py
test_skill_view_path_check.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_skill_view_traversal.py
test_skills_ast_audit.py
test_skills_guard.py
test_skills_hub.py feat(skills-hub): fall back to live repo for optional skills missing from local checkout 2026-08-09 23:14:18 -07:00
test_skills_hub_browse_sh.py
test_skills_hub_clawhub.py
test_skills_list_modified_diff.py
test_skills_sync.py
test_skills_sync_client.py
test_skills_tool.py
test_skills_tool_discovery_cache.py
test_skills_tool_profile_scope.py
test_slack_send_message_media.py
test_slash_confirm.py
test_smart_approval_injection.py
test_smart_approval_policy.py
test_snapshot_multiline_session_env_injection.py
test_snapshot_session_id_leak.py
test_spotify_client.py
test_ssh_bulk_upload.py
test_ssh_environment.py
test_stage2_hook_seed_one_symlinks.py
test_stage2_hook_symlink_chown.py
test_startup_latency_regressions.py perf(cli): sub-400ms warm startup — probe-mode check_fns, lazy MCP SDK, banner snapshot, parallel worktree add 2026-08-10 10:40:19 -07:00
test_stt_cloud_trim.py refactor(stt): fold review findings into the cloud silence trim 2026-08-07 19:26:04 +05:30
test_stt_default_language.py
test_stt_idle_unload.py fix(stt): close idle-unload races — strong model ref, single long-lived watcher 2026-08-07 19:26:12 +05:30
test_stt_language_resolution.py
test_stt_silence_hallucinations.py
test_subagent_steer.py fix(delegation): bind steering to session generation 2026-08-06 09:40:27 -07:00
test_subprocess_stdin_guard.py
test_subprocess_utf8_encoding.py
test_symlink_prefix_confusion.py
test_sync_back_backends.py
test_telegram_send_message_caption.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_terminal_compound_background.py
test_terminal_config_env_sync.py
test_terminal_cwd_echo.py
test_terminal_degraded_mode.py feat(terminal): graceful degradation for remote backend connection failures 2026-08-07 09:07:55 -07:00
test_terminal_env_bridge.py fix(terminal): preserve SSH remote home cwd 2026-08-07 18:41:57 -06:00
test_terminal_error_redaction.py fix(terminal-tool): redact terminal error result fields 2026-08-08 04:28:19 -07:00
test_terminal_exit_semantics.py
test_terminal_foreground_timeout_cap.py
test_terminal_hints.py
test_terminal_none_command_guard.py
test_terminal_output_transform_hook.py
test_terminal_requirements.py
test_terminal_self_repo_guard.py fix(tools): harden live source checkout guard 2026-08-08 14:56:38 +05:30
test_terminal_task_cwd.py
test_terminal_timeout_output.py
test_terminal_tool.py
test_terminal_tool_exception_redaction.py fix(security): redact terminal exception results and ACP stderr logs (#77484) 2026-08-08 04:19:49 -07:00
test_terminal_tool_pty_fallback.py
test_terminal_tool_requirements.py
test_terminal_truncation_spill.py
test_termux_api_detection.py
test_threaded_process_handle.py
test_threat_patterns.py
test_tirith_security.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_todo_tool.py
test_todo_tool_type_coercion.py
test_tool_backend_helpers.py
test_tool_output_limits.py
test_tool_result_storage.py
test_tool_search.py
test_tool_search_context_provider.py
test_transcription.py
test_transcription_command_providers.py
test_transcription_deepinfra.py
test_transcription_dotenv_fallback.py
test_transcription_plugin_dispatch.py
test_transcription_tools.py
test_tts_command_providers.py
test_tts_container_repair.py
test_tts_deepinfra.py
test_tts_dotenv_fallback.py
test_tts_gemini.py
test_tts_instructions.py
test_tts_kittentts.py
test_tts_long_form_chunking.py fix(tts): split long speech by provider and platform limits 2026-08-08 22:54:20 +05:30
test_tts_macos_output.py test: convert the last host-OS fakes and guard double markers 2026-08-09 22:09:49 -04:00
test_tts_max_text_length.py fix(tts): split long speech by provider and platform limits 2026-08-08 22:54:20 +05:30
test_tts_minimax_region.py
test_tts_mistral.py
test_tts_model_cache_lru.py
test_tts_openai_config.py
test_tts_opus_routing.py
test_tts_output_timestamp.py
test_tts_path_traversal.py
test_tts_piper.py
test_tts_plugin_dispatch.py
test_tts_prepare_spoken.py
test_tts_provider_base_urls.py
test_tts_pythonpath_fallback.py
test_tts_response_body_cap.py
test_tts_speed.py
test_tts_streaming.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_tts_streaming_e2e.py
test_tts_text_normalize.py
test_tts_xai_speech_tags.py
test_url_safety.py
test_vercel_sandbox_environment.py
test_video_analyze.py fix(video): route terminal-backend reads through the shared media resolver 2026-08-08 03:59:39 -07:00
test_video_generation_dispatch.py feat(media): opt-in upscale pass for image_generate and video_generate across FAL and Krea 2026-08-08 14:49:28 -07:00
test_video_generation_dynamic_schema.py Add more FAL models to nous portal (#82019) 2026-08-08 19:59:12 -04:00
test_video_generation_tool_surface_matrix.py Add more FAL models to nous portal (#82019) 2026-08-08 19:59:12 -04:00
test_vision_native_fast_path.py
test_vision_region.py feat(vision): optional region zoom crop on vision_analyze 2026-08-07 08:58:49 -07:00
test_vision_scale_disclosure.py feat(vision): disclose downscale factor and crop offset for coordinate mapping 2026-08-10 01:23:38 -07:00
test_vision_tools.py feat(vision): optional region zoom crop on vision_analyze 2026-08-07 08:58:49 -07:00
test_voice_cli_integration.py fix(tts): split long speech by provider and platform limits 2026-08-08 22:54:20 +05:30
test_voice_credential_pool_resolution.py
test_voice_mode.py test: convert the last host-OS fakes and guard double markers 2026-08-09 22:09:49 -04:00
test_voice_mode_playback_env_scrub.py
test_voice_stop_phrase.py
test_voice_thinking_sound.py
test_voice_tts_echo_guard.py fix(voice): require minimum evidence for fragment echo matching, use char windows 2026-08-07 14:38:02 +05:30
test_voice_wsl_pipewire.py
test_wake_word.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_watch_patterns.py
test_web_extract_robustness.py
test_web_providers.py
test_web_providers_brave_free.py
test_web_providers_ddgs.py
test_web_providers_searxng.py
test_web_providers_xai.py
test_web_tools_config.py
test_web_tools_dict_urls.py
test_web_tools_tavily.py
test_web_tools_truncate.py fix(tests): read and write test files as UTF-8 so the suite runs on Windows 2026-08-08 12:33:19 -07:00
test_website_policy.py
test_whatsapp_send_message_media.py
test_windows_compat.py fix: relax start_new_session assertion for systemd scope path 2026-08-08 01:12:16 +05:30
test_windows_native_support.py test: run os-specific tests on their real host, not a faked one 2026-08-09 22:09:49 -04:00
test_working_diff.py fix(tools): decode git output as UTF-8 in working_diff on Windows 2026-08-08 12:34:46 -07:00
test_write_approval.py
test_write_deny.py
test_write_file_syntax_gate.py
test_write_verification.py
test_x_search_tool.py
test_xai_http_credentials.py
test_xai_http_storage.py
test_yolo_mode.py
test_zombie_process_cleanup.py