============================= test session starts ==============================
platform linux -- Python 3.12.7, pytest-9.0.2, pluggy-1.5.0 -- /home/matthew/anaconda3/bin/python
cachedir: .pytest_cache
hypothesis profile 'default'
rootdir: /home/matthew/mlg-cli
configfile: pyproject.toml
plugins: asyncio-1.3.0, dash-3.3.0, mock-3.15.1, cov-7.0.0, typeguard-4.4.4, anyio-4.12.1, hypothesis-6.148.7, playwright-0.7.2, base-url-2.1.0
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function
collecting ... collected 5369 items

tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_no_inject_at_zero_tool_calls PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_no_inject_when_not_at_interval PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_inject_at_interval_no_identity PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_inject_at_interval_with_identity PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_inject_with_ledger_mission PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_inject_with_ledger_no_recap PASSED [  0%]
tests/agents/test_agents_coverage.py::TestInjectRoleAnchor::test_inject_uses_identity_id_when_no_role PASSED [  0%]
tests/agents/test_agents_coverage.py::TestAssessAgentCompletion::test_completed_status_with_tool_calls PASSED [  0%]
tests/agents/test_agents_coverage.py::TestAssessAgentCompletion::test_no_work_done_status PASSED [  0%]
tests/agents/test_agents_coverage.py::TestAssessAgentCompletion::test_stalled_via_stall_detector PASSED [  0%]
tests/agents/test_agents_coverage.py::TestAssessAgentCompletion::test_stalled_via_legacy_attribute PASSED [  0%]
tests/agents/test_agents_coverage.py::TestAssessAgentCompletion::test_no_tool_call_count_attribute PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_none_is_false PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_true_is_true PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_false_is_false PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_truthy_int_is_true PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_zero_is_false PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_truthy_object_is_true PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_list_is_true PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_nonempty_string_is_true PASSED [  0%]
tests/agents/test_agents_coverage.py::TestIsTruthyFailure::test_empty_string_is_false PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetricsController::test_update_tool_metrics PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetricsController::test_track_tool_error_with_content PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetricsController::test_track_tool_error_none_content PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetricsController::test_update_delegation_metrics_known_target PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetricsController::test_update_delegation_metrics_unknown_target PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_getitem_direct_attr PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_getitem_component_key PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_getitem_invalid_key_raises PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_contains_direct_attr PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_contains_component_key PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_contains_false_for_unknown PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_get_returns_default PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_get_returns_value PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_setitem_direct_attr PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_setitem_component_key PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_setitem_invalid_key_raises PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_reset_for_run PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_calculate_final_metrics PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_update_tool_metrics_read_file PASSED [  0%]
tests/agents/test_agents_coverage.py::TestOrchestratorMetrics::test_update_tool_metrics_non_read_file PASSED [  0%]
tests/agents/test_agents_coverage.py::TestPerformanceMetrics::test_calculate_file_re_reads_empty PASSED [  0%]
tests/agents/test_agents_coverage.py::TestPerformanceMetrics::test_calculate_file_re_reads_with_reread PASSED [  0%]
tests/agents/test_agents_coverage.py::TestPerformanceMetrics::test_track_file_access PASSED [  0%]
tests/agents/test_agents_coverage.py::TestPerformanceMetrics::test_track_tool_usage PASSED [  0%]
tests/agents/test_agents_coverage.py::TestPerformanceMetrics::test_reset PASSED [  0%]
tests/agents/test_agents_coverage.py::TestQualityMetrics::test_calculate_test_percentage PASSED [  0%]
tests/agents/test_agents_coverage.py::TestQualityMetrics::test_calculate_test_percentage_zero_total PASSED [  0%]
tests/agents/test_agents_coverage.py::TestQualityMetrics::test_reset PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_success PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_failure PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_other PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_git_ops PASSED [  0%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_edit_file PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_track_tool_call_write_file PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_calculate_error_rate PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_calculate_error_rate_zero_calls PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_get_tool_call_counts_by_category PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_reset PASSED [  1%]
tests/agents/test_agents_coverage.py::TestToolMetrics::test_calculate_final_metrics_no_duration PASSED [  1%]
tests/agents/test_agents_coverage.py::TestHelperFunctions::test_categorize_tool_known PASSED [  1%]
tests/agents/test_agents_coverage.py::TestHelperFunctions::test_categorize_tool_unknown PASSED [  1%]
tests/agents/test_agents_coverage.py::TestHelperFunctions::test_increment_counter PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCollectEvents::test_collect_content_events[asyncio] PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCollectEvents::test_collect_tool_call_events[asyncio] PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCollectEvents::test_collect_events_stop_async_iteration[asyncio] PASSED [  1%]
tests/agents/test_agents_coverage.py::TestRunToolsAndCollect::test_run_tools_increments_count[asyncio] PASSED [  1%]
tests/agents/test_agents_coverage.py::TestLastAssistantContent::test_returns_last_assistant_message PASSED [  1%]
tests/agents/test_agents_coverage.py::TestLastAssistantContent::test_returns_empty_when_no_assistant PASSED [  1%]
tests/agents/test_agents_coverage.py::TestLastAssistantContent::test_raises_when_messages_is_none PASSED [  1%]
tests/agents/test_agents_coverage.py::TestLastAssistantContent::test_raises_when_messages_is_not_list PASSED [  1%]
tests/agents/test_agents_coverage.py::TestLastAssistantContent::test_handles_non_string_content PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckColonStall::test_no_stall_when_max_retries_exceeded PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckColonStall::test_no_stall_when_content_doesnt_end_with_colon PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckColonStall::test_no_stall_when_content_too_short PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckColonStall::test_stall_detected PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckColonStall::test_stall_on_type_error PASSED [  1%]
tests/agents/test_agents_coverage.py::TestFinalizeLoop::test_finalize_with_record_delegation_errors PASSED [  1%]
tests/agents/test_agents_coverage.py::TestFinalizeLoop::test_finalize_without_record_delegation_errors PASSED [  1%]
tests/agents/test_agents_coverage.py::TestCheckTurnLimits::test_no_limit_exceeded PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAddToSharedContext::test_add_entry PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAddToSharedContext::test_size_limit_enforced PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareExecution::test_raises_when_target_agent_none PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareExecution::test_raises_when_not_agent_protocol PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareExecution::test_raises_when_messages_is_none PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareExecution::test_raises_when_clear_history_fails PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareExecution::test_success PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_basic_task_only PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_mission PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_done_when PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_requirements PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_files PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_depends_on_string PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_depends_on_list PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_background PASSED [  1%]
tests/agents/test_agents_coverage.py::TestAssembleDelegationInput::test_with_brief_context PASSED [  1%]
tests/agents/test_agents_coverage.py::TestParseCompletionReport::test_parse_full_report PASSED [  1%]
tests/agents/test_agents_coverage.py::TestParseCompletionReport::test_parse_empty_summary PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareDelegationContext::test_no_context_no_ledger PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareDelegationContext::test_with_shared_context PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareDelegationContext::test_with_prior_failure_in_ledger PASSED [  1%]
tests/agents/test_agents_coverage.py::TestPrepareDelegationContext::test_with_existing_background_and_shared_context PASSED [  1%]
tests/agents/test_completion_status.py::TestCompletionStatusEnum::test_completed_value PASSED [  1%]
tests/agents/test_completion_status.py::TestCompletionStatusEnum::test_no_work_done_value PASSED [  1%]
tests/agents/test_completion_status.py::TestCompletionStatusEnum::test_stalled_value PASSED [  1%]
tests/agents/test_completion_status.py::TestCompletionStatusEnum::test_timed_out_value PASSED [  1%]
tests/agents/test_completion_status.py::TestCompletionStatusEnum::test_all_members PASSED [  1%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_no_tool_calls_returns_no_work_done PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_tool_calls_returns_completed PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_stall_failure_returns_stalled PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_stall_failure_overrides_tool_count PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_missing_stall_failure_attr PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletion::test_missing_stall_failure_no_tools PASSED [  2%]
tests/agents/test_completion_status.py::TestRunCompletionStatus::test_no_tool_calls_emits_error_and_no_work_done PASSED [  2%]
tests/agents/test_completion_status.py::TestRunCompletionStatus::test_with_tool_calls_emits_completed PASSED [  2%]
tests/agents/test_completion_status.py::TestRunDirectCompletionStatus::test_run_direct_no_work_done PASSED [  2%]
tests/agents/test_completion_status.py::TestDelegationCompletionStatus::test_delegation_no_work_includes_status PASSED [  2%]
tests/agents/test_completion_status.py::TestOrchestratorInit::test_initial_completion_status PASSED [  2%]
tests/agents/test_completion_status.py::TestOrchestratorInit::test_initial_loop_tool_call_count PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_completed_renders_muted PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_no_work_done_renders_warning PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_stalled_renders_error PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_timed_out_renders_warning PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_missing_status_defaults_to_completed PASSED [  2%]
tests/agents/test_completion_status.py::TestAgentCompletionRendering::test_unknown_status_defaults_to_completed PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_none_tool_call_count_is_zero PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_bool_true_tool_call_count_is_one PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_bool_false_tool_call_count_is_zero PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_float_tool_call_count_coerced_to_int PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_string_numeric_tool_call_count PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_empty_string_tool_call_count_is_zero PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_invalid_string_tool_call_count_raises PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_unknown_type_tool_call_count_raises PASSED [  2%]
tests/agents/test_completion_status.py::TestAssessCompletionEdgeCases::test_negative_tool_call_count_clamped_to_zero PASSED [  2%]
tests/agents/test_config.py::test_agent_config_valid PASSED              [  2%]
tests/agents/test_config.py::test_agent_config_empty_tools PASSED        [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_agent_protocol_has_clear_history PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_agent_messages_none PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_invalid_message_type PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_no_clear_history PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_messages_not_sequence PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_clear_history_attribute_error PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_clear_history_exception PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_clear_history_not_callable PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_string_messages PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_prepare_execution_broken_sequence_indexing PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_finalize_execution_target_none[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_finalize_execution_status_str_raises[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_run_delegation_non_error_event_from_get_agent[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_run_delegation_prepare_execution_error[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_run_delegation_finalize_value_error[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_not_protocol[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_messages_none[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_messages_not_sequence[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_messages_is_string[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_no_clear_history[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_get_target_agent_clear_history_not_callable[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorExecutionMissingLines::test_run_agent_loop_none_agent[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorExecutionMissingLines::test_run_agent_loop_generator_exhausted_no_pending[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorLoopMissingLines::test_collect_events_stop_async_iteration[asyncio] PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestDelegationMissingLines::test_process_delegation_results_fallback_tool_errors PASSED [  2%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorExecutionMissingLines::test_process_no_pending_with_stall_event PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorExecutionMissingLines::test_process_no_pending_validator_none PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorInitMissingLines::test_init_orchestrator_with_none_config PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorInitMissingLines::test_init_agents_with_custom_agent_configs PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorAnchoringMissingLines::test_is_truthy_failure_none_is_false PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorAnchoringMissingLines::test_is_truthy_failure_true_is_true PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorAnchoringMissingLines::test_is_truthy_failure_false_is_false PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorAnchoringMissingLines::test_is_truthy_failure_truthy_string PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorAnchoringMissingLines::test_is_truthy_failure_empty_string PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorEventsMissingLines::test_update_ledger_no_ledger PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorEventsMissingLines::test_update_ledger_had_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorEventsMissingLines::test_update_ledger_no_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorEventsMissingLines::test_update_ledger_no_record PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorMissingLines::test_get_pool PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorMissingLines::test_get_event_bus PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorMissingLines::test_delegation_runner_property PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorLoopMissingLines::test_check_colon_stall_non_string_content PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorComponentsMissingLines::test_check_thinking_pattern_stripped_no_thinking PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorComponentsMissingLines::test_check_thinking_pattern_empty_content PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPresetsMissingLines::test_create_agent_config_default_tool_categories PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPresetsMissingLines::test_create_agent_config_no_file_edit_tools PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPresetsMissingLines::test_create_agent_config_no_git_tools PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPresetsMissingLines::test_create_agent_config_with_special_tools PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPromptsMissingLines::test_get_agent_prompt_with_team_descriptions_and_no_desc PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPromptsMissingLines::test_get_agent_prompt_member_with_no_role_parens PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPoolMissingLines::test_get_agent_with_provider_registry PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPoolMissingLines::test_get_agent_with_custom_system_prompt PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPoolMissingLines::test_reset_agent_exists PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPoolMissingLines::test_reset_agent_nonexistent PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestPresetsMissingLinesExtra::test_create_agent_config_no_basic_file_tools PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorInitMissingLinesExtra::test_initialize_orchestrator_with_config PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorInitMissingLinesExtra::test_initialize_orchestrator_without_config PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestOrchestratorLoopMissingLinesExtra::test_check_colon_stall_non_string_content PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_msg_start_not_int_raises_type_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_msg_start_negative_raises_value_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_agent_missing_messages_attr_raises_attribute_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_messages_none_raises_value_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_messages_not_sequence_raises_type_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_msg_start_exceeds_length_raises_value_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_message_without_role_raises_type_error PASSED [  3%]
tests/agents/test_coverage_gaps_agents.py::TestProcessDelegationResultsValidation::test_empty_messages_skips_validation_block PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestAddToSharedContextValidation::test_shared_context_not_list_raises_type_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestAddToSharedContextValidation::test_target_role_empty_string_raises_value_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestAddToSharedContextValidation::test_target_role_none_raises_value_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestAddToSharedContextValidation::test_summary_not_string_raises_type_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestAddToSharedContextValidation::test_parsed_not_dict_raises_type_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestExecuteLoop::test_execute_loop_non_aiter_raises_type_error_wrapped_as_runtime[asyncio] PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestRunDelegationExecuteLoopError::test_run_delegation_execute_loop_exception_yields_error[asyncio] PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestGetTargetAgentWithMockName::test_get_target_agent_success_mock_has_mock_name[asyncio] PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_msg_start_not_int_raises_type_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_msg_start_negative_raises_value_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_agent_missing_messages_raises_attribute_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_messages_is_none_raises_value_error PASSED [  3%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_messages_not_sequence_raises_type_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_msg_start_exceeds_messages_length_raises_value_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_messages_contain_non_message_objects_raises_type_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsValidation::test_messages_sequence_raises_index_error_wrapped_as_type_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_returns_none PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_returns_non_list PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_returns_list_with_none_values PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_returns_list_with_non_stringifiable_objects PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_raises_attribute_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_raises_type_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_fallback_to_delegation_tool_errors_attribute PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_fallback_delegation_tool_errors_not_list PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_fallback_delegation_tool_errors_none PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_no_tool_errors_methods_available PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_tool_errors_empty_list PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_tool_errors_slicing_with_few_errors PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_tool_errors_slicing_with_many_errors PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_get_delegation_errors_raises_unexpected_exception PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_inner_type_error_value_error_caught PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestProcessDelegationResultsToolErrors::test_fallback_path_inner_type_error_value_error_caught PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestParseCompletionReportTypeCheck::test_non_string_raises_type_error PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_stalled_passes_through_unchanged PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_no_work_done_passes_through_unchanged PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_completed_with_failure_status_downgraded PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_completed_with_blockers_downgraded PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_completed_with_empty_report_stays_completed PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_completed_with_ok_status_stays_completed PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestEnrichCompletionFromReport::test_status_token_matching_is_case_insensitive PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestScoreContextRelevance::test_same_agent_gets_role_bonus PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestScoreContextRelevance::test_different_agent_no_role_bonus PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestScoreContextRelevance::test_keyword_overlap_increases_score PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestScoreContextRelevance::test_empty_task_only_role_bonus PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestScoreContextRelevance::test_files_modified_contributes_to_overlap PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestRunParallelDelegations::test_parallel_delegations_emit_all_events PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestRunParallelDelegations::test_empty_params_list_emits_no_events PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestDelegationControllerRetry::test_retry_on_error_creates_new_ledger_record PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestDelegationControllerRetry::test_no_retry_when_retries_zero PASSED [  4%]
tests/agents/test_delegation_coverage_100.py::TestAgentPoolModelOverride::test_model_override_applied_to_provider PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_tech_lead_delegates_to_coder_who_uses_tools PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_coder_tool_result_is_in_coder_messages PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_delegation_depth_limit PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_delegation_to_unknown_agent PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_tech_lead_uses_own_tools_without_delegation PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_multiple_tool_calls_in_single_turn PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_delegate_plus_tool_in_same_turn PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_coder_multiple_tool_iterations PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_streaming_delegation_summary_not_doubled PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_ledger_injected_into_tech_lead_context PASSED [  4%]
tests/agents/test_delegation_e2e.py::TestDelegateTaskEndToEnd::test_ledger_tracks_failed_delegation PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_with_get_delegation_errors PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_with_delegation_tool_errors_attr PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_with_no_error_methods PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_with_none_errors PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_with_non_list_errors PASSED [  4%]
tests/agents/test_delegation_error_handling.py::test_fetch_agent_errors_exception_handling PASSED [  5%]
tests/agents/test_delegation_error_handling.py::test_collect_tool_errors PASSED [  5%]
tests/agents/test_delegation_error_handling.py::test_get_status_value PASSED [  5%]
tests/agents/test_identity.py::test_agent_identity_creation PASSED       [  5%]
tests/agents/test_identity.py::test_agent_identity_str PASSED            [  5%]
tests/agents/test_infinite_loop_fix.py::test_infinite_loop_on_generator_exhaustion PASSED [  5%]
tests/agents/test_infinite_loop_fix.py::test_generator_exhaustion_with_colon_stall PASSED [  5%]
tests/agents/test_infinite_loop_fix.py::test_missing_validator_attribute PASSED [  5%]
tests/agents/test_infinite_loop_fix.py::test_normal_generator_completion PASSED [  5%]
tests/agents/test_infinite_loop_fix.py::test_generator_with_tool_calls PASSED [  5%]
tests/agents/test_ledger.py::TestDelegationRecord::test_defaults PASSED  [  5%]
tests/agents/test_ledger.py::TestDelegationRecord::test_custom_status PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_init PASSED            [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_add_delegation PASSED  [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_complete_delegation PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_complete_delegation_truncates_summary PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_fail_delegation PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_fail_delegation_truncates PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_render_empty PASSED    [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_render_with_delegations PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_render_with_failures PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_render_collapses_old_entries PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedger::test_render_progress_counts PASSED [  5%]
tests/agents/test_ledger.py::TestDelegationStatus::test_values PASSED    [  5%]
tests/agents/test_ledger.py::TestDelegationStatus::test_is_str PASSED    [  5%]
tests/agents/test_ledger.py::TestChecklistItem::test_defaults PASSED     [  5%]
tests/agents/test_ledger.py::TestChecklistItem::test_mark_done PASSED    [  5%]
tests/agents/test_ledger.py::TestTaskLedgerChecklist::test_add_checklist_item PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerChecklist::test_check_item PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerChecklist::test_check_item_out_of_range PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerChecklist::test_render_shows_checklist PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerVerification::test_default_unverified PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerVerification::test_mark_verified PASSED [  5%]
tests/agents/test_ledger.py::TestTaskLedgerVerification::test_mission_recap_shows_verification PASSED [  5%]
tests/agents/test_ledger.py::TestMissionRecap::test_recap_empty PASSED   [  5%]
tests/agents/test_ledger.py::TestMissionRecap::test_recap_with_checklist PASSED [  5%]
tests/agents/test_ledger.py::TestMissionRecap::test_recap_with_delegations PASSED [  5%]
tests/agents/test_ledger.py::TestMissionRecap::test_render_includes_mission_recap PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_format_progress_line_type_error PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_render_checklist_section_empty PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_render_checklist_section_with_items PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_check_item_valid_index PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_fail_delegation_with_keyword_args PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_mission_recap_with_checklist_and_delegations PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_render_delegations_section_empty PASSED [  5%]
tests/agents/test_ledger_coverage.py::TestCoverageGaps::test_render_delegations_section_with_collapsed PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestProgressCountsEdgeCases::test_progress_counts_zero_values PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestProgressCountsEdgeCases::test_progress_counts_large_values PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestChecklistItemEdgeCases::test_checklist_item_empty_description PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestChecklistItemEdgeCases::test_checklist_item_long_description PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestDelegationRecordEdgeCases::test_delegation_record_empty_strings PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestDelegationRecordEdgeCases::test_delegation_record_long_summary PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestDelegationRecordEdgeCases::test_delegation_record_format_line_empty_summary PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestDelegationRecordEdgeCases::test_delegation_record_format_line_newlines PASSED [  5%]
tests/agents/test_ledger_edge_cases.py::TestDelegationRecordEdgeCases::test_delegation_record_format_line_custom_length PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestLedgerRendererEdgeCases::test_renderer_empty_ledger PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestLedgerRendererEdgeCases::test_renderer_max_entries_zero PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestLedgerRendererEdgeCases::test_renderer_max_entries_negative PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestLedgerRendererEdgeCases::test_renderer_static_method PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestLedgerRendererEdgeCases::test_get_visible_delegations_edge_cases PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_add_checklist_item_duplicate PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_check_item_invalid_index PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_complete_delegation_long_summary PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_fail_delegation_empty_reason PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_mission_recap_edge_cases PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_render_custom_max_entries PASSED [  6%]
tests/agents/test_ledger_edge_cases.py::TestTaskLedgerEdgeCases::test_ledger_repr PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_add_checklist_item_duplicate_prevention PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_add_delegation_duplicate_prevention PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_check_item_negative_index PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_check_item_large_index PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_complete_delegation_empty_summary PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_fail_delegation_empty_reason PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_mission_recap_no_checklist PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_mission_recap_all_done PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_render_max_entries_zero PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerEdgeCases::test_render_max_entries_negative PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_get_visible_delegations_empty PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_get_visible_delegations_zero_max PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_get_visible_delegations_negative_max PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_format_progress_line_counts_object PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_format_progress_line_individual_params PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_format_progress_line_invalid_args PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_render_delegations_section_empty PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_render_static_with_ledger PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_get_delegation_counts_static PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestLedgerRendererEdgeCases::test_count_delegations_by_status_static PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestProgressCounts::test_init PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestProgressCounts::test_total_consistency PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestDelegationRecordEdgeCases::test_format_line_long_summary PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestDelegationRecordEdgeCases::test_format_line_no_summary PASSED [  6%]
tests/agents/test_ledger_refactor.py::TestDelegationRecordEdgeCases::test_get_icon_all_statuses PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_get_delegation_counts_as_static_method PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_render_delegations_section_feature_envy_fix PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_count_delegations_by_status_duplicate_code_fix PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_render_method_duplicate_code_fix PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_complete_delegation_duplicate_code_fix PASSED [  6%]
tests/agents/test_ledger_refactoring.py::TestLedgerRefactoring::test_add_checklist_item_and_add_delegation_common_pattern PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_shared_count_delegations_by_status PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_shared_get_delegation_counts PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_format_progress_line_primitive_obsession_fix PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_format_progress_line_feature_envy_fix PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_add_item_factory_eliminates_duplicate_code PASSED [  6%]
tests/agents/test_ledger_refactoring_smells.py::TestLedgerDuplicateCodeFixes::test_render_static_duplicate_code PASSED [  6%]
tests/agents/test_ledger_smell_fixes.py::TestPrimitiveObsessionFix::test_format_progress_line_with_counts_object PASSED [  6%]
tests/agents/test_ledger_smell_fixes.py::TestPrimitiveObsessionFix::test_format_progress_line_with_individual_params PASSED [  6%]
tests/agents/test_ledger_smell_fixes.py::TestPrimitiveObsessionFix::test_format_progress_line_mixed_params_error PASSED [  6%]
tests/agents/test_ledger_smell_fixes.py::TestPrimitiveObsessionFix::test_format_progress_line_missing_params_error PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestDuplicateCodeFixes::test_add_checklist_item_vs_add_delegation_pattern PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestDuplicateCodeFixes::test_complete_delegation_truncation PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestDuplicateCodeFixes::test_fail_delegation_truncation PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestDuplicateCodeFixes::test_update_delegation_internal_helper PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestRendererEdgeCases::test_get_visible_delegations_zero_max_entries PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestRendererEdgeCases::test_get_visible_delegations_negative_max_entries PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestRendererEdgeCases::test_render_with_empty_checklist PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestRendererEdgeCases::test_render_with_empty_delegations PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestRendererEdgeCases::test_mission_recap_edge_cases PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestTypeHintsAndDocstrings::test_all_public_methods_have_type_hints PASSED [  7%]
tests/agents/test_ledger_smell_fixes.py::TestTypeHintsAndDocstrings::test_docstring_completeness PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_metrics_reporter_init PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_get_metrics_report_default PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_get_metrics_report_with_data PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_task_completion_time_not_completed PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_task_completion_time_completed PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_files_accessed PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_tool_usage_empty PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_tool_usage_with_data PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_delegation_rate PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_test_results_no_tests PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_test_results_with_data PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_code_coverage_not_measured PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_code_coverage_with_data PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_linting_status PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_documentation_coverage_not_measured PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_documentation_coverage_with_data PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_file_re_reads PASSED  [  7%]
tests/agents/test_metrics_reporter.py::test_format_delegation_target_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_delegation_target_not_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_error_rate_target_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_error_rate_target_not_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_context_window_target_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_context_window_target_not_met PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_format_tool_call_statistics PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_generate_detailed_statistics_with_delegation_breakdown PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_generate_detailed_statistics_without_delegation PASSED [  7%]
tests/agents/test_metrics_reporter.py::test_max_tool_usage_constant PASSED [  7%]
tests/agents/test_orchestrator.py::test_orchestrator_run_basic PASSED    [  7%]
tests/agents/test_orchestrator.py::test_orchestrator_delegation_interception PASSED [  7%]
tests/agents/test_orchestrator.py::test_cross_delegation_handoff_notes PASSED [  7%]
tests/agents/test_orchestrator.py::test_orchestrator_ledger_has_checklist_support PASSED [  7%]
tests/agents/test_orchestrator.py::test_delegation_clears_agent_history PASSED [  7%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_task_only PASSED [  7%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_empty_brief PASSED [  7%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_full_brief PASSED [  7%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_partial_brief PASSED [  7%]
tests/agents/test_orchestrator.py::test_agent_stall_detection_colon_ending PASSED [  7%]
tests/agents/test_orchestrator.py::test_agent_stall_failure_flag_after_max_nudges PASSED [  7%]
tests/agents/test_orchestrator.py::test_agent_stall_resets_on_tool_calls PASSED [  7%]
tests/agents/test_orchestrator.py::test_agent_stall_detection_disabled_flag PASSED [  7%]
tests/agents/test_orchestrator.py::test_agent_no_stall_on_genuine_content PASSED [  7%]
tests/agents/test_orchestrator.py::test_stall_nudge_triggers_continuation PASSED [  7%]
tests/agents/test_orchestrator.py::test_stall_failure_reported_after_max_nudges PASSED [  8%]
tests/agents/test_orchestrator.py::test_tech_lead_exempt_from_stall_failure PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_done_when PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_no_done_when PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_full PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_empty PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_partial PASSED [  8%]
tests/agents/test_orchestrator.py::test_delegation_turn_limit PASSED     [  8%]
tests/agents/test_orchestrator.py::test_build_timeout_summary_with_tools PASSED [  8%]
tests/agents/test_orchestrator.py::test_build_timeout_summary_empty PASSED [  8%]
tests/agents/test_orchestrator.py::test_tool_error_aggregation PASSED    [  8%]
tests/agents/test_orchestrator.py::test_max_delegation_turns_setting PASSED [  8%]
tests/agents/test_orchestrator.py::test_thinking_pattern_validation PASSED [  8%]
tests/agents/test_orchestrator.py::test_thinking_pattern_metrics PASSED  [  8%]
tests/agents/test_orchestrator.py::test_delegation_metrics PASSED        [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_with_mission PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_without_mission PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_with_depends_on PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_no_depends_on PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_mission_no_brief PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_blockers PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_handoff_notes PASSED [  8%]
tests/agents/test_orchestrator.py::test_parse_completion_report_artifacts PASSED [  8%]
tests/agents/test_orchestrator.py::test_orchestrator_metrics_class_initialization PASSED [  8%]
tests/agents/test_orchestrator.py::test_orchestrator_metrics_initialization PASSED [  8%]
tests/agents/test_orchestrator.py::test_update_tool_metrics PASSED       [  8%]
tests/agents/test_orchestrator.py::test_calculate_final_metrics PASSED   [  8%]
tests/agents/test_orchestrator.py::test_get_metrics_report PASSED        [  8%]
tests/agents/test_orchestrator.py::test_reset_metrics_for_run PASSED     [  8%]
tests/agents/test_orchestrator.py::test_last_assistant_content_found PASSED [  8%]
tests/agents/test_orchestrator.py::test_last_assistant_content_empty PASSED [  8%]
tests/agents/test_orchestrator.py::test_last_assistant_content_skips_empty PASSED [  8%]
tests/agents/test_orchestrator.py::test_colon_stall_guard_nudges_agent PASSED [  8%]
tests/agents/test_orchestrator.py::test_colon_stall_guard_skips_short_responses PASSED [  8%]
tests/agents/test_orchestrator.py::test_colon_stall_guard_respects_max_retries PASSED [  8%]
tests/agents/test_orchestrator.py::test_colon_stall_guard_resets_on_non_colon PASSED [  8%]
tests/agents/test_orchestrator.py::test_regular_tool_calls_are_executed_before_continue PASSED [  8%]
tests/agents/test_orchestrator.py::test_multiple_tool_calls_all_executed PASSED [  8%]
tests/agents/test_orchestrator.py::test_prepare_delegation_context_type_safety PASSED [  8%]
tests/agents/test_orchestrator.py::test_race_condition_on_agent_errors PASSED [  8%]
tests/agents/test_orchestrator.py::test_silent_failure_when_validator_missing PASSED [  8%]
tests/agents/test_orchestrator.py::test_assemble_delegation_input_files_as_string PASSED [  8%]
tests/agents/test_pool.py::test_create_scoped_registry PASSED            [  8%]
tests/agents/test_pool.py::test_agent_pool_lazy_init PASSED              [  8%]
tests/agents/test_pool.py::test_agent_pool_list_agents PASSED            [  8%]
tests/agents/test_pool.py::test_agent_pool_reset PASSED                  [  8%]
tests/agents/test_pool.py::test_create_scoped_registry_with_extra_tools PASSED [  8%]
tests/agents/test_pool.py::test_create_scoped_registry_copies_confirmation_handler PASSED [  8%]
tests/agents/test_pool.py::test_agent_pool_get_identity PASSED           [  8%]
tests/agents/test_pool.py::test_agent_pool_list_active_agents PASSED     [  8%]
tests/agents/test_pool.py::test_agent_pool_reset_all PASSED              [  8%]
tests/agents/test_pool.py::test_agent_pool_shutdown PASSED               [  8%]
tests/agents/test_presets.py::test_get_default_team PASSED               [  8%]
tests/agents/test_presets.py::test_tech_lead_tools PASSED                [  8%]
tests/agents/test_presets.py::test_planner_tools PASSED                  [  9%]
tests/agents/test_presets.py::test_explorer_tools PASSED                 [  9%]
tests/agents/test_presets.py::test_engineer_tools PASSED                 [  9%]
tests/agents/test_presets.py::test_data_engineer_tools PASSED            [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_leader PASSED        [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_explorer PASSED      [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_with_team PASSED     [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_with_delegation PASSED [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_planner PASSED       [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_engineer PASSED      [  9%]
tests/agents/test_prompts.py::test_leader_prompt_references_specialists PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_recon_first PASSED  [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_scope_sentinel PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_no_write_tools PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_verification_lock PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_cleanup_habit PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_agent_workspace PASSED [  9%]
tests/agents/test_prompts.py::test_explorer_prompt_has_delegation_summary PASSED [  9%]
tests/agents/test_prompts.py::test_explorer_prompt_has_agent_workspace PASSED [  9%]
tests/agents/test_prompts.py::test_leader_prompt_has_knowledge_graph PASSED [  9%]
tests/agents/test_prompts.py::test_explorer_prompt_has_knowledge_graph PASSED [  9%]
tests/agents/test_prompts.py::test_prompt_fragments_are_nonempty PASSED  [  9%]
tests/agents/test_prompts.py::test_planner_prompt_has_delegation_summary PASSED [  9%]
tests/agents/test_prompts.py::test_planner_prompt_has_agent_workspace PASSED [  9%]
tests/agents/test_prompts.py::test_planner_prompt_has_knowledge_graph PASSED [  9%]
tests/agents/test_prompts.py::test_engineer_prompt_has_delegation_summary PASSED [  9%]
tests/agents/test_prompts.py::test_engineer_prompt_has_verification_lock PASSED [  9%]
tests/agents/test_prompts.py::test_engineer_prompt_has_lint_on_write PASSED [  9%]
tests/agents/test_prompts.py::test_planner_instructions_nonempty PASSED  [  9%]
tests/agents/test_prompts.py::test_engineer_instructions_nonempty PASSED [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_data_engineer PASSED [  9%]
tests/agents/test_prompts.py::test_data_engineer_prompt_has_delegation_summary PASSED [  9%]
tests/agents/test_prompts.py::test_data_engineer_prompt_has_agent_workspace PASSED [  9%]
tests/agents/test_prompts.py::test_data_engineer_prompt_has_verification_lock PASSED [  9%]
tests/agents/test_prompts.py::test_data_engineer_prompt_has_lint_on_write PASSED [  9%]
tests/agents/test_prompts.py::test_data_engineer_instructions_nonempty PASSED [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_with_environment_context PASSED [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_without_environment_context PASSED [  9%]
tests/agents/test_prompts.py::test_get_agent_prompt_env_context_all_roles PASSED [  9%]
tests/agents/test_prompts.py::test_new_prompt_fragments_are_nonempty PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_checklist_in_leader PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_examples_in_leader PASSED  [  9%]
tests/agents/test_prompts.py::test_re_delegation_rule_in_leader PASSED   [  9%]
tests/agents/test_prompts.py::test_task_granularity_check_in_thinking_protocol PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_summary_has_blockers_field PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_summary_has_handoff_notes_field PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_summary_has_artifacts_field PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_summary_has_failure_analysis PASSED [  9%]
tests/agents/test_prompts.py::test_delegation_summary_has_output_audience PASSED [  9%]
tests/agents/test_prompts.py::test_checkpoint_discipline_in_specialist_thinking PASSED [  9%]
tests/agents/test_prompts.py::test_blocker_protocol_in_all_specialists PASSED [  9%]
tests/agents/test_prompts.py::test_convention_awareness_in_all_specialists PASSED [  9%]
tests/agents/test_prompts.py::test_engineer_has_plan_awareness PASSED    [  9%]
tests/agents/test_prompts.py::test_planner_has_engineer_handoff PASSED   [ 10%]
tests/agents/test_prompts.py::test_get_agent_prompt_with_team_descriptions PASSED [ 10%]
tests/agents/test_prompts.py::test_get_agent_prompt_team_descriptions_fallback PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_thinking_protocol_in_leader_prompt PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_delegation_matrix_in_leader_prompt PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_specialist_thinking_in_planner_prompt PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_specialist_thinking_in_explorer_prompt PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_specialist_thinking_in_engineer_prompt PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_thinking_format_requirements PASSED [ 10%]
tests/agents/test_thinking_protocol.py::test_delegation_priority_rules PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntry::test_entry_creation PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntry::test_entry_to_dict PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntry::test_entry_from_dict PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_creation PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_file PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_file_does_not_modify_input PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_decision PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_completed_step PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_next_action PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_insight PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_problem PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_update_problem PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_update_problem_not_found PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_update_problem_invalid_input PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_problem_invalid_input PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_add_problem_invalid_input_raises PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_with_multiple_entries PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_already_read_full PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_no_line_range PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_overlapping_lines PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_different_lines PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_full_read PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_invalid_lines_read PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_overlap_but_not_contained PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_get_file_insights PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_get_file_insights_multiple_entries PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_update_after_read PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_prune_recent_files PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_prune_recent_files_no_pruning_needed PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_to_dict PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_from_dict PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_save_and_load PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_multiple_entries_same_file PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_invalid_lines_read_and_invalid_line_numbers PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_invalid_line_numbers PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_invalid_line_numbers_partial_range PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_invalid_line_numbers_with_full_read PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_full_with_whitespace PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_full_then_partial PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_multiple_partials_cover_range PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_full_then_partial_bug PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_path_normalization_bug PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemory::test_memory_should_read_file_partial_range_specification_bug PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntryValidation::test_entry_validation_invalid_lines_read PASSED [ 10%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntryValidation::test_entry_validation_valid_lines_read PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntryValidation::test_entry_validation_lines_read_type_error PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEntryValidation::test_entry_validation_key_insights_type_error PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEdgeCases::test_should_read_file_edge_cases PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEdgeCases::test_update_problem_not_found PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEdgeCases::test_add_problem_invalid_type PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemoryEdgeCases::test_update_problem_invalid_type PASSED [ 11%]
tests/agents/test_working_memory.py::TestLineRangeEdgeCases::test_line_range_from_str_edge_cases PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystemEdgeCases::test_get_current_memory_when_no_current_task PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystemEdgeCases::test_archive_current_memory_when_no_current_task PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_system_creation PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_create_memory PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_switch_memory PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_switch_memory_not_found PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_archive_current_memory PASSED [ 11%]
tests/agents/test_working_memory.py::TestWorkingMemorySystem::test_archive_current_memory_no_current PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_normalize_path PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_parse_line_range_valid PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_parse_line_range_invalid_format PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_parse_line_range_invalid_numbers PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_parse_line_range_single_number PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_parse_line_range_multiple_ranges PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_line_range_overlaps_true PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_line_range_overlaps_false PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_line_range_invalid_start_gt_end PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_line_range_positive_line_numbers PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_memory_should_read_file_missing_return_bug PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_memory_should_read_file_lines_read_none PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_memory_should_read_file_full_with_invalid_line_numbers_bug PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_memory_parse_line_ranges_unicode_dash_bug PASSED [ 11%]
tests/agents/test_working_memory.py::TestHelperFunctions::test_memory_parse_line_ranges_invalid_parts_silently_ignored_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_bug.py::test_memory_should_read_file_merge_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_bug.py::test_memory_should_read_file_covered_by_multiple PASSED [ 11%]
tests/agents/test_working_memory_actual_bug.py::test_memory_should_read_file_edge_case_merge PASSED [ 11%]
tests/agents/test_working_memory_actual_bug.py::test_memory_should_read_file_empty_ranges PASSED [ 11%]
tests/agents/test_working_memory_actual_core_bug.py::test_should_read_file_bool_input_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_core_bug.py::test_should_read_file_none_handling_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_core_bug.py::test_line_range_overlaps_edge_case_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_core_bug.py::test_merge_ranges_adjacent_bug PASSED [ 11%]
tests/agents/test_working_memory_actual_core_bug.py::test_real_core_bug_should_read_file_with_invalid_lines_read PASSED [ 11%]
tests/agents/test_working_memory_algorithm_bug.py::test_should_read_file_coverage_algorithm_bug PASSED [ 11%]
tests/agents/test_working_memory_algorithm_bug.py::test_should_read_file_adjacent_ranges PASSED [ 11%]
tests/agents/test_working_memory_algorithm_bug.py::test_should_read_file_overlapping_ranges PASSED [ 11%]
tests/agents/test_working_memory_algorithm_bug.py::test_should_read_file_single_range_covered PASSED [ 11%]
tests/agents/test_working_memory_algorithm_bug.py::test_should_read_file_single_range_not_covered PASSED [ 11%]
tests/agents/test_working_memory_bool_bug.py::test_should_read_file_with_bool_start PASSED [ 11%]
tests/agents/test_working_memory_bool_bug.py::test_should_read_file_with_bool_end PASSED [ 11%]
tests/agents/test_working_memory_bool_bug.py::test_should_read_file_with_bool_false PASSED [ 11%]
tests/agents/test_working_memory_bug.py::test_memory_should_read_file_empty_lines_read PASSED [ 11%]
tests/agents/test_working_memory_bug_end_minus_one.py::test_memory_should_read_file_end_minus_one PASSED [ 11%]
tests/agents/test_working_memory_bug_end_minus_one.py::test_memory_should_read_file_start_minus_one PASSED [ 11%]
tests/agents/test_working_memory_bug_end_minus_one.py::test_memory_should_read_file_both_minus_one PASSED [ 11%]
tests/agents/test_working_memory_bug_end_minus_one.py::test_memory_should_read_file_end_zero PASSED [ 11%]
tests/agents/test_working_memory_bug_error_message.py::test_error_message_single_entry PASSED [ 11%]
tests/agents/test_working_memory_bug_error_message.py::test_error_message_multiple_entries PASSED [ 12%]
tests/agents/test_working_memory_bug_error_message.py::test_error_message_full_read PASSED [ 12%]
tests/agents/test_working_memory_bug_find.py::test_memory_should_read_file_start_equals_end PASSED [ 12%]
tests/agents/test_working_memory_bug_find.py::test_memory_should_read_file_start_gt_end_validation PASSED [ 12%]
tests/agents/test_working_memory_bug_find.py::test_memory_should_read_file_float_validation PASSED [ 12%]
tests/agents/test_working_memory_bug_find.py::test_memory_should_read_file_string_validation PASSED [ 12%]
tests/agents/test_working_memory_bug_find.py::test_memory_should_read_file_none_start_valid_end PASSED [ 12%]
tests/agents/test_working_memory_bug_validation.py::test_working_memory_entry_accepts_invalid_lines_read PASSED [ 12%]
tests/agents/test_working_memory_bug_validation.py::test_working_memory_entry_accepts_empty_string PASSED [ 12%]
tests/agents/test_working_memory_bug_validation_order.py::test_should_read_file_full_with_invalid_line_numbers_bug PASSED [ 12%]
tests/agents/test_working_memory_bug_validation_order.py::test_should_read_file_partial_range_invalid_line_numbers_bug PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_completely_covered PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_edge_case_at_boundary PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_single_line PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_single_line_not_read PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_with_full PASSED [ 12%]
tests/agents/test_working_memory_core_bug.py::test_should_read_file_with_full_and_ranges PASSED [ 12%]
tests/agents/test_working_memory_dash_inconsistency.py::test_line_range_from_str_vs_parse_line_ranges_inconsistency PASSED [ 12%]
tests/agents/test_working_memory_deserialization_bug.py::test_deserialization_bug_invalid_lines_read PASSED [ 12%]
tests/agents/test_working_memory_deserialization_bug.py::test_working_memory_deserialization_bug PASSED [ 12%]
tests/agents/test_working_memory_edge_case_bug.py::test_should_read_file_end_minus_one_with_start_none PASSED [ 12%]
tests/agents/test_working_memory_edge_case_bug.py::test_should_read_file_end_minus_one_with_start_gt_end PASSED [ 12%]
tests/agents/test_working_memory_edge_case_bug.py::test_should_read_file_end_minus_one_converted_to_none PASSED [ 12%]
tests/agents/test_working_memory_edge_case_bug.py::test_should_read_file_validation_order_bug PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_merge_ranges_empty_list PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_merge_ranges_single_range PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_merge_ranges_unsorted PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_merge_ranges_fully_overlapping PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_line_range_validation PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_should_read_file_edge_cases PASSED [ 12%]
tests/agents/test_working_memory_edge_cases.py::test_parse_line_ranges_edge_cases PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug.py::test_memory_empty_lines_read PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug.py::test_memory_whitespace_lines_read PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug.py::test_memory_none_lines_read PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug_fix.py::test_empty_lines_read_not_invalid_format PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug_fix.py::test_whitespace_only_lines_read_is_invalid PASSED [ 12%]
tests/agents/test_working_memory_empty_lines_read_bug_fix.py::test_empty_vs_whitespace_consistency PASSED [ 12%]
tests/agents/test_working_memory_end_minus_one_bug.py::test_should_read_file_end_minus_one_with_invalid_start_bug PASSED [ 12%]
tests/agents/test_working_memory_end_minus_one_bug.py::test_should_read_file_end_minus_one_with_start_greater_than_end_bug PASSED [ 12%]
tests/agents/test_working_memory_end_minus_one_bug.py::test_should_read_file_validation_order_bug PASSED [ 12%]
tests/agents/test_working_memory_entry_validation_bug.py::test_working_memory_entry_validation_bug PASSED [ 12%]
tests/agents/test_working_memory_error_message.py::test_should_read_file_invalid_range_error_message PASSED [ 12%]
tests/agents/test_working_memory_error_message.py::test_should_read_file_invalid_line_numbers_error_messages PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_parse_line_ranges_empty_string PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_parse_line_ranges_whitespace_only PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_parse_line_ranges_invalid_characters PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_parse_line_ranges_leading_zeros PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_parse_line_ranges_unicode_digits PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_validate_lines_read_empty_string PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_validate_lines_read_whitespace_only PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_validate_lines_read_inconsistent_with_parse PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_should_read_file_with_zero_line PASSED [ 12%]
tests/agents/test_working_memory_find_bug.py::test_should_read_file_validation_order PASSED [ 12%]
tests/agents/test_working_memory_float_bug.py::test_should_read_file_with_float_minus_one PASSED [ 13%]
tests/agents/test_working_memory_float_bug.py::test_should_read_file_with_float_minus_one_point_five PASSED [ 13%]
tests/agents/test_working_memory_float_bug.py::test_should_read_file_type_safety_bug PASSED [ 13%]
tests/agents/test_working_memory_float_minus_one_bug.py::test_should_read_file_with_end_float_minus_one PASSED [ 13%]
tests/agents/test_working_memory_float_minus_one_bug.py::test_should_read_file_with_end_float_minus_one_no_start PASSED [ 13%]
tests/agents/test_working_memory_float_minus_one_bug.py::test_should_read_file_with_end_float_minus_one_partial PASSED [ 13%]
tests/agents/test_working_memory_float_minus_one_bug.py::test_should_read_file_with_end_int_minus_one PASSED [ 13%]
tests/agents/test_working_memory_float_precision_bug.py::test_memory_should_read_file_float_precision_bug PASSED [ 13%]
tests/agents/test_working_memory_four_lenses_bug_fix.py::test_should_read_file_negative_end_other_than_minus_one PASSED [ 13%]
tests/agents/test_working_memory_four_lenses_bug_fix.py::test_should_read_file_start_gt_end_with_negative_end PASSED [ 13%]
tests/agents/test_working_memory_four_lenses_bug_fix.py::test_should_read_file_end_minus_one_with_start PASSED [ 13%]
tests/agents/test_working_memory_full_contains_bug.py::test_lines_read_contains_full_but_not_exact PASSED [ 13%]
tests/agents/test_working_memory_full_contains_bug.py::test_lines_read_full_with_extra_spaces PASSED [ 13%]
tests/agents/test_working_memory_full_contains_bug.py::test_lines_read_full_with_other_text PASSED [ 13%]
tests/agents/test_working_memory_full_contains_bug.py::test_lines_read_multiple_parts_with_full PASSED [ 13%]
tests/agents/test_working_memory_full_contains_bug.py::test_parse_line_ranges_with_full_and_ranges PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_full_comma_range_bug PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_range_comma_full_bug PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_full_with_spaces_bug PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_uppercase_full_bug PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_exact_full_still_works PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug.py::test_should_read_file_full_with_whitespace_still_works PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug_fix.py::test_parse_line_ranges_full_with_ranges PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug_fix.py::test_parse_line_ranges_ranges_with_full PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug_fix.py::test_parse_line_ranges_full_alone PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug_fix.py::test_parse_line_ranges_multiple_full PASSED [ 13%]
tests/agents/test_working_memory_full_token_bug_fix.py::test_parse_line_ranges_no_full PASSED [ 13%]
tests/agents/test_working_memory_invalid_lines_read_bug.py::test_memory_should_read_file_invalid_lines_read_bug PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_parse_line_ranges_superscript_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_parse_line_ranges_circled_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_parse_line_ranges_arabic_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_line_range_from_str_superscript PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_should_read_file_with_superscript_in_lines_read PASSED [ 13%]
tests/agents/test_working_memory_isdigit_bug.py::test_isdecimal_vs_isdigit PASSED [ 13%]
tests/agents/test_working_memory_isdigit_fix.py::test_line_range_from_str_superscript_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_fix.py::test_line_range_from_str_circled_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_fix.py::test_line_range_from_str_arabic_digits PASSED [ 13%]
tests/agents/test_working_memory_isdigit_fix.py::test_working_memory_with_superscript_in_lines_read PASSED [ 13%]
tests/agents/test_working_memory_isdigit_fix.py::test_isdecimal_vs_isdigit_demonstration PASSED [ 13%]
tests/agents/test_working_memory_key_insights_bug.py::test_add_recent_file_with_string_key_insights_bug PASSED [ 13%]
tests/agents/test_working_memory_key_insights_bug.py::test_working_memory_entry_validation_bug PASSED [ 13%]
tests/agents/test_working_memory_key_insights_bug.py::test_add_recent_file_preserves_list_key_insights PASSED [ 13%]
tests/agents/test_working_memory_key_insights_bug.py::test_add_recent_file_with_none_key_insights PASSED [ 13%]
tests/agents/test_working_memory_line_number_validation_bug.py::test_memory_should_read_file_full_with_invalid_line_numbers PASSED [ 13%]
tests/agents/test_working_memory_line_number_validation_bug.py::test_memory_should_read_file_partial_range_invalid_line_numbers PASSED [ 13%]
tests/agents/test_working_memory_line_number_validation_bug.py::test_memory_should_read_file_boolean_line_numbers PASSED [ 13%]
tests/agents/test_working_memory_line_number_validation_bug.py::test_memory_should_read_file_float_line_numbers PASSED [ 13%]
tests/agents/test_working_memory_logic_bug.py::test_should_read_file_end_minus_one_bug PASSED [ 13%]
tests/agents/test_working_memory_logic_bug.py::test_should_read_file_invalid_range_with_end_none PASSED [ 13%]
tests/agents/test_working_memory_logic_bug.py::test_should_read_file_code_analysis PASSED [ 13%]
tests/agents/test_working_memory_merge_bug.py::test_memory_merge_ranges_adjacent PASSED [ 13%]
tests/agents/test_working_memory_merge_bug.py::test_memory_should_read_file_with_gap PASSED [ 13%]
tests/agents/test_working_memory_merge_bug.py::test_memory_should_read_file_covered_by_multiple_ranges PASSED [ 13%]
tests/agents/test_working_memory_merge_bug.py::test_memory_should_read_file_partial_overlap PASSED [ 13%]
tests/agents/test_working_memory_misleading_message_bug.py::test_memory_should_read_file_misleading_message_bug PASSED [ 14%]
tests/agents/test_working_memory_misleading_message_bug.py::test_memory_should_read_file_empty_no_ranges PASSED [ 14%]
tests/agents/test_working_memory_misleading_message_bug.py::test_memory_should_read_file_marked_full PASSED [ 14%]
tests/agents/test_working_memory_missing_return.py::test_should_read_file_start_none_end_not_none PASSED [ 14%]
tests/agents/test_working_memory_missing_return.py::test_should_read_file_edge_cases PASSED [ 14%]
tests/agents/test_working_memory_none_bug.py::test_memory_should_read_file_none_lines_read PASSED [ 14%]
tests/agents/test_working_memory_none_bug.py::test_memory_should_read_file_empty_string_lines_read PASSED [ 14%]
tests/agents/test_working_memory_none_bug.py::test_memory_should_read_file_mixed_none_and_empty PASSED [ 14%]
tests/agents/test_working_memory_none_vs_empty_bug.py::test_lines_read_none_vs_empty_consistency PASSED [ 14%]
tests/agents/test_working_memory_none_vs_empty_bug.py::test_lines_read_none_reason PASSED [ 14%]
tests/agents/test_working_memory_none_vs_empty_bug.py::test_lines_read_empty_reason PASSED [ 14%]
tests/agents/test_working_memory_parse_bug.py::test_parse_line_ranges_skips_invalid_parts PASSED [ 14%]
tests/agents/test_working_memory_parse_bug.py::test_should_read_file_with_mixed_valid_invalid_lines_read PASSED [ 14%]
tests/agents/test_working_memory_real_bug.py::test_bug_invalid_lines_read_with_full_file_request PASSED [ 14%]
tests/agents/test_working_memory_real_bug.py::test_bug_empty_string_lines_read PASSED [ 14%]
tests/agents/test_working_memory_real_bug.py::test_bug_none_lines_read PASSED [ 14%]
tests/agents/test_working_memory_real_bug.py::test_bug_mixed_valid_invalid_entries PASSED [ 14%]
tests/agents/test_working_memory_real_bug_found.py::test_should_read_file_end_minus_one_with_start_bug PASSED [ 14%]
tests/agents/test_working_memory_real_bug_found.py::test_should_read_file_end_minus_one_with_start_full_read PASSED [ 14%]
tests/agents/test_working_memory_real_bug_found.py::test_should_read_file_end_minus_one_no_start PASSED [ 14%]
tests/agents/test_working_memory_real_failing_bug.py::test_memory_should_read_file_whitespace_only_bug PASSED [ 14%]
tests/agents/test_working_memory_real_failing_bug.py::test_memory_validate_lines_read_whitespace PASSED [ 14%]
tests/agents/test_working_memory_real_failing_bug.py::test_memory_parse_line_ranges_whitespace PASSED [ 14%]
tests/agents/test_working_memory_real_failing_bug.py::test_memory_inconsistent_validation_bug PASSED [ 14%]
tests/agents/test_working_memory_type_safety_bug.py::test_working_memory_entry_lines_read_type_safety PASSED [ 14%]
tests/agents/test_working_memory_type_safety_bug.py::test_should_read_file_with_invalid_lines_read_type PASSED [ 14%]
tests/agents/test_working_memory_unicode_dash_bug.py::test_memory_parse_line_ranges_unicode_dash_handling PASSED [ 14%]
tests/agents/test_working_memory_unicode_dash_bug.py::test_memory_parse_line_ranges_invalid_unicode_dash PASSED [ 14%]
tests/agents/test_working_memory_unicode_dash_bug.py::test_memory_should_read_file_with_unicode_dash_in_history PASSED [ 14%]
tests/agents/test_working_memory_unicode_dash_bug2.py::test_memory_parse_line_ranges_unicode_dash_bug PASSED [ 14%]
tests/agents/test_working_memory_unicode_digit_bug.py::test_parse_line_ranges_unicode_superscript_digit PASSED [ 14%]
tests/agents/test_working_memory_unicode_digit_bug.py::test_parse_line_ranges_arabic_digits PASSED [ 14%]
tests/agents/test_working_memory_unicode_digit_bug.py::test_parse_line_ranges_mixed_digits PASSED [ 14%]
tests/agents/test_working_memory_unicode_digit_bug.py::test_should_read_file_with_unicode_digits PASSED [ 14%]
tests/agents/test_working_memory_validation_bug.py::test_working_memory_entry_validation_bug PASSED [ 14%]
tests/agents/test_working_memory_validation_bug.py::test_working_memory_entry_valid_cases PASSED [ 14%]
tests/agents/test_working_memory_validation_bug_fix.py::test_validate_lines_read_with_full_and_invalid_parts PASSED [ 14%]
tests/agents/test_working_memory_validation_bug_fix.py::test_working_memory_entry_creation_with_invalid_lines_read PASSED [ 14%]
tests/agents/test_working_memory_validation_bug_fix.py::test_parse_line_ranges_behavior_with_full PASSED [ 14%]
tests/agents/test_working_memory_validation_order_bug.py::test_should_read_file_validation_order_bug PASSED [ 14%]
tests/agents/test_working_memory_validation_order_bug.py::test_should_read_file_validation_before_conversion PASSED [ 14%]
tests/agents/test_working_memory_validation_order_bug.py::test_should_read_file_error_message_accuracy PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_parse_line_ranges_whitespace_only PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_validate_lines_read_whitespace_only PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_working_memory_entry_creation_whitespace_only PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_inconsistency_impact PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_should_read_file_with_empty_lines_read PASSED [ 14%]
tests/agents/test_working_memory_whitespace_bug.py::test_fix_whitespace_consistency PASSED [ 14%]
tests/api/test_api.py::TestState::test_default_state PASSED              [ 14%]
tests/api/test_api.py::TestState::test_metrics_keys PASSED               [ 14%]
tests/api/test_api.py::TestState::test_metrics_initial_values PASSED     [ 14%]
tests/api/test_api.py::TestVerifyApiKey::test_no_settings_allows_access[asyncio] PASSED [ 14%]
tests/api/test_api.py::TestVerifyApiKey::test_no_api_attr_allows_access[asyncio] PASSED [ 14%]
tests/api/test_api.py::TestVerifyApiKey::test_auth_disabled_allows_any_key[asyncio] PASSED [ 14%]
tests/api/test_api.py::TestVerifyApiKey::test_auth_enabled_no_key_denied[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestVerifyApiKey::test_auth_enabled_valid_key_accepted[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestVerifyApiKey::test_auth_enabled_invalid_key_denied[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestGetAgent::test_get_agent_returns_agent[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestGetAgent::test_get_agent_raises_when_none[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestServer::test_lifespan_startup_success[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestServer::test_lifespan_startup_agent_failure[asyncio] PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_health_ok PASSED        [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_health_no_settings PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_metrics_with_data PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_metrics_no_metrics PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_usage_with_tokens PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_usage_no_metrics PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_health_response_model PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_metrics_response_model PASSED [ 15%]
tests/api/test_api.py::TestHealthEndpoints::test_usage_response_model PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_convert_chat_message_basic PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_convert_chat_message_with_tool_calls PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_convert_chat_message_with_tool_call_id PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_setup_agent_history PASSED  [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_content PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_tool_call PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_finished_string PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_finished_dict PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_finished_invalid_reason PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_agent_event_finished_dict_invalid_reason PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_metrics_no_state_metrics PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_metrics_with_usage PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_metrics_with_tool_calls PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_stream_event_content PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_stream_event_tool_call PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_stream_event_finished PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_process_stream_event_finished_with_usage PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_stream_metrics PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_stream_metrics_no_tools PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_update_stream_metrics_no_state PASSED [ 15%]
tests/api/test_api.py::TestChatHelpers::test_handle_stream_error PASSED  [ 15%]
tests/api/test_api.py::TestChatHelpers::test_handle_stream_error_no_metrics PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_success PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_with_system_prompt PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_no_user_message PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_agent_error PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_unauthorized PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_with_usage_in_finished PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_with_tool_calls_in_response PASSED [ 15%]
tests/api/test_api.py::TestChatCompletion::test_chat_completion_agent_unavailable PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_response_content_type PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_response_events PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_with_system_prompt PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_unauthorized PASSED   [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_agent_unavailable PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_error_handling PASSED [ 15%]
tests/api/test_api.py::TestChatStream::test_stream_with_tool_calls_increments_metrics PASSED [ 15%]
tests/api/test_api.py::TestChatHistory::test_get_history_empty PASSED    [ 15%]
tests/api/test_api.py::TestChatHistory::test_get_history_with_messages PASSED [ 16%]
tests/api/test_api.py::TestChatHistory::test_get_history_with_limit PASSED [ 16%]
tests/api/test_api.py::TestChatHistory::test_get_history_unauthorized PASSED [ 16%]
tests/api/test_api.py::TestChatHistory::test_clear_history PASSED        [ 16%]
tests/api/test_api.py::TestChatHistory::test_clear_history_unauthorized PASSED [ 16%]
tests/api/test_api.py::TestServer::test_root_endpoint PASSED             [ 16%]
tests/api/test_api.py::TestServer::test_http_exception_handler PASSED    [ 16%]
tests/api/test_api.py::TestServer::test_generic_exception_handler PASSED [ 16%]
tests/api/test_api.py::TestServer::test_get_provider_settings_unknown PASSED [ 16%]
tests/api/test_api.py::TestServer::test_get_provider_settings_known PASSED [ 16%]
tests/api/test_api.py::TestServer::test_get_provider_settings_none_value PASSED [ 16%]
tests/api/test_api.py::TestServer::test_run_server_calls_uvicorn PASSED  [ 16%]
tests/api/test_api.py::TestServer::test_chat_stream_increments_requests_total PASSED [ 16%]
tests/api/test_api.py::TestChatStreamBranchCoverage::test_stream_no_user_message_exhausts_loop PASSED [ 16%]
tests/api/test_api.py::TestChatStreamBranchCoverage::test_stream_non_user_message_continues_loop PASSED [ 16%]
tests/api/test_api.py::TestChatStreamBranchCoverage::test_stream_no_metrics_skips_increment PASSED [ 16%]
tests/chat/test_chat.py::TestChatMessage::test_create_basic_message PASSED [ 16%]
tests/chat/test_chat.py::TestChatMessage::test_message_with_attachments PASSED [ 16%]
tests/chat/test_chat.py::TestChatMessage::test_message_not_dm PASSED     [ 16%]
tests/chat/test_chat.py::TestChatPlatform::test_platform_values PASSED   [ 16%]
tests/chat/test_chat.py::TestChatPlatform::test_platform_from_string PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_split_message_short PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_split_message_long PASSED  [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_split_message_single_long_line PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_split_message_with_newlines PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_platform_property PASSED   [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_is_connected_initially_false PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBot::test_set_message_handler PASSED [ 16%]
tests/chat/test_chat.py::TestDiscordBotImportError::test_check_discord_installed_raises PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_create_manager PASSED     [ 16%]
tests/chat/test_chat.py::TestChatManager::test_get_provider_settings PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_get_provider_settings_unknown PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_get_provider_settings_missing_attr PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_get_or_create_agent_with_missing_provider_settings[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_help[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_clear[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_status[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_unknown[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_history_empty[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_command_history_with_data[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_handle_message_no_bot[asyncio] PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_stop_all[asyncio] PASSED  [ 16%]
tests/chat/test_chat.py::TestChatManager::test_create_discord_bot PASSED [ 16%]
tests/chat/test_chat.py::TestChatManager::test_get_provider_settings_string_instead_of_dict PASSED [ 16%]
tests/cli/commands/test_context.py::test_context_command_properties PASSED [ 16%]
tests/cli/commands/test_context.py::test_context_command_no_args PASSED  [ 16%]
tests/cli/commands/test_context.py::test_context_command_enable PASSED   [ 16%]
tests/cli/commands/test_context.py::test_context_command_disable PASSED  [ 16%]
tests/cli/commands/test_context.py::test_context_command_strategy_no_args PASSED [ 16%]
tests/cli/commands/test_context.py::test_context_command_stats PASSED    [ 16%]
tests/cli/commands/test_context.py::test_context_command_invalid_subcommand PASSED [ 16%]
tests/cli/commands/test_context.py::test_context_command_registered PASSED [ 16%]
tests/cli/commands/test_model.py::test_model_command_basics PASSED       [ 16%]
tests/cli/commands/test_model.py::test_show_current PASSED               [ 17%]
tests/cli/commands/test_model.py::test_show_current_no_agent PASSED      [ 17%]
tests/cli/commands/test_model.py::test_list_providers PASSED             [ 17%]
tests/cli/commands/test_model.py::test_set_provider_success PASSED       [ 17%]
tests/cli/commands/test_model.py::test_set_provider_not_found PASSED     [ 17%]
tests/cli/commands/test_model.py::test_set_provider_with_model PASSED    [ 17%]
tests/cli/commands/test_model.py::test_set_provider_no_repl PASSED       [ 17%]
tests/cli/commands/test_model.py::test_invalid_usage PASSED              [ 17%]
tests/cli/commands/test_model.py::test_get_api_key_from_env PASSED       [ 17%]
tests/cli/commands/test_model.py::test_get_env_var_name PASSED           [ 17%]
tests/cli/commands/test_model.py::test_get_example_config PASSED         [ 17%]
tests/cli/commands/test_model.py::test_get_env_vars PASSED               [ 17%]
tests/cli/commands/test_model_integration.py::test_model_command_integration PASSED [ 17%]
tests/cli/commands/test_model_integration.py::test_model_switch_integration PASSED [ 17%]
tests/cli/commands/test_model_integration.py::test_model_command_error_handling PASSED [ 17%]
tests/cli/commands/test_plan.py::test_plan_toggle PASSED                 [ 17%]
tests/cli/commands/test_plan.py::test_plan_no_session PASSED             [ 17%]
tests/cli/commands/test_plan.py::test_plan_no_tool_registry PASSED       [ 17%]
tests/cli/commands/test_plan.py::test_plan_no_agent PASSED               [ 17%]
tests/cli/commands/test_plan.py::test_plan_prompt_already_in_system_prompt PASSED [ 17%]
tests/cli/commands/test_plan.py::test_plan_ui_messages PASSED            [ 17%]
tests/cli/commands/test_plan.py::test_plan_mode_prompt_not_duplicated PASSED [ 17%]
tests/cli/commands/test_plan_branch.py::test_plan_toggle_with_duplicate_prompt PASSED [ 17%]
tests/cli/commands/test_plan_branch.py::test_plan_toggle_multiple_times PASSED [ 17%]
tests/cli/commands/test_plan_branch.py::test_plan_mode_with_partial_prompt PASSED [ 17%]
tests/cli/commands/test_session.py::test_session_help PASSED             [ 17%]
tests/cli/commands/test_session.py::test_session_branch_missing_args PASSED [ 17%]
tests/cli/commands/test_session.py::test_session_branch_success PASSED   [ 17%]
tests/cli/commands/test_session.py::test_session_merge_success PASSED    [ 17%]
tests/cli/commands/test_session.py::test_session_list_success PASSED     [ 17%]
tests/cli/commands/test_session_resume_id.py::test_resume_session_by_short_id PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_command_properties PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_no_agent PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_toggle_on_to_off PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_toggle_off_to_on PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_on_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_off_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_true_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_false_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_1_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_0_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_yes_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_set_no_explicitly PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_invalid_argument PASSED [ 17%]
tests/cli/commands/test_unlimited.py::TestUnlimitedCommand::test_execute_case_insensitive PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_print_welcome_basic PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_print_goodbye PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_print_newline PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_show_turn_status_with_agent PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_show_turn_status_no_agent PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_confirm_tool_execution_approved[asyncio] PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_confirm_tool_execution_denied[asyncio] PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestExtensionsCommand::test_execute_no_extensions[asyncio] PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestExtensionsCommand::test_execute_with_extensions[asyncio] PASSED [ 17%]
tests/cli/test_additional_coverage.py::TestToolExecutorAdditionalCoverage::test_execute_tool_calls_with_parallel[asyncio] PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestToolExecutorAdditionalCoverage::test_run_sequential_tool_calls_with_monitor[asyncio] PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestToolExecutorAdditionalCoverage::test_run_sequential_tool_calls_no_monitor[asyncio] PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTeamCommandAdditionalCoverage::test_team_status_action[asyncio] PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTeamCommandAdditionalCoverage::test_team_list_action[asyncio] PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_print_welcome_with_tools PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_stop_thinking_clears_state PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_is_thinking_property PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_thinking_context_manager PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestUIRenderer::test_muted_via_getattr PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestExtensionsCommand::test_name PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestExtensionsCommand::test_description PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestExtensionsCommand::test_usage PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualAppCoverage::test_textual_config_defaults PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualAppCoverage::test_textual_config_custom PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualAppCoverage::test_check_utf8_encoding_no_error PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualAppCoverage::test_check_utf8_encoding_non_utf8 PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualAppCoverage::test_henchman_textual_app_can_instantiate PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_textual_config_defaults PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_textual_config_custom_values PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_component_config_defaults PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_component_initializer_init PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_resolve_theme_name_valid PASSED [ 18%]
tests/cli/test_additional_coverage.py::TestTextualConfigCoverage::test_resolve_theme_name_invalid PASSED [ 18%]
tests/cli/test_agent_command.py::test_agent_list PASSED                  [ 18%]
tests/cli/test_agent_command.py::test_agent_list_with_agents PASSED      [ 18%]
tests/cli/test_agent_command.py::test_agent_no_orchestrator PASSED       [ 18%]
tests/cli/test_agent_command.py::test_agent_config_all PASSED            [ 18%]
tests/cli/test_agent_command.py::test_agent_config_specific_role PASSED  [ 18%]
tests/cli/test_agent_command.py::test_agent_config_unknown_role PASSED   [ 18%]
tests/cli/test_agent_command.py::test_agent_direct_no_message PASSED     [ 18%]
tests/cli/test_agent_command.py::test_agent_direct_no_run_agent_direct PASSED [ 18%]
tests/cli/test_agent_command.py::test_agent_direct_message PASSED        [ 18%]
tests/cli/test_agent_command.py::test_agent_command_properties PASSED    [ 18%]
tests/cli/test_agent_command.py::test_agent_direct_exception PASSED      [ 18%]
tests/cli/test_app.py::test_cli_version_option PASSED                    [ 18%]
tests/cli/test_app.py::test_cli_help_option PASSED                       [ 18%]
tests/cli/test_app.py::test_cli_default_invocation PASSED                [ 18%]
tests/cli/test_app.py::test_cli_with_prompt_option PASSED                [ 18%]
tests/cli/test_app.py::test_cli_with_short_prompt_option PASSED          [ 18%]
tests/cli/test_app.py::test_main_function PASSED                         [ 18%]
tests/cli/test_app.py::test_main_function_via_import PASSED              [ 18%]
tests/cli/test_app.py::TestGetProvider::test_get_provider_from_env PASSED [ 18%]
tests/cli/test_app.py::TestGetProvider::test_get_provider_from_henchman_api_key PASSED [ 18%]
tests/cli/test_app.py::TestGetProvider::test_get_provider_from_settings PASSED [ 18%]
tests/cli/test_app.py::TestGetProvider::test_get_provider_no_provider_settings PASSED [ 18%]
tests/cli/test_app.py::TestGetProvider::test_get_provider_no_key_raises PASSED [ 18%]
tests/cli/test_app.py::TestEnsureApiKey::test_api_key_already_in_kwargs PASSED [ 18%]
tests/cli/test_app.py::TestEnsureApiKey::test_anthropic_uses_anthropic_api_key PASSED [ 18%]
tests/cli/test_app.py::TestEnsureApiKey::test_other_provider_uses_henchman_api_key PASSED [ 18%]
tests/cli/test_app.py::TestEnsureApiKey::test_no_env_var_sets_nothing PASSED [ 18%]
tests/cli/test_app.py::TestShowTeamInfo::test_show_team_info_prints_table PASSED [ 18%]
tests/cli/test_app.py::TestShowTeamInfo::test_run_interactive_creates_repl PASSED [ 18%]
tests/cli/test_app.py::TestRunHeadless::test_run_headless_processes_prompt PASSED [ 18%]
tests/cli/test_app.py::test_run_single_prompt_integration[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestGetThemeAndRendererSilentMode::test_get_theme_and_renderer_invalid_theme_silent PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunInteractiveStartReplInnerFunction::test_run_interactive_agent_role_start_repl_executed PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessPromptNone::test_run_headless_prompt_none_returns_early PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessOutputFormats::test_run_headless_json_format PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessOutputFormats::test_run_headless_stream_json_format PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessOutputFormats::test_run_headless_json_complete_format PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessText::test_run_headless_text_with_agent_role[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessText::test_run_headless_text_with_rag_system[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessText::test_run_headless_text_without_agent_role[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestInitializeJsonProcessing::test_initialize_json_processing_with_rag_system[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestInitializeJsonProcessing::test_initialize_json_processing_returns_renderer[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestProcessToolCalls::test_process_tool_calls_executes_and_submits[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestProcessToolCalls::test_process_tool_calls_with_collect_events[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessJson::test_run_headless_json_with_tool_calls[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessStreamJson::test_run_headless_stream_json_with_tool_calls[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessJsonComplete::test_run_headless_json_complete_with_tool_calls[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunHeadlessJsonComplete::test_run_headless_json_complete_no_tool_calls[asyncio] PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestExecuteChatCommand::test_execute_chat_command_debug_filter_suppresses_debug_output PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestExecuteChatCommand::test_execute_chat_command_debug_filter_return_on_debug_prefix PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestExecuteChatCommand::test_execute_chat_command_team_mode_calls_show_team_info PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestExecuteChatCommand::test_execute_chat_command_tui_with_prompt_clears_prompt PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestExecuteChatCommand::test_execute_chat_command_prompt_runs_headless PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunTextualTui::test_run_textual_tui_with_plan_mode PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunTextualTui::test_run_textual_tui_basic PASSED [ 19%]
tests/cli/test_app_coverage_100.py::TestRunTextualTui::test_run_textual_tui_non_text_format_warns PASSED [ 19%]
tests/cli/test_app_extended.py::test_run_interactive_json_warning PASSED [ 19%]
tests/cli/test_app_extended.py::test_run_interactive_plan_mode PASSED    [ 19%]
tests/cli/test_app_extended.py::test_run_headless_json[asyncio] PASSED   [ 19%]
tests/cli/test_app_extended.py::test_run_headless_stream_json[asyncio] PASSED [ 19%]
tests/cli/test_app_extended.py::test_cli_plan_flag PASSED                [ 19%]
tests/cli/test_app_input_coverage.py::TestInputCoverage::test_is_slash_command_valid PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestInputCoverage::test_is_slash_command_double_slash PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestInputCoverage::test_is_slash_command_just_slash PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestInputCoverage::test_is_slash_command_slash_space PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestInputCoverage::test_is_shell_command PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestToolForm::test_prompt_for_parameters_empty PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestToolForm::test_prompt_for_parameters_boolean PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestToolForm::test_prompt_for_parameters_integer PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestToolForm::test_prompt_for_parameters_string PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_init PASSED   [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_stop_requested_property PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_exit_requested_property PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_suspend_and_resume[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestExpandAtReferences::test_expand_normal_text[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestExpandAtReferences::test_expand_nonexistent_file[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestExpandAtReferences::test_expand_existing_file[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestExpandAtReferences::test_expand_oversized_file[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_initialize_mcp_no_manager[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_initialize_mcp_with_manager[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_initialize_mcp_already_connected[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_initialize_mcp_connection_error[asyncio] PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_should_continue_monitoring_initial PASSED [ 19%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_should_continue_monitoring_stopped PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_process_keys_escape PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestKeyMonitor::test_process_keys_ctrl_c PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_get_theme_and_renderer_valid_theme PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_get_theme_and_renderer_invalid_theme PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_get_theme_and_renderer_no_ui PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_check_completion_status_no_work PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_check_completion_status_work_done PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestAppCoverage::test_check_completion_status_no_orchestrator PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_collect_event_content_error PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_collect_event_content_content PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestReplCoverage::test_collect_event_content_no_collector PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_ui_plugin_description_default PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_ui_plugin_render_noop PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_load_from_nonexistent_dir PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_load_from_empty_dir PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_load_valid_plugin PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_skips_dunder_files PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_register_plugin PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_no_duplicate_registration PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_plugin_manager_load_error_silently_continues PASSED [ 20%]
tests/cli/test_app_input_coverage.py::TestPluginsCoverage::test_try_register_plugin_class_not_plugin PASSED [ 20%]
tests/cli/test_builtins.py::TestHelpCommand::test_name PASSED            [ 20%]
tests/cli/test_builtins.py::TestHelpCommand::test_description PASSED     [ 20%]
tests/cli/test_builtins.py::TestHelpCommand::test_usage PASSED           [ 20%]
tests/cli/test_builtins.py::TestHelpCommand::test_execute_shows_help[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestQuitCommand::test_execute_raises_systemexit[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestClearCommand::test_execute_clears_screen[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_execute_lists_tools[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_execute_with_tool_registry[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_execute_with_agent_tool_registry[asyncio] PASSED [ 20%]
tests/cli/test_builtins.py::TestQuitCommand::test_name PASSED            [ 20%]
tests/cli/test_builtins.py::TestQuitCommand::test_description PASSED     [ 20%]
tests/cli/test_builtins.py::TestQuitCommand::test_usage PASSED           [ 20%]
tests/cli/test_builtins.py::TestClearCommand::test_name PASSED           [ 20%]
tests/cli/test_builtins.py::TestClearCommand::test_description PASSED    [ 20%]
tests/cli/test_builtins.py::TestClearCommand::test_usage PASSED          [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_name PASSED           [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_description PASSED    [ 20%]
tests/cli/test_builtins.py::TestToolsCommand::test_usage PASSED          [ 20%]
tests/cli/test_builtins.py::TestGetBuiltinCommands::test_returns_list_of_commands PASSED [ 20%]
tests/cli/test_builtins.py::TestGetBuiltinCommands::test_includes_help PASSED [ 20%]
tests/cli/test_builtins.py::TestGetBuiltinCommands::test_includes_quit PASSED [ 20%]
tests/cli/test_builtins.py::TestGetBuiltinCommands::test_includes_clear PASSED [ 20%]
tests/cli/test_builtins.py::TestGetBuiltinCommands::test_includes_tools PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_name PASSED        [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_description PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_usage PASSED       [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_no_args_shows_help[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_save[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_save_no_tag[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_save_no_session[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_list[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_list_empty[asyncio] PASSED [ 20%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_not_found[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_unknown_subcommand[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_save_no_manager[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_list_no_manager[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_no_manager[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_no_tag[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_restores_agent_history[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_restores_tool_calls[asyncio] PASSED [ 21%]
tests/cli/test_chat_command.py::TestChatCommand::test_chat_resume_validates_restored_history[asyncio] PASSED [ 21%]
tests/cli/test_cli_smoke.py::TestCLISmoke::test_cli_help_works PASSED    [ 21%]
tests/cli/test_cli_smoke.py::TestCLISmoke::test_cli_version_works PASSED [ 21%]
tests/cli/test_cli_smoke.py::TestCLISmoke::test_cli_module_import PASSED [ 21%]
tests/cli/test_cli_smoke.py::TestCLISmoke::test_repl_can_be_instantiated PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_initialization PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_initialization_with_mcp_manager PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_quit PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_clear PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_unknown PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_registered PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_with_args PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_empty_args PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_invalid_parse PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_exception PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_get_command_registry PASSED [ 21%]
tests/cli/test_command_processor.py::TestCommandProcessor::test_handle_command_context_attributes PASSED [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_simple_command PASSED [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_command_with_args PASSED [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_command_with_multiple_args PASSED [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_command_without_slash PASSED [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_empty_command PASSED  [ 21%]
tests/cli/test_commands.py::TestParseCommand::test_command_with_extra_whitespace PASSED [ 21%]
tests/cli/test_commands.py::TestCommand::test_command_abstract_methods PASSED [ 21%]
tests/cli/test_commands.py::TestCommandContext::test_context_creation PASSED [ 21%]
tests/cli/test_commands.py::TestCommandContext::test_context_with_all_fields PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_register_command PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_get_command PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_get_unknown_command PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_list_names PASSED  [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_execute_command[asyncio] PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_execute_unknown_command_raises[asyncio] PASSED [ 21%]
tests/cli/test_commands.py::TestCommandRegistry::test_register_duplicate_command_raises PASSED [ 21%]
tests/cli/test_commands_repro.py::TestCommandRegistryAttribute::test_get_commands_method PASSED [ 21%]
tests/cli/test_commands_repro.py::TestCommandRegistryAttribute::test_commands_attribute_still_missing PASSED [ 21%]
tests/cli/test_console.py::TestTheme::test_default_theme_values PASSED   [ 21%]
tests/cli/test_console.py::TestTheme::test_custom_theme PASSED           [ 21%]
tests/cli/test_console.py::TestThemeManager::test_default_theme PASSED   [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_dark PASSED  [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_light PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_solarized_dark PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_solarized_light PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_monokai PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_dracula PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_high_contrast_dark PASSED [ 21%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_high_contrast_light PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_get_theme_unknown_returns_default PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme PASSED       [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_solarized_dark PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_solarized_light PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_monokai PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_dracula PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_high_contrast_dark PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_set_theme_high_contrast_light PASSED [ 22%]
tests/cli/test_console.py::TestThemeManager::test_list_themes PASSED     [ 22%]
tests/cli/test_console.py::TestThemeManager::test_register_custom_theme PASSED [ 22%]
tests/cli/test_console.py::TestGetDefaultTheme::test_returns_theme PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_text PASSED    [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_styled PASSED  [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_success PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_warning PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_error PASSED   [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_muted PASSED   [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_info PASSED    [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_heading PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_markdown PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_code PASSED    [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_rule PASSED    [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_print_rule_with_title PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_clear PASSED         [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_custom_theme PASSED  [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_default_console_creation PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_error_with_rich_markup_in_message PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_warning_with_rich_markup_in_message PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_success_with_rich_markup_in_message PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_info_with_rich_markup_in_message PASSED [ 22%]
tests/cli/test_console.py::TestOutputRenderer::test_heading_with_rich_markup_in_text PASSED [ 22%]
tests/cli/test_console_confirm.py::test_confirm_method PASSED            [ 22%]
tests/cli/test_console_confirm.py::test_confirm_method_false PASSED      [ 22%]
tests/cli/test_console_confirm.py::test_confirm_with_different_messages PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_table_empty_data PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_table_with_data PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_table_with_title PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tree_basic PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tree_deep_nested PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_diff_with_strings PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_diff_with_params_object PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_diff_no_differences PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_code_method PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_code_empty PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_markdown_truncation PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tool_result_success PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tool_result_failure PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tool_summary PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_tool_summary_no_duration PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_print_agent_content PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_agent_content_alias PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_thinking_method PASSED [ 22%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_list_dict_keys PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_rule_method PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_rule_no_title PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleCoverage::test_status_message_params PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_init PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_getattr_creates_wrapper PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_getattr_caches_wrapper PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_getattr_missing_method_raises PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_getattr_private_method_raises PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_async_wrapper_calls_sync[asyncio] PASSED [ 23%]
tests/cli/test_console_coverage.py::TestAsyncOutputRenderer::test_async_diff_wrapper[asyncio] PASSED [ 23%]
tests/cli/test_console_coverage.py::TestCoreInitCoverage::test_initialize_mcp_with_manager[asyncio] PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleHelpersCoverage::test_print_error_message_with_usage PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleHelpersCoverage::test_print_error_message_no_usage PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleHelpersCoverage::test_print_usage_help PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleHelpersCoverage::test_print_usage_help_no_commands PASSED [ 23%]
tests/cli/test_console_coverage.py::TestConsoleHelpersCoverage::test_print_parameter_list PASSED [ 23%]
tests/cli/test_console_coverage.py::TestCoreInitCoverage::test_initialize_mcp_no_manager PASSED [ 23%]
tests/cli/test_console_coverage.py::TestCoreInitCoverage::test_initialize_mcp_already_connected PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_handle_confirmation_auto_approve PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_handle_confirmation_default_false PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_handle_confirmation_custom_handler PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_set_confirmation_handler PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_set_auto_approve PASSED [ 23%]
tests/cli/test_console_coverage.py::TestToolManagerCoverage::test_set_plan_mode PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_get_display_label_from_param_name PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_get_display_label_explicit PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_validate_value_in_range PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_validate_value_out_of_range PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_validate_value_below_min PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_validate_value_no_max PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_parse_value_int PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestRangeParameterConfig::test_parse_value_float PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextConsoleHelper::test_print_status_info PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextConsoleHelper::test_print_strategy_usage PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextConsoleHelper::test_print_strategy_status PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestStrategyManager::test_manage_strategy_no_args_shows_status[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestStrategyManager::test_manage_strategy_set_valid[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestStrategyManager::test_manage_strategy_set_insufficient_args[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestStrategyManager::test_manage_strategy_unknown_action[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_update_context_setting[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_handle_adaptive_on[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_handle_adaptive_off[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_handle_adaptive_invalid[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_enable_intelligent_context_when_disabled[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_enable_intelligent_context_when_already_enabled[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_disable_intelligent_context_when_enabled[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_disable_intelligent_context_when_already_disabled[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_show_stats_no_agent[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_show_stats_with_agent[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestModuleLevelContextHelpers::test_show_stats_import_error[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_threshold[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_importance[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_similarity[asyncio] PASSED [ 23%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_unknown_param[asyncio] PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_adaptive_on[asyncio] PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_strategy_set_adaptive_invalid[asyncio] PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestContextCommandStrategyCoverage::test_context_stats[asyncio] PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestPrintHelpers::test_print_no_compactor_message PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestPrintHelpers::test_print_statistics_values PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestPrintHelpers::test_print_stats_info_no_compactor PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestPrintHelpers::test_print_stats_info_with_compactor PASSED [ 24%]
tests/cli/test_context_strategy_coverage.py::TestPrintHelpers::test_print_stats_info_exception PASSED [ 24%]
tests/cli/test_core_init.py::TestCoreContext::test_core_context_creation PASSED [ 24%]
tests/cli/test_core_init.py::TestCoreContext::test_core_context_defaults PASSED [ 24%]
tests/cli/test_core_init.py::TestCreateCoreContext::test_create_core_context_basic PASSED [ 24%]
tests/cli/test_core_init.py::TestCreateCoreContext::test_create_core_context_with_mcp PASSED [ 24%]
tests/cli/test_core_init.py::TestCreateCoreContext::test_create_core_context_no_settings PASSED [ 24%]
tests/cli/test_core_init.py::TestInitializeMcp::test_initialize_mcp_with_clients PASSED [ 24%]
tests/cli/test_core_init.py::TestInitializeMcp::test_initialize_mcp_no_mcp_manager PASSED [ 24%]
tests/cli/test_core_init.py::TestInitializeMcp::test_initialize_mcp_with_existing_clients PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_typing_self_import_fallback PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_cleanup_monitor_timeout[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_cleanup_monitor_with_stop_event[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_cleanup_monitor_no_stop_event[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_monitored_task_exit_requested[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_monitored_task_stop_requested[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_initialize_mcp_no_manager[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_initialize_mcp_error[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_direct_agent_lines_446_450[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_agent_with_monitor_exit_requested[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_agent_with_monitor_stop_requested[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_agent_with_monitor_no_status_msg[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_process_input_should_not_continue[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_initialize_mcp_with_tools[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_run_calls_disconnect_all[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestCoreInitMissingLines::test_initialize_mcp_background_connect_with_tools[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestCoreInitMissingLines::test_initialize_mcp_background_connect[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestCoreInitMissingLines::test_initialize_mcp_background_connect_error[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_safe_create_task_success_no_logging[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_safe_create_task_exception_logged[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_set_provider_no_repl[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_set_provider_update_fails[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_set_provider_exception[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_list_providers_registry_error[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestTeamCommandMissingLines::test_show_status_with_active_agents[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestTeamCommandMissingLines::test_show_status_with_shared_context[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_branch_executor_missing_args[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_branch_executor_missing_session_id[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_branch_executor_invalid_branch_point[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_branch_executor_with_tag[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_save_missing_args[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_save_with_description[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_create_missing_args[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_create_with_tag[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_create_no_tag[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_delete_missing_args[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_export_executor_missing_session_id[asyncio] PASSED [ 24%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_import_executor_missing_file_path[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_import_executor_with_tag[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_import_executor_no_tag[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_session_command_execute_list[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_branch_executor_no_tag[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_merge_executor_missing_session_ids[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_template_save_without_description[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_execute_operation_manager_none[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_abstract_execute_is_covered[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_handle_post_stream_flushed_with_content[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_handle_post_stream_pending_tool_calls[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_handle_post_stream_flushed_already[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_handle_post_stream_no_content_no_pending[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_create_async_diff_wrapper[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestContextCommandMissingLines::test_handle_context_param_missing_value[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_command_usage_property[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_command_no_args_shows_help[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_command_dispatches_status[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_get_rag_system_no_repl[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_status_no_rag_system[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_status_with_rag_system[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_reindex_no_rag_system[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_reindex_already_indexing[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_reindex_success[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_reindex_no_stats[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_no_rag_system[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_success[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_all_no_cache_dir[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_all_confirmed[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_all_cancelled[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_cleanup_not_in_git[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_cleanup_nothing_to_clean[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_cleanup_removes_old_files[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_all_input_eof[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_clear_all_shutil_error[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_cleanup_index_rmtree_error[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestRagCommandMissingLines::test_rag_cleanup_manifest_unlink_error[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestCommandsInitMissingLines::test_base_command_show_help_not_implemented[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_expand_at_references_path_resolve_exception[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_key_monitor_suspend_while_in_raw_mode[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_key_monitor_monitor_when_unsuspended[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_key_monitor_suspend_in_raw_mode_path[asyncio] PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_repl_init_renderer PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_repl_init_mcp_manager_none PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_repl_init_with_renderer PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestReplMissingLines::test_repl_init_mcp_manager_with_servers PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_typing_extensions_fallback PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_load_plugins_warning_on_error PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_try_register_plugin_class_instantiation_error PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_try_register_plugin_class_instantiation_error_no_logging PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_load_plugin_from_nonexistent_file PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_load_plugin_info_log PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestPluginsMissingLines::test_register_plugin_with_repl PASSED [ 25%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_typing_extensions_import PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_add_provider_status_exception PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_add_provider_status_works PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_get_max_tokens_no_settings PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_get_max_tokens_no_context_attr PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_get_max_tokens_context_falsy PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_add_tool_status_no_list_tools PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_add_mcp_status_zero_clients PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_add_mcp_status_exception PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestOutputHandlerMissingLines::test_show_turn_status_rag_index PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_get_env_vars_known_henchman_provider PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_get_env_vars_unknown_provider PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_get_api_key_for_provider_returns_from_env PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_print_provider_entry_with_doc_no_env PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_test_provider_connection_no_default_model PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_test_provider_connection_with_model PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_update_agent_provider_no_agent PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_update_agent_provider_no_repl PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_get_api_key_no_settings_key PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_get_api_key_settings_exception PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_print_current_configuration_no_model PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_print_provider_entry_no_doc PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_show_all_providers_registry_error PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_test_provider_connection_exception PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestTeamCommandMissingLines::test_usage_property PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestSessionCommandMissingLines::test_session_command_usage_property PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_handle_finished_when_thinking PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_dispatch_event_context_compacted PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestStreamEventHandlersMissingLines::test_dispatch_event_agent_message PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_create_task PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_update_task_with_description PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_update_task_no_description PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_update_nonexistent_task PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_complete_task PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_progress_manager_complete_nonexistent_task PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_ui_renderer_getattr_attribute_error PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_ui_renderer_getattr_missing_internal_attr PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_ui_renderer_getattr_delegates_to_renderer PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_ui_renderer_start_thinking_exception PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestUIRendererMissingLines::test_ui_renderer_stop_thinking_not_started PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_typing_extensions_import PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_status_type_accessible_icon PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_theme_with_overrides_empty PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_renderer_config_with_overrides PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_renderer_config_theme_with_overrides PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_find_or_create_child_new_child PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_markdown_truncation PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_markdown_with_open_code_fence PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_table_compact_mode PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_parse_diff_args_type_error PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_tool_result_truncation PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_markdown_empty_content PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_tool_result_error_mode_accessible PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_validate_method_name_private PASSED [ 26%]
tests/cli/test_coverage_gaps_cli.py::TestContextCommandMissingLines::test_print_current_context_size_with_session PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestContextCommandMissingLines::test_print_current_context_size_no_session PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestContextCommandMissingLines::test_print_statistics_block_no_stats PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestThemeCommandMissingLines::test_update_renderer_theme_no_theme_attr PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestThemeCommandMissingLines::test_update_renderer_theme_no_repl PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestThemeCommandMissingLines::test_persist_theme_settings_saves PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestThemeCommandMissingLines::test_persist_theme_no_repl PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestAgentCommandMissingLines::test_show_agent_config_with_provider_and_model PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestAgentCommandMissingLines::test_list_agents_with_role_with_provider_model PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestAgentCommandMissingLines::test_check_multi_agent_initialized_delegates PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestAgentCommandMissingLines::test_get_orchestrator PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_typing_extensions_import PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_expand_at_references_path_traversal PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_create_session_with_abort_binding PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_create_session_abort_callback_body PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_create_session_exit_callback_body PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_create_session_unknown_action PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestInputMissingLines::test_process_keys_other_key PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestSessionManagerMissingLines::test_typing_extensions_import PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestSessionManagerMissingLines::test_load_raises_on_empty_session_id PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestSessionManagerMissingLines::test_delete_clears_current_session PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestJsonOutputMissingLines::test_typing_extensions_import PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestJsonOutputMissingLines::test_render_event_with_dict_data PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestTextualMessagesMissingLines::test_tool_confirmation_message_request PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestTextualMessagesMissingLines::test_command_output_message_text PASSED [ 27%]
tests/cli/test_coverage_gaps_cli.py::TestTextualMessagesMissingLines::test_switch_provider_message_provider_name PASSED [ 27%]
tests/cli/test_delegation_session.py::TestDelegationDepthTracking::test_sub_agent_tools_not_in_session[asyncio] PASSED [ 27%]
tests/cli/test_delegation_session.py::TestDelegationDepthTracking::test_only_top_level_tool_calls_in_pending[asyncio] PASSED [ 27%]
tests/cli/test_delegation_session.py::TestDelegationDepthTracking::test_delegation_depth_returns_to_zero[asyncio] PASSED [ 27%]
tests/cli/test_delegation_session.py::TestDelegationDepthTracking::test_nested_delegation_depth[asyncio] PASSED [ 27%]
tests/cli/test_delegation_session.py::TestDelegationDepthTracking::test_content_only_accumulated_at_top_level[asyncio] PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_call_display PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_result_success PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_result_failure PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_result_truncation PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_summary_with_duration PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestEnhancedToolDisplay::test_tool_summary_without_duration PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestConsoleIntegration::test_markdown_method_exists PASSED [ 27%]
tests/cli/test_enhanced_tool_display.py::TestConsoleIntegration::test_all_output_methods PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_escape_key_binding_exists PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_action_cancel_or_clear_method_exists PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_is_processing_property_exists PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_current_agent_task_attribute_exists PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_cancel_or_clear_cancels_agent_task_when_processing PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_cancel_or_clear_clears_search_when_not_processing PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_cancel_or_clear_does_nothing_when_no_task PASSED [ 27%]
tests/cli/test_escape_cancellation.py::TestEscapeCancellation::test_escape_during_agent_operation PASSED [ 27%]
tests/cli/test_input.py::TestIsSlashCommand::test_slash_command PASSED   [ 27%]
tests/cli/test_input.py::TestIsSlashCommand::test_not_slash_command PASSED [ 27%]
tests/cli/test_input.py::TestIsSlashCommand::test_just_slash PASSED      [ 27%]
tests/cli/test_input.py::TestIsShellCommand::test_shell_command PASSED   [ 27%]
tests/cli/test_input.py::TestIsShellCommand::test_not_shell_command PASSED [ 27%]
tests/cli/test_input.py::TestIsShellCommand::test_just_exclamation PASSED [ 27%]
tests/cli/test_input.py::TestParseShellCommand::test_simple_command PASSED [ 27%]
tests/cli/test_input.py::TestParseShellCommand::test_command_with_args PASSED [ 28%]
tests/cli/test_input.py::TestParseShellCommand::test_preserves_whitespace PASSED [ 28%]
tests/cli/test_input.py::TestParseShellCommand::test_invalid_command_returns_empty PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_no_references[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_single_reference[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_multiple_references[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_nonexistent_file[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_reference_in_middle[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestExpandAtReferences::test_unreadable_file[asyncio] PASSED [ 28%]
tests/cli/test_input.py::TestInputHandler::test_create_handler PASSED    [ 28%]
tests/cli/test_input.py::TestInputHandler::test_handler_with_history_file PASSED [ 28%]
tests/cli/test_input.py::TestInputHandler::test_get_prompt PASSED        [ 28%]
tests/cli/test_input.py::TestInputHandler::test_custom_prompt PASSED     [ 28%]
tests/cli/test_input_bindings.py::test_escape_key_clears_buffer PASSED   [ 28%]
tests/cli/test_input_bindings.py::test_escape_key_empty_buffer PASSED    [ 28%]
tests/cli/test_input_bindings.py::test_ctrl_c_raises_keyboard_interrupt PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_initialization PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_initialization_with_custom_history_file PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_initialize_prompt_session PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_get_input_success PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_get_input_without_initialized_session PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_get_input_keyboard_interrupt PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_get_input_eof_error PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_is_slash_command PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_expand_at_references PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_process_input_empty PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_process_input_whitespace PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_process_input_slash_command PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_process_input_regular_input PASSED [ 28%]
tests/cli/test_input_handler.py::TestInputHandler::test_process_input_with_at_reference PASSED [ 28%]
tests/cli/test_interrupt.py::test_esc_interrupt PASSED                   [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_init_default_console PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_init_custom_console PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_content_event PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_thought_event PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_tool_call_event PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_error_event PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_finished_event PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_stream_json PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_render_final_json PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_event_to_dict_with_object PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_event_to_dict_with_dict PASSED [ 28%]
tests/cli/test_json_output.py::TestJsonOutputRenderer::test_event_to_dict_with_other_data PASSED [ 28%]
tests/cli/test_keyboard_fixes.py::TestCtrlCFixes::test_ctrl_c_continues_and_eof_exits PASSED [ 28%]
tests/cli/test_keyboard_fixes.py::TestCtrlCFixes::test_ctrl_c_during_agent_operation PASSED [ 28%]
tests/cli/test_keyboard_integration.py::test_ctrl_c_double_tap_exits PASSED [ 28%]
tests/cli/test_keyboard_integration.py::test_escape_raises_keyboard_interrupt PASSED [ 28%]
tests/cli/test_keyboard_interrupt.py::TestKeyboardInterruptHandling::test_ctrl_c_continues_eof_exits PASSED [ 28%]
tests/cli/test_keyboard_interrupt.py::TestKeyboardInterruptHandling::test_esc_key_should_stop_agent PASSED [ 28%]
tests/cli/test_keyboard_interrupt.py::TestKeyboardInterruptHandling::test_multiple_ctrl_c_then_eof_exits PASSED [ 28%]
tests/cli/test_keyboard_verification.py::test_ctrl_c_double_tap_logic PASSED [ 28%]
tests/cli/test_keyboard_verification.py::test_escape_handler_implementation PASSED [ 28%]
tests/cli/test_keyboard_verification.py::test_agent_interruption PASSED  [ 28%]
tests/cli/test_keyboard_verification.py::test_implementation_summary PASSED [ 28%]
tests/cli/test_loop_protection.py::TestLoopProtectionConfig::test_default_iteration_limits PASSED [ 29%]
tests/cli/test_loop_protection.py::TestLoopProtectionConfig::test_custom_iteration_limits PASSED [ 29%]
tests/cli/test_loop_protection.py::TestTurnTrackingInRepl::test_repl_has_turn_state PASSED [ 29%]
tests/cli/test_loop_protection.py::TestTurnTrackingInRepl::test_turn_resets_on_new_input PASSED [ 29%]
tests/cli/test_loop_protection.py::TestIterationLimitEnforcement::test_at_limit_detection PASSED [ 29%]
tests/cli/test_loop_protection.py::TestIterationLimitEnforcement::test_approaching_limit_detection PASSED [ 29%]
tests/cli/test_loop_protection.py::TestSpinningDetection::test_consecutive_duplicate_detection PASSED [ 29%]
tests/cli/test_loop_protection.py::TestSpinningDetection::test_no_spinning_with_varied_calls PASSED [ 29%]
tests/cli/test_loop_protection.py::TestAdaptiveLimits::test_progress_increases_limit PASSED [ 29%]
tests/cli/test_loop_protection.py::TestAdaptiveLimits::test_spinning_decreases_limit PASSED [ 29%]
tests/cli/test_loop_protection.py::TestAdaptiveLimits::test_minimum_limit PASSED [ 29%]
tests/cli/test_loop_protection.py::TestUnlimitedMode::test_unlimited_mode_default_off PASSED [ 29%]
tests/cli/test_loop_protection.py::TestUnlimitedMode::test_unlimited_mode_toggle PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_import PASSED      [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_strips_ansi_codes[0] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_strips_ansi_codes[1] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_strips_ansi_codes[2] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_strips_ansi_codes[3] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[0] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[1] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[2] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[3] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[4] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_escapes_rich_tags[5] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[0] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[1] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[2] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[3] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[4] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[5] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[6] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[7] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[8] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[9] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[10] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_rich[11] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[0] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[1] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[2] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[3] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[4] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[5] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[6] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[7] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[8] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[9] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[10] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_no_markup_error_from_textual_visualize[11] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_exact_crash_payload PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_preserves_readable_content PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_empty_string PASSED [ 29%]
tests/cli/test_markup_safety.py::TestSafeMarkup::test_none_returns_empty PASSED [ 29%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[0] PASSED [ 29%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[1] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[2] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[3] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[4] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[5] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[6] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[7] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[8] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[9] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[10] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_init_with_dangerous_thought[11] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[0] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[1] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[2] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[3] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[4] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[5] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[6] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[7] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[8] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[9] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[10] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_append_dangerous_content[11] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[0] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[1] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[2] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[3] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[4] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[5] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[6] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[7] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[8] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[9] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[10] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestToolMessageMarkupSafety::test_set_content_dangerous[11] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[0] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[1] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[2] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[3] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[4] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[5] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[6] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[7] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[8] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[9] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[10] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_init_with_dangerous_thought[11] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[0] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[1] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[2] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[3] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[4] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[5] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[6] PASSED [ 30%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[7] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[8] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[9] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[10] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestThinkingMessageMarkupSafety::test_append_dangerous_content[11] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[0] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[1] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[2] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[3] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[4] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[5] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[6] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[7] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[8] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[9] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[10] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_init_with_dangerous_content[11] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[0] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[1] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[2] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[3] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[4] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[5] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[6] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[7] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[8] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[9] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[10] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatMessageMarkupSafety::test_append_dangerous_content[11] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[0] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[1] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[2] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[3] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[4] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[5] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[6] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[7] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[8] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[9] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[10] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_tool_message_dangerous[11] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[0] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[1] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[2] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[3] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[4] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[5] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[6] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[7] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[8] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[9] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[10] PASSED [ 31%]
tests/cli/test_markup_safety.py::TestChatPaneMarkupSafety::test_add_thinking_message_dangerous[11] PASSED [ 31%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_name PASSED          [ 31%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_description PASSED   [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_usage PASSED         [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_no_args_shows_help[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_list_no_manager[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_list_with_servers[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_status[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_unknown_subcommand[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_list_empty_servers[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_status_no_manager[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_status_many_tools[asyncio] PASSED [ 32%]
tests/cli/test_mcp_command.py::TestMcpCommand::test_mcp_status_no_tools[asyncio] PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_command_exists PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_on_enables_logging[asyncio] PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_off_disables_logging[asyncio] PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_status_shows_current_setting[asyncio] PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_invalid_argument[asyncio] PASSED [ 32%]
tests/cli/test_mcp_logging.py::TestMcpLogging::test_mcp_logging_no_argument_shows_help[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_basic PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_with_auth_required PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_auth_no_keys PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_auth_disabled PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_keyboard_interrupt PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestServeCommand::test_serve_command_exception PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTextualDriver::test_robust_linux_driver_exists_on_linux PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTextualDriver::test_module_imports PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTextualDriver::test_robust_linux_driver_process_selector_events_success PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTextualDriver::test_robust_linux_driver_process_selector_events_unicode_error PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTextualDriver::test_robust_linux_driver_process_selector_events_other_error PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_show_specific_command_help_found PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_show_specific_command_help_not_found PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_list_all_commands PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_list_all_commands_no_registry PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_help_command_specific_cmd[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_clear_command_with_agent[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestBuiltinsCoverage::test_clear_command_no_agent[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTeamCommandCoverage::test_team_no_orchestrator[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTeamCommandCoverage::test_team_no_repl[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestTeamCommandCoverage::test_team_reset_action[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_current[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_list[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_set_no_args[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_set_success[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_set_error[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_test[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelCommandCoverage::test_model_no_agent[asyncio] PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelHelpers::test_get_example_config PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelHelpers::test_get_env_var_name PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelHelpers::test_get_env_vars_ollama PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelHelpers::test_print_current_configuration PASSED [ 32%]
tests/cli/test_misc_commands_coverage.py::TestModelHelpers::test_print_provider_entry PASSED [ 32%]
tests/cli/test_null_provider_fixed.py::test_no_unreachable_yield_without_conditional PASSED [ 32%]
tests/cli/test_null_provider_fixed.py::test_method_still_raises PASSED   [ 32%]
tests/cli/test_null_provider_unreachable_yield_final.py::test_unreachable_yield_exists PASSED [ 32%]
tests/cli/test_orchestration_leak_fix.py::test_sub_agent_event_filtering[asyncio] PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_initialization PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_initialization_with_optional_args PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_basic PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_plan_mode PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_with_tokens PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_with_tool_count PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_with_mcp PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_toolbar_status_with_rag_indexing PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_get_rich_status_message PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_delegation_methods PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_create_status PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_show_turn_status PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_show_turn_status_spinning PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_show_turn_status_approaching_limit PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_start_background_indexing PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_start_background_indexing_no_rag PASSED [ 33%]
tests/cli/test_output_handler.py::TestOutputHandler::test_start_background_indexing_no_index_async PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_escape_markup PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_determine_event_ownership_no_source PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_determine_event_ownership_with_matching_source PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_determine_event_ownership_with_non_matching_source PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_determine_event_ownership_no_identity PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_update_processing_state_exits_thinking PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_update_processing_state_stays_thinking PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_display_tool_result_success PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_display_tool_result_failure PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_thought_first PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_thought_continues PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_context_compacted PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_tool_call_request_own_event PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_tool_call_request_not_own_event PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_tool_call_result_not_dict PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_tool_call_result_dict PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_agent_routing_delegated PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_agent_routing_message PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_handle_agent_completed PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_build_confirmation_message_shell PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_build_confirmation_message_write_file PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_build_confirmation_message_edit_file PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_build_confirmation_message_other PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_build_confirmation_message_no_params PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_dispatch_event_content PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_dispatch_event_error PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestStreamEventHandlers::test_dispatch_event_finished PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_getattr_delegates_to_renderer PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_getattr_raises_for_missing PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_get_toolbar_status_basic PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_get_toolbar_status_with_agent PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_add_provider_status PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_add_tool_status PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_add_mcp_status_no_mcp PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_add_mcp_status_with_mcp PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_count_connected_mcp_clients PASSED [ 33%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_count_connected_no_mcp PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_get_max_tokens_from_model PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_get_max_tokens_no_settings PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_start_background_indexing PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_start_background_indexing_no_rag PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestOutputHandlerCoverage::test_add_rag_status_no_rag PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_should_stop_due_to_limits_false_normal PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_should_stop_due_to_limits_unlimited_mode PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_should_stop_due_to_limits_iteration_limit PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_should_stop_due_to_limits_tool_count PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_should_stop_due_to_limits_spinning PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_handle_confirmation_approved[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_handle_confirmation_denied[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_execute_and_record_tool_call_success[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_execute_and_record_tool_call_failure[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_process_agent_stream_stop_due_to_limits[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_process_agent_stream_does_not_reannounce_tool_requests[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_execute_tool_calls_empty[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_execute_tool_calls_invalid_items[asyncio] PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_ensure_all_tool_calls_have_response PASSED [ 34%]
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_split_tools_by_confirmation PASSED [ 34%]
tests/cli/test_repl.py::TestReplConfig::test_default_config PASSED       [ 34%]
tests/cli/test_repl.py::TestReplConfig::test_custom_config PASSED        [ 34%]
tests/cli/test_repl.py::TestRepl::test_repl_init PASSED                  [ 34%]
tests/cli/test_repl.py::TestRepl::test_repl_with_config PASSED           [ 34%]
tests/cli/test_repl.py::TestRepl::test_builtin_tools_registered PASSED   [ 34%]
tests/cli/test_repl.py::TestRepl::test_all_exported_tools_registered PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_regular_message[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_quit_command[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_clear_command[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_help_command[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_empty[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_whitespace[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_input_at_reference[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_process_tool_call[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_unknown_command[asyncio] PASSED   [ 34%]
tests/cli/test_repl.py::TestRepl::test_agent_error_handling[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_thought_event_handling[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_error_event_handling[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_invalid_tool_call_type[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_tool_call_failure[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_slash_only_command[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestRepl::test_get_input_method[asyncio] PASSED  [ 34%]
tests/cli/test_repl.py::TestReplRun::test_run_single_turn[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestReplRun::test_run_exits_via_running_flag[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestReplRun::test_run_handles_keyboard_interrupt[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestReplRun::test_run_handles_eof[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_auto_save_enabled_saves_session_on_exit[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_auto_save_disabled_does_not_save[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_auto_save_on_keyboard_interrupt[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_auto_save_skips_empty_session[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_session_messages_recorded_during_conversation[asyncio] PASSED [ 34%]
tests/cli/test_repl.py::TestSessionAutoSave::test_session_records_tool_calls_and_results[asyncio] PASSED [ 34%]
tests/cli/test_repl_attribute_fix.py::TestReplHasRunMethod::test_repl_has_run_method PASSED [ 34%]
tests/cli/test_repl_attribute_fix.py::TestReplHasRunMethod::test_repl_run_is_async PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestReplHasRunMethod::test_repl_run_callable PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestReplHasRunMethod::test_repl_run_signature PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestReplImportable::test_repl_importable_from_henchman_cli_repl PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestReplImportable::test_repl_config_importable PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestReplImportable::test_run_interactive_imports_repl PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestRunInteractiveInvokesReplRun::test_run_interactive_invokes_repl_run_with_anyio PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestRunInteractiveInvokesReplRun::test_run_interactive_passes_correct_repl_instance PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCliEntrypointRuns::test_cli_entrypoint_help_no_attribute_error PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCliEntrypointRuns::test_cli_entrypoint_version_no_attribute_error PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCliEntrypointRuns::test_cli_with_prompt_no_attribute_error PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestInteractiveReplLoop::test_repl_run_callable_and_async PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestInteractiveReplLoop::test_repl_run_returns_coroutine PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestInteractiveReplLoop::test_repl_has_run_that_works_with_anyio PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestNoAttributeErrorRegression::test_repl_run_method_always_exists PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestNoAttributeErrorRegression::test_repl_run_is_coroutine_function PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestNoAttributeErrorRegression::test_no_attribute_error_with_mocked_repl_without_run PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestNoAttributeErrorRegression::test_app_py_calls_repl_run_not_repl_start PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCoverageRegression::test_repl_run_method_is_public PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCoverageRegression::test_app_py_references_repl_run PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCoverageRegression::test_repl_run_method_attributes PASSED [ 35%]
tests/cli/test_repl_attribute_fix.py::TestCoverageRegression::test_repl_run_vs_start_differentiation PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_create_session PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_load_session PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_load_by_tag PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_load_by_tag_not_found PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_save_raises_when_no_session PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_save_uses_current_session PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_save_with_explicit_session PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_list_sessions PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerDelegation::test_delete PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerRestoreHistory::test_restore_history_with_tool_calls PASSED [ 35%]
tests/cli/test_repl_session_manager.py::TestReplSessionManagerRestoreHistory::test_restore_history_without_tool_calls PASSED [ 35%]
tests/cli/test_repl_startup_message.py::test_repl_startup_displays_info_message[asyncio] PASSED [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_chat PASSED      [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_plan PASSED      [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_no_session PASSED [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_exception PASSED [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_with_settings PASSED [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_token_colors PASSED [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_with_mcp PASSED  [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_no_mcp PASSED    [ 35%]
tests/cli/test_repl_toolbar.py::test_get_toolbar_status_provider_without_default_model PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_print_success PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_print_error PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_print_info PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_print_usage PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_get_arg_existing PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_get_arg_out_of_bounds PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_get_arg_or_empty PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_has_min_args_true PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestCommandOperationContext::test_has_min_args_false PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestDisplayInfo::test_format_with_condition_and_value PASSED [ 35%]
tests/cli/test_session_helpers_coverage.py::TestDisplayInfo::test_format_no_condition PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayInfo::test_format_no_value PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayInfo::test_format_zero_max_id_len PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestAttributeDisplayInfo::test_format_with_condition PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestAttributeDisplayInfo::test_format_no_condition PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_tag_display_with_tag PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_tag_display_without_tag PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_basic_session_info PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_field_unknown_key PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_field_parent_id PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_field_no_parent PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_validate_args_passes PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_validate_args_fails PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_get_manager_returns_manager PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_get_manager_returns_none_when_missing PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_details_basic PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_details_with_merged PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_display_no_session PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestModuleLevelHelpers::test_format_session_display_with_session PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayHelpers::test_display_basic_session_info PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayHelpers::test_display_enhanced_session_info PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayHelpers::test_display_session_entry_success PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayHelpers::test_display_session_entry_load_error PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestDisplayHelpers::test_display_sessions_list PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestBranchExecutor::test_branch_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestBranchExecutor::test_branch_invalid_branch_point[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestBranchExecutor::test_branch_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestBranchExecutor::test_branch_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestMergeExecutor::test_merge_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestMergeExecutor::test_merge_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestMergeExecutor::test_merge_with_union_strategy[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestMergeExecutor::test_merge_with_tag_as_strategy[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestMergeExecutor::test_merge_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateSaveExecutor::test_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateSaveExecutor::test_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateSaveExecutor::test_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateCreateExecutor::test_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateCreateExecutor::test_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateCreateExecutor::test_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateListExecutor::test_no_templates[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateListExecutor::test_with_templates[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateDeleteExecutor::test_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateDeleteExecutor::test_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestTemplateDeleteExecutor::test_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestExportExecutor::test_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestExportExecutor::test_success_json[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestExportExecutor::test_success_markdown[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestExportExecutor::test_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestImportExecutor::test_missing_args[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestImportExecutor::test_file_not_found[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestImportExecutor::test_success[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestImportExecutor::test_import_error[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_template_with_valid_subcommand[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_template_with_invalid_subcommand[asyncio] PASSED [ 36%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_template_missing_subcommand[asyncio] PASSED [ 37%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_list_empty[asyncio] PASSED [ 37%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_list_with_sessions[asyncio] PASSED [ 37%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_list_no_manager[asyncio] PASSED [ 37%]
tests/cli/test_session_helpers_coverage.py::TestSessionCommandFullCoverage::test_unknown_subcommand_shows_help[asyncio] PASSED [ 37%]
tests/cli/test_session_manager_errors.py::test_save_no_session PASSED    [ 37%]
tests/cli/test_session_manager_errors.py::test_save_with_session PASSED  [ 37%]
tests/cli/test_session_manager_errors.py::test_save_current_session PASSED [ 37%]
tests/cli/test_simple_null_provider_bug.py::test_unreachable_yield_in_null_provider PASSED [ 37%]
tests/cli/test_team_command.py::test_team_status PASSED                  [ 37%]
tests/cli/test_team_command.py::test_team_reset PASSED                   [ 37%]
tests/cli/test_team_command.py::test_team_unknown_subcommand PASSED      [ 37%]
tests/cli/test_team_command.py::test_team_no_repl PASSED                 [ 37%]
tests/cli/test_team_command.py::test_team_no_orchestrator PASSED         [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_app_initialization PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_app_compose PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_app_css PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_pane_widgets PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_status_bar PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_initialize_core_components PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_add_message PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_keyboard_shortcuts_defined PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_toggle_thinking_pane PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_toggle_tool_pane PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_clear_thinking_pane PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_clear_tool_pane PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_switch_provider_failure_leaves_inconsistent_state PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_on_tree_node_selected_implementation_fixed PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_on_tree_node_selected_async_behavior PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_resolve_provider_from_env_handles_all_exceptions PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_fill_context_tree_proper_error_logging PASSED [ 37%]
tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_persist_history_entry_shows_error_notification PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestCheckUtf8EncodingExceptionPath::test_check_utf8_exception_is_silently_caught PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_success PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_unicode_decode_error_prints_and_reraises PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_exception_with_unicode_in_message_prints_and_reraises PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_other_exception_reraises_without_print PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_with_linux_driver PASSED [ 37%]
tests/cli/test_textual_app_coverage_100.py::TestRunTextualApp::test_run_textual_app_on_non_linux_uses_no_driver PASSED [ 37%]
tests/cli/test_textual_bridge_bugs.py::test_bug9_format_error_text_case_sensitivity PASSED [ 37%]
tests/cli/test_textual_bridge_bugs.py::test_bug10_format_turn_status_missing_keys PASSED [ 37%]
tests/cli/test_textual_bridge_bugs.py::test_bug11_event_bridge_forward_events_exception_handling PASSED [ 37%]
tests/cli/test_textual_bridge_bugs.py::test_bug12_event_handlers_missing_null_checks PASSED [ 37%]
tests/cli/test_textual_bridge_bugs.py::test_bug13_tui_console_adapter_buffer_overflow PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestDispatchUnhandledEvent::test_dispatch_unhandled_type_posts_status_message PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestOnUsageStats::test_update_status_bar_with_tokens_and_cost PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestOnUsageStats::test_update_status_bar_exception_is_caught PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestCreateHandlerPaths::test_create_handler_with_status_text_posts_status PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestCreateHandlerPaths::test_create_handler_with_prefix_posts_thought_message PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_tool_req_with_none_data_skips_post PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_tool_req_with_data_posts_message PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_error_with_empty_data_returns_early PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_agent_start_with_non_dict_returns_early PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_agent_done_with_non_dict_returns_early PASSED [ 37%]
tests/cli/test_textual_bridge_coverage_100.py::TestEventHandlerGuardReturns::test_on_delegated_with_non_dict_returns_early PASSED [ 38%]
tests/cli/test_textual_bridge_coverage_100.py::TestUpdateStatusBarBranchCoverage::test_update_status_bar_only_cost_no_tokens PASSED [ 38%]
tests/cli/test_textual_bridge_coverage_100.py::TestUpdateStatusBarBranchCoverage::test_update_status_bar_only_tokens_no_cost PASSED [ 38%]
tests/cli/test_textual_config.py::TestComponentInitializer::test_initialize_all_creates_input_handler_with_correct_config_type PASSED [ 38%]
tests/cli/test_textual_config.py::TestComponentInitializer::test_plugin_manager_ui_instance_assignment PASSED [ 38%]
tests/cli/test_textual_config_bugs.py::test_bug1_duplicate_config_classes PASSED [ 38%]
tests/cli/test_textual_config_bugs.py::test_bug2_input_handler_wrong_config_type PASSED [ 38%]
tests/cli/test_textual_config_bugs.py::test_bug3_plugin_manager_missing_ui_instance PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_renderer_no_tui_adapter_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_output_handler_no_core_context_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_output_handler_no_renderer_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_command_processor_no_core_context_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_command_processor_no_output_handler_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_tool_executor_no_core_context_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerErrorPaths::test_initialize_input_handler_no_renderer_raises PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerImportPaths::test_initialize_command_processor_imports_when_class_none PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerImportPaths::test_initialize_input_handler_imports_when_class_none PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerImportPaths::test_initialize_mcp_calls_initialize_mcp_when_manager_exists PASSED [ 38%]
tests/cli/test_textual_config_coverage_100.py::TestComponentInitializerImportPaths::test_initialize_mcp_does_nothing_when_no_manager PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestTuiConsoleAdapter::test_init_creates_rich_console PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestTuiConsoleAdapter::test_flush_to_chat_with_content PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestTuiConsoleAdapter::test_flush_to_chat_empty_buffer PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestTuiConsoleAdapter::test_print_calls_flush PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessageCreationHelpers::test_extract_dict_field_with_dict PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessageCreationHelpers::test_extract_dict_field_missing_key PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessageCreationHelpers::test_extract_dict_field_not_dict PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessageCreationHelpers::test_extract_dict_field_none_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessagePoster::test_post_calls_app PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessagePoster::test_post_message_with_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessagePoster::test_post_message_no_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestMessagePoster::test_post_status_message PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_content_event PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_thought_event PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_tool_call_request PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_error_event PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_finished_event PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_context_compacted PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_turn_status PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_agent_started PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_agent_completed PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_agent_delegated PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_dispatch_agent_message PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_create_handler_with_message_class PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_create_handler_with_status_text PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_create_handler_with_prefix PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_create_handler_raises_without_options PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_tool_req_with_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_error_with_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_finished PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_ctx_compact PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_turn_status PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_turn_status_no_data PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_agent_start PASSED [ 38%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_agent_done PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_delegated PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_agent_msg PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_on_agent_msg_no_data PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_update_status_bar PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestEventBridge::test_update_status_bar_no_tokens PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_init PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_build_params_label_with_params PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_build_params_label_no_params PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_build_params_label_non_serializable PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_action_approve PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_action_deny PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_on_button_pressed_yes PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestConfirmToolScreen::test_on_button_pressed_no PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestHelpScreen::test_on_button_pressed_close PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_on_button_pressed_cancel PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_on_button_pressed_switch_blank PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_on_button_pressed_switch_valid PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_build_provider_options_empty PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_current_provider_name PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestProviderScreen::test_current_provider_name_no_settings PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_init PASSED  [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_build_entries PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_action_cancel PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_on_button_pressed_cancel PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_on_button_pressed_resume_valid PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_on_button_pressed_delete_valid PASSED [ 39%]
tests/cli/test_textual_coverage.py::TestSessionScreen::test_on_button_pressed_no_selection PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_chatmessage_initialization PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_python_code_block_detection PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_python_syntax_highlighting_rendering PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_markdown_table_rendering PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_markdown_task_list_rendering PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_code_fence_language_detection PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_backward_compatibility_rich_markup PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_append_method_preserves_content PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_set_content_method PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_finalize_as_markdown_enables_flag PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_finalize_as_markdown_skips_plain_text PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_finalize_as_markdown_skips_empty PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_finish_agent_stream_calls_finalize PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestEnhancedChatMessage::test_highlight_disables_markdown PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestLooksLikeMarkdown::test_code_blocks PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestLooksLikeMarkdown::test_bold PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestLooksLikeMarkdown::test_headings PASSED [ 39%]
tests/cli/test_textual_enhanced_chatmessage.py::TestLooksLikeMarkdown::test_plain_text PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_app_initialization PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_app_compose_structure PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_pane_widgets_initialization PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_status_bar_functionality PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_henchman_textarea_bindings PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_add_message_functionality PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_event_bridge_initialization PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_event_bridge_forward_events PASSED [ 39%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_command_palette_functionality PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_history_navigation PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_tab_toggling PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_pane_clearing PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_search_actions_mocked PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_clear_search_action PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_modal_screens PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_textual_config_defaults PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_textual_config_custom_values PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_keyboard_shortcuts PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_on_mount_initialization PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_message_handler_methods_exist PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_process_user_input_integration_style PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_screen_composition PASSED [ 40%]
tests/cli/test_textual_functional_final.py::TestTextualFunctionalFinal::test_message_handling_with_errors PASSED [ 40%]
tests/cli/test_textual_integration.py::TestAppLifecycle::test_app_mounts_and_renders PASSED [ 40%]
tests/cli/test_textual_integration.py::TestAppLifecycle::test_initial_focus_on_input PASSED [ 40%]
tests/cli/test_textual_integration.py::TestAppLifecycle::test_status_bar_shows_provider PASSED [ 40%]
tests/cli/test_textual_integration.py::TestAppLifecycle::test_subtitle_shows_provider PASSED [ 40%]
tests/cli/test_textual_integration.py::TestWidgetComposition::test_chat_pane_exists_in_tab PASSED [ 40%]
tests/cli/test_textual_integration.py::TestWidgetComposition::test_thinking_pane_exists_in_tab PASSED [ 40%]
tests/cli/test_textual_integration.py::TestWidgetComposition::test_tool_pane_exists_in_tab PASSED [ 40%]
tests/cli/test_textual_integration.py::TestWidgetComposition::test_context_tree_exists_in_tab PASSED [ 40%]
tests/cli/test_textual_integration.py::TestWidgetComposition::test_command_palette_hidden_by_default PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTextInput::test_type_text_into_input PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTextInput::test_enter_submits_message PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTextInput::test_shift_enter_inserts_newline PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTextInput::test_empty_submit_does_nothing PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_agent_content_shows_in_chat PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_agent_thought_shows_in_chat_as_collapsible PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_tool_call_request_shows_in_tool_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_tool_call_result_shows_in_tool_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_agent_status_updates_status_bar PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_agent_finished_clears_streaming PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_add_message_user_role PASSED [ 40%]
tests/cli/test_textual_integration.py::TestMessageDisplay::test_add_message_assistant_role PASSED [ 40%]
tests/cli/test_textual_integration.py::TestCommandPalette::test_typing_slash_shows_palette PASSED [ 40%]
tests/cli/test_textual_integration.py::TestCommandPalette::test_typing_slash_help_filters PASSED [ 40%]
tests/cli/test_textual_integration.py::TestCommandPalette::test_hide_palette_on_non_slash PASSED [ 40%]
tests/cli/test_textual_integration.py::TestSearchFunctionality::test_ctrl_f_enters_search_mode PASSED [ 40%]
tests/cli/test_textual_integration.py::TestSearchFunctionality::test_escape_exits_search_mode PASSED [ 40%]
tests/cli/test_textual_integration.py::TestSearchFunctionality::test_search_status_bar_updates PASSED [ 40%]
tests/cli/test_textual_integration.py::TestSearchFunctionality::test_search_next_previous_wrap PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTabNavigation::test_toggle_thinking_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTabNavigation::test_toggle_tool_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTabNavigation::test_clear_thinking_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestTabNavigation::test_clear_tool_pane PASSED [ 40%]
tests/cli/test_textual_integration.py::TestHistoryNavigation::test_history_navigation_up_down PASSED [ 40%]
tests/cli/test_textual_integration.py::TestHistoryNavigation::test_submit_adds_to_history PASSED [ 40%]
tests/cli/test_textual_integration.py::TestHistoryNavigation::test_empty_history_navigation_does_nothing PASSED [ 40%]
tests/cli/test_textual_integration.py::TestModalScreens::test_help_screen_shows_and_dismisses PASSED [ 40%]
tests/cli/test_textual_integration.py::TestModalScreens::test_provider_screen_shows_and_dismisses PASSED [ 40%]
tests/cli/test_textual_integration.py::TestErrorHandling::test_add_message_handles_errors PASSED [ 40%]
tests/cli/test_textual_integration.py::TestErrorHandling::test_update_status_with_tokens_and_cost PASSED [ 40%]
tests/cli/test_textual_integration.py::TestErrorHandling::test_is_processing_blocks_submit PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEventBridge::test_forward_content_event PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEventBridge::test_forward_thought_event PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEventBridge::test_forward_finished_event PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEventBridge::test_forward_error_event PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEventBridge::test_forward_handles_stream_exception PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEndToEndMessageFlow::test_user_message_flows_to_provider_and_response_appears_in_chat PASSED [ 41%]
tests/cli/test_textual_integration.py::TestEndToEndMessageFlow::test_multiple_messages_accumulate_in_chat PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestTextualConfirmAttributeErrorBug::test_textual_confirm_without_init_raises_runtime_error[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestTextualConfirmAttributeErrorBug::test_textual_confirm_with_init_works[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestTextualConfirmCallbackRaceBug::test_callback_creates_task_for_lock_race[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestCancelledErrorBug::test_cancelled_error_propagated[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestTextualConfirmCleanupRaceBug::test_cleanup_race_condition[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestNullProviderDeadCodeBug::test_chat_completion_stream_raises_immediately[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestBoolConversionBug::test_callback_with_various_values[asyncio] PASSED [ 41%]
tests/cli/test_textual_mixins.py::TestNullProviderDeadCodeBug::test_no_unreachable_code_in_chat_completion_stream PASSED [ 41%]
tests/cli/test_textual_phase1.py::TestTextualPhase1::test_tabbed_structure PASSED [ 41%]
tests/cli/test_textual_phase1.py::TestTextualPhase1::test_textarea_input PASSED [ 41%]
tests/cli/test_textual_phase1.py::TestTextualPhase1::test_history_navigation_init PASSED [ 41%]
tests/cli/test_textual_phase1.py::TestTextualPhase1::test_submit_textarea PASSED [ 41%]
tests/cli/test_textual_phase2.py::TestTextualPhase2::test_search_logic PASSED [ 41%]
tests/cli/test_textual_phase2.py::TestTextualPhase2::test_slash_command_trigger PASSED [ 41%]
tests/cli/test_textual_phase2.py::TestTextualPhase2::test_slash_command_filter PASSED [ 41%]
tests/cli/test_textual_phase3.py::TestTextualPhase3::test_context_viewer_structure PASSED [ 41%]
tests/cli/test_textual_phase3.py::TestTextualPhase3::test_status_bar_update PASSED [ 41%]
tests/cli/test_textual_phase4.py::TestTextualPhase4::test_help_modal PASSED [ 41%]
tests/cli/test_textual_phase4.py::TestTextualPhase4::test_provider_switcher PASSED [ 41%]
tests/cli/test_textual_phase4.py::TestTextualPhase4::test_apply_code_block PASSED [ 41%]
tests/cli/test_textual_progress_indicators.py::TestProgressIndicators::test_progress_indicator_widget_creation PASSED [ 41%]
tests/cli/test_textual_progress_indicators.py::TestProgressIndicators::test_progress_shown_during_tool_execution PASSED [ 41%]
tests/cli/test_textual_progress_indicators.py::TestProgressIndicators::test_progress_shown_during_agent_work PASSED [ 41%]
tests/cli/test_textual_progress_indicators.py::TestProgressIndicators::test_progress_indicator_position PASSED [ 41%]
tests/cli/test_textual_screens_bugs.py::test_bug14_confirm_tool_screen_json_serialization PASSED [ 41%]
tests/cli/test_textual_screens_bugs.py::test_bug15_provider_screen_build_options PASSED [ 41%]
tests/cli/test_textual_screens_bugs.py::test_bug16_help_screen_static_content PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_confirm_tool_screen_init_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_confirm_tool_screen_compose_return_type PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_confirm_tool_screen_build_params_label_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_confirm_tool_screen_on_button_pressed_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_confirm_tool_screen_action_methods_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_help_screen_compose_return_type PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_help_screen_on_button_pressed_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_provider_screen_compose_return_type PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_provider_screen_build_options_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_provider_screen_current_provider_name_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_provider_screen_on_button_pressed_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_session_screen_init_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_session_screen_compose_return_type PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_session_screen_build_entries_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_session_screen_on_button_pressed_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_session_screen_action_cancel_type_hints PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_long_method_compose_refactoring PASSED [ 41%]
tests/cli/test_textual_screens_refactoring.py::test_duplicate_code_analysis PASSED [ 41%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_binding_defined PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_binding_show_in_ui PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_action_method_exists PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_widget_creation PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_action_shows_input PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_clears_on_escape PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_highlights_matches PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_navigation PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_also_in_thinking_pane PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_case_insensitive_search PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_search_status_update PASSED [ 42%]
tests/cli/test_textual_search.py::TestTextualSearch::test_no_matches_status PASSED [ 42%]
tests/cli/test_textual_session_management.py::TestSessionManagementScreen::test_session_screen_creation PASSED [ 42%]
tests/cli/test_textual_session_management.py::TestSessionManagementScreen::test_session_list_display PASSED [ 42%]
tests/cli/test_textual_session_management.py::TestSessionManagementScreen::test_session_resume_functionality PASSED [ 42%]
tests/cli/test_textual_session_management.py::TestSessionManagementScreen::test_session_delete_functionality PASSED [ 42%]
tests/cli/test_textual_session_management.py::TestSessionManagementScreen::test_session_list_functionality PASSED [ 42%]
tests/cli/test_textual_tool_boxes.py::test_tool_message_collapsed PASSED [ 42%]
tests/cli/test_textual_tool_boxes.py::test_tool_message_expanded PASSED  [ 42%]
tests/cli/test_textual_tool_boxes.py::test_tool_message_append PASSED    [ 42%]
tests/cli/test_textual_widgets_bugs.py::TestChatPaneBugs::test_bug4_double_scroll_on_new_agent_stream PASSED [ 42%]
tests/cli/test_textual_widgets_bugs.py::TestChatPaneBugs::test_bug5_finish_agent_stream_silent_failure PASSED [ 42%]
tests/cli/test_textual_widgets_bugs.py::TestChatPaneBugs::test_bug6_clear_thinking_messages_import_coupling PASSED [ 42%]
tests/cli/test_textual_widgets_bugs.py::TestChatPaneBugs::test_bug7_chatmessage_escape_handling PASSED [ 42%]
tests/cli/test_textual_widgets_bugs.py::TestChatPaneBugs::test_bug8_toolmessage_unused_parameters PASSED [ 42%]
tests/cli/test_textual_widgets_markup_bug.py::TestSystemMessageRichMarkup::test_welcome_message_renders_bold PASSED [ 42%]
tests/cli/test_textual_widgets_markup_bug.py::TestSystemMessageRichMarkup::test_system_message_with_colored_markup PASSED [ 42%]
tests/cli/test_textual_widgets_markup_bug.py::TestSystemMessageRichMarkup::test_chatpane_add_system_message_renders_markup PASSED [ 42%]
tests/cli/test_textual_widgets_markup_bug.py::TestSystemMessageRichMarkup::test_user_message_still_escapes_untrusted_content PASSED [ 42%]
tests/cli/test_textual_widgets_markup_bug.py::TestSystemMessageRichMarkup::test_default_trusted_is_false PASSED [ 42%]
tests/cli/test_textual_widgets_refactoring.py::TestChatPaneRefactoring::test_add_message_with_prefix_creates_chatmessage PASSED [ 42%]
tests/cli/test_textual_widgets_refactoring.py::TestChatPaneRefactoring::test_add_thinking_message_creates_thinkingmessage PASSED [ 42%]
tests/cli/test_textual_widgets_refactoring.py::TestChatPaneRefactoring::test_add_tool_message_creates_toolmessage PASSED [ 42%]
tests/cli/test_textual_widgets_refactoring.py::TestChatPaneRefactoring::test_partial_methods_work_correctly PASSED [ 42%]
tests/cli/test_textual_widgets_refactoring.py::TestChatPaneRefactoring::test_message_methods_have_correct_signatures PASSED [ 42%]
tests/cli/test_theme_command.py::test_theme_command_no_args PASSED       [ 42%]
tests/cli/test_theme_command.py::test_theme_list PASSED                  [ 42%]
tests/cli/test_theme_command.py::test_theme_set_valid PASSED             [ 42%]
tests/cli/test_theme_command.py::test_theme_set_invalid PASSED           [ 42%]
tests/cli/test_theme_command.py::test_theme_set_no_args PASSED           [ 42%]
tests/cli/test_theme_command.py::test_theme_preview_valid PASSED         [ 42%]
tests/cli/test_theme_command.py::test_theme_preview_invalid PASSED       [ 42%]
tests/cli/test_theme_command.py::test_theme_preview_no_args PASSED       [ 42%]
tests/cli/test_theme_command.py::test_theme_create PASSED                [ 42%]
tests/cli/test_theme_command.py::test_theme_unknown_subcommand PASSED    [ 42%]
tests/cli/test_theme_command.py::test_theme_command_properties PASSED    [ 42%]
tests/cli/test_theme_command.py::test_get_theme_manager_with_repl PASSED [ 42%]
tests/cli/test_theme_command.py::test_get_theme_manager_without_repl PASSED [ 42%]
tests/cli/test_theme_command.py::test_get_theme_manager_with_incomplete_repl PASSED [ 42%]
tests/cli/test_theme_command.py::test_theme_set_updates_renderer PASSED  [ 42%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_thinking_message_widget_exists PASSED [ 42%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_tool_message_widget_exists PASSED [ 42%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_thinking_message_styling PASSED [ 42%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_tool_message_styling PASSED [ 42%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_thinking_message_accumulates_content PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_thinking_message_not_token_by_token PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_chat_pane_displays_thinking_messages PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_chat_pane_displays_tool_messages PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_thinking_message_with_agent_name PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_tool_message_with_thought PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_chat_pane_clears_thinking_messages PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_no_separate_thinking_pane_in_layout PASSED [ 43%]
tests/cli/test_thinking_in_chat.py::TestThinkingInChat::test_no_separate_tool_pane_in_layout PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_thinking_indicator_initialization PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_start_thinking PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_start_thinking_default_message PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_stop_thinking PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_stop_thinking_when_not_thinking PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_thinking_context_manager PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_thinking_context_manager_default_message PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_is_thinking_property PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_thinking_with_custom_spinner PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_thinking_context_manager_exception_handling PASSED [ 43%]
tests/cli/test_thinking_indicator.py::TestThinkingIndicator::test_multiple_start_thinking_calls PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestThinkingStreamAccumulation::test_on_agent_thought_uses_streaming_api PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestThinkingStreamAccumulation::test_multiple_thoughts_same_agent_accumulate PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestThinkingStreamAccumulation::test_different_agents_get_separate_widgets PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestThinkingStreamAccumulation::test_empty_source_agent_defaults_to_empty_string PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestToolResultSpacing::test_tool_result_header_has_space_after_emoji PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestToolResultSpacing::test_tool_pane_result_has_space_after_arrow PASSED [ 43%]
tests/cli/test_thinking_streaming_and_tool_spacing.py::TestToolResultSpacing::test_tool_result_chat_pane_formatting PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_on_agent_thought_message_adds_thinking_widget PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_on_tool_call_request_message_adds_tool_widget PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_thinking_message_appears_in_chat_pane PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_tool_message_appears_in_chat_pane PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_mixed_messages_in_chat_pane PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_thinking_message_streaming PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_event_bridge_converts_thought_events PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_event_bridge_converts_tool_request_events PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_thinking_messages_clearable PASSED [ 43%]
tests/cli/test_thinking_tool_display.py::TestThinkingToolDisplay::test_all_messages_clearable PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_warning PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_heading PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_markdown PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_code PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_rule PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_clear PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_tool_call PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_tool_result PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_tool_summary PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_agent_content PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_show_thinking PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_confirm_tool_execution[asyncio] PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_start_task PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_update_task PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_complete_task PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererDelegation::test_create_status PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererStatusMessage::test_status_message_exception_in_token_count PASSED [ 43%]
tests/cli/test_ui_renderer_methods.py::TestUIRendererStatusMessage::test_status_message_rag_indexing PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_no_context_files PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_global_context_file PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_workspace_context_file PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_ancestor_context_files PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_stops_at_git_root PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_load_empty PASSED  [ 44%]
tests/config/test_context.py::TestContextLoader::test_load_single_file PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_load_multiple_files PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_load_with_file_header PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_custom_filename PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_subdirectory_context_files PASSED [ 44%]
tests/config/test_context.py::TestContextLoader::test_respects_gitignore PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderFilename::test_default_filenames PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderFilename::test_filename_property_returns_first PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderFilename::test_custom_single_filename PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderFilename::test_custom_filenames_sequence PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderMultipleFilenames::test_discovers_copilot_instructions PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderMultipleFilenames::test_discovers_gemini_md PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderMultipleFilenames::test_discovers_all_three_in_order PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderMultipleFilenames::test_ancestor_copilot_instructions PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderMultipleFilenames::test_load_concatenates_all_file_types PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderGitignore::test_gitignore_with_comments_and_empty_lines PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderGitignore::test_pattern_matches_first_path_component PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderSubdirectories::test_skips_non_directories PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderSubdirectories::test_skips_hidden_directories PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderSubdirectories::test_subdirs_without_git_root PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderSubdirectories::test_subdir_without_context_file PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderIsIgnored::test_path_not_relative_to_base PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderIsIgnored::test_pattern_matches_full_path PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderIsIgnored::test_pattern_matches_first_component_only PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderAncestorSearch::test_no_ancestors_with_context PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderAncestorSearch::test_ancestor_search_without_git PASSED [ 44%]
tests/config/test_context.py::TestContextLoaderAncestorSearch::test_cwd_equals_git_root PASSED [ 44%]
tests/config/test_environment.py::TestRunCmd::test_successful_command PASSED [ 44%]
tests/config/test_environment.py::TestRunCmd::test_failed_command PASSED [ 44%]
tests/config/test_environment.py::TestRunCmd::test_nonexistent_command PASSED [ 44%]
tests/config/test_environment.py::TestRunCmd::test_timeout PASSED        [ 44%]
tests/config/test_environment.py::TestDetectGitRoot::test_in_git_repo PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitRoot::test_not_in_git_repo PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitBranch::test_returns_string_or_none PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_returns_string_or_none PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_clean_repo PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_few_changes PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_many_changes_summarised PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_git_not_available PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_summary_with_added_and_deleted PASSED [ 44%]
tests/config/test_environment.py::TestDetectGitStatus::test_summary_with_other_category PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_python_project PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_node_project PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_rust_project PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_go_project PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_multiple_types PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_no_markers PASSED [ 44%]
tests/config/test_environment.py::TestDetectProjectTypes::test_deduplicates_types PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_docker_compose_yaml PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_docker_compose_yml PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_java_maven PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_java_gradle PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_ruby_project PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_php_project PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_make_project PASSED [ 45%]
tests/config/test_environment.py::TestDetectProjectTypes::test_typescript_project PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_basic_listing PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_hidden_files_excluded PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_max_entries PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_sorted_output PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_empty_directory PASSED [ 45%]
tests/config/test_environment.py::TestGetDirectorySnapshot::test_oserror_handling PASSED [ 45%]
tests/config/test_environment.py::TestDetectAvailableTools::test_returns_list PASSED [ 45%]
tests/config/test_environment.py::TestDetectAvailableTools::test_common_tool_detected PASSED [ 45%]
tests/config/test_environment.py::TestDetectAvailableTools::test_with_mocked_shutil PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_returns_frozen_dataclass PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_working_directory_is_absolute PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_defaults_to_cwd PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_os_info_present PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_python_version_present PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_project_types_detected PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_directory_snapshot_populated PASSED [ 45%]
tests/config/test_environment.py::TestGatherEnvironment::test_uses_git_root_for_inspection PASSED [ 45%]
tests/config/test_environment.py::TestFormatEnvironmentBlock::test_basic_format PASSED [ 45%]
tests/config/test_environment.py::TestFormatEnvironmentBlock::test_minimal_format PASSED [ 45%]
tests/config/test_environment.py::TestFormatEnvironmentBlock::test_multiple_project_types PASSED [ 45%]
tests/config/test_missing_coverage.py::TestDiscoverSettingsFilesEnvPath::test_nonexistent_env_path_falls_through PASSED [ 45%]
tests/config/test_missing_coverage.py::TestDiscoverSettingsFilesEnvPath::test_existing_env_path_is_used PASSED [ 45%]
tests/config/test_missing_coverage.py::TestSaveSettingsJson::test_save_to_json_file PASSED [ 45%]
tests/config/test_missing_coverage.py::TestSaveSettingsJson::test_save_to_yaml_file PASSED [ 45%]
tests/config/test_missing_coverage.py::TestSaveSettingsDefaultPath::test_save_to_default_path PASSED [ 45%]
tests/config/test_schema.py::TestProviderSettings::test_default_values PASSED [ 45%]
tests/config/test_schema.py::TestProviderSettings::test_custom_values PASSED [ 45%]
tests/config/test_schema.py::TestProviderSettings::test_model_dump PASSED [ 45%]
tests/config/test_schema.py::TestToolSettings::test_default_values PASSED [ 45%]
tests/config/test_schema.py::TestToolSettings::test_custom_values PASSED [ 45%]
tests/config/test_schema.py::TestToolSettings::test_sandbox_literal_validation PASSED [ 45%]
tests/config/test_schema.py::TestUISettings::test_default_values PASSED  [ 45%]
tests/config/test_schema.py::TestUISettings::test_custom_values PASSED   [ 45%]
tests/config/test_schema.py::TestMcpServerConfig::test_minimal_config PASSED [ 45%]
tests/config/test_schema.py::TestMcpServerConfig::test_full_config PASSED [ 45%]
tests/config/test_schema.py::TestSettings::test_default_values PASSED    [ 45%]
tests/config/test_schema.py::TestSettings::test_agent_settings PASSED    [ 45%]
tests/config/test_schema.py::TestSettings::test_nested_settings PASSED   [ 45%]
tests/config/test_schema.py::TestSettings::test_mcp_servers PASSED       [ 45%]
tests/config/test_schema.py::TestSettings::test_from_dict PASSED         [ 45%]
tests/config/test_schema.py::TestSettings::test_model_dump PASSED        [ 45%]
tests/config/test_schema_errors.py::test_agent_config_no_tools_error PASSED [ 45%]
tests/config/test_schema_errors.py::test_agent_config_with_tools PASSED  [ 45%]
tests/config/test_settings.py::TestDeepMerge::test_empty_dicts PASSED    [ 45%]
tests/config/test_settings.py::TestDeepMerge::test_base_only PASSED      [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_override_only PASSED  [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_simple_override PASSED [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_nested_merge PASSED   [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_override_non_dict_with_dict PASSED [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_override_dict_with_non_dict PASSED [ 46%]
tests/config/test_settings.py::TestDeepMerge::test_does_not_mutate_inputs PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_default_settings PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_user_settings PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_workspace_settings PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_workspace_overrides_user PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_env_override_provider PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_env_override_model PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_json_settings_file PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_yaml_preferred_over_json PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_invalid_yaml_raises_error PASSED [ 46%]
tests/config/test_settings.py::TestLoadSettings::test_invalid_settings_structure PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_no_config_directories PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_user_config_only PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_workspace_config_only PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_both_configs_ordered PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_yml_extension PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_empty_henchman_directory PASSED [ 46%]
tests/config/test_settings.py::TestSettingsFileDiscovery::test_json_fallback PASSED [ 46%]
tests/core/test_agent.py::test_agent_auto_detects_model_from_provider PASSED [ 46%]
tests/core/test_agent.py::test_agent_explicit_model_overrides_provider PASSED [ 46%]
tests/core/test_agent.py::test_agent_explicit_max_tokens_overrides_all PASSED [ 46%]
tests/core/test_agent.py::test_agent_no_model_no_provider_model_uses_default PASSED [ 46%]
tests/core/test_agent.py::test_agent_emits_source_agent PASSED           [ 46%]
tests/core/test_agent.py::test_agent_no_identity_emits_none_source_agent PASSED [ 46%]
tests/core/test_agent.py::test_agent_clear_history_keeps_system_prompt PASSED [ 46%]
tests/core/test_agent.py::test_agent_clear_history_no_system_prompt PASSED [ 46%]
tests/core/test_agent.py::test_agent_submit_tool_result PASSED           [ 46%]
tests/core/test_agent.py::test_agent_get_messages_for_api PASSED         [ 46%]
tests/core/test_agent.py::test_agent_stall_detection_skip_short_response PASSED [ 46%]
tests/core/test_agent.py::test_agent_stall_detection_skip_with_tool_calls PASSED [ 46%]
tests/core/test_agent.py::test_agent_stall_detection_disabled PASSED     [ 46%]
tests/core/test_agent.py::test_agent_detect_stalling_patterns_colon_ending PASSED [ 46%]
tests/core/test_agent.py::test_agent_detect_stalling_patterns_intent_phrases PASSED [ 46%]
tests/core/test_agent.py::test_agent_check_for_stalling_no_stall PASSED  [ 46%]
tests/core/test_agent.py::test_agent_check_for_stalling_with_nudge PASSED [ 46%]
tests/core/test_agent.py::test_agent_check_for_stalling_max_nudges PASSED [ 46%]
tests/core/test_agent.py::test_agent_run_with_stalling_nudge PASSED      [ 46%]
tests/core/test_agent.py::test_agent_continue_with_tool_results PASSED   [ 46%]
tests/core/test_agent.py::test_continue_with_tool_results_stall_detection PASSED [ 46%]
tests/core/test_agent.py::test_continue_with_tool_results_stall_failure PASSED [ 46%]
tests/core/test_agent.py::test_continue_with_tool_results_no_stall_on_normal_response PASSED [ 46%]
tests/core/test_agent.py::test_agent_constants PASSED                    [ 46%]
tests/core/test_agent.py::test_agent_properties PASSED                   [ 46%]
tests/core/test_agent.py::test_agent_emit_with_identity PASSED           [ 46%]
tests/core/test_agent.py::test_agent_emit_without_identity PASSED        [ 46%]
tests/core/test_agent.py::test_apply_pending_config_no_config_object PASSED [ 46%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_pending_config_with_non_config_key_not_applied PASSED [ 46%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_setattr_pending_config_already_exists PASSED [ 46%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_getattr_returns_pending_config_value PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_getattr_raises_attribute_error_no_config_no_pending PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_getattr_raises_attribute_error_no_stall PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_getattr_raises_attribute_error_alias_target_missing PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_setattr_stores_in_pending_config_when_config_absent PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_setattr_super_when_stall_absent PASSED [ 47%]
tests/core/test_agent_coverage_100.py::TestAgentPendingConfig::test_setattr_super_when_alias_target_absent PASSED [ 47%]
tests/core/test_automatic_compaction.py::TestAutomaticContextCompaction::test_compaction_applied_when_needed PASSED [ 47%]
tests/core/test_automatic_compaction.py::TestAutomaticContextCompaction::test_no_compaction_when_within_limit PASSED [ 47%]
tests/core/test_automatic_compaction.py::TestAutomaticContextCompaction::test_system_prompt_preserved PASSED [ 47%]
tests/core/test_automatic_compaction.py::TestAutomaticContextCompaction::test_last_user_message_preserved_when_user_last PASSED [ 47%]
tests/core/test_automatic_compaction.py::TestAutomaticContextCompaction::test_compaction_logic_understands_token_limits PASSED [ 47%]
tests/core/test_compaction_start_index.py::TestStartIndexUpdatedAfterCompaction::test_start_index_decreases_after_simple_compaction[asyncio] PASSED [ 47%]
tests/core/test_compaction_start_index.py::TestStartIndexUpdatedAfterCompaction::test_start_index_correct_after_summarization_compaction[asyncio] PASSED [ 47%]
tests/core/test_compaction_start_index.py::TestStartIndexUpdatedAfterCompaction::test_subsequent_compaction_uses_correct_start_index[asyncio] PASSED [ 47%]
tests/core/test_compaction_start_index.py::TestStartIndexUpdatedAfterCompaction::test_no_compaction_leaves_start_index_unchanged[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestEventBusMissingLines::test_history_limit_is_respected[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestEventBusMissingLines::test_clear_history[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines::test_mcp_client_call_tool_without_session[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_connect_all_creates_tools[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_disconnect_all[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_call_tool_unknown_server[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_call_tool_known_server[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines2::test_mcp_client_disconnect_with_exit_stack_none[asyncio] PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionExportMissingLines::test_render_metadata_with_parent_id PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionExportMissingLines::test_render_metadata_with_template_id PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionExportMissingLines::test_export_to_markdown_preserves_structure PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionManagerBaseMissingLines::test_load_session_raises_when_data_dir_missing PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionManagerBaseMissingLines::test_load_session_raises_ambiguous_prefix PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionMergeMissingLines::test_merge_intersection_empty_sessions PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionMergeMissingLines::test_merge_validate_fewer_than_2_sessions PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionMergeMissingLines::test_merge_invalid_strategy PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionMergeMissingLines::test_merge_different_projects_raises PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionTemplatesMissingLines::test_try_load_template_invalid_json PASSED [ 47%]
tests/core/test_coverage_boost.py::TestSessionTemplatesMissingLines::test_list_templates_nonexistent_dir PASSED [ 47%]
tests/core/test_coverage_boost.py::TestTurnStateMissingLines::test_track_duplicates_read_only_below_threshold PASSED [ 47%]
tests/core/test_coverage_boost.py::TestTurnStateMissingLines::test_track_result_hash_trims_old PASSED [ 47%]
tests/core/test_coverage_boost.py::TestTurnStateMissingLines::test_format_status_spinning PASSED [ 47%]
tests/core/test_coverage_boost.py::TestTurnStateMissingLines::test_format_status_making_progress PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines::test_filtered_stderr_write_with_info_prefix PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines::test_filtered_stderr_write_filters_info PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines::test_filtered_stream_verbose_passthrough PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_get_all_tools PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_build_logging_env_node_server PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines::test_create_from_settings_none_settings PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines2::test_filtered_stream_bracket_info_filtered PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpClientMissingLines2::test_filtered_stream_empty_line_filtered PASSED [ 47%]
tests/core/test_coverage_boost.py::TestMcpManagerMissingLines2::test_build_logging_env_python_logging_disabled PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_session_manager_base_unambiguous_prefix PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_session_export_import_json_no_tag PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_turn_is_making_progress_unique_hashes_below_threshold PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_turn_is_spinning_no_hash_repeats PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_turn_get_status_string_not_spinning_not_progress PASSED [ 47%]
tests/core/test_coverage_boost.py::TestCoreRemainingGaps::test_mcp_manager_build_env_generic_server PASSED [ 47%]
tests/core/test_eventbus.py::test_eventbus_subscribe_publish PASSED      [ 48%]
tests/core/test_eventbus.py::test_eventbus_subscribe_all PASSED          [ 48%]
tests/core/test_eventbus.py::test_eventbus_unsubscribe PASSED            [ 48%]
tests/core/test_eventbus.py::test_eventbus_history PASSED                [ 48%]
tests/core/test_eventbus.py::test_eventbus_error_isolation PASSED        [ 48%]
tests/core/test_eventbus.py::test_eventbus_sync_handler PASSED           [ 48%]
tests/core/test_events.py::TestEventType::test_event_types_exist PASSED  [ 48%]
tests/core/test_events.py::TestEventType::test_event_types_are_unique PASSED [ 48%]
tests/core/test_events.py::TestAgentEvent::test_content_event PASSED     [ 48%]
tests/core/test_events.py::TestAgentEvent::test_thought_event PASSED     [ 48%]
tests/core/test_events.py::TestAgentEvent::test_tool_call_request_event PASSED [ 48%]
tests/core/test_events.py::TestAgentEvent::test_tool_call_result_event PASSED [ 48%]
tests/core/test_events.py::TestAgentEvent::test_error_event PASSED       [ 48%]
tests/core/test_events.py::TestAgentEvent::test_finished_event PASSED    [ 48%]
tests/core/test_events.py::TestAgentEvent::test_event_with_none_data PASSED [ 48%]
tests/core/test_events.py::TestAgentEvent::test_event_equality PASSED    [ 48%]
tests/core/test_events.py::TestAgentEvent::test_event_inequality PASSED  [ 48%]
tests/core/test_events.py::TestAgentEvent::test_event_with_source_agent PASSED [ 48%]
tests/core/test_events.py::TestAgentEvent::test_multi_agent_events PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_agent_initialization_with_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_agent_initialization_without_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_get_messages_for_api_with_intelligent_context_enabled PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_get_messages_for_api_with_intelligent_context_disabled PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_get_messages_for_api_with_turn_protection PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_apply_simple_compaction_with_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_apply_simple_compaction_without_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_token_reduction_metrics_with_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_agent_run_with_intelligent_context PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_configuration_integration PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_message_compaction_integration_with_tool_sequences PASSED [ 48%]
tests/core/test_intelligent_context_integration.py::TestAgentIntelligentContextIntegration::test_backward_compatibility PASSED [ 48%]
tests/core/test_missing_coverage.py::TestBuildOuterFinishedEvent::test_with_usage PASSED [ 48%]
tests/core/test_missing_coverage.py::TestBuildOuterFinishedEvent::test_without_usage PASSED [ 48%]
tests/core/test_missing_coverage.py::TestBuildOuterFinishedEvent::test_with_none_state PASSED [ 48%]
tests/core/test_missing_coverage.py::TestStreamStateCreateFinishedData::test_with_usage_returns_dict PASSED [ 48%]
tests/core/test_missing_coverage.py::TestStreamStateCreateFinishedData::test_without_usage_returns_string PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentSetattr::test_set_max_tokens_alias PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentSetattr::test_set_history_alias PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentSetattr::test_set_tools_alias PASSED [ 48%]
tests/core/test_missing_coverage.py::TestApplySimpleCompaction::test_repair_after_compaction[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestCompactIfNeededProtectedTokens::test_protected_tokens_updated_when_start_index_in_range[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestCompactIfNeededRepair::test_repair_after_compact[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestTrySummarizedCompact::test_returns_false_when_not_compacted[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestTrySummarizedCompact::test_repairs_invalid_sequence_after_summarization[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestStreamWithStallLoop::test_repairs_self_messages_when_invalid[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestStreamWithStallLoop::test_repairs_api_messages_when_invalid[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentCheckForStalling::test_check_for_stalling_delegates_to_stall[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestGenerateStreamEventsCompacted::test_compacted_event_emitted[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestGenerateStreamEventsThinking::test_thinking_yields_thought_event[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestGenerateStreamEventsError::test_provider_error_yields_error_event[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestStreamWithStallLoopException::test_exception_yields_error_event[asyncio] PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentGetattr::test_get_stall_field PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentGetattr::test_get_stall_detection_enabled PASSED [ 48%]
tests/core/test_missing_coverage.py::TestAgentGetattr::test_get_unknown_attribute_raises PASSED [ 49%]
tests/core/test_missing_coverage.py::TestAgentSetStallFields::test_set_stall_detection_enabled PASSED [ 49%]
tests/core/test_missing_coverage.py::TestAgentSetStallFields::test_set_max_stall_nudges PASSED [ 49%]
tests/core/test_missing_coverage.py::TestAccumulateChunk::test_accumulates_thinking PASSED [ 49%]
tests/core/test_missing_coverage.py::TestAccumulateChunk::test_accumulates_usage PASSED [ 49%]
tests/core/test_missing_coverage.py::TestHandleFinishToolCalls::test_tool_calls_branch PASSED [ 49%]
tests/core/test_missing_coverage.py::TestRecordDelegationErrors::test_lock_and_list_initialized_at_construction PASSED [ 49%]
tests/core/test_missing_coverage.py::TestRecordDelegationErrors::test_first_call_records_errors PASSED [ 49%]
tests/core/test_missing_coverage.py::TestRecordDelegationErrors::test_subsequent_call_appends PASSED [ 49%]
tests/core/test_missing_coverage.py::TestGetDelegationErrors::test_returns_empty_list_when_no_errors_recorded PASSED [ 49%]
tests/core/test_missing_coverage.py::TestGetDelegationErrors::test_returns_recorded_errors PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_user_message PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_assistant_message PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_tool_message PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_message_with_tool_calls PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_message_with_agent PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_to_dict PASSED      [ 49%]
tests/core/test_session.py::TestSessionMessage::test_to_dict_minimal PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_to_dict_with_tool_calls PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_to_dict_with_tool_call_id PASSED [ 49%]
tests/core/test_session.py::TestSessionMessage::test_from_dict PASSED    [ 49%]
tests/core/test_session.py::TestSessionMetadata::test_create_metadata PASSED [ 49%]
tests/core/test_session.py::TestSessionMetadata::test_metadata_without_tag PASSED [ 49%]
tests/core/test_session.py::TestSessionMetadata::test_to_dict PASSED     [ 49%]
tests/core/test_session.py::TestSessionMetadata::test_from_dict PASSED   [ 49%]
tests/core/test_session.py::TestSession::test_create_session PASSED      [ 49%]
tests/core/test_session.py::TestSession::test_session_with_tag PASSED    [ 49%]
tests/core/test_session.py::TestSession::test_session_with_messages PASSED [ 49%]
tests/core/test_session.py::TestSession::test_session_with_agents_and_delegation PASSED [ 49%]
tests/core/test_session.py::TestSession::test_to_dict PASSED             [ 49%]
tests/core/test_session.py::TestSession::test_from_dict PASSED           [ 49%]
tests/core/test_session.py::TestSession::test_to_json PASSED             [ 49%]
tests/core/test_session.py::TestSession::test_from_json PASSED           [ 49%]
tests/core/test_session.py::TestSession::test_get_metadata PASSED        [ 49%]
tests/core/test_session.py::TestSession::test_session_with_enhanced_fields PASSED [ 49%]
tests/core/test_session.py::TestSession::test_session_enhanced_fields_serialization PASSED [ 49%]
tests/core/test_session.py::TestSession::test_session_enhanced_fields_json_roundtrip PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_export_session_markdown_no_metadata PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_export_session_with_tool_calls PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_export_session_with_turn_summaries PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_export_session_with_agent_info PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_import_session_markdown_error PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_import_session_invalid_format PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_save_template_without_parameters PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_create_from_template_without_parameters PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_create_from_template_nonexistent PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_delete_template_nonexistent PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_session_with_all_enhanced_fields PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_merge_sessions_with_turn_summaries PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_branch_session_with_all_metadata PASSED [ 49%]
tests/core/test_session_enhanced.py::TestSessionEnhancedCoverage::test_export_import_preserves_enhanced_fields PASSED [ 49%]
tests/core/test_session_errors.py::test_load_ambiguous_session_id PASSED [ 49%]
tests/core/test_session_errors.py::test_load_session_not_found PASSED    [ 49%]
tests/core/test_session_manager.py::TestSessionManager::test_create_manager PASSED [ 49%]
tests/core/test_session_manager.py::TestSessionManager::test_default_data_dir PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_create_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_create_session_with_tag PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_save_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_load_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_load_nonexistent_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_load_by_tag PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_load_by_tag_not_found PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_load_by_tag_skips_non_matching PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_list_sessions PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_list_sessions_empty PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_list_sessions_no_data_dir PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_list_sessions_skips_invalid_json PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_list_all_sessions PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_delete_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_delete_nonexistent_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_update_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_get_current_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManager::test_clear_current_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_branch_session PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_branch_session_invalid_point PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_merge_sessions_union PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_merge_sessions_smart PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_merge_sessions_intersection PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_merge_sessions_different_projects PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_merge_sessions_insufficient_sessions PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_export_session_json PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_export_session_markdown PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_export_session_invalid_format PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_import_session_json PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_save_template PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_create_from_template PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_list_templates PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerEnhancedFeatures::test_delete_template PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerProjectHash::test_compute_project_hash PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerProjectHash::test_project_hash_is_consistent PASSED [ 50%]
tests/core/test_session_manager.py::TestSessionManagerProjectHash::test_project_hash_differs_for_different_dirs PASSED [ 50%]
tests/core/test_streaming_tool_calls.py::TestStreamingToolCallAccumulation::test_tool_calls_accumulated_before_finish_reason[asyncio] PASSED [ 50%]
tests/core/test_streaming_tool_calls.py::TestStreamingToolCallAccumulation::test_content_streamed_as_it_comes[asyncio] PASSED [ 50%]
tests/core/test_streaming_tool_calls.py::TestStreamingToolCallAccumulation::test_tool_results_match_after_streaming[asyncio] PASSED [ 50%]
tests/core/test_streaming_tool_calls.py::TestStreamingToolCallAccumulation::test_no_tool_triplication_on_multiple_finish_chunks[asyncio] PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_default_values PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_reset PASSED          [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_record_tool_call PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_increment_iteration PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_is_making_progress PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_is_spinning_consecutive_duplicates PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_is_spinning_repeated_results PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_get_adaptive_limit PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_get_status_string PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_is_approaching_limit PASSED [ 50%]
tests/core/test_turn_state.py::TestTurnState::test_is_at_limit PASSED    [ 50%]
tests/core/test_turn_state.py::TestTurnSummary::test_basic_creation PASSED [ 50%]
tests/e2e/test_agent_interaction.py::test_agent_interaction_flow PASSED  [ 50%]
tests/e2e/test_context_safety.py::TestContextSafety::test_shell_tool_truncation PASSED [ 51%]
tests/e2e/test_context_safety.py::TestContextSafety::test_glob_tool_truncation PASSED [ 51%]
tests/e2e/test_context_safety.py::TestContextSafety::test_compactor_safety_limit PASSED [ 51%]
tests/e2e/test_context_safety.py::TestContextSafety::test_compactor_safety_limit_preserves_tool_calls PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_tools_in_registry[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_tool_execution_flow[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_tool_error_handling[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_server_connection_failure[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_tool_auto_approval_based_on_trust[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_real_serena_help_command[asyncio] PASSED [ 51%]
tests/e2e/test_mcp_integration.py::TestMcpEndToEnd::test_mcp_config_from_settings PASSED [ 51%]
tests/e2e/test_plan_mode_workflow.py::test_plan_mode_workflow PASSED     [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_cli_with_mcp_config PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_mcp_list_command_integration PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_real_serena_installation PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_mcp_tool_integration_with_agent PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_serena_mcp_manager_integration[asyncio] PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_multiple_mcp_servers_with_serena[asyncio] PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_serena_environment_variables PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_serena_command_shell_execution PASSED [ 51%]
tests/e2e/test_serena_cli_integration.py::TestSerenaCliIntegration::test_mcp_server_config_serialization PASSED [ 51%]
tests/e2e/test_tool_fix.py::test_e2e_tool_execution PASSED               [ 51%]
tests/e2e/test_tool_fix.py::test_shell_tool_execution PASSED             [ 51%]
tests/e2e/test_tool_fix.py::test_file_read_tool PASSED                   [ 51%]
tests/e2e/test_tool_fix.py::test_all_builtin_tools_registered PASSED     [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_openai_provider_rejects_empty_messages PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_openai_provider_rejects_messages_with_empty_content PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_openai_provider_allows_tool_messages_with_empty_content PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_agent_validates_messages_before_sending PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_message_validation_in_provider PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestInputValidationInREPL::test_repl_validation_of_empty_input PASSED [ 51%]
tests/empty_message_validation/test_empty_messages.py::TestInputValidationInREPL::test_repl_processes_valid_input PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_extension_name PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_extension_version PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_extension_description PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_get_tools PASSED  [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_get_commands PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_get_context PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_minimal_extension_defaults PASSED [ 51%]
tests/extensions/test_base.py::TestExtensionBase::test_extension_is_abstract PASSED [ 51%]
tests/extensions/test_command.py::TestExtensionsCommand::test_command_name PASSED [ 51%]
tests/extensions/test_command.py::TestExtensionsCommand::test_command_description PASSED [ 51%]
tests/extensions/test_command.py::TestExtensionsCommand::test_command_usage PASSED [ 51%]
tests/extensions/test_command.py::TestExtensionsCommand::test_list_no_extensions[asyncio] PASSED [ 51%]
tests/extensions/test_command.py::TestExtensionsCommand::test_list_with_extensions[asyncio] PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_init_empty PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_register_extension PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_get_extension PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_register_multiple_extensions PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_duplicate_registration_replaces PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_get_all_tools PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_get_all_commands PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_get_combined_context PASSED [ 51%]
tests/extensions/test_manager.py::TestExtensionManager::test_unregister_extension PASSED [ 52%]
tests/extensions/test_manager.py::TestEntryPointDiscovery::test_discover_entry_points_empty PASSED [ 52%]
tests/extensions/test_manager.py::TestEntryPointDiscovery::test_discover_entry_points_loads_extension PASSED [ 52%]
tests/extensions/test_manager.py::TestEntryPointDiscovery::test_discover_entry_points_handles_error PASSED [ 52%]
tests/extensions/test_manager.py::TestEntryPointDiscovery::test_discover_entry_points_python_310_compat PASSED [ 52%]
tests/extensions/test_manager.py::TestEntryPointDiscovery::test_discover_entry_points_not_subclass PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_no_dir PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_empty PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_loads_extension PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_handles_invalid_extension PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_handles_missing_class PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_skips_files PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_skips_dirs_without_extension_py PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_handles_instantiation_failure PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_discover_directory_handles_load_exception PASSED [ 52%]
tests/extensions/test_manager.py::TestDirectoryDiscovery::test_load_extension_from_file_spec_none PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginDatabaseCorruptRow::test_corrupt_row_is_skipped[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginInstallerUnsupportedSource::test_unsupported_source_raises[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerDisabledPlugin::test_disabled_plugin_not_loaded[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerCloseNoRegistry::test_close_with_no_registry_client[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerGetPluginInfo::test_get_plugin_info_when_initialized[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerPermissionLogging::test_permissions_are_logged[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerUninstallNoPath::test_uninstall_no_path[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerUpdateException::test_update_plugin_raises_on_reinstall_failure[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerUpdateSameVersion::test_no_update_when_same_version[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestPluginManagerCheckUpdatesSameVersion::test_no_update_when_same_version_in_check_updates[asyncio] PASSED [ 52%]
tests/extensions/test_missing_coverage.py::TestCopyRepoFilesWithDirectory::test_copy_with_subdirectory PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_compatible_plugin[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_incompatible_henchman_version[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_incompatible_python_version[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_compatible_current_os[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_incompatible_os[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_invalid_version_specifier[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_subprocess_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_subprocess_failure[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_subprocess_failure_no_stderr[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_install_pypi_package_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_install_pypi_package_failure[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_git_clone_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_git_clone_failure[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_git_clone_failure_no_stderr[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_git_clone_to_dir_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_git_clone_to_dir_failure[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_download_archive_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_download_archive_http_error[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_download_archive_connection_error[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_deps_subprocess_success[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_deps_subprocess_failure_warns[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_run_pip_deps_subprocess_no_stderr[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_pypi[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_github[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_github_no_url[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_git[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_git_no_url[asyncio] PASSED [ 52%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_url_zip[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_url_no_url[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_local_file[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_local_dir[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_local_no_url[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_from_local_path_not_exist[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_pypi_failure_propagates[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_dependencies_empty[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_dependencies_success[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_dependencies_failure_logs_warning[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_install_package_with_pip[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_download_archive_from_url[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_extract_archive[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_clone_and_copy_git_repo[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_local_install_copy_failure[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_search_plugins_success[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_search_plugins_with_category[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_search_plugins_validation_error[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_search_plugins_not_initialized[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_get_plugin_info_found[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_get_plugin_info_not_found[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_get_plugin_info_with_version[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_get_plugin_info_validation_error[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_get_plugin_info_not_initialized[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_context_manager[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_initialize_creates_session[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_close_owned_session[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginRegistryClient::test_close_external_session_not_closed[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_initialize_creates_dir[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_initialize_idempotent[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_close_cleanup[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_search_plugins_not_initialized[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_get_plugin_info_not_initialized[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_not_initialized[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_already_installed[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_not_found[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_incompatible[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_success[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_installer_failure[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_uninstall_plugin_not_installed[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_uninstall_plugin_success[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_uninstall_plugin_removal_failure_warns[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_update_plugin_not_installed[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_update_plugin_not_found_in_registry[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_update_plugin_already_up_to_date[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_check_updates_finds_update[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_check_updates_none_found[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_scan_security_not_installed[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_scan_security_passes[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_scan_security_sandbox_warning[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_load_plugin_extension_no_path[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_load_plugin_extension_no_ext_file[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_load_plugin_extension_failure_warns[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_initialize_loads_enabled_plugins[asyncio] PASSED [ 53%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_search_plugins_delegates_to_client[asyncio] PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_install_plugin_with_dependencies[asyncio] PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_henchman_compatibility_true PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_henchman_compatibility_false PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_python_compatibility_true PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_python_compatibility_false PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_os_compatibility_linux PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_os_compatibility_windows PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_os_compatibility_macos PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_os_compatibility_mismatch PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginCompatibilityChecker::test_check_os_compatibility_unknown_platform PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_copy_dir_contents PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_copy_repo_files_skips_git PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_parse_github_url_with_branch PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_parse_github_url_without_branch PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_parse_github_url_invalid PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_tar_open_mode_tar_gz PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_tar_open_mode_tgz PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_tar_open_mode_tar PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_tar_open_mode_unsupported PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_extract_archive_file_zip PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_extract_archive_file_tar_gz PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_extract_archive_file_unsupported PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_copy_local_path_file PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_copy_local_path_dir PASSED [ 54%]
tests/extensions/test_plugin_coverage.py::TestPluginInstaller::test_copy_installed_files PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_initialization PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_search_plugins_mocked PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_get_plugin_info_mocked PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_install_uninstall_plugin PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_check_updates PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_database_persistence PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_scan_security PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_error_handling_not_initialized PASSED [ 54%]
tests/extensions/test_plugin_manager.py::TestPluginManager::test_update_plugin PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_search_plugins_with_search_params PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_search_plugins_deprecation_warning PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_install_plugin_with_permissions_confirmation PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_install_plugin_without_permissions_confirmation PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_update_plugin_already_up_to_date PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_update_plugin_not_found_in_registry PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_check_updates_empty PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_scan_security_not_installed PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_type_hints_present PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_error_handling_install_plugin_failure PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_error_handling_plugin_not_found PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_error_handling_incompatible_plugin PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_load_plugin_extension_missing_file PASSED [ 54%]
tests/extensions/test_plugin_manager_refactor.py::TestPluginManagerRefactoring::test_load_plugin_extension_invalid_file PASSED [ 54%]
tests/extensions/test_plugin_manager_refactoring.py::TestPluginManagerRefactoring::test_search_plugins_only_accepts_search_params PASSED [ 54%]
tests/extensions/test_plugin_manager_refactoring.py::TestPluginManagerRefactoring::test_install_plugin_parameter_object PASSED [ 54%]
tests/extensions/test_plugin_manager_refactoring.py::TestPluginManagerRefactoring::test_method_type_hints_complete PASSED [ 54%]
tests/extensions/test_plugin_manager_refactoring.py::TestPluginManagerRefactoring::test_class_size_reduction PASSED [ 54%]
tests/extensions/test_plugin_manager_refactoring.py::TestPluginManagerRefactoring::test_duplicate_code_elimination PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_all_public_methods_have_type_hints PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_search_plugins_parameter_types PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_install_plugin_parameter_types PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_initialization_parameters PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_private_methods_type_hints PASSED [ 55%]
tests/extensions/test_plugin_manager_type_hints.py::TestPluginManagerTypeHints::test_method_signatures_preserved PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_metadata_basic PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_metadata_validation PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_metadata_serialization PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_compatibility PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_stats PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_search_result PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_installation PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_update_info PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_security_report PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_permission_enum PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_plugin_source_enum PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_model_defaults PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_model_immutability PASSED [ 55%]
tests/extensions/test_plugin_models.py::TestPluginModels::test_json_encoders PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatMessage::test_init_with_prefix_content PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatMessage::test_append_streams_content PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatMessage::test_set_content_replaces PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestThinkingMessage::test_init_collapsed_no_html_tags PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestThinkingMessage::test_append_updates_header_and_hidden_content PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestThinkingMessage::test_long_summary_truncates PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestThinkingMessage::test_toggle_expansion_changes_state PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_add_user_message_adds_widget PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_begin_agent_stream_creates_active PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_append_agent_chunk_auto_begin PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_begin_thinking_stream PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_append_thinking_auto_begin PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestChatPane::test_clear_thinking_removes PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestToolMessage::test_init_tool_box_collapsed PASSED [ 55%]
tests/henchman/cli/test_textual_app.py::TestToolMessage::test_toggle_shows_args PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestThinkingMessageFixed::test_collapsed_by_default PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestThinkingMessageFixed::test_expanded_shows_content_via_css PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestThinkingMessageFixed::test_append_updates PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestThinkingMessageFixed::test_header_click_toggle PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestChatPaneThinking::test_begin_thinking PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestChatPaneThinking::test_append_thinking PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestToolMessage::test_collapsed_by_default PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestToolMessage::test_toggle_shows_full_args PASSED [ 55%]
tests/henchman/cli/test_textual_widgets.py::TestChatPaneTools::test_add_tool_message PASSED [ 55%]
tests/integration/test_anthropic_functional.py::test_anthropic_connectivity_opus_4_6[asyncio] SKIPPED [ 55%]
tests/integration/test_context_limits.py::TestAgentContextAccumulation::test_context_grows_with_messages[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestAgentContextAccumulation::test_system_prompt_included[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestContextCompactionTriggering::test_compaction_event_emitted[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestContextCompactionTriggering::test_model_limit_respected[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestCompactionWithSummarization::test_summarization_enabled_creates_summary[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestContextCompactionFlow::test_full_compaction_flow[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestContextCompactionFlow::test_compaction_preserves_recent_context[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestUINotification::test_repl_handles_compaction_event[asyncio] PASSED [ 55%]
tests/integration/test_context_limits.py::TestToolOutputTruncation::test_long_tool_output_truncated[asyncio] PASSED [ 56%]
tests/integration/test_context_limits.py::TestReadFileMaxChars::test_read_file_truncates_large_files[asyncio] PASSED [ 56%]
tests/integration/test_context_limits.py::TestReadFileMaxChars::test_read_file_default_limit[asyncio] PASSED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_serena_command_exists PASSED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_serena_mcp_connection[asyncio] SKIPPED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_serena_tool_wrapping[asyncio] PASSED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_serena_tool_execution_mock[asyncio] PASSED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_multiple_mcp_servers_integration[asyncio] PASSED [ 56%]
tests/integration/test_mcp_serena.py::TestSerenaMcpIntegration::test_serena_config_validation PASSED [ 56%]
tests/integration/test_tool_integration.py::TestReplToolIntegration::test_repl_initializes_with_tool_registry PASSED [ 56%]
tests/integration/test_tool_integration.py::TestReplToolIntegration::test_repl_agent_initialized_with_tools PASSED [ 56%]
tests/integration/test_tool_integration.py::TestReplToolIntegration::test_tool_registration_affects_agent PASSED [ 56%]
tests/integration/test_tool_integration.py::TestReplToolIntegration::test_agent_with_tools_can_act_as_chatbot PASSED [ 56%]
tests/integration/test_tool_integration.py::TestReplToolIntegration::test_agent_with_tools_can_make_tool_calls PASSED [ 56%]
tests/integration/test_tool_integration.py::TestToolSystemE2E::test_tool_execution_flow SKIPPED [ 56%]
tests/integration/test_tool_integration.py::TestToolSystemE2E::test_builtin_tools_available PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestSafeNodeToEntity::test_malformed_attrs_returns_none PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestSafeNodeToEntity::test_valid_attrs_returns_entity PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestKnowledgeStoreGraphProperty::test_graph_property_returns_digraph PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestFormatEntityMarkdown::test_entity_without_file_path PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestFormatEntityMarkdown::test_entity_without_description PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestSearchEntitiesSkipsNone::test_search_skips_malformed_nodes PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestGetNeighbors::test_neighbor_not_in_graph_is_skipped PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestGetNeighbors::test_neighbor_with_malformed_attrs_skipped PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestGetImportantEntities::test_nid_not_in_graph_skipped PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestGetImportantEntities::test_malformed_node_skipped_in_pagerank PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestGetImportantEntities::test_empty_graph_returns_empty PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestListEntities::test_malformed_node_skipped_in_list PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestFindImportTargetOptimized::test_exact_match_takes_priority PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestBuildModuleLookup::test_root_level_file_creates_no_parent_relation PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestFormatEntityMarkdownWithRelations::test_format_with_relation PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestKnowledgeStoreStoreDir::test_store_dir_is_path PASSED [ 56%]
tests/knowledge/test_missing_coverage.py::TestScanRepositoryRootLevelFile::test_root_level_py_file_has_no_contains_relation PASSED [ 56%]
tests/knowledge/test_scanner.py::test_path_to_entity_id PASSED           [ 56%]
tests/knowledge/test_scanner.py::test_path_to_module PASSED              [ 56%]
tests/knowledge/test_scanner.py::test_extract_imports_simple PASSED      [ 56%]
tests/knowledge/test_scanner.py::test_extract_imports_from_style PASSED  [ 56%]
tests/knowledge/test_scanner.py::test_extract_imports_syntax_error PASSED [ 56%]
tests/knowledge/test_scanner.py::test_extract_imports_dedup PASSED       [ 56%]
tests/knowledge/test_scanner.py::test_extract_top_level_defs PASSED      [ 56%]
tests/knowledge/test_scanner.py::test_extract_top_level_defs_syntax_error PASSED [ 56%]
tests/knowledge/test_scanner.py::test_get_package_entities PASSED        [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_creates_entities PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_creates_observations PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_creates_relations PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_incremental PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_incremental_detects_changes PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_repository_updates_meta PASSED [ 56%]
tests/knowledge/test_scanner.py::test_scan_empty_repo PASSED             [ 56%]
tests/knowledge/test_scanner.py::test_get_git_tracked_python_files_error_handling PASSED [ 56%]
tests/knowledge/test_scanner.py::test_build_module_lookup_edge_cases PASSED [ 56%]
tests/knowledge/test_scanner.py::test_import_resolution_bug PASSED       [ 56%]
tests/knowledge/test_scanner_coverage.py::TestGetGitTrackedPythonFiles::test_subprocess_error_returns_empty PASSED [ 56%]
tests/knowledge/test_scanner_coverage.py::TestGetGitTrackedPythonFiles::test_file_not_found_returns_empty PASSED [ 56%]
tests/knowledge/test_scanner_coverage.py::TestGetGitTrackedPythonFiles::test_nonzero_returncode_returns_empty PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTarget::test_finds_matching_module PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTarget::test_no_match_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTarget::test_self_match_breaks PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_exact_self_import_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_package_init_self_import_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_no_candidates_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_self_match_in_prefix_loop_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_candidate_priority_sorting PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_exact_match_returns_target PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimized::test_exact_match_self_returns_none PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestScanRepositoryMissingLines::test_scan_with_package_entities PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestScanRepositoryMissingLines::test_scan_incremental_skips_unchanged PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestScanRepositoryMissingLines::test_scan_file_with_subpackage_contains_relation PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestScanRepositoryMissingLines::test_scan_empty_repo_returns_zero PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestScanRepositoryMissingLines::test_scan_nonexistent_file_is_skipped PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimizedAdditional::test_init_file_non_self_package_name_continues PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimizedAdditional::test_exact_match_self_without_init_file_module PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimizedAdditional::test_prefix_match_adds_non_self_candidates PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestFindImportTargetOptimizedAdditional::test_prefix_match_init_priority_over_regular PASSED [ 57%]
tests/knowledge/test_scanner_coverage.py::TestBuildModuleLookupAdditional::test_package_name_already_mapped_skips PASSED [ 57%]
tests/knowledge/test_store.py::test_slugify_path PASSED                  [ 57%]
tests/knowledge/test_store.py::test_slugify_dots_underscores PASSED      [ 57%]
tests/knowledge/test_store.py::test_add_and_get_entity PASSED            [ 57%]
tests/knowledge/test_store.py::test_get_missing_entity PASSED            [ 57%]
tests/knowledge/test_store.py::test_remove_entity PASSED                 [ 57%]
tests/knowledge/test_store.py::test_remove_missing_entity PASSED         [ 57%]
tests/knowledge/test_store.py::test_list_entities_all PASSED             [ 57%]
tests/knowledge/test_store.py::test_list_entities_by_type PASSED         [ 57%]
tests/knowledge/test_store.py::test_list_entities_by_tag PASSED          [ 57%]
tests/knowledge/test_store.py::test_search_entities PASSED               [ 57%]
tests/knowledge/test_store.py::test_search_entities_in_observations PASSED [ 57%]
tests/knowledge/test_store.py::test_add_observation PASSED               [ 57%]
tests/knowledge/test_store.py::test_add_observation_missing_entity PASSED [ 57%]
tests/knowledge/test_store.py::test_add_and_get_relations PASSED         [ 57%]
tests/knowledge/test_store.py::test_get_relations_both PASSED            [ 57%]
tests/knowledge/test_store.py::test_remove_relation PASSED               [ 57%]
tests/knowledge/test_store.py::test_remove_missing_relation PASSED       [ 57%]
tests/knowledge/test_store.py::test_get_neighbors PASSED                 [ 57%]
tests/knowledge/test_store.py::test_get_neighbors_depth_2 PASSED         [ 57%]
tests/knowledge/test_store.py::test_get_neighbors_missing_entity PASSED  [ 57%]
tests/knowledge/test_store.py::test_get_important_entities PASSED        [ 57%]
tests/knowledge/test_store.py::test_get_important_entities_empty PASSED  [ 57%]
tests/knowledge/test_store.py::test_get_connected_components PASSED      [ 57%]
tests/knowledge/test_store.py::test_save_and_load PASSED                 [ 57%]
tests/knowledge/test_store.py::test_load_empty PASSED                    [ 57%]
tests/knowledge/test_store.py::test_entity_and_relation_count PASSED     [ 57%]
tests/knowledge/test_store.py::test_clear PASSED                         [ 57%]
tests/knowledge/test_store.py::test_format_entity_for_llm PASSED         [ 57%]
tests/knowledge/test_store.py::test_format_for_llm_caps_output PASSED    [ 57%]
tests/mcp/test_client.py::TestMcpClient::test_init PASSED                [ 57%]
tests/mcp/test_client.py::TestMcpClient::test_connect_disconnect[asyncio] PASSED [ 57%]
tests/mcp/test_client.py::TestMcpClient::test_discover_tools[asyncio] PASSED [ 57%]
tests/mcp/test_client.py::TestMcpClient::test_call_tool[asyncio] PASSED  [ 57%]
tests/mcp/test_client.py::TestMcpClient::test_call_tool_error[asyncio] PASSED [ 58%]
tests/mcp/test_client.py::TestMcpClient::test_call_tool_not_connected[asyncio] PASSED [ 58%]
tests/mcp/test_client.py::TestMcpClient::test_discover_tools_not_connected[asyncio] PASSED [ 58%]
tests/mcp/test_client.py::TestMcpClient::test_connect_already_connected[asyncio] PASSED [ 58%]
tests/mcp/test_client.py::TestMcpClient::test_call_tool_non_text_content[asyncio] PASSED [ 58%]
tests/mcp/test_client.py::TestMcpClient::test_get_tools_empty PASSED     [ 58%]
tests/mcp/test_config.py::TestMcpServerConfig::test_minimal_config PASSED [ 58%]
tests/mcp/test_config.py::TestMcpServerConfig::test_full_config PASSED   [ 58%]
tests/mcp/test_config.py::TestMcpServerConfig::test_to_dict PASSED       [ 58%]
tests/mcp/test_config.py::TestMcpServerConfig::test_from_dict PASSED     [ 58%]
tests/mcp/test_config.py::TestMcpServerConfig::test_from_dict_minimal PASSED [ 58%]
tests/mcp/test_filtered_stream.py::TestFilteredStream::test_verbose_mode_passes_through PASSED [ 58%]
tests/mcp/test_filtered_stream.py::TestFilteredStream::test_non_verbose_mode_filters_info_debug PASSED [ 58%]
tests/mcp/test_filtered_stream.py::TestFilteredStream::test_various_log_formats PASSED [ 58%]
tests/mcp/test_filtered_stream.py::TestFilteredStream::test_empty_and_whitespace PASSED [ 58%]
tests/mcp/test_manager.py::TestMcpManager::test_init PASSED              [ 58%]
tests/mcp/test_manager.py::TestMcpManager::test_get_server_names PASSED  [ 58%]
tests/mcp/test_manager.py::TestMcpManager::test_is_trusted PASSED        [ 58%]
tests/mcp/test_manager.py::TestMcpManager::test_is_trusted_unknown_server PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_no_servers PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_empty_servers PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_with_servers_no_logging PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_with_servers_with_logging PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_uvx_python_server PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_npx_node_server PASSED [ 58%]
tests/mcp/test_manager.py::TestCreateFromSettings::test_create_from_settings_py_file_server PASSED [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_name PASSED                    [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_description PASSED             [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_parameters PASSED              [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_kind_untrusted PASSED          [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_kind_trusted PASSED            [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_execute[asyncio] PASSED        [ 58%]
tests/mcp/test_tool.py::TestMcpTool::test_execute_error[asyncio] PASSED  [ 58%]
tests/metrics/test_collector.py::TestCollectorConfig::test_defaults PASSED [ 58%]
tests/metrics/test_collector.py::TestCollectorConfig::test_custom_values PASSED [ 58%]
tests/metrics/test_collector.py::TestToolExecutionParams::test_defaults PASSED [ 58%]
tests/metrics/test_collector.py::TestToolExecutionParams::test_custom_values PASSED [ 58%]
tests/metrics/test_collector.py::TestMetricsCollectorInit::test_default_config PASSED [ 58%]
tests/metrics/test_collector.py::TestMetricsCollectorInit::test_custom_config PASSED [ 58%]
tests/metrics/test_collector.py::TestMetricsCollectorInit::test_anonymize_false_no_hash PASSED [ 58%]
tests/metrics/test_collector.py::TestMetricsCollectorInit::test_no_user_id_no_hash PASSED [ 58%]
tests/metrics/test_collector.py::TestMetricsCollectorInit::test_default_storage_created PASSED [ 58%]
tests/metrics/test_collector.py::TestShouldSample::test_enabled_full_rate PASSED [ 58%]
tests/metrics/test_collector.py::TestShouldSample::test_disabled PASSED  [ 58%]
tests/metrics/test_collector.py::TestShouldSample::test_partial_rate PASSED [ 58%]
tests/metrics/test_collector.py::TestShouldSample::test_partial_rate_passes PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_start_command PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_end_command_returns_metric PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_end_command_clears_state PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_end_command_no_start_returns_none PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_start_command_disabled PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_end_command_disabled PASSED [ 58%]
tests/metrics/test_collector.py::TestStartEndCommand::test_end_command_no_storage PASSED [ 58%]
tests/metrics/test_collector.py::TestRecordTokenUsage::test_returns_token_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordTokenUsage::test_calculates_token_ratio PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordTokenUsage::test_no_token_ratio_without_limit PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordTokenUsage::test_updates_accumulator PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordTokenUsage::test_disabled_returns_none PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordCost::test_returns_cost_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordCost::test_updates_cost_accumulator PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordCost::test_disabled_returns_none PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordCost::test_no_storage_still_works PASSED [ 59%]
tests/metrics/test_collector.py::TestTrackToolExecution::test_successful_execution[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestTrackToolExecution::test_failed_execution[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestTrackToolExecution::test_execution_no_storage[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestTrackToolExecution::test_disabled_skips_tracking[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_request[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_result[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_result_unknown_id[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_context_compacted_event[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_agent_delegated_event[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_content_event[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_thought_event[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_disabled_skips_all[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_request_non_list_data[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_request_non_toolcall_items[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_tool_call_result_no_tool_call_id[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestProcessAgentEvent::test_unhandled_event_type[asyncio] PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordAgentSwitch::test_increments_counter PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordAgentSwitch::test_multiple_switches PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordAgentSwitch::test_disabled_no_increment PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordContextCompaction::test_increments_counter PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordContextCompaction::test_disabled_no_increment PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordPerformanceEvent::test_returns_performance_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordPerformanceEvent::test_disabled_returns_none PASSED [ 59%]
tests/metrics/test_collector.py::TestRecordPerformanceEvent::test_no_storage PASSED [ 59%]
tests/metrics/test_collector.py::TestGetSessionSummary::test_returns_summary_dict PASSED [ 59%]
tests/metrics/test_collector.py::TestGetSessionSummary::test_summary_reflects_activity PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_build_token_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_build_cost_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_build_performance_metric PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_increment_sampled_counter PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_increment_sampled_counter_disabled PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_store_provider_metric_with_storage PASSED [ 59%]
tests/metrics/test_collector.py::TestModuleLevelHelpers::test_store_provider_metric_no_storage PASSED [ 59%]
tests/metrics/test_dashboard.py::TestModuleConstants::test_stats_lookback_days PASSED [ 59%]
tests/metrics/test_dashboard.py::TestModuleConstants::test_success_rate_multiplier PASSED [ 59%]
tests/metrics/test_dashboard.py::TestModuleConstants::test_layout_constants PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateSumStats::test_empty_list PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateSumStats::test_single_period PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateSumStats::test_multiple_periods PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateSumStats::test_missing_field_uses_default PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateSumStats::test_periods_included PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateTokenStats::test_aggregates_token_usage PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateCostStats::test_aggregates_cost PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateToolStats::test_zero_calls PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateToolStats::test_calculates_success_rate PASSED [ 59%]
tests/metrics/test_dashboard.py::TestAggregateToolStats::test_multiple_periods PASSED [ 60%]
tests/metrics/test_dashboard.py::TestAggregateUsageStats::test_aggregates_usage PASSED [ 60%]
tests/metrics/test_dashboard.py::TestAggregateUsageStats::test_empty_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestCollectStats::test_returns_empty_when_no_records PASSED [ 60%]
tests/metrics/test_dashboard.py::TestCollectStats::test_returns_aggregated_when_records_exist PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_token_panel_rows PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_token_panel_rows_empty PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_cost_panel_rows PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_cost_panel_rows_empty PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_tool_panel_rows PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_tool_panel_rows_empty PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_usage_panel_rows PASSED [ 60%]
tests/metrics/test_dashboard.py::TestPanelRowBuilders::test_usage_panel_rows_empty PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboardPanelFactory::test_create_panel PASSED [ 60%]
tests/metrics/test_dashboard.py::TestExportStatsToCsv::test_empty_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestExportStatsToCsv::test_with_token_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestExportStatsToCsv::test_with_cost_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestExportStatsToCsv::test_with_tool_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestExportStatsToCsv::test_full_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_init PASSED         [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_get_summary_stats PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_export_data_json PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_export_data_csv PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_export_data_invalid_format PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_close PASSED        [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_close_with_live_display PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_refresh_with_live_display PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_refresh_without_live_display PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_create_layout PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_create_header PASSED [ 60%]
tests/metrics/test_dashboard.py::TestDashboard::test_display_stops_on_close PASSED [ 60%]
tests/metrics/test_exporter.py::TestMetricsExporterInit::test_init PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_exports_to_file PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_creates_parent_directories PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_filters_passed_to_storage PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_count_matches_metrics PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_no_filters_uses_defaults PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToJson::test_filters_in_output PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToCsv::test_exports_to_csv_file PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToCsv::test_creates_parent_directories_csv PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToCsv::test_filters_passed_to_storage_csv PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToCsv::test_csv_with_complex_data PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToCsv::test_csv_empty_metrics PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_exports_to_prometheus PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_filters_passed_to_storage_prometheus PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_handles_prometheus_error PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_prometheus_empty_endpoint PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_prometheus_empty_metrics PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_prometheus_format_correct PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_prometheus_nan_infinity_values PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_prometheus_no_numeric_values PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportToPrometheus::test_build_prometheus_labels PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportSummary::test_exports_summary_statistics PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportSummary::test_filters_passed_to_storage_summary PASSED [ 60%]
tests/metrics/test_exporter.py::TestExportSummary::test_summary_with_complex_data PASSED [ 61%]
tests/metrics/test_exporter.py::TestExportSummary::test_empty_summary PASSED [ 61%]
tests/metrics/test_exporter.py::TestExportSummary::test_summary_with_invalid_timestamps PASSED [ 61%]
tests/metrics/test_exporter.py::TestExportSummary::test_summary_with_non_numeric_metrics PASSED [ 61%]
tests/metrics/test_exporter.py::TestGetAvailableFormats::test_returns_list PASSED [ 61%]
tests/metrics/test_exporter.py::TestGetAvailableFormats::test_json_is_available PASSED [ 61%]
tests/metrics/test_exporter.py::TestGetAvailableFormats::test_csv_is_available PASSED [ 61%]
tests/metrics/test_exporter.py::TestGetAvailableFormats::test_prometheus_is_available PASSED [ 61%]
tests/metrics/test_exporter.py::TestGetCurrentTimestamp::test_returns_string PASSED [ 61%]
tests/metrics/test_init.py::TestMetricsPublicApi::test_all_exports_importable PASSED [ 61%]
tests/metrics/test_init.py::TestMetricsPublicApi::test_all_in_dunder_all PASSED [ 61%]
tests/metrics/test_models.py::TestMetricType::test_values PASSED         [ 61%]
tests/metrics/test_models.py::TestMetricType::test_is_str_enum PASSED    [ 61%]
tests/metrics/test_models.py::TestBaseMetric::test_defaults PASSED       [ 61%]
tests/metrics/test_models.py::TestBaseMetric::test_unique_ids PASSED     [ 61%]
tests/metrics/test_models.py::TestBaseMetric::test_custom_values PASSED  [ 61%]
tests/metrics/test_models.py::TestTokenMetric::test_defaults PASSED      [ 61%]
tests/metrics/test_models.py::TestTokenMetric::test_custom_values PASSED [ 61%]
tests/metrics/test_models.py::TestCostMetric::test_defaults PASSED       [ 61%]
tests/metrics/test_models.py::TestCostMetric::test_custom_values PASSED  [ 61%]
tests/metrics/test_models.py::TestToolMetric::test_defaults PASSED       [ 61%]
tests/metrics/test_models.py::TestToolMetric::test_failure_metric PASSED [ 61%]
tests/metrics/test_models.py::TestUsageMetric::test_defaults PASSED      [ 61%]
tests/metrics/test_models.py::TestUsageMetric::test_custom_values PASSED [ 61%]
tests/metrics/test_models.py::TestPerformanceMetric::test_defaults PASSED [ 61%]
tests/metrics/test_models.py::TestPerformanceMetric::test_custom_values PASSED [ 61%]
tests/metrics/test_models.py::TestTokenUsageData::test_required_fields PASSED [ 61%]
tests/metrics/test_models.py::TestTokenUsageData::test_optional_fields PASSED [ 61%]
tests/metrics/test_models.py::TestCostData::test_required_fields PASSED  [ 61%]
tests/metrics/test_models.py::TestCostData::test_optional_fields PASSED  [ 61%]
tests/metrics/test_models.py::TestPerformanceEventData::test_required_fields PASSED [ 61%]
tests/metrics/test_models.py::TestPerformanceEventData::test_optional_fields PASSED [ 61%]
tests/metrics/test_storage.py::TestCreateBaseMetricDict::test_base_fields PASSED [ 61%]
tests/metrics/test_storage.py::TestCreateBaseMetricDict::test_metadata_serialized PASSED [ 61%]
tests/metrics/test_storage.py::TestCreateBaseMetricDict::test_empty_metadata_is_none PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_no_filters PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_metric_type_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_session_id_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_agent_id_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_date_filters PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_limit_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsQueryParams::test_all_filters PASSED [ 61%]
tests/metrics/test_storage.py::TestDatabaseSchemaManager::test_create_tables_and_indexes PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_init_with_path PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_init_with_string_path PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_store_and_retrieve_token_metric PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_store_cost_metric PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_store_tool_metric PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_store_usage_metric PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_store_performance_metric PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_metrics_session_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_metrics_agent_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_metrics_date_filter PASSED [ 61%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_metrics_limit PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_metrics_with_params PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_clear_metrics PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_database_size PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_database_size_nonexistent PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_max_metrics_limit PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_retention_cleanup PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_token PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_cost PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_tool PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_usage PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_performance PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_aggregated_stats_with_dates PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_session_metrics PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_get_session_metrics_empty PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsStorage::test_default_db_path PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsAggregator::test_invalid_group_by_raises PASSED [ 62%]
tests/metrics/test_storage.py::TestMetricsAggregator::test_valid_group_by_values PASSED [ 62%]
tests/metrics/test_storage.py::TestSessionMetricsAnalyzer::test_get_session_metrics_with_tool_failure PASSED [ 62%]
tests/metrics/test_storage.py::TestSessionMetricsAnalyzer::test_usage_patterns_returned PASSED [ 62%]
tests/metrics/test_storage.py::TestSessionMetricsAnalyzer::test_get_session_aggregated_metrics_unknown_type PASSED [ 62%]
tests/metrics/test_storage.py::TestSessionMetricsAnalyzer::test_store_base_metric_no_type_match PASSED [ 62%]
tests/metrics/test_storage.py::TestSessionMetricsAnalyzer::test_should_store_metric_count_result_none PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeError::test_error_creation_default_message PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeError::test_error_creation_custom_message PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeError::test_error_is_exception PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeError::test_error_can_be_raised PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestOpenAICompatible413Handling::test_413_error_raises_context_too_large[asyncio] PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestOpenAICompatible413Handling::test_other_api_errors_not_caught[asyncio] PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestOpenAICompatible413Handling::test_500_error_not_caught[asyncio] PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeErrorHandling::test_error_inheritance PASSED [ 62%]
tests/providers/test_413_error_handling.py::TestContextTooLargeErrorHandling::test_error_message_actionable PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_instantiation_with_explicit_key PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_instantiation_with_env_var PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_instantiation_without_key PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_custom_model PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_name_property PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_list_models PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_is_model_provider PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_max_tokens_default PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicProvider::test_custom_max_tokens PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_tool PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_messages_basic PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_messages_with_system PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_messages_tool_result PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_messages_assistant_with_tool_calls PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFormatting::test_format_messages_assistant_tool_calls_no_content PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_end_turn PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_stop_sequence PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_tool_use PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_max_tokens PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_none PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicFinishReasons::test_parse_finish_reason_unknown PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_stream_text[asyncio] PASSED [ 62%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_stream_with_tools[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_stream_thinking[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_handles_invalid_json[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_with_system_message[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_text_block_start[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_input_json_without_tool_id[asyncio] PASSED [ 63%]
tests/providers/test_anthropic.py::TestAnthropicStreaming::test_chat_completion_unknown_event_type[asyncio] PASSED [ 63%]
tests/providers/test_anthropic_ratelimit.py::test_anthropic_rate_limit_initialization PASSED [ 63%]
tests/providers/test_anthropic_ratelimit.py::test_anthropic_rate_limiting_delays SKIPPED [ 63%]
tests/providers/test_anthropic_ratelimit.py::test_anthropic_rate_limit_retry PASSED [ 63%]
tests/providers/test_anthropic_validation.py::TestAnthropicValidation::test_empty_messages_validation PASSED [ 63%]
tests/providers/test_anthropic_validation.py::TestAnthropicValidation::test_empty_user_message_validation PASSED [ 63%]
tests/providers/test_anthropic_validation.py::TestAnthropicValidation::test_valid_messages_with_tool_calls PASSED [ 63%]
tests/providers/test_anthropic_validation.py::TestAnthropicValidation::test_assistant_message_with_only_tool_calls PASSED [ 63%]
tests/providers/test_anthropic_validation.py::TestAnthropicValidation::test_mixed_valid_messages PASSED [ 63%]
tests/providers/test_base.py::TestMessage::test_user_message_creation PASSED [ 63%]
tests/providers/test_base.py::TestMessage::test_assistant_message_with_tool_calls PASSED [ 63%]
tests/providers/test_base.py::TestMessage::test_tool_result_message PASSED [ 63%]
tests/providers/test_base.py::TestMessage::test_system_message PASSED    [ 63%]
tests/providers/test_base.py::TestToolCall::test_tool_call_creation PASSED [ 63%]
tests/providers/test_base.py::TestToolCall::test_tool_call_with_complex_arguments PASSED [ 63%]
tests/providers/test_base.py::TestToolDeclaration::test_tool_declaration_creation PASSED [ 63%]
tests/providers/test_base.py::TestStreamChunk::test_content_chunk PASSED [ 63%]
tests/providers/test_base.py::TestStreamChunk::test_tool_call_chunk PASSED [ 63%]
tests/providers/test_base.py::TestStreamChunk::test_finish_chunk PASSED  [ 63%]
tests/providers/test_base.py::TestStreamChunk::test_thinking_chunk PASSED [ 63%]
tests/providers/test_base.py::TestFinishReason::test_finish_reason_values PASSED [ 63%]
tests/providers/test_base.py::TestModelProviderProtocol::test_cannot_instantiate_directly PASSED [ 63%]
tests/providers/test_base.py::TestModelProviderProtocol::test_subclass_must_implement_name PASSED [ 63%]
tests/providers/test_base.py::TestModelProviderProtocol::test_subclass_must_implement_chat_completion_stream PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_instantiation_with_explicit_key PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_instantiation_with_env_var PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_instantiation_without_key PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_custom_model PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_name_property PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_list_models PASSED [ 63%]
tests/providers/test_deepseek.py::TestDeepSeekProvider::test_inherits_from_openai_compatible PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestHandleContentBlockDeltaEvent::test_empty_text_delta_skips_token_count PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestHandleContentBlockDeltaEvent::test_none_text_delta_skips_token_count PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestHandleContentBlockDeltaEvent::test_empty_thinking_delta_skips_token_count PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestHandleContentBlockDeltaEvent::test_none_thinking_delta_skips_token_count PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestHandleContentBlockDeltaEvent::test_non_empty_text_delta_counts_tokens PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestRaiseIfRetriesExhausted::test_raises_when_retries_exceeded PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestRaiseIfRetriesExhausted::test_does_not_raise_when_within_limit PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestAnthropicProviderConfigProvided::test_init_with_config_object PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestAnthropicValidateAndRepair::test_repairs_invalid_message_sequence PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestAnthropicValidateAndRepair::test_no_repair_when_valid PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestOpenAICompatExtractUsage::test_returns_none_when_no_usage_attribute PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestOpenAICompatExtractUsage::test_returns_none_when_usage_is_none PASSED [ 63%]
tests/providers/test_missing_coverage.py::TestOpenAICompatExtractUsage::test_returns_dict_when_usage_present PASSED [ 63%]
tests/providers/test_ollama.py::TestOllamaProvider::test_instantiation_default PASSED [ 63%]
tests/providers/test_ollama.py::TestOllamaProvider::test_custom_base_url PASSED [ 63%]
tests/providers/test_ollama.py::TestOllamaProvider::test_custom_model PASSED [ 63%]
tests/providers/test_ollama.py::TestOllamaProvider::test_base_url_from_env PASSED [ 63%]
tests/providers/test_ollama.py::TestOllamaProvider::test_name_property PASSED [ 64%]
tests/providers/test_ollama.py::TestOllamaProvider::test_list_models PASSED [ 64%]
tests/providers/test_ollama.py::TestOllamaProvider::test_is_model_provider PASSED [ 64%]
tests/providers/test_ollama.py::TestOllamaProvider::test_inherits_from_openai_compatible PASSED [ 64%]
tests/providers/test_ollama.py::TestOllamaProvider::test_no_api_key_required PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_instantiation_with_api_key PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_name_property PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_format_tool_declaration PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_format_message_user PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_format_message_assistant_with_tool_calls PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_format_message_tool_result PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_parse_finish_reason_mapping PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_parse_tool_calls_empty PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_parse_tool_calls_valid PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_parse_tool_calls_invalid_json PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_content PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_with_tools PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_empty_choices PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_with_tool_calls PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_with_thinking PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_tool_call_invalid_json PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_custom_model PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_tool_call_no_function PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_tool_call_no_arguments PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_format_message_with_reasoning_content PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_empty_messages_validation PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_empty_content_validation PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_valid_empty_content PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_message_sequence_repair PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_context_too_large_error PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_api_status_error PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_generic_exception PASSED [ 64%]
tests/providers/test_openai_compat.py::TestOpenAICompatibleProvider::test_chat_completion_stream_with_kwargs PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_instantiation_with_explicit_key PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_instantiation_with_env_var PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_instantiation_without_key PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_custom_model PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_name_property PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_list_models PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_base_url_default PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_base_url_custom PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_inherits_from_openai_compatible PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_chat_completion_stream_inherited PASSED [ 64%]
tests/providers/test_openrouter.py::TestOpenRouterProvider::test_additional_kwargs_passed_to_parent PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_register_provider_class PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_get_provider_class PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_get_unregistered_provider PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_list_providers PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_create_provider_instance PASSED [ 64%]
tests/providers/test_registry.py::TestProviderRegistry::test_create_provider_with_kwargs PASSED [ 64%]
tests/providers/test_registry.py::TestDefaultRegistry::test_default_registry_has_deepseek PASSED [ 64%]
tests/providers/test_registry.py::TestDefaultRegistry::test_default_registry_singleton PASSED [ 64%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_deepseek PASSED [ 64%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_openai PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_anthropic PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_openrouter PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_openai_compat PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_together PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_groq PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_fireworks PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_ollama PASSED [ 65%]
tests/providers/test_utils.py::TestGetEnvVarForProvider::test_unknown_provider PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_deepseek_with_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_deepseek_without_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_openrouter_with_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_openrouter_with_henchman_fallback PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_openrouter_precedence PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_openai_compat_with_henchman_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_together_with_henchman_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_groq_with_henchman_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_fireworks_with_henchman_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_ollama_no_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_anthropic_with_key PASSED [ 65%]
tests/providers/test_utils.py::TestGetApiKeyForProvider::test_unknown_provider PASSED [ 65%]
tests/rag/test_chunker.py::TestChunk::test_chunk_id PASSED               [ 65%]
tests/rag/test_chunker.py::TestChunk::test_chunk_id_with_different_index PASSED [ 65%]
tests/rag/test_chunker.py::TestChunk::test_to_metadata PASSED            [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_count_tokens PASSED     [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_text_simple PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_text_empty PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_text_whitespace_only PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_text_preserves_content PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_text_line_numbers_correct PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_file_success PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_file_binary_skipped PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_chunk_file_nonexistent PASSED [ 65%]
tests/rag/test_chunker.py::TestTextChunker::test_overlap_works PASSED    [ 65%]
tests/rag/test_concurrency.py::TestRagLock::test_lock_acquire_and_release PASSED [ 65%]
tests/rag/test_concurrency.py::TestRagLock::test_lock_context_manager PASSED [ 65%]
tests/rag/test_concurrency.py::TestRagLock::test_lock_timeout PASSED     [ 65%]
tests/rag/test_concurrency.py::TestRagLock::test_lock_file_creation PASSED [ 65%]
tests/rag/test_concurrency.py::TestRagLock::test_lock_already_acquired_property PASSED [ 65%]
tests/rag/test_concurrency.py::TestAcquireRagLockFunction::test_successful_acquisition PASSED [ 65%]
tests/rag/test_concurrency.py::TestAcquireRagLockFunction::test_failed_acquisition PASSED [ 65%]
tests/rag/test_concurrency.py::TestRetryOnLockedDecorator::test_successful_first_try PASSED [ 65%]
tests/rag/test_concurrency.py::TestRetryOnLockedDecorator::test_retry_on_locked_error PASSED [ 65%]
tests/rag/test_concurrency.py::TestRetryOnLockedDecorator::test_max_retries_exceeded PASSED [ 65%]
tests/rag/test_concurrency.py::TestRetryOnLockedDecorator::test_non_lock_error_not_retried PASSED [ 65%]
tests/rag/test_concurrency.py::TestRetryOnLockedDecorator::test_lock_error_pattern_matching PASSED [ 65%]
tests/rag/test_concurrency.py::TestLockTimeoutError::test_exception_creation PASSED [ 65%]
tests/rag/test_concurrency_smoke.py::TestConcurrencySmoke::test_basic_lock_smoke PASSED [ 65%]
tests/rag/test_concurrency_smoke.py::TestConcurrencySmoke::test_concurrent_access_smoke PASSED [ 65%]
tests/rag/test_concurrency_smoke.py::TestConcurrencySmoke::test_file_creation_smoke PASSED [ 65%]
tests/rag/test_concurrency_smoke.py::TestRagSystemSmoke::test_rag_initialization_smoke PASSED [ 65%]
tests/rag/test_concurrency_smoke.py::TestEndToEndSmoke::test_multiple_henchman_instances PASSED [ 65%]
tests/rag/test_coverage_boost.py::TestEmbeddingProviderAbstractMethods::test_concrete_provider_dimensions PASSED [ 65%]
tests/rag/test_coverage_boost.py::TestEmbeddingProviderAbstractMethods::test_concrete_provider_model_name PASSED [ 65%]
tests/rag/test_coverage_boost.py::TestEmbeddingProviderAbstractMethods::test_concrete_provider_embed PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestEmbeddingProviderAbstractMethods::test_embed_query_default_implementation PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_acquire_already_acquired_returns_true PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_acquire_raises_oserror_falls_through PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_context_manager_raises_on_timeout PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_retry_on_locked_raises_non_lock_error PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_is_lock_error_true PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines::test_is_lock_error_false PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines::test_init_retry_on_hnsw_error PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines::test_delete_by_file_no_ids PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines::test_delete_by_ids_empty PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines::test_get_all_file_paths_with_none_metadata PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRepoIdMissingLines::test_compute_repository_id_unusual_protocol PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRepoIdMissingLines::test_migrate_old_index_manifest_migration_fails PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRepoIdMissingLines::test_migrate_old_index_nothing_to_migrate PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestIndexerMissingLines::test_get_tracked_files_subprocess_error PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestIndexerMissingLines::test_index_files_unchanged_count PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestIndexerMissingLines::test_index_files_with_console PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_index_read_only_mode_with_console PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_index_lock_failure_skip PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_index_lock_failure_no_skip_raises PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_index_async[asyncio] PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_get_stats PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_clear_deletes_manifest PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_initialize_rag_disabled PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_initialize_rag_no_git_root PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_initialize_rag_migrated_with_console PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_initialize_rag_returns_system PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines::test_initialize_rag_exception_returns_none PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines2::test_init_all_retries_exhausted PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestVectorStoreMissingLines2::test_get_all_file_paths_empty_metadatas PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines2::test_index_read_only_no_console PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines2::test_index_lock_failure_skip_no_console PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemMissingLines2::test_clear_manifest_does_not_exist PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagLockMissingLines2::test_acquire_oserror_with_no_lock_file PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestAbstractEmbedderMethods::test_abstract_dimensions_body_via_super PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestAbstractEmbedderMethods::test_abstract_model_name_body_via_super PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestAbstractEmbedderMethods::test_abstract_embed_body_via_super PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestIndexerProgressCallback::test_index_files_with_console_and_progress_callback PASSED [ 66%]
tests/rag/test_coverage_boost.py::TestRagSystemInit::test_init_switches_read_only_when_lock_fails PASSED [ 66%]
tests/rag/test_embedder.py::TestEmbeddingProviderABC::test_abc_cannot_instantiate PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_model_name_property PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_dimensions_known_model PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_dimensions_base_model PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_dimensions_unknown_model_defaults PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_embed_batch PASSED [ 66%]
tests/rag/test_embedder.py::TestFastEmbedProvider::test_embed_query PASSED [ 66%]
tests/rag/test_indexer.py::TestIndexManifest::test_save_and_load PASSED  [ 66%]
tests/rag/test_indexer.py::TestIndexManifest::test_load_nonexistent PASSED [ 66%]
tests/rag/test_indexer.py::TestIndexManifest::test_load_invalid_json PASSED [ 66%]
tests/rag/test_indexer.py::TestIndexManifest::test_save_creates_parent_dirs PASSED [ 66%]
tests/rag/test_indexer.py::TestIndexStats::test_defaults PASSED          [ 66%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_should_index_respects_extensions PASSED [ 66%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_should_index_no_filter PASSED [ 66%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_should_index_rejects_directories PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_compute_file_hash PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_compute_file_hash_nonexistent PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_get_stats PASSED     [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexer::test_get_tracked_files_git_error PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_new_files PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_force_reindex PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_with_progress_callback PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_removes_deleted_files PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_updates_modified_files PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_forces_on_model_change PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_index_forces_on_chunk_size_change PASSED [ 67%]
tests/rag/test_indexer.py::TestGitFileIndexerIndex::test_should_index_special_files PASSED [ 67%]
tests/rag/test_missing_coverage.py::TestGetOverlapLinesEmptyInput::test_empty_lines_returns_empty PASSED [ 67%]
tests/rag/test_missing_coverage.py::TestGetOverlapLinesAllFit::test_all_lines_fit_in_overlap PASSED [ 67%]
tests/rag/test_missing_coverage.py::TestGetOverlapLinesAllFit::test_partial_lines_exceed_budget PASSED [ 67%]
tests/rag/test_missing_coverage.py::TestChunkTextOverlapEmpty::test_overlap_tokens_zero_gives_empty_overlap PASSED [ 67%]
tests/rag/test_missing_coverage.py::TestChunkTextEmptyLastBatch::test_no_leftover_when_overlap_returns_empty PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_name PASSED          [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_description PASSED   [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_usage PASSED         [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_execute_no_args_shows_help PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_execute_unknown_subcommand_shows_help PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_status_no_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_reindex_no_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_clear_no_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_status_with_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_reindex_with_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCommand::test_clear_with_rag_system PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagClearAll::test_clear_all_no_cache_dir PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagClearAll::test_clear_all_confirmed PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagClearAll::test_clear_all_cancelled PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagClearAll::test_clear_all_keyboard_interrupt PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagClearAll::test_clear_all_error_handling PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCleanup::test_cleanup_not_in_git_repo PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCleanup::test_cleanup_with_old_indices PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCleanup::test_cleanup_no_old_indices PASSED [ 67%]
tests/rag/test_rag_command.py::TestRagCleanup::test_cleanup_handles_removal_errors PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestRagSystemConcurrency::test_rag_system_with_lock PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestRagSystemConcurrency::test_rag_system_lock_timeout PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestRagSystemConcurrency::test_initialize_rag_with_concurrent_instances PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestRagSystemConcurrency::test_vector_store_retry_on_locked PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestRagSystemConcurrency::test_concurrent_indexing_skip PASSED [ 67%]
tests/rag/test_rag_concurrency_integration.py::TestMultiProcessRag::test_lock_across_processes PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_name PASSED   [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_description PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_kind_is_read PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_parameters_schema PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_empty_query PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_no_results PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_with_results PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_uses_default_top_k PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_custom_top_k PASSED [ 67%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_handles_exception PASSED [ 68%]
tests/rag/test_rag_search_tool.py::TestRagSearchTool::test_execute_multiple_results PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetGitRemoteUrl::test_returns_remote_url PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetGitRemoteUrl::test_returns_none_without_remote PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetGitRemoteUrl::test_returns_none_for_non_git_dir PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetGitRevision::test_returns_revision PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetGitRevision::test_returns_none_without_commits PASSED [ 68%]
tests/rag/test_repo_id.py::TestComputeRepositoryId::test_uses_remote_url_when_available PASSED [ 68%]
tests/rag/test_repo_id.py::TestComputeRepositoryId::test_uses_path_without_remote PASSED [ 68%]
tests/rag/test_repo_id.py::TestComputeRepositoryId::test_consistent_ids PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetRagCacheDir::test_default_cache_dir PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetRagCacheDir::test_custom_cache_dir PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetRepositoryIndexDir::test_returns_repo_specific_dir PASSED [ 68%]
tests/rag/test_repo_id.py::TestGetRepositoryManifestPath::test_returns_manifest_path PASSED [ 68%]
tests/rag/test_repo_id.py::TestMigrateOldIndex::test_returns_false_when_no_old_index PASSED [ 68%]
tests/rag/test_repo_id.py::TestMigrateOldIndex::test_migrates_old_index_dir PASSED [ 68%]
tests/rag/test_repo_id.py::TestMigrateOldIndex::test_migrates_old_manifest PASSED [ 68%]
tests/rag/test_repo_id.py::TestMigrateOldIndex::test_handles_migration_errors PASSED [ 68%]
tests/rag/test_store.py::TestSearchResult::test_format_for_llm PASSED    [ 68%]
tests/rag/test_store.py::TestVectorStore::test_init_creates_directory PASSED [ 68%]
tests/rag/test_store.py::TestVectorStore::test_count_empty PASSED        [ 68%]
tests/rag/test_store.py::TestVectorStore::test_add_chunks PASSED         [ 68%]
tests/rag/test_store.py::TestVectorStore::test_add_empty_chunks PASSED   [ 68%]
tests/rag/test_store.py::TestVectorStore::test_search_empty_store PASSED [ 68%]
tests/rag/test_store.py::TestVectorStore::test_search_returns_results PASSED [ 68%]
tests/rag/test_store.py::TestVectorStore::test_delete_by_file PASSED     [ 68%]
tests/rag/test_store.py::TestVectorStore::test_delete_by_ids PASSED      [ 68%]
tests/rag/test_store.py::TestVectorStore::test_get_all_file_paths PASSED [ 68%]
tests/rag/test_store.py::TestVectorStore::test_clear PASSED              [ 68%]
tests/rag/test_system.py::TestFindGitRoot::test_finds_git_root PASSED    [ 68%]
tests/rag/test_system.py::TestFindGitRoot::test_returns_none_outside_git PASSED [ 68%]
tests/rag/test_system.py::TestFindGitRoot::test_uses_cwd_as_default PASSED [ 68%]
tests/rag/test_system.py::TestRagSystem::test_init_creates_components PASSED [ 68%]
tests/rag/test_system.py::TestRagSystem::test_properties_return_components PASSED [ 68%]
tests/rag/test_system.py::TestRagSystem::test_index_calls_indexer PASSED [ 68%]
tests/rag/test_system.py::TestRagSystem::test_clear_clears_store_and_manifest PASSED [ 68%]
tests/rag/test_system.py::TestInitializeRag::test_returns_none_when_disabled PASSED [ 68%]
tests/rag/test_system.py::TestInitializeRag::test_returns_none_outside_git PASSED [ 68%]
tests/rag/test_system.py::TestInitializeRag::test_initializes_system PASSED [ 68%]
tests/rag/test_system.py::TestInitializeRag::test_handles_exception PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyReturnsToPrompt::test_escape_on_empty_buffer_exits_prompt_not_program PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyReturnsToPrompt::test_repl_continues_after_keyboard_interrupt[asyncio] PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyReturnsToPrompt::test_escape_during_agent_operation_stops_agent[asyncio] PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyDoesNotQuit::test_multiple_escapes_do_not_quit[asyncio] PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyDoesNotQuit::test_escape_after_output_returns_to_prompt[asyncio] PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeKeyReturnsToPrompt::test_escape_key_binding_returns_empty_not_none PASSED [ 68%]
tests/smoke/test_escape_key_behavior.py::TestEscapeVsCtrlCBehavior::test_escape_is_not_exit_signal PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeFileReading::test_large_file_does_not_crash[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeFileReading::test_large_file_truncated[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeFileReading::test_huge_file_handled_gracefully[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeFileReading::test_custom_max_chars_respected[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeFileReading::test_truncation_message_included[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeToolOutput::test_tool_registry_truncates_output[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestLargeToolOutput::test_normal_output_not_affected[asyncio] PASSED [ 68%]
tests/smoke/test_large_file_handling.py::TestBinaryFileHandling::test_binary_file_error_handling[asyncio] PASSED [ 69%]
tests/smoke/test_large_file_handling.py::TestLineRangeWithLargeFiles::test_line_range_efficient[asyncio] PASSED [ 69%]
tests/smoke/test_large_file_handling.py::TestLineRangeWithLargeFiles::test_end_of_large_file[asyncio] PASSED [ 69%]
tests/smoke/test_large_file_handling.py::TestMemoryUsage::test_repeated_large_reads[asyncio] PASSED [ 69%]
tests/smoke/test_large_file_handling.py::TestMemoryUsage::test_many_small_file_reads[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationCtrlNoLedger::test_run_delegation_no_ledger[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestBuiltinsNoRegistry::test_help_specific_command_no_registry[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestBuiltinsToolNone::test_tools_command_get_returns_none[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestPlanCommandPromptAlreadyPresent::test_plan_enable_prompt_already_present[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestInputHandlerNoNewline::test_get_input_renderer_without_print_newline[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestPluginRegistryClientAlreadyInitialized::test_initialize_already_has_session[asyncio] PASSED [ 69%]
tests/test_branch_coverage.py::TestSetupTechLeadToolAlreadyRegistered::test_setup_tech_lead_tool_already_registered PASSED [ 69%]
tests/test_branch_coverage.py::TestTimeoutExtractMsgInfo::test_extract_msg_info_no_tool_calls PASSED [ 69%]
tests/test_branch_coverage.py::TestTimeoutExtractMsgInfo::test_extract_tool_info_no_path PASSED [ 69%]
tests/test_branch_coverage.py::TestProcessAgentEventOtherType::test_process_agent_event_other_type_returns_none PASSED [ 69%]
tests/test_branch_coverage.py::TestProcessStreamEventUsageFalsy::test_process_stream_event_finished_empty_usage PASSED [ 69%]
tests/test_branch_coverage.py::TestHandleStreamChatBranches::test_coverage_delegated_to_test_api PASSED [ 69%]
tests/test_branch_coverage.py::TestToolManagerNoHandler::test_set_confirmation_handler_none PASSED [ 69%]
tests/test_branch_coverage.py::TestGetApiKeyOllama::test_ollama_skips_generic_key_lookup PASSED [ 69%]
tests/test_branch_coverage.py::TestGitFileIndexerShouldIndexFalse::test_get_tracked_files_skips_non_indexed_file PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_get_delegation_errors_returns_none PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_delegation_errors_attr_is_none PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_get_delegation_errors_raises_exception PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_get_delegation_errors_with_none_items_and_unconvertible PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_fallback_no_delegation_errors_attr PASSED [ 69%]
tests/test_branch_coverage.py::TestDelegationProcessResultsErrorsBranches::test_fallback_delegation_errors_with_none_items_and_unconvertible PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_working_memory_template_exists PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_smart_file_reading_patterns_exist PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_verification_requirements_exist PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_file_size_guidelines_exist PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_structured_thinking_protocol_exists PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_delegation_optimization_exists PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_performance_metrics_tracking_exists PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_anti_patterns_documented PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_pre_flight_checklists_exist PASSED [ 69%]
tests/test_context_management.py::TestPerformanceImprovementPlanGuidelines::test_tool_combination_patterns_exist PASSED [ 69%]
tests/test_context_management.py::TestPatternsLearningDatabase::test_patterns_directory_exists PASSED [ 69%]
tests/test_context_management.py::TestPatternsLearningDatabase::test_pattern_files_exist PASSED [ 69%]
tests/test_context_management.py::TestPatternsLearningDatabase::test_pattern_files_have_content PASSED [ 69%]
tests/test_coverage_suite.py::test_prompts_import PASSED                 [ 69%]
tests/test_coverage_suite.py::test_repl_config PASSED                    [ 69%]
tests/test_coverage_suite.py::test_console_methods PASSED                [ 69%]
tests/test_coverage_suite.py::test_plan_command PASSED                   [ 69%]
tests/test_coverage_suite.py::test_anthropic_provider PASSED             [ 69%]
tests/test_coverage_suite.py::test_anthropic_empty_messages PASSED       [ 69%]
tests/test_coverage_suite.py::test_repl_basic PASSED                     [ 69%]
tests/test_init.py::test_version PASSED                                  [ 69%]
tests/test_init.py::test_getattr_app PASSED                              [ 69%]
tests/test_init.py::test_getattr_other PASSED                            [ 69%]
tests/test_init.py::test_all PASSED                                      [ 69%]
tests/test_interactive.py::test_tool_form PASSED                         [ 69%]
tests/test_interactive.py::test_tab_completion PASSED                    [ 69%]
tests/test_main.py::test_main_module_imports PASSED                      [ 69%]
tests/test_main.py::test_python_m_henchman_help SKIPPED (Temporarily...) [ 69%]
tests/test_phase5.py::test_accessibility PASSED                          [ 70%]
tests/test_phase5.py::test_keybindings PASSED                            [ 70%]
tests/test_phase6_1.py::test_style_overrides PASSED                      [ 70%]
tests/test_phase6_2.py::test_plugin_system PASSED                        [ 70%]
tests/test_phase6_3.py::test_layout_settings PASSED                      [ 70%]
tests/test_phase7.py::test_async_renderer PASSED                         [ 70%]
tests/test_phase7.py::test_chunked_file_read PASSED                      [ 70%]
tests/test_progress.py::test_progress_manager PASSED                     [ 70%]
tests/test_settings_persistence.py::test_settings_persistence PASSED     [ 70%]
tests/test_version.py::test_version_string_format PASSED                 [ 70%]
tests/test_version.py::test_version_tuple PASSED                         [ 70%]
tests/test_version.py::test_package_version_exported PASSED              [ 70%]
tests/test_visualization.py::test_visualization PASSED                   [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_properties PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_execute_basic[asyncio] PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_execute_with_timeout[asyncio] PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_execute_empty_question[asyncio] PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_execute_method_is_async[asyncio] PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_str_representation PASSED [ 70%]
tests/tools/test_ask_user_comprehensive.py::TestAskUserTool::test_tool_registration PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_name PASSED     [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_description PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_kind PASSED     [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_parameters PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_needs_confirmation PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_execute_success PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_execute_with_timeout PASSED [ 70%]
tests/tools/test_ask_user_tool.py::TestAskUserTool::test_execute_empty_question PASSED [ 70%]
tests/tools/test_base.py::TestToolKind::test_read_value PASSED           [ 70%]
tests/tools/test_base.py::TestToolKind::test_write_value PASSED          [ 70%]
tests/tools/test_base.py::TestToolKind::test_execute_value PASSED        [ 70%]
tests/tools/test_base.py::TestToolKind::test_network_value PASSED        [ 70%]
tests/tools/test_base.py::TestToolKind::test_all_kinds_exist PASSED      [ 70%]
tests/tools/test_base.py::TestToolResult::test_minimal_result PASSED     [ 70%]
tests/tools/test_base.py::TestToolResult::test_full_result PASSED        [ 70%]
tests/tools/test_base.py::TestToolResult::test_error_result PASSED       [ 70%]
tests/tools/test_base.py::TestConfirmationRequest::test_basic_request PASSED [ 70%]
tests/tools/test_base.py::TestConfirmationRequest::test_high_risk_request PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_read_tool_properties PASSED  [ 70%]
tests/tools/test_base.py::TestToolABC::test_write_tool_properties PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_default_kind_is_read PASSED  [ 70%]
tests/tools/test_base.py::TestToolABC::test_read_tool_no_confirmation_needed PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_write_tool_needs_confirmation PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_execute_tool_high_risk PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_network_tool_needs_confirmation PASSED [ 70%]
tests/tools/test_base.py::TestToolABC::test_to_declaration PASSED        [ 70%]
tests/tools/test_base.py::TestToolExecution::test_execute_read_tool PASSED [ 70%]
tests/tools/test_base.py::TestToolExecution::test_execute_write_tool PASSED [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_name PASSED    [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_description PASSED [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_kind_is_write PASSED [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_parameters_schema PASSED [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_format_already_clean PASSED [ 70%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_format_fixes_spacing PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_nonexistent_file PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_format_reports_changes PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_syntax_error_file PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_empty_path PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_changed_file_reports_changes PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_ruff_not_installed PASSED [ 71%]
tests/tools/test_code_format.py::TestCodeFormatTool::test_ruff_timeout PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_name PASSED  [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_description PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_kind_is_read PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_parameters_schema PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_parse_coverage_xml PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_fully_covered_file_not_reported PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_nonexistent_file PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_filter_by_file PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_invalid_xml PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_json_format PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_json_file_filter PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_json_invalid PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_branch_coverage_xml PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_branch_coverage_json PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_per_function_xml PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_per_function_json PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_empty_path PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapTool::test_no_matching_files PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_compress_ranges_empty PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_compress_ranges_single PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_compress_ranges_consecutive PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_parse_branch_coverage_no_cond PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_parse_branch_coverage_no_paren PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_parse_branch_coverage_wrong_parts PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_parse_branch_coverage_value_error PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_xml_with_filter_skips_non_matching PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_xml_with_branches PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapInternals::test_json_with_filter PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapDirectCalls::test_parse_class_returns_none_for_filter_mismatch PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapDirectCalls::test_parse_lines_branch_data_none PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapDirectCalls::test_json_parse_file_returns_none_for_filter PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapDirectCalls::test_xml_parse_entry_none_skipped PASSED [ 71%]
tests/tools/test_coverage_map.py::TestCoverageMapDirectCalls::test_json_parse_entry_none_skipped PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_name PASSED        [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_description PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_kind_is_read PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_parameters_schema PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_unused_import PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_all_imports_used PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_unused_function PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_whitelisted_names PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_directory_scan PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_nonexistent_path PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_empty_path PASSED  [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_syntax_error PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_private_functions_excluded PASSED [ 71%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_all_export_respected PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_no_dead_code PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_attribute_usage PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeTool::test_imports_only_flag PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_is_import_context_true PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_collect_top_level_definitions_class PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_collect_import_from_names_star_skipped PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_process_name_in_import_context PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_process_attribute_node_non_name_root PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_collect_used_names_attribute PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_extract_names_from_all_non_list_returns_none PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_extract_names_from_all_list PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_parse_file_read_error PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeInternals::test_directory_scan_no_findings PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeCoverage::test_collect_imported_names_from_import PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeCoverage::test_collect_import_from_names_with_asname PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeCoverage::test_collect_used_names_import_context_name PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeCoverage::test_collect_used_names_attribute_non_name_root PASSED [ 72%]
tests/tools/test_dead_code.py::TestDeadCodeCoverage::test_extract_names_from_all_non_constant_element PASSED [ 72%]
tests/tools/test_deep_research.py::TestGenerateSubqueries::test_always_includes_original PASSED [ 72%]
tests/tools/test_deep_research.py::TestGenerateSubqueries::test_focus_appended PASSED [ 72%]
tests/tools/test_deep_research.py::TestGenerateSubqueries::test_max_queries_respected PASSED [ 72%]
tests/tools/test_deep_research.py::TestGenerateSubqueries::test_no_duplicates PASSED [ 72%]
tests/tools/test_deep_research.py::TestGenerateSubqueries::test_extra_variants_added PASSED [ 72%]
tests/tools/test_deep_research.py::TestBuildReport::test_report_has_title PASSED [ 72%]
tests/tools/test_deep_research.py::TestBuildReport::test_report_has_sources PASSED [ 72%]
tests/tools/test_deep_research.py::TestBuildReport::test_report_truncates_long_snippets PASSED [ 72%]
tests/tools/test_deep_research.py::TestBuildReport::test_report_with_errors PASSED [ 72%]
tests/tools/test_deep_research.py::TestBuildReport::test_report_shows_source_count PASSED [ 72%]
tests/tools/test_deep_research.py::TestExecuteDeepResearch::test_missing_aiohttp PASSED [ 72%]
tests/tools/test_deep_research.py::TestExecuteDeepResearch::test_no_results_returns_message PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_name PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_description PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_kind_is_network PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_parameters_schema PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_execute_empty_question PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_execute_passes_focus PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_execute_ignores_extra_kwargs PASSED [ 72%]
tests/tools/test_deep_research.py::TestDeepResearchTool::test_needs_confirmation PASSED [ 72%]
tests/tools/test_delegate.py::test_delegate_task_tool PASSED             [ 72%]
tests/tools/test_delegate.py::test_delegate_task_tool_kind PASSED        [ 72%]
tests/tools/test_delegate_enhanced.py::test_delegate_tool_has_enhanced_description PASSED [ 72%]
tests/tools/test_delegate_enhanced.py::test_delegate_tool_parameters PASSED [ 72%]
tests/tools/test_delegate_enhanced.py::test_delegate_tool_kind PASSED    [ 72%]
tests/tools/test_delegate_enhanced.py::test_delegate_tool_files_description_emphasizes_importance PASSED [ 72%]
tests/tools/test_delegate_enhanced.py::test_delegate_tool_depends_on_field PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_name PASSED        [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_description PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_kind_is_read PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_parameters_schema PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_diff_in_git_repo PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_diff_no_changes PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_diff_specific_file PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_not_a_git_repo PASSED [ 72%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_staged_diff PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_compare_branches PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_stat_mode PASSED   [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_name_only_mode PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_context_lines PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_build_command_defaults PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_build_command_all_options PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_build_command_staged_ignored_with_compare PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_output_truncation PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_git_not_installed PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_git_timeout PASSED [ 73%]
tests/tools/test_diff_view.py::TestDiffViewTool::test_run_git_method PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_name PASSED        [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_description PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_kind_is_read PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_parameters_schema PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_ls_directory PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_ls_nonexistent_directory PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_ls_file_instead_of_directory PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_ls_hidden_files PASSED [ 73%]
tests/tools/test_directory_tools.py::TestLsTool::test_truncation_at_max_items PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_name PASSED      [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_description PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_kind_is_read PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_parameters_schema PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_glob_simple_pattern PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_glob_recursive_pattern PASSED [ 73%]
tests/tools/test_directory_tools.py::TestGlobTool::test_glob_no_matches PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_name PASSED    [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_description PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_kind_is_read PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_parameters_schema PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_basic_info PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_package_versions PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_show_path PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_show_env_vars PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_project_detection PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_custom_cwd PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_secret_filtering PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_detect_project_empty_dir PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_get_package_version PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_with_virtualenv PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_with_conda_env PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_no_venv_no_conda PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_show_path_includes_entries PASSED [ 73%]
tests/tools/test_env_inspect.py::TestEnvInspectTool::test_show_env_vars_empty_safe_vars PASSED [ 73%]
tests/tools/test_file_overview.py::TestFormatAnnotation::test_none_returns_empty PASSED [ 73%]
tests/tools/test_file_overview.py::TestFormatAnnotation::test_simple_annotation PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeMarkdown::test_headings_extracted PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeMarkdown::test_line_count_shown PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeMarkdown::test_truncates_many_headings PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeJson::test_object_shows_keys PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeJson::test_array_shows_length PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeJson::test_invalid_json PASSED [ 73%]
tests/tools/test_file_overview.py::TestSummarizeYaml::test_top_level_keys PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_imports_section PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_function_signature PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_class_with_methods PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_depth_1_excludes_methods PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_syntax_error PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_empty_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_module_docstring_included PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizePython::test_module_docstring_excluded PASSED [ 74%]
tests/tools/test_file_overview.py::TestCollectImports::test_regular_import PASSED [ 74%]
tests/tools/test_file_overview.py::TestCollectImports::test_from_import PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizeGeneric::test_markdown_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizeGeneric::test_json_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizeGeneric::test_yaml_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizeGeneric::test_short_generic_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestSummarizeGeneric::test_long_generic_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestExecuteFileOverview::test_missing_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestExecuteFileOverview::test_directory_path PASSED [ 74%]
tests/tools/test_file_overview.py::TestExecuteFileOverview::test_python_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestExecuteFileOverview::test_markdown_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestExecuteFileOverview::test_json_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_name PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_description PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_kind_is_read PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_parameters_schema PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_execute_missing_path PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_execute_python_file PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_execute_default_depth PASSED [ 74%]
tests/tools/test_file_overview.py::TestFileOverviewTool::test_execute_ignores_extra_kwargs PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_name PASSED       [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_description PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_kind_is_read PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_parameters_schema PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_read_file_success PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_read_file_with_line_range PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_read_file_not_found PASSED [ 74%]
tests/tools/test_file_tools.py::TestReadFileTool::test_read_file_with_negative_end_line PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_name PASSED      [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_description PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_kind_is_write PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_parameters_schema PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_write_file_success PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_write_file_creates_parent_dirs PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_write_file_overwrites_existing PASSED [ 74%]
tests/tools/test_file_tools.py::TestWriteFileTool::test_path_traversal_rejected PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_name PASSED       [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_description PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_kind_is_write PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_parameters_schema PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_file_success PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_file_string_not_found PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_file_multiple_matches_error PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_file_not_found PASSED [ 74%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_line_range PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_line_range_invalid PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_line_range_exceeds_file PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_both_modes_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_no_target_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_dry_run_string PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_edit_dry_run_line_range PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_path_traversal_rejected PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_line_range_replacement_adds_newline PASSED [ 75%]
tests/tools/test_file_tools.py::TestEditFileTool::test_dry_run_no_changes PASSED [ 75%]
tests/tools/test_file_tools.py::TestFileToolPermissionErrors::test_read_file_permission_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestFileToolPermissionErrors::test_write_file_permission_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestFileToolPermissionErrors::test_edit_file_permission_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestLsToolEdgeCases::test_ls_permission_error PASSED [ 75%]
tests/tools/test_file_tools.py::TestGlobToolEdgeCases::test_glob_path_not_found PASSED [ 75%]
tests/tools/test_file_tools.py::TestGrepToolEdgeCases::test_grep_invalid_regex PASSED [ 75%]
tests/tools/test_file_tools.py::TestShellToolEdgeCases::test_shell_exception_handling PASSED [ 75%]
tests/tools/test_file_tools.py::TestWebFetchEdgeCases::test_aiohttp_not_installed PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_name PASSED            [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_description PASSED     [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_kind_is_read PASSED    [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_parameters_schema PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_empty_action PASSED    [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_unknown_action PASSED  [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_status PASSED          [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_log PASSED             [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_branch_list PASSED     [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_stash_list PASSED      [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_blame_requires_path PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_blame_with_path PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_blame_with_line_range PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_show_default PASSED    [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_show_with_stat PASSED  [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_diff_branches_requires_refs PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_log_with_stat PASSED   [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_log_with_path PASSED   [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_status_in_non_git_dir PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_log_with_ref PASSED    [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_show_with_path PASSED  [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_stash_list_empty_output PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_diff_branches_with_path_and_stat PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_run_git_file_not_found PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsTool::test_run_git_timeout PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsCoverageGaps::test_stash_list_with_stashes PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsCoverageGaps::test_diff_branches_no_stat PASSED [ 75%]
tests/tools/test_git_ops.py::TestGitOpsCoverageGaps::test_diff_branches_no_path PASSED [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_name PASSED            [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_description PASSED     [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_kind_is_read PASSED    [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_parameters_schema PASSED [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_simple_pattern PASSED [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_regex_pattern PASSED [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_case_insensitive PASSED [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_directory PASSED  [ 75%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_with_line_numbers PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_no_matches PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_file_not_found PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_with_glob_pattern PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_context_before PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_context_after PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_context_separator PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_context_line_separator_types PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_invert_match PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_whole_word PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_count_only PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_count_only_no_matches PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepTool::test_grep_invalid_regex PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_format_context_block_empty_indices PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_format_context_block_separator PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_format_context_block_no_line_numbers PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_result_formatter_should_truncate PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_find_matching_indices PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_validate_and_setup PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_count_matches PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_search_single_file PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_search_files PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_execute_with_params PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_truncation_on_many_matches PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_file_searcher_collect_files PASSED [ 76%]
tests/tools/test_grep_tool.py::TestGrepInternals::test_truncation_across_files_line316 PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_name PASSED  [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_description PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_kind_is_read PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_parameters_schema PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_simple_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_from_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_relative_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_package_reverse_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_nonexistent_file PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_no_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_syntax_error PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_detect_cycles PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_no_cycles PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_classify_imports PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_classify_without_scan_dir PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_classify_import_method PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphTool::test_build_import_graph PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_extract_top_level_module_from_import PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_extract_top_level_module_import PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_extract_top_level_module_other PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_classify_import_unknown PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_extract_imports_with_alias PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_extract_dependencies_syntax_error PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_cycle_finder_no_duplicate_cycles PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_import_analysis_request_validate_bad_scan_dir PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_parse_file_read_error PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_file_imports_module_parse_error PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_check_import_from_node_module_name PASSED [ 76%]
tests/tools/test_import_graph.py::TestImportGraphInternals::test_collect_local_modules_nonexistent_dir PASSED [ 77%]
tests/tools/test_import_graph.py::TestImportGraphCoverageGaps::test_classify_import_empty_module PASSED [ 77%]
tests/tools/test_import_graph.py::TestImportGraphCoverageGaps::test_build_graph_skips_syntax_error_files PASSED [ 77%]
tests/tools/test_import_graph.py::TestImportGraphCoverageGaps::test_dfs_already_visited_not_in_rec_stack PASSED [ 77%]
tests/tools/test_import_graph.py::TestImportGraphCoverageGaps::test_record_cycle_deduplication PASSED [ 77%]
tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_path_in_git_repo PASSED [ 77%]
tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_none_when_git_not_found PASSED [ 77%]
tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_none_when_not_in_git_repo PASSED [ 77%]
tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_none_on_subprocess_error PASSED [ 77%]
tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_path_on_success PASSED [ 77%]
tests/tools/test_kg_common.py::TestKgToolBase::test_init_with_store PASSED [ 77%]
tests/tools/test_kg_common.py::TestKgToolBase::test_init_without_store PASSED [ 77%]
tests/tools/test_kg_query.py::test_search PASSED                         [ 77%]
tests/tools/test_kg_query.py::test_search_with_type_filter PASSED        [ 77%]
tests/tools/test_kg_query.py::test_search_no_results PASSED              [ 77%]
tests/tools/test_kg_query.py::test_search_missing_query PASSED           [ 77%]
tests/tools/test_kg_query.py::test_get PASSED                            [ 77%]
tests/tools/test_kg_query.py::test_get_missing PASSED                    [ 77%]
tests/tools/test_kg_query.py::test_get_missing_query PASSED              [ 77%]
tests/tools/test_kg_query.py::test_neighbors PASSED                      [ 77%]
tests/tools/test_kg_query.py::test_neighbors_missing PASSED              [ 77%]
tests/tools/test_kg_query.py::test_neighbors_missing_query PASSED        [ 77%]
tests/tools/test_kg_query.py::test_relations PASSED                      [ 77%]
tests/tools/test_kg_query.py::test_relations_missing PASSED              [ 77%]
tests/tools/test_kg_query.py::test_relations_missing_query PASSED        [ 77%]
tests/tools/test_kg_query.py::test_important PASSED                      [ 77%]
tests/tools/test_kg_query.py::test_important_empty PASSED                [ 77%]
tests/tools/test_kg_query.py::test_stats PASSED                          [ 77%]
tests/tools/test_kg_query.py::test_unknown_action PASSED                 [ 77%]
tests/tools/test_kg_query.py::test_no_git_repo PASSED                    [ 77%]
tests/tools/test_kg_query.py::test_tool_properties PASSED                [ 77%]
tests/tools/test_kg_query.py::test_parse_int_param_non_digit PASSED      [ 77%]
tests/tools/test_kg_query.py::test_lazy_init_with_git_root PASSED        [ 77%]
tests/tools/test_kg_query.py::test_lazy_init_scans_when_empty PASSED     [ 77%]
tests/tools/test_kg_query.py::test_kg_query_description PASSED           [ 77%]
tests/tools/test_kg_query.py::test_lazy_init_with_real_git_root PASSED   [ 77%]
tests/tools/test_kg_update.py::test_add_entity PASSED                    [ 77%]
tests/tools/test_kg_update.py::test_add_entity_defaults PASSED           [ 77%]
tests/tools/test_kg_update.py::test_add_entity_with_file_path PASSED     [ 77%]
tests/tools/test_kg_update.py::test_add_observation PASSED               [ 77%]
tests/tools/test_kg_update.py::test_add_observation_missing_entity PASSED [ 77%]
tests/tools/test_kg_update.py::test_add_observation_missing_text PASSED  [ 77%]
tests/tools/test_kg_update.py::test_add_relation PASSED                  [ 77%]
tests/tools/test_kg_update.py::test_add_relation_missing_target PASSED   [ 77%]
tests/tools/test_kg_update.py::test_remove_entity PASSED                 [ 77%]
tests/tools/test_kg_update.py::test_remove_missing_entity PASSED         [ 77%]
tests/tools/test_kg_update.py::test_missing_entity_id PASSED             [ 77%]
tests/tools/test_kg_update.py::test_invalid_entity_type PASSED           [ 77%]
tests/tools/test_kg_update.py::test_invalid_relation_type PASSED         [ 77%]
tests/tools/test_kg_update.py::test_add_relation_missing_endpoint PASSED [ 77%]
tests/tools/test_kg_update.py::test_unknown_action PASSED                [ 77%]
tests/tools/test_kg_update.py::test_no_git_repo PASSED                   [ 77%]
tests/tools/test_kg_update.py::test_saves_after_write PASSED             [ 77%]
tests/tools/test_kg_update.py::test_tool_properties PASSED               [ 78%]
tests/tools/test_kg_update.py::test_no_git_repo_update PASSED            [ 78%]
tests/tools/test_kg_update.py::test_add_entity_name_defaults_to_id PASSED [ 78%]
tests/tools/test_kg_update.py::test_add_relation_missing_entity PASSED   [ 78%]
tests/tools/test_kg_update.py::test_kg_update_description PASSED         [ 78%]
tests/tools/test_kg_update.py::test_lazy_init_with_real_git_root PASSED  [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_name PASSED      [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_description PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_kind_is_read PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_parameters_schema PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_clean_file PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_file_with_lint_errors PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_nonexistent_file PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_ruff_only PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_mypy_only PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_fix_mode PASSED  [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_fix_mode_needs_confirmation PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_no_fix_no_confirmation PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_default_no_confirmation PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_empty_path PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_ruff_not_installed PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_ruff_timeout PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_ruff_success_no_output PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_output_truncation PASSED [ 78%]
tests/tools/test_lint_check.py::TestLintCheckTool::test_mypy_failure_sets_all_ok_false PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_name PASSED    [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_description PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_kind_is_write PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_parameters_schema PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_simple_patch PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_multi_hunk_patch PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_dry_run PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_empty_patch PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_malformed_patch PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_file_not_found PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_hunk_mismatch PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_fuzz_matching PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_file_header_parsing PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_addition_only_hunk PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_deletion_only_hunk PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_parse_patch_no_path PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyTool::test_lines_match PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_split_content_trailing_newline PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_split_content_no_trailing_newline PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_reconstruct_content_adds_newline PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_extract_hunk_lines_non_list PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_extract_old_and_new_lines_context PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_find_match_empty_old_lines PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_find_match_wide_search PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_lines_match_negative_start PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_parse_no_path_raises PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_parse_hunk_header_invalid PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_parse_hunk_header_no_counts PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_handle_hunk_content_backslash PASSED [ 78%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_handle_hunk_content_trailing_blank PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_execute_with_params_empty_patch PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyInternals::test_apply_patch_file_read_error PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyCoverageGaps::test_reconstruct_content_no_trailing_newline PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyCoverageGaps::test_extract_old_and_new_lines_unknown_prefix PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyCoverageGaps::test_handle_hunk_header_returns_none PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyCoverageGaps::test_handle_hunk_content_unknown_prefix_not_last PASSED [ 79%]
tests/tools/test_patch_apply.py::TestPatchApplyCoverageGaps::test_execute_with_params_no_hunks PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractKeywords::test_removes_stop_words PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractKeywords::test_keeps_meaningful_words PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractKeywords::test_ignores_short_tokens PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractKeywords::test_empty_description PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_detects_inheritance PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_detects_decorator PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_detects_async PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_detects_class_def PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_detects_raises PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExtractStructuralPatterns::test_no_patterns_for_generic PASSED [ 79%]
tests/tools/test_pattern_search.py::TestCollectFiles::test_file_returns_itself PASSED [ 79%]
tests/tools/test_pattern_search.py::TestCollectFiles::test_directory_collects_files PASSED [ 79%]
tests/tools/test_pattern_search.py::TestCollectFiles::test_glob_filter PASSED [ 79%]
tests/tools/test_pattern_search.py::TestSearchFileStructural::test_finds_keyword_match PASSED [ 79%]
tests/tools/test_pattern_search.py::TestSearchFileStructural::test_scores_multiple_pattern_hits PASSED [ 79%]
tests/tools/test_pattern_search.py::TestSearchFileStructural::test_empty_file PASSED [ 79%]
tests/tools/test_pattern_search.py::TestDeduplicateAndRank::test_sorts_by_score PASSED [ 79%]
tests/tools/test_pattern_search.py::TestDeduplicateAndRank::test_top_k_respected PASSED [ 79%]
tests/tools/test_pattern_search.py::TestDeduplicateAndRank::test_deduplicates_same_location PASSED [ 79%]
tests/tools/test_pattern_search.py::TestBuildPatternSearchReport::test_no_matches_message PASSED [ 79%]
tests/tools/test_pattern_search.py::TestBuildPatternSearchReport::test_report_includes_description PASSED [ 79%]
tests/tools/test_pattern_search.py::TestBuildPatternSearchReport::test_report_shows_file_and_line PASSED [ 79%]
tests/tools/test_pattern_search.py::TestBuildPatternSearchReport::test_report_shows_strategy PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_missing_path PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_invalid_strategy PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_no_patterns_extracted PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_finds_matches PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_semantic_strategy PASSED [ 79%]
tests/tools/test_pattern_search.py::TestExecutePatternSearch::test_structural_strategy PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_name PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_description PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_kind_is_read PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_parameters_schema PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_execute_empty_description PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_execute_finds_code PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_execute_ignores_extra_kwargs PASSED [ 79%]
tests/tools/test_pattern_search.py::TestPatternSearchTool::test_no_confirmation_needed PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_name PASSED    [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_description PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_kind_is_read PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_parameters_schema PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_list_packages PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_inspect_specific_package PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_inspect_nonexistent_package PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_list_includes_versions PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_pip_error_message PASSED [ 79%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_output_truncation PASSED [ 80%]
tests/tools/test_pip_inspect.py::TestPipInspectTool::test_empty_output_no_packages PASSED [ 80%]
tests/tools/test_plan_mode_enforcement.py::TestPlanModeEnforcement::test_write_tool_blocked_in_plan_mode PASSED [ 80%]
tests/tools/test_plan_mode_enforcement.py::TestPlanModeEnforcement::test_execute_tool_blocked_in_plan_mode PASSED [ 80%]
tests/tools/test_plan_mode_enforcement.py::TestPlanModeEnforcement::test_read_tool_allowed_in_plan_mode PASSED [ 80%]
tests/tools/test_plan_mode_enforcement.py::TestPlanModeEnforcement::test_write_tool_allowed_when_plan_mode_disabled PASSED [ 80%]
tests/tools/test_plan_mode_enforcement.py::TestPlanModeEnforcement::test_network_tool_blocked_in_plan_mode PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_name PASSED      [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_description PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_kind_is_execute PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_parameters_schema PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_passing_test PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_failing_test PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_specific_test PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_with_verbose PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_nonexistent_path PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_with_keyword PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_collect_only PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_with_markers PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_coverage_flag PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_empty_path PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_new_parameters_in_schema PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_with_keyword_filter PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_run_with_markers_filter PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_timeout_zero_no_limit PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_timeout_kills_process PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_stderr_only_output PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunTool::test_truncate_output_large PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunCoverageGaps::test_run_with_parallel PASSED [ 80%]
tests/tools/test_pytest_run.py::TestPytestRunCoverageGaps::test_cancelled_error_propagates PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_name PASSED      [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_description PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_kind_is_read PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_parameters_schema PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_parse_simple_file PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_parse_shows_line_numbers PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_parse_shows_imports PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_parse_decorators PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_nonexistent_file PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_syntax_error_file PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_empty_file PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_docstrings_extracted PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_docstrings_disabled PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_method_classification PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_empty_path PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_include_docstrings_in_schema PASSED [ 80%]
tests/tools/test_python_ast.py::TestPythonAstTool::test_permission_error PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetNodeDocstring::test_function_with_docstring PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetNodeDocstring::test_function_without_docstring PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetNodeDocstring::test_non_matching_node_returns_none PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetNodeDocstring::test_class_with_multiline_docstring PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetDecoratorName::test_name_decorator PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetDecoratorName::test_attribute_decorator PASSED [ 80%]
tests/tools/test_python_ast_helpers.py::TestGetDecoratorName::test_call_decorator PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestGetDecoratorName::test_unknown_decorator PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatDecorator::test_name_decorator PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatDecorator::test_attribute_decorator PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatDecorator::test_call_decorator PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatDecorator::test_unknown_node PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatClassNode::test_class_without_docstring PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatClassNode::test_class_with_nested_class PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatClassNode::test_class_without_docstring_flag PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddAssignmentsSection::test_annotated_assignment PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddAssignmentsSection::test_regular_assignment PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddAssignmentsSection::test_no_assignments PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddAssignmentsSection::test_annnassign_with_none_target_skipped PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestGenerateSymbolTable::test_generates_full_table PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatFunctionNode::test_basic_function PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatFunctionNode::test_async_function PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatImportNode::test_simple_import PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestFormatImportNode::test_from_import PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddImportsSection::test_adds_imports PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddImportsSection::test_no_imports PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddFunctionsAndClassesSections::test_adds_functions PASSED [ 81%]
tests/tools/test_python_ast_helpers.py::TestAddFunctionsAndClassesSections::test_adds_classes PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_name PASSED    [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_description PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_kind_is_execute PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_parameters_schema PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_simple_print PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_captures_stdout PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_captures_stderr PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_syntax_error PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_runtime_error PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_timeout PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_cwd_parameter PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_multiline_code PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_uses_same_python PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_return_value_in_output PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_empty_code_returns_error PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_whitespace_only_code_returns_error PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_timeout_zero_means_no_limit PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_output_truncation PASSED [ 81%]
tests/tools/test_python_exec.py::TestPythonExecTool::test_cancelled_error_kills_process PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_empty_registry PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_register_tool PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_register_multiple_tools PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_get_tool PASSED     [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_get_nonexistent_tool PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_get_declarations PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_duplicate_registration_raises PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_unregister_tool PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistry::test_unregister_nonexistent_silent PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_execute_read_tool PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_execute_nonexistent_tool PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_execute_write_tool_without_confirmation PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_execute_with_confirmation_handler_approved PASSED [ 81%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_execute_with_confirmation_handler_denied PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryExecution::test_read_tool_skips_confirmation PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryPolicyEngine::test_policy_auto_approve PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryPolicyEngine::test_policy_can_be_removed PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryPolicyEngine::test_list_auto_approve_policies PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryRetry::test_network_tool_retries_on_failure PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryRetry::test_network_tool_exhausts_retries PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryRetry::test_non_network_tool_no_retry PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryRetry::test_set_retry_config PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryRetry::test_zero_retries_disables_retry PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_empty PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_single PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_multiple PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_with_failures PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_duplicate_tool_names PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_batch_result_dataclass PASSED [ 82%]
tests/tools/test_registry.py::TestToolRegistryBatch::test_execute_batch_exception_as_result PASSED [ 82%]
tests/tools/test_registry.py::TestRegistryCoverageGaps::test_len PASSED  [ 82%]
tests/tools/test_registry.py::TestRegistryCoverageGaps::test_execute_large_output_truncated PASSED [ 82%]
tests/tools/test_registry.py::TestRegistryCoverageGaps::test_execute_batch_base_exception PASSED [ 82%]
tests/tools/test_research_notes.py::TestGetNotesDir::test_creates_directory PASSED [ 82%]
tests/tools/test_research_notes.py::TestGetNotesDir::test_returns_path PASSED [ 82%]
tests/tools/test_research_notes.py::TestNotePath::test_safe_tag PASSED   [ 82%]
tests/tools/test_research_notes.py::TestNotePath::test_sanitizes_unsafe_chars PASSED [ 82%]
tests/tools/test_research_notes.py::TestSaveLoadNote::test_round_trip PASSED [ 82%]
tests/tools/test_research_notes.py::TestSaveLoadNote::test_load_missing_returns_empty PASSED [ 82%]
tests/tools/test_research_notes.py::TestSaveLoadNote::test_load_corrupted_returns_empty PASSED [ 82%]
tests/tools/test_research_notes.py::TestSaveLoadNote::test_updated_at_present PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionWrite::test_writes_note PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionWrite::test_overwrites_existing PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionAppend::test_appends_to_existing PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionAppend::test_creates_if_absent PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionRead::test_reads_existing PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionRead::test_missing_note_returns_error PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionList::test_empty_notes_dir PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionList::test_lists_notes PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionSearch::test_finds_matching_note PASSED [ 82%]
tests/tools/test_research_notes.py::TestActionSearch::test_no_matches PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_invalid_action PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_write_requires_tag PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_write_requires_content PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_append_requires_tag PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_append_requires_content PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_search_requires_query PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_list_action PASSED [ 82%]
tests/tools/test_research_notes.py::TestExecuteResearchNotes::test_full_write_read_cycle PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_name PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_description PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_kind_is_write PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_parameters_schema PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_needs_confirmation_write PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_needs_confirmation_append PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_no_confirmation_read PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_no_confirmation_list PASSED [ 82%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_no_confirmation_search PASSED [ 83%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_execute_list PASSED [ 83%]
tests/tools/test_research_notes.py::TestResearchNotesTool::test_execute_ignores_extra_kwargs PASSED [ 83%]
tests/tools/test_security_extended.py::TestExceptionHierarchy::test_security_error_is_exception PASSED [ 83%]
tests/tools/test_security_extended.py::TestExceptionHierarchy::test_path_traversal_is_security_error PASSED [ 83%]
tests/tools/test_security_extended.py::TestExceptionHierarchy::test_command_injection_is_security_error PASSED [ 83%]
tests/tools/test_security_extended.py::TestExceptionHierarchy::test_ssrf_is_security_error PASSED [ 83%]
tests/tools/test_security_extended.py::TestFindFirstMatchingPattern::test_returns_none_when_no_match PASSED [ 83%]
tests/tools/test_security_extended.py::TestFindFirstMatchingPattern::test_returns_first_matching_pattern PASSED [ 83%]
tests/tools/test_security_extended.py::TestFindFirstMatchingPattern::test_returns_earlier_pattern_when_multiple_match PASSED [ 83%]
tests/tools/test_security_extended.py::TestFindFirstMatchingPattern::test_empty_patterns_returns_none PASSED [ 83%]
tests/tools/test_security_extended.py::TestMessageMatchesAnyKeyword::test_returns_false_when_no_match PASSED [ 83%]
tests/tools/test_security_extended.py::TestMessageMatchesAnyKeyword::test_returns_true_when_keyword_found PASSED [ 83%]
tests/tools/test_security_extended.py::TestMessageMatchesAnyKeyword::test_case_insensitive PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPathTraversal::test_no_error_for_safe_path PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPathTraversal::test_raises_for_dotdot_path PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPathTraversal::test_no_error_for_dotdot_in_filename PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckWithinBaseDir::test_no_error_when_within_base PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckWithinBaseDir::test_raises_when_outside_base PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckWithinBaseDir::test_exact_base_path_is_allowed PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_raises_for_empty_string PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_raises_for_none_path PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_returns_absolute_path PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_path_with_base_dir_valid PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_path_with_base_dir_outside_raises PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidatePath::test_path_traversal_raises PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_no_error_for_safe_command PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_backtick_substitution PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_dollar_paren_substitution PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_variable_expansion PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_redirect_to_system_dirs PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_trailing_semicolon PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckForDangerousPatterns::test_raises_for_trailing_pipe PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_raises_for_empty_string PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_raises_for_none PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_raises_for_non_string PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_raises_when_not_in_allowed_commands PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_allowed_command_passes PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_raises_for_invalid_shell_syntax PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_sub_commands_validated_with_pipe PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_sub_commands_with_allowed_commands PASSED [ 83%]
tests/tools/test_security_extended.py::TestSanitizeCommandExtended::test_dangerous_pattern_raises_command_injection PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidateSubCommands::test_valid_sub_commands_pass PASSED [ 83%]
tests/tools/test_security_extended.py::TestValidateSubCommands::test_invalid_sub_command_raises PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckUrlScheme::test_raises_for_missing_scheme PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckUrlScheme::test_raises_for_disallowed_scheme PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckUrlScheme::test_allowed_scheme_passes PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckLocalhostUrl::test_raises_for_localhost PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckLocalhostUrl::test_raises_for_127_0_0_1 PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckLocalhostUrl::test_passes_for_public_host PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_raises_for_10_x_x_x PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_raises_for_192_168_x_x PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_raises_for_172_16_x_x PASSED [ 83%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_raises_for_169_254_x_x PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_no_raise_for_no_hostname PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_passes_for_public_ip PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckPrivateIpAddress::test_raises_for_ipv6_private PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckDomainWhitelist::test_raises_when_domain_not_in_whitelist PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckDomainWhitelist::test_passes_when_domain_in_whitelist PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckDomainWhitelist::test_passes_when_no_whitelist PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckSuspiciousUrlPatterns::test_raises_for_multiple_at_symbols PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckSuspiciousUrlPatterns::test_passes_for_clean_url PASSED [ 84%]
tests/tools/test_security_extended.py::TestCheckSuspiciousUrlPatterns::test_raises_for_multiple_question_marks PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_empty_url PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_none_url PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_valid_https_url_passes PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_valid_http_url_passes PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_ftp_scheme PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_localhost PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_block_localhost_false PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_private_ip PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_block_private_ips_false PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_domain_not_in_whitelist PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_passes_for_domain_in_whitelist PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_raises_for_suspicious_pattern PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrl::test_custom_schemes_allowed PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_permission_denied_returns_clean PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_file_not_found_returns_clean PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_file_not_found_alternate_message PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_connection_refused_returns_clean PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_timeout_message_sanitizes_paths PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_network_message_sanitizes_paths PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_generic_error_returns_generic_message PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_exception_object_accepted PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_paths_in_env_vars_redacted PASSED [ 84%]
tests/tools/test_security_extended.py::TestSanitizeErrorMessage::test_home_paths_redacted_before_classification PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_writes_content_to_file PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_overwrites_existing_file PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_creates_new_file PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_raises_on_read_only_file PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_temp_file_cleaned_up_after_write PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWrite::test_accepts_string_path PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_reads_file_content PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_accepts_string_path PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_raises_for_missing_file PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_inode_change_handled_gracefully PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_reads_multiline_content PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicRead::test_stat_differs_branch_is_silently_ignored PASSED [ 84%]
tests/tools/test_security_extended.py::TestValidateUrlExceptionBranch::test_urlparse_exception_raises_ssrf_error PASSED [ 84%]
tests/tools/test_security_extended.py::TestAtomicWriteFinally::test_temp_file_cleaned_up_when_replace_fails PASSED [ 84%]
tests/tools/test_shell_advanced.py::test_shell_pipes PASSED              [ 84%]
tests/tools/test_shell_advanced.py::test_shell_redirection PASSED        [ 84%]
tests/tools/test_shell_advanced.py::test_shell_timeout PASSED            [ 84%]
tests/tools/test_shell_advanced.py::test_shell_multiline PASSED          [ 84%]
tests/tools/test_shell_coverage_extra.py::TestFormatOutput::test_output_truncated_when_exceeds_max_chars PASSED [ 84%]
tests/tools/test_shell_coverage_extra.py::TestFormatOutput::test_output_not_truncated_when_within_limit PASSED [ 84%]
tests/tools/test_shell_coverage_extra.py::TestFormatOutput::test_no_output_returns_placeholder PASSED [ 84%]
tests/tools/test_shell_coverage_extra.py::TestFormatOutput::test_only_stderr_included PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestIsProcessDead::test_returns_true_for_nonexistent_pid PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestIsProcessDead::test_returns_false_for_current_process PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestIsProcessDead::test_handles_generic_exception PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestForceClosePipes::test_handles_none_transport PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestForceClosePipes::test_closes_open_pipe_transports PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestForceClosePipes::test_handles_none_pipe_transport PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestForceClosePipes::test_handles_exception_during_close PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestReapProcess::test_reap_kills_on_timeout[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestReapProcess::test_reap_kills_handles_process_lookup_error[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestReapProcess::test_reap_succeeds_normally[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestDrainReaders::test_returns_true_when_readers_finish[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestDrainReaders::test_returns_false_on_timeout[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestRunSudoWithPty::test_returns_error_on_exception[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestRunSudoWithPty::test_successful_pty_execution[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestRunSudoWithPty::test_pty_timeout_kills_process[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestRunSudoWithPty::test_pty_output_truncated_when_too_long[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestShellToolExecuteInteractiveSudo::test_delegates_to_run_sudo_with_pty[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestShellToolExecuteValidation::test_command_injection_returns_error[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestShellToolExecuteValidation::test_empty_command_returns_error[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestShellToolExecuteValidation::test_execute_interactive_when_tty_and_sudo[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestShellToolExecuteValidation::test_execute_interactive_when_interactive_kwarg_and_tty[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestRunSudoWithPtyLoopIteration::test_pty_loop_iterates_once_before_process_exits[asyncio] PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestDrainPty::test_reads_data_until_eof PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestDrainPty::test_handles_oserror PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestDrainPty::test_appends_decoded_chunks PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyRead::test_reads_chunk_and_writes_to_stdout PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyRead::test_returns_early_on_empty_chunk PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyRead::test_handles_eio_error PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyRead::test_raises_non_eio_oserror PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyStdinWrite::test_forwards_stdin_data PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyStdinWrite::test_no_write_when_empty_stdin PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyStdinWrite::test_handles_oserror PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyIo::test_reads_when_master_fd_ready PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyIo::test_writes_when_stdin_ready PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyIo::test_both_read_and_write_when_both_ready PASSED [ 85%]
tests/tools/test_shell_coverage_extra.py::TestHandlePtyIo::test_no_action_when_nothing_ready PASSED [ 85%]
tests/tools/test_shell_interactive.py::TestShellToolInteractive::test_interactive_parameter_in_schema PASSED [ 85%]
tests/tools/test_shell_interactive.py::TestShellToolInteractive::test_sudo_command_detection PASSED [ 85%]
tests/tools/test_shell_interactive.py::TestShellToolInteractive::test_non_interactive_mode_for_non_sudo PASSED [ 85%]
tests/tools/test_shell_interactive.py::TestShellToolInteractive::test_sudo_without_tty_falls_back PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultAllowedCommands::test_returns_set PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultAllowedCommands::test_contains_common_commands PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultAllowedCommands::test_each_call_returns_new_set PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultDeniedPatterns::test_returns_list PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultDeniedPatterns::test_contains_shell_pipe_patterns PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultDeniedPatterns::test_each_call_returns_new_list PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultAllowedDirectories::test_returns_set PASSED [ 85%]
tests/tools/test_shell_secure.py::TestDefaultAllowedDirectories::test_contains_cwd_and_home PASSED [ 85%]
tests/tools/test_shell_secure.py::TestShellSecurityConfig::test_defaults_populated_on_init PASSED [ 85%]
tests/tools/test_shell_secure.py::TestShellSecurityConfig::test_custom_values_not_overwritten PASSED [ 85%]
tests/tools/test_shell_secure.py::TestShellSecurityConfig::test_default_flags PASSED [ 85%]
tests/tools/test_shell_secure.py::TestShellSecurityConfig::test_max_defaults PASSED [ 85%]
tests/tools/test_shell_secure.py::TestParseCommand::test_simple_command PASSED [ 85%]
tests/tools/test_shell_secure.py::TestParseCommand::test_command_with_pipe PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_command_with_redirect PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_command_with_background PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_command_with_subshell PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_command_with_backtick_subshell PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_sudo_command PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_non_sudo_command PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_invalid_shell_syntax_falls_back_to_split PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_stderr_redirect_detected PASSED [ 86%]
tests/tools/test_shell_secure.py::TestParseCommand::test_append_redirect_detected PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_no_errors_on_clean_command PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_detects_pipe_to_bash PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_detects_backtick_substitution PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_detects_dollar_paren_substitution PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_detects_dangerous_rm PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectDeniedPatternErrors::test_empty_patterns_list PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_no_errors_when_all_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_sudo_not_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_pipes_not_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_redirects_not_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_background_not_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectFeatureFlagErrors::test_subshells_not_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectTokenConstraintErrors::test_no_errors_for_valid_tokens PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectTokenConstraintErrors::test_too_many_args PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectTokenConstraintErrors::test_command_not_in_allowlist PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectTokenConstraintErrors::test_denylist_mode_skips_allowlist_check PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCollectTokenConstraintErrors::test_empty_tokens PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckWorkingDirectory::test_allowed_cwd PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckWorkingDirectory::test_subdirectory_is_allowed PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckWorkingDirectory::test_disallowed_cwd PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckCommandBasics::test_clean_command PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckCommandBasics::test_command_too_long PASSED [ 86%]
tests/tools/test_shell_secure.py::TestCheckCommandBasics::test_null_byte_detected PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_disables_pipes PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_disables_redirects PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_disables_sudo PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_sets_lower_limits PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_allowlist_mode PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyStrictSecurity::test_strict_allowed_commands_is_subset PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyModerateSecurity::test_moderate_allows_pipes PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyModerateSecurity::test_moderate_disables_sudo PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyModerateSecurity::test_moderate_disables_background PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyModerateSecurity::test_moderate_sets_limits PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyPermissiveSecurity::test_permissive_allows_sudo PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyPermissiveSecurity::test_permissive_allows_background PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyPermissiveSecurity::test_permissive_allows_subshells PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyPermissiveSecurity::test_permissive_disables_allowlist PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplyPermissiveSecurity::test_permissive_sets_high_limits PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplySecurityLevel::test_returns_copy_not_original PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplySecurityLevel::test_strict_level PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplySecurityLevel::test_moderate_level PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplySecurityLevel::test_permissive_level PASSED [ 86%]
tests/tools/test_shell_secure.py::TestApplySecurityLevel::test_unknown_level_returns_copy_unchanged PASSED [ 86%]
tests/tools/test_shell_secure.py::TestBuildValidationErrorResult::test_returns_tool_result PASSED [ 86%]
tests/tools/test_shell_secure.py::TestBuildValidationErrorResult::test_success_is_false PASSED [ 87%]
tests/tools/test_shell_secure.py::TestBuildValidationErrorResult::test_error_field_set PASSED [ 87%]
tests/tools/test_shell_secure.py::TestBuildValidationErrorResult::test_content_contains_errors PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_init_with_default_config PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_init_with_custom_config PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_none_command_raises PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_empty_command_raises PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_valid_command_returns_empty_errors PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_with_cwd_outside_allowed PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_command_too_long PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_command_with_null_byte PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_denied_pattern PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_sudo_not_allowed PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_background_not_allowed PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_command_not_in_allowlist PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_sanitize_command_removes_null_bytes PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_sanitize_command_removes_control_chars PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_sanitize_command_truncates_long_command PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_parsed_command_directly PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_command_when_parse_raises_value_error PASSED [ 87%]
tests/tools/test_shell_secure.py::TestShellSecurityValidator::test_validate_parsed_command_with_non_list_tokens PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolProperties::test_name PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolProperties::test_description PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolProperties::test_kind_is_execute PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolProperties::test_parameters_schema PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolProperties::test_default_config_class_var PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolInit::test_init_defaults PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolInit::test_init_with_custom_config PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolInit::test_init_with_custom_wrapped_tool PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_valid_command_strict[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_valid_command_moderate[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_valid_command_permissive[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_empty_command_raises_validation_error[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_none_command_raises_validation_error[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_disallowed_command_strict[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_pipe_to_bash_denied[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_passes_timeout_to_wrapped_tool[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_passes_cwd_to_wrapped_tool[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_with_sudo_in_permissive_mode[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_background_not_allowed_by_default[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_subshell_not_allowed[asyncio] PASSED [ 87%]
tests/tools/test_shell_secure.py::TestSecureShellToolExecute::test_execute_forwards_kwargs[asyncio] PASSED [ 87%]
tests/tools/test_shell_sudo_logic.py::test_sudo_detection_logic PASSED   [ 87%]
tests/tools/test_shell_sudo_logic.py::test_parameter_schema PASSED       [ 87%]
tests/tools/test_shell_sudo_logic.py::test_execution_path_logic PASSED   [ 87%]
tests/tools/test_shell_sudo_logic.py::test_mocked_execution PASSED       [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_name PASSED          [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_description PASSED   [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_kind_is_execute PASSED [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_parameters_schema PASSED [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_simple_command PASSED [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_command_with_exit_code PASSED [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_captures_stderr PASSED [ 87%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_captures_stdout_and_stderr PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_sets_henchman_cli_env PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_timeout PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_working_directory PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_invalid_command PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_shell_multiline_output PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_default_timeout_constructor PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_default_timeout_is_3600 PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_timeout_zero_means_no_timeout PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_custom_default_timeout_used_on_timeout PASSED [ 88%]
tests/tools/test_shell_tool.py::TestShellTool::test_description_mentions_long_running PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectPythonFiles::test_finds_py_files PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectPythonFiles::test_excludes_test_files PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectPythonFiles::test_includes_test_files PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_finds_function_definition PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_finds_class_definition PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_finds_variable_definition PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_missing_symbol_returns_empty PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_syntax_error_file PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindDefinitionsInFile::test_finds_decorated_function_definition PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindImportsInFile::test_finds_from_import PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindImportsInFile::test_finds_regular_import PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindImportsInFile::test_missing_import_returns_empty PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindImportsInFile::test_syntax_error_file PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindReferencesInFile::test_finds_references PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindReferencesInFile::test_missing_symbol_returns_empty PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestFindReferencesInFile::test_references_have_context PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectAnnotations::test_finds_return_annotations PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectAnnotations::test_finds_param_annotations PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectAnnotations::test_missing_symbol_returns_empty PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestCollectAnnotations::test_finds_all_argument_type_annotations PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestBuildTraceReport::test_report_has_symbol_name PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestBuildTraceReport::test_report_shows_counts PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestBuildTraceReport::test_not_found_message PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestExecuteSymbolTrace::test_missing_path PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestExecuteSymbolTrace::test_traces_symbol PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestExecuteSymbolTrace::test_single_file_path PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_name PASSED  [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_description PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_kind_is_read PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_parameters_schema PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_execute_empty_symbol PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_execute_found PASSED [ 88%]
tests/tools/test_symbol_trace.py::TestSymbolTraceTool::test_execute_ignores_extra_kwargs PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_name PASSED          [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_description PASSED   [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_kind_is_write PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_parameters_schema PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_generate_for_functions PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_generate_for_class PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_function_style PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_async_function PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_write_output_file PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_no_testable_symbols PASSED [ 88%]
tests/tools/test_test_gen.py::TestTestGenTool::test_nonexistent_file PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_empty_path PASSED    [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_syntax_error PASSED  [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_pascal_case PASSED   [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_private_excluded PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_generate_function_style PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_generate_function_style_with_class PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_file_read_error PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_class_with_no_public_methods_gets_create_test PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_private_functions_excluded PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenTool::test_output_path_writes_file PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_class_methods_skips_private PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_class_methods_includes_init PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_symbols_skips_private_functions PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_generate_test_init PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_class_methods_delegate PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_symbols_delegate PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_extract_args_delegate PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_get_return_annotation_delegate PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_build_method_test_stubs_non_list PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_build_method_test_stubs_non_dict_skipped PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenInternals::test_generate_symbol_test_class_unknown_kind PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenCoverageGaps::test_extract_class_methods_non_func_child PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenCoverageGaps::test_extract_symbols_private_class_skipped PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenCoverageGaps::test_generate_function_style_class_symbols PASSED [ 89%]
tests/tools/test_test_gen.py::TestTestGenCoverageGaps::test_generate_function_style_class_execute PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_name PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_description PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_kind_is_read PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_parameters_schema PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_parse_simple_traceback PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_parse_extracts_frames PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_parse_division_error PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_empty_input PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_non_traceback_input PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_parse_includes_function_names PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_is_code_line_empty PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_is_code_line_traceback_header PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_is_code_line_exception PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_is_code_line_real_code PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_extract_exception_with_empty_lines PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_format_output_with_message PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_format_output_no_message PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_frame_with_another_frame_next PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_frame_as_last_line PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_extract_exception_all_empty_or_frame PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_extract_exception_exc_match_false PASSED [ 89%]
tests/tools/test_traceback_parse.py::TestTracebackParseTool::test_format_output_no_exception_type PASSED [ 89%]
tests/tools/test_utils.py::TestValidateFilePath::test_returns_none_for_valid_file PASSED [ 89%]
tests/tools/test_utils.py::TestValidateFilePath::test_returns_error_for_empty_path PASSED [ 89%]
tests/tools/test_utils.py::TestValidateFilePath::test_returns_error_for_missing_file PASSED [ 89%]
tests/tools/test_utils.py::TestValidateDirectoryPath::test_returns_none_for_valid_dir PASSED [ 89%]
tests/tools/test_utils.py::TestValidateDirectoryPath::test_returns_error_for_empty_path PASSED [ 89%]
tests/tools/test_utils.py::TestValidateDirectoryPath::test_returns_error_for_missing_dir PASSED [ 89%]
tests/tools/test_utils.py::TestValidateDirectoryPath::test_returns_error_when_path_is_file PASSED [ 90%]
tests/tools/test_utils.py::TestCreateParameterSchema::test_basic_schema PASSED [ 90%]
tests/tools/test_utils.py::TestCreateParameterSchema::test_with_optional_params PASSED [ 90%]
tests/tools/test_utils.py::TestCreateParameterSchema::test_without_optional_params PASSED [ 90%]
tests/tools/test_utils.py::TestCreatePathParameterSchema::test_default_schema PASSED [ 90%]
tests/tools/test_utils.py::TestCreatePathParameterSchema::test_with_additional_params PASSED [ 90%]
tests/tools/test_utils.py::TestCreatePathParameterSchema::test_with_custom_required PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_name PASSED   [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_description PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_kind_is_network PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_parameters_schema PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_fetch_success PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_fetch_with_max_length PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_fetch_error_status PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_fetch_connection_error PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_fetch_timeout PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_ssrf_blocked PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestWebFetchTool::test_private_ip_blocked PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestDuckDuckGoSearchToolKind::test_kind_is_network PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestDuckDuckGoProperties::test_name PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestDuckDuckGoProperties::test_description PASSED [ 90%]
tests/tools/test_web_fetch_tool.py::TestDuckDuckGoProperties::test_parameters PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_processes_user_input PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_multi_turn_conversation PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_tool_call_workflow PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_system_prompt_integration PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_error_handling PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentProcessing::test_agent_with_tools_declaration PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentUIIntegration::test_agent_repl_integration PASSED [ 90%]
tests/ui_integration/test_agent.py::TestAgentUIIntegration::test_agent_session_integration PASSED [ 90%]
tests/ui_integration/test_compaction_llm.py::TestUICompactionLLM::test_conversation_history_management PASSED [ 90%]
tests/ui_integration/test_compaction_llm.py::TestUICompactionLLM::test_long_conversation PASSED [ 90%]
tests/ui_integration/test_events.py::TestUIEvents::test_basic_agent_operation PASSED [ 90%]
tests/ui_integration/test_events.py::TestUIEvents::test_error_handling PASSED [ 90%]
tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_user_input_sent_to_llm PASSED [ 90%]
tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_llm_response_displayed_in_ui PASSED [ 90%]
tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_streaming_response_displayed PASSED [ 90%]
tests/ui_integration/test_llm.py::TestProviderSpecificIntegration::test_deepseek_provider_integration PASSED [ 90%]
tests/ui_integration/test_llm.py::TestProviderSpecificIntegration::test_anthropic_provider_integration PASSED [ 90%]
tests/ui_integration/test_llm.py::TestProviderSpecificIntegration::test_ollama_provider_integration PASSED [ 90%]
tests/ui_integration/test_llm.py::TestToolCallExecutionFlow::test_tool_call_requested_and_executed PASSED [ 90%]
tests/ui_integration/test_llm.py::TestToolCallExecutionFlow::test_tool_result_included_in_conversation PASSED [ 90%]
tests/ui_integration/test_llm.py::TestLLMErrorHandling::test_llm_error_handled_gracefully PASSED [ 90%]
tests/ui_integration/test_llm.py::TestMultiProviderSupport::test_provider_classes_exist PASSED [ 90%]
tests/ui_integration/test_llm.py::TestEndToEndLLMIntegration::test_complete_conversation_flow PASSED [ 90%]
tests/ui_integration/test_llm.py::TestEndToEndLLMIntegration::test_provider_initialization PASSED [ 90%]
tests/ui_integration/test_llm.py::TestRequirementsCoverage::test_requirement_1_covered PASSED [ 90%]
tests/ui_integration/test_llm.py::TestRequirementsCoverage::test_requirement_2_covered PASSED [ 90%]
tests/ui_integration/test_llm.py::TestRequirementsCoverage::test_requirement_3_covered PASSED [ 90%]
tests/ui_integration/test_llm.py::TestRequirementsCoverage::test_mocking_policy_followed PASSED [ 90%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_list_command_integration PASSED [ 90%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_status_command_integration PASSED [ 90%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_command_no_args_shows_help PASSED [ 90%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_tool_execution_through_ui PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_unknown_subcommand PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_command_with_real_manager PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_tool_integration PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPCommandOutputFormatting::test_mcp_list_output_format PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPCommandOutputFormatting::test_mcp_status_output_format PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPErrorHandling::test_mcp_server_connection_error PASSED [ 91%]
tests/ui_integration/test_mcp.py::TestMCPErrorHandling::test_mcp_tool_execution_error PASSED [ 91%]
tests/ui_integration/test_plan_mode.py::TestPlanModeIntegration::test_plan_command_toggles_plan_mode PASSED [ 91%]
tests/ui_integration/test_plan_mode.py::TestPlanModeIntegration::test_plan_mode_prevents_write_tool_calls PASSED [ 91%]
tests/ui_integration/test_plan_mode.py::TestPlanModeIntegration::test_plan_mode_allows_read_tool_calls PASSED [ 91%]
tests/ui_integration/test_plan_mode.py::TestPlanModeIntegration::test_plan_mode_disabled_allows_all_tools PASSED [ 91%]
tests/ui_integration/test_plan_mode.py::TestPlanModeIntegration::test_ui_status_display PASSED [ 91%]
tests/ui_integration/test_repl_e2e.py::TestReplE2E::test_tool_execution_flow PASSED [ 91%]
tests/ui_integration/test_repl_e2e.py::TestReplE2E::test_multi_turn_conversation PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_initializes_all_components PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_tool_registry_connection PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_agent_connection PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_command_registry_connection PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_session_manager_connection PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentConnections::test_repl_output_renderer_connection PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentCommunication::test_tool_execution_communication SKIPPED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentCommunication::test_command_execution_communication PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLInitializationOrder::test_tool_registry_before_agent PASSED [ 91%]
tests/ui_integration/test_repl_integration.py::TestREPLComponentDependencies::test_component_dependency_graph PASSED [ 91%]
tests/ui_integration/test_session.py::TestUISession::test_session_creation PASSED [ 91%]
tests/ui_integration/test_session.py::TestUISession::test_agent_with_session_context PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_help_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_quit_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_clear_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_tools_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_chat_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_extensions_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_mcp_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_plan_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_skill_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_unknown_slash_command_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_slash_command_with_arguments_integration PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_invalid_slash_commands[] PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_invalid_slash_commands[help] PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_invalid_slash_commands[/] PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestSlashCommandIntegration::test_invalid_slash_commands[ /help] PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestCommandParsingEdgeCases::test_parse_command_quoted_arguments PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestCommandParsingEdgeCases::test_parse_command_special_characters PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestCommandParsingEdgeCases::test_parse_command_empty_arguments PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestCommandParsingEdgeCases::test_is_slash_command_detection PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestREPLSlashCommandRouting::test_repl_routes_slash_commands PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestREPLSlashCommandRouting::test_repl_continues_after_slash_command PASSED [ 91%]
tests/ui_integration/test_slash_commands.py::TestREPLSlashCommandRouting::test_repl_exits_after_quit_command PASSED [ 91%]
tests/ui_integration/test_tokens_llm.py::TestUITokensLLM::test_agent_token_awareness PASSED [ 91%]
tests/ui_integration/test_tokens_llm.py::TestUITokensLLM::test_conversation_history PASSED [ 91%]
tests/ui_integration/test_tokens_llm.py::TestUITokensLLM::test_system_prompt_integration PASSED [ 91%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_read_file_tool PASSED [ 91%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_write_file_tool PASSED [ 91%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_ls_tool PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_grep_tool PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_glob_tool PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_shell_tool_basic PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_edit_file_tool PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_tool_error_handling PASSED [ 92%]
tests/ui_integration/test_tool_calls.py::TestToolCalls::test_all_tools_registered PASSED [ 92%]
tests/ui_integration/test_tool_integration.py::TestToolCallHandling::test_handle_tool_call_success PASSED [ 92%]
tests/ui_integration/test_tool_integration.py::TestToolCallHandling::test_handle_tool_call_nonexistent_tool PASSED [ 92%]
tests/ui_integration/test_tool_integration.py::TestToolDisplayFormatting::test_tool_call_display PASSED [ 92%]
tests/utils/test_backslash_in_comment_bug.py::test_backslash_in_comment PASSED [ 92%]
tests/utils/test_backslash_in_comment_bug.py::test_backslash_at_end_of_line PASSED [ 92%]
tests/utils/test_compaction.py::test_token_counter PASSED                [ 92%]
tests/utils/test_compaction.py::test_compaction PASSED                   [ 92%]
tests/utils/test_compaction.py::test_compaction_no_pruning_needed PASSED [ 92%]
tests/utils/test_compaction.py::test_compaction_last_not_user PASSED     [ 92%]
tests/utils/test_compaction.py::test_compaction_full_budget PASSED       [ 92%]
tests/utils/test_compaction_edge_cases.py::TestMessageSequenceEdgeCases::test_repr PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestMessageSequenceEdgeCases::test_is_tool_sequence_true PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestMessageSequenceEdgeCases::test_is_tool_sequence_false PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestCompactorEdgeCases::test_empty_unprotected_with_protected PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestCompactorEdgeCases::test_degenerate_budget_system_only PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestCompactorEdgeCases::test_no_sequences_empty_history PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestCompactorEdgeCases::test_budget_exactly_zero PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestProtectedZoneTruncation::test_truncation_skips_non_tool_messages PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestProtectedZoneTruncation::test_truncation_small_tool_content PASSED [ 92%]
tests/utils/test_compaction_edge_cases.py::TestProtectedZoneTruncation::test_truncation_integer_division_bug PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_valid_simple_sequence PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_tool_without_preceding_assistant PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_tool_after_user_fails PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_valid_tool_sequence PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_tool_with_wrong_id_fails PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestValidateCompactedSequence::test_orphaned_tool_calls_fail PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestCompactWithResult::test_returns_compaction_result PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestCompactWithResult::test_tracks_dropped_count PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestMessageSummarizer::test_create_summary_message PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestMessageSummarizer::test_summarize_with_mock_provider PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestMessageSummarizer::test_summarize_handles_exception PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestCompactWithSummarization::test_no_compaction_needed PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestCompactWithSummarization::test_compaction_without_summarization PASSED [ 92%]
tests/utils/test_compaction_validation.py::TestCompactWithSummarization::test_compaction_with_protected_zone PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_nested_code_blocks_in_strings PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_malformed_code_block_no_closing PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_code_block_with_backticks_in_comments PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_consecutive_code_blocks PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_code_block_with_unicode PASSED [ 92%]
tests/utils/test_comprehensive_bug.py::test_raw_string_with_odd_backslashes PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_empty PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_none_content PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_single_block PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_multiple_blocks PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_no_blocks PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_sections_with_error_patterns PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_sections_with_tool_patterns PASSED [ 92%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_with_apostrophe_bug PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_code_blocks_with_various_apostrophes PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_keyword_sections_with_default_keywords PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_keyword_sections_with_custom_keywords PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_critical_sections PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_extract_by_patterns_edge_cases PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_get_context_around_line_edge_cases PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_line_contains_keyword_case_insensitive PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_code_block_with_raw_string_and_backtick PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_nested_code_blocks_in_string PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_malformed_raw_string PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_escape_sequence_outside_string PASSED [ 93%]
tests/utils/test_content_extractor.py::TestContentExtractor::test_comprehensive_string_parsing PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_sections_empty_content PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_by_patterns_no_matches PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_by_patterns_with_matches PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_code_blocks_empty PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_code_blocks_no_code PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_extract_code_blocks_with_code PASSED [ 93%]
tests/utils/test_content_extractor_edge_cases.py::test_create_extractor_methods_creates_methods PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestTokenCounterMissingLines::test_truncate_empty_string PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestTokenCounterMissingLines::test_truncate_fits_within_limit PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestTokenCounterMissingLines::test_truncate_known_model PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestTokenCounterMissingLines::test_get_encoding_unknown_model PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestTokenCounterMissingLines::test_get_encoding_known_model PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestImportanceScorerMissingLines::test_unknown_role_returns_zero PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestImportanceScorerMissingLines::test_assistant_long_content_importance PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestImportanceScorerMissingLines::test_apply_minimum_score_zero PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestImportanceScorerMissingLines::test_apply_minimum_score_nonzero PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestImportanceScorerMissingLines::test_calculate_importance_with_unknown_role PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestConversationTypeDetectorMissingLine::test_returns_general_for_generic_messages PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestConversationTypeDetectorMissingLine::test_returns_general_for_empty PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_enforce_safety_limits_basic PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_enforce_message_safety_limit_no_content PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_enforce_message_safety_limit_short_content PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_enforce_message_safety_limit_truncates_long PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_create_truncated_message PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_create_truncated_message_no_content PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_compact_with_result_returns_result PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_validate_compacted_sequence_valid PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_validate_compacted_sequence_tool_at_start PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_validate_compacted_sequence_bad_prev_role PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_validate_compacted_sequence_wrong_tool_id PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_calculate_cluster_importance_empty_cluster PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_calculate_cluster_importance_valid PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_generate_intelligent_summary_returns_none PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestIntelligentContextManagerMissingLines::test_preserve_critical_context_returns_messages PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_compress_empty_messages PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_compress_empty_clusters PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_compress_medium_importance_no_summary PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_compress_medium_with_tool_sequences PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_compress_low_importance_with_code_blocks PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_summarize_cluster_empty PASSED [ 93%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_generate_cluster_summary_empty PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_generate_cluster_summary_short_content PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_generate_cluster_summary_long_content PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_preserve_tool_sequences_no_tool_calls PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_preserve_tool_sequences_with_tool_calls PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_factory_coding PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_factory_debugging PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_factory_research PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines::test_factory_general PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_cluster_tool_call_sequences_single_message PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_should_merge_adjacent_non_adjacent_indices PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_cluster_topic_similarity_empty_keywords PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_cluster_topic_similarity_merges_similar PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_merge_clusters_nothing_to_merge_single_cluster PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_cluster_role_patterns_single_cluster PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines::test_cluster_temporal_proximity_single_cluster PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_sequence_grouper_last_sequence_preserved PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_handle_tool_call_sequence_user_break PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_handle_tool_call_sequence_matches_tool_call_id PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_truncate_zone_messages_no_trim_needed PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_truncate_tool_message_empty_content PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_truncate_tool_message_heavy_truncation PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_sequence_validator_tool_at_zero PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_all_tool_calls_have_responses_missing_response PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_all_tool_calls_have_responses_valid PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_format_messages_for_summary_with_tool_call_id PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_format_messages_skips_system PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_generate_summary_with_provider_success[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_generate_summary_with_provider_exception[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_compact_messages_no_compaction_needed[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_compact_messages_compacted_not_summarized[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_attempt_summarization_no_dropped_messages[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines::test_attempt_summarization_exception_swallowed[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines2::test_generate_summary_provider_empty_chunks[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines2::test_compact_messages_was_not_compacted[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_generate_summary_no_finish_reason_loop_exhausts[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_compact_messages_not_compacted_returns_early[asyncio] PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines2::test_group_into_sequences_last_sequence_not_empty PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines2::test_protected_zone_truncate_needed PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines2::test_compress_cluster_no_content_short PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines2::test_compress_medium_tool_sequence_no_tool_calls PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines2::test_compress_code_block_no_code PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines2::test_compress_code_block_with_code PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_handle_tool_call_multiple_calls_continuation PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_truncate_protected_zone_already_fits PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_select_sequences_all_fit_no_break PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompactionMissingLines3::test_loop_continues_after_last_sequence_not_empty PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines3::test_generate_cluster_summary_none_content PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines3::test_preserve_tool_sequences_out_of_bounds_index PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines3::test_preserve_tool_sequences_tool_response_not_following PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestCompressionStrategyMissingLines3::test_preserve_code_blocks_out_of_bounds_index PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestIntelligentContextMissingLines2::test_enforce_message_safety_len_gt_limit_but_tokens_ok PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestIntelligentContextMissingLines2::test_calculate_cluster_importance_missing_score PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines2::test_cluster_tool_call_mismatched_id PASSED [ 94%]
tests/utils/test_coverage_boost.py::TestMessageClustererMissingLines2::test_get_cluster_content_none_content PASSED [ 95%]
tests/utils/test_double_quote_apostrophe_bug_final.py::test_double_quote_not_apostrophe PASSED [ 95%]
tests/utils/test_failing_bug.py::test_code_block_with_trailing_backslash PASSED [ 95%]
tests/utils/test_failing_bug.py::test_nested_backticks_in_raw_string PASSED [ 95%]
tests/utils/test_failing_bug.py::test_consecutive_backticks_in_code PASSED [ 95%]
tests/utils/test_has_language_bug.py::test_has_language_reset_bug PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_empty_messages PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_with_result_empty_messages PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_small_conversation_fits PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_with_result_small_conversation PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_preserves_tool_sequences PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_with_high_importance_messages PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_with_protected_index PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_with_result_metrics PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_enforces_safety_limits PASSED [ 95%]
tests/utils/test_intelligent_compaction.py::test_compact_clusters_related_messages PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_empty PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_single_block PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_multiple_blocks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_no_blocks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_nested_backticks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_raw_string_backslash_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_empty_code_blocks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_combined_string_prefixes PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_four_backticks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_carriage_return_line_ending PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_raw_string_double_backslash PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_odd_number_of_backticks PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_uppercase_string_prefixes PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_invalid_string_prefixes PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_apostrophe_in_string_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_escaped_quote_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_apostrophe_string_delimiter PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_line_continuation_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_line_continuation_escaped_newline_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_string_prefix_validation_empty_string_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_none_value_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_two_backticks_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_language_with_hyphen_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_extract_code_blocks_language_no_whitespace_bug PASSED [ 95%]
tests/utils/test_intelligent_context.py::test_is_apostrophe_in_word_negative_index_bug PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug.py::test_apostrophe_after_variable PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug.py::test_apostrophe_in_word_vs_string PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug.py::test_string_prefix_with_apostrophe_after_variable PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug_failing.py::test_variable_followed_by_string_literal PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug_failing.py::test_actual_bug_scenario PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug_final.py::test_is_apostrophe_in_word_theyve_bug PASSED [ 95%]
tests/utils/test_intelligent_context_apostrophe_bug_final.py::test_is_apostrophe_in_word_common_contractions PASSED [ 95%]
tests/utils/test_intelligent_context_ar_bug.py::test_extract_code_blocks_ar_string_bug PASSED [ 95%]
tests/utils/test_intelligent_context_bug.py::test_escaped_quote_in_string PASSED [ 95%]
tests/utils/test_intelligent_context_bug.py::test_escaped_backtick_in_string PASSED [ 95%]
tests/utils/test_intelligent_context_bug_find.py::test_code_block_with_backtick_in_comment PASSED [ 95%]
tests/utils/test_intelligent_context_bug_find.py::test_code_block_with_triple_backtick_in_comment PASSED [ 95%]
tests/utils/test_intelligent_context_bug_find.py::test_code_block_with_string_containing_backtick_and_newline PASSED [ 95%]
tests/utils/test_intelligent_context_bug_find.py::test_raw_string_with_odd_backslashes_before_quote PASSED [ 96%]
tests/utils/test_intelligent_context_bug_find.py::test_comment_inside_string PASSED [ 96%]
tests/utils/test_intelligent_context_bug_find.py::test_escape_sequence_in_raw_string PASSED [ 96%]
tests/utils/test_intelligent_context_bug_fix_verification.py::test_invalid_string_prefix_not_mistaken_for_apostrophe PASSED [ 96%]
tests/utils/test_intelligent_context_bug_fix_verification.py::test_valid_string_prefix_detection PASSED [ 96%]
tests/utils/test_intelligent_context_bug_yve.py::test_is_apostrophe_in_word_yve_bug PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug.py::test_is_apostrophe_in_word_invalid_contractions PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug.py::test_is_apostrophe_in_word_valid_contractions PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug.py::test_is_apostrophe_in_word_edge_cases PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug_fixed.py::test_is_apostrophe_in_word_invalid_contractions PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug_fixed.py::test_is_apostrophe_in_word_valid_contractions PASSED [ 96%]
tests/utils/test_intelligent_context_contraction_bug_fixed.py::test_is_apostrophe_in_word_edge_cases PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_bug.py::test_bug_ar_prefix_affects_code_block PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_bug.py::test_bug_ur_prefix_in_python3 PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_bug.py::test_actual_failing_case PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_bug_final.py::test_is_apostrophe_in_word_negative_index_at_start_bug PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_bug_final.py::test_is_apostrophe_in_word_regular_cases_still_work PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_invalid_string_prefix_ar PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_invalid_string_prefix_ur_python3 PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_valid_string_prefix_r PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_apostrophe_in_word_isnt PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_code_block_with_ar_string PASSED [ 96%]
tests/utils/test_intelligent_context_four_lenses_real_bug.py::test_abr_string_prefix_bug PASSED [ 96%]
tests/utils/test_intelligent_context_index_error_bug.py::test_is_apostrophe_in_word_index_error PASSED [ 96%]
tests/utils/test_intelligent_context_index_error_bug.py::test_is_apostrophe_in_word_edge_cases PASSED [ 96%]
tests/utils/test_intelligent_context_index_error_bug_final.py::test_is_apostrophe_in_word_index_error_bug PASSED [ 96%]
tests/utils/test_intelligent_context_index_error_bug_final.py::test_is_apostrophe_in_word_negative_index PASSED [ 96%]
tests/utils/test_intelligent_context_mayve_bug.py::test_is_apostrophe_in_word_mayve_bug PASSED [ 96%]
tests/utils/test_intelligent_context_mismatched_fence_bug.py::test_extract_code_blocks_mismatched_fence_bug PASSED [ 96%]
tests/utils/test_intelligent_context_mismatched_fence_bug.py::test_mismatched_fence_direct PASSED [ 96%]
tests/utils/test_intelligent_context_mismatched_fence_bug.py::test_exact_match_fence PASSED [ 96%]
tests/utils/test_intelligent_context_mismatched_fence_bug.py::test_too_few_backticks PASSED [ 96%]
tests/utils/test_intelligent_context_raw_string_backslash_bug.py::test_raw_string_escaped_quote_does_not_end_string PASSED [ 96%]
tests/utils/test_intelligent_context_raw_string_backslash_bug.py::test_parser_state_handle_backslash_return_value PASSED [ 96%]
tests/utils/test_intelligent_context_raw_string_backslash_bug.py::test_raw_string_with_escaped_quote_and_backticks_inside PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug.py::test_parser_state_apostrophe_bug PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug.py::test_code_block_extraction_with_bug PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug_final.py::test_is_valid_string_prefix_edge_cases PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug_final.py::test_is_valid_raw_string_prefix_edge_cases PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug_final.py::test_apostrophe_detection_bug PASSED [ 96%]
tests/utils/test_intelligent_context_real_bug_final.py::test_code_block_extraction_with_string_prefixes PASSED [ 96%]
tests/utils/test_intelligent_context_reasoning_bug.py::test_reasoning_content_preserved_when_no_truncation_needed PASSED [ 96%]
tests/utils/test_intelligent_context_reasoning_bug.py::test_reasoning_content_lost_when_truncation_needed PASSED [ 96%]
tests/utils/test_intelligent_context_reasoning_bug.py::test_reasoning_content_with_tool_calls PASSED [ 96%]
tests/utils/test_intelligent_context_triple_quote_bug.py::test_triple_quote_string_parsing PASSED [ 96%]
tests/utils/test_intelligent_context_triple_quote_bug.py::test_triple_quote_in_code_block PASSED [ 96%]
tests/utils/test_intelligent_context_triple_quote_bug.py::test_mixed_quotes_in_code PASSED [ 96%]
tests/utils/test_intelligent_context_ur_bug.py::test_ur_prefix_invalid_python3 PASSED [ 96%]
tests/utils/test_intelligent_context_ur_bug.py::test_string_prefix_extraction_bug PASSED [ 96%]
tests/utils/test_intelligent_context_ur_ru_bug.py::test_is_valid_raw_string_prefix_ur_ru PASSED [ 96%]
tests/utils/test_intelligent_context_ur_ru_bug.py::test_python_3_string_prefix_behavior PASSED [ 96%]
tests/utils/test_intelligent_context_yve_bug_final.py::test_is_apostrophe_in_word_yve_bug PASSED [ 96%]
tests/utils/test_intelligent_context_yve_bug_final.py::test_is_apostrophe_in_word_valid_contractions_still_work PASSED [ 96%]
tests/utils/test_intelligent_context_yve_bug_final.py::test_is_apostrophe_in_word_invalid_single_letter_contractions PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_empty_message PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_within_limit PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_preserves_code_blocks PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_preserves_error_messages PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_no_critical_sections PASSED [ 97%]
tests/utils/test_intelligent_truncation_refactoring.py::test_intelligent_truncation_edge_cases PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_getattr_for_textual_app_returns_callable PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_getattr_lazy_imports_app PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_getattr_raises_for_unknown_attribute PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_getattr_raises_for_empty_name PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_getattr_case_sensitive PASSED [ 97%]
tests/utils/test_lazy_import.py::TestLazyImport::test_module_usage_example PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestValidateDuplicateToolCallId::test_duplicate_tool_call_id_raises PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestCompactWithSummarizationNotCompacted::test_returns_early_when_not_compacted[asyncio] PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestRetryWithNegativeMaxRetries::test_raises_runtime_error_with_empty_range[asyncio] PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestCompactionBranches::test_tool_call_loop_exits_naturally PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestCompactionBranches::test_non_matching_tool_message_skipped PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestCompactionBranches::test_all_sequences_fit_in_budget_direct PASSED [ 97%]
tests/utils/test_missing_coverage.py::TestCompactionBranches::test_select_sequences_all_fit_in_budget PASSED [ 97%]
tests/utils/test_multi_turn_tool_calls.py::TestMultiTurnToolCalls::test_multiple_tool_call_rounds PASSED [ 97%]
tests/utils/test_multi_turn_tool_calls.py::TestMultiTurnToolCalls::test_wrong_tool_call_id_detected PASSED [ 97%]
tests/utils/test_multi_turn_tool_calls.py::TestMultiTurnToolCalls::test_multiple_tool_calls_same_assistant PASSED [ 97%]
tests/utils/test_multi_turn_tool_calls.py::TestMultiTurnToolCalls::test_tool_result_matches_wrong_round PASSED [ 97%]
tests/utils/test_protected_zone.py::TestProtectedZone::test_no_protection_by_default PASSED [ 97%]
tests/utils/test_protected_zone.py::TestProtectedZone::test_protection_preserves_current_turn PASSED [ 97%]
tests/utils/test_protected_zone.py::TestProtectedZone::test_protected_zone_budget_limit PASSED [ 97%]
tests/utils/test_protected_zone.py::TestProtectedZone::test_tool_sequences_in_protected_zone PASSED [ 97%]
tests/utils/test_protected_zone.py::TestProtectedZone::test_unprotected_pruned_before_protected PASSED [ 97%]
tests/utils/test_protected_zone.py::TestCompactorMaxProtectedRatio::test_default_30_percent PASSED [ 97%]
tests/utils/test_protected_zone.py::TestCompactorMaxProtectedRatio::test_custom_ratio PASSED [ 97%]
tests/utils/test_protected_zone.py::TestCompactorMaxProtectedRatio::test_zero_ratio_no_protection PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_initialization PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_get_current_usage_empty PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_get_current_usage_with_entries PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_clean_old_usage_empty PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_clean_old_usage_all_old PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_clean_old_usage_mixed_ages PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_add_usage_basic PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_add_usage_multiple_calls PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_wait_for_capacity_immediate PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_wait_for_capacity_needs_wait PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_wait_for_capacity_tokens_exceed_limit PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_wait_for_capacity_empty_deque_edge_case PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_concurrent_access PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_integration_flow PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_cleanup_integration PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_zero_tokens PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_negative_time_edge_case PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_sleep_time_zero_or_negative PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_lock_prevents_race_conditions PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_multiple_loop_iterations_with_expired_entries PASSED [ 97%]
tests/utils/test_ratelimit.py::TestAsyncRateLimiter::test_sleep_time_less_than_or_equal_zero_branch PASSED [ 97%]
tests/utils/test_raw_string_backslash_bug.py::test_raw_string_escaped_quote PASSED [ 97%]
tests/utils/test_raw_string_backslash_bug.py::test_raw_string_double_backslash PASSED [ 98%]
tests/utils/test_retry.py::TestRetryConfig::test_default_config PASSED   [ 98%]
tests/utils/test_retry.py::TestRetryConfig::test_custom_config PASSED    [ 98%]
tests/utils/test_retry.py::TestCalculateDelay::test_first_attempt PASSED [ 98%]
tests/utils/test_retry.py::TestCalculateDelay::test_exponential_growth PASSED [ 98%]
tests/utils/test_retry.py::TestCalculateDelay::test_max_delay_cap PASSED [ 98%]
tests/utils/test_retry.py::TestCalculateDelay::test_jitter_adds_variability PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_success_on_first_try PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_success_after_retry PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_exhaust_retries PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_non_retryable_exception PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_default_config PASSED [ 98%]
tests/utils/test_retry.py::TestWithRetryDecorator::test_custom_retryable_exceptions PASSED [ 98%]
tests/utils/test_retry.py::TestRetryAsync::test_success PASSED           [ 98%]
tests/utils/test_retry.py::TestRetryAsync::test_retry_on_failure PASSED  [ 98%]
tests/utils/test_retry.py::TestRetryAsync::test_default_config PASSED    [ 98%]
tests/utils/test_retry.py::TestRetryAsync::test_all_retries_fail PASSED  [ 98%]
tests/utils/test_summarization.py::TestCompactionResult::test_default_values PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactionResult::test_with_compaction PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactorCompactWithResult::test_no_compaction_needed PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactorCompactWithResult::test_compaction_applied PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactorCompactWithResult::test_empty_messages PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_init_without_provider PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_init_with_provider PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_format_messages_filters_system PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_format_messages_with_tool_calls PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_format_messages_truncates_long_content PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_without_provider[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_empty_messages[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_success[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_handles_error[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_caches_result[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_empty_summary_returns_none[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_summarize_only_system_messages_returns_none[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_no_compaction_needed[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_without_provider[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_with_summarization[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_summarize_false[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_summarization_failure_fallback[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_with_successful_summary_insertion[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_summary_returns_none[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_with_protected_zone[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_no_dropped_messages[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_with_custom_max_protected_ratio[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_summarizer_returns_empty_summary[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_without_summarize_flag[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_compaction_summarization_exception_handling[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestCompactWithSummarization::test_summarize_comprehensive_coverage[asyncio] PASSED [ 98%]
tests/utils/test_summarization.py::TestMessageSummarizer::test_create_summary_message PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_model_limits_dict_exists PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_deepseek_limit PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_claude_limit PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_gpt4_limit PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_get_model_limit_known_model PASSED [ 98%]
tests/utils/test_tiktoken_integration.py::TestModelLimits::test_get_model_limit_unknown_model PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_text_empty PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_text_simple PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_text_long PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_text_with_model PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_text_with_unknown_model PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_messages_empty PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_messages_simple PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_messages_with_tool_calls PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_messages_with_tool_result PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_encoding_caching PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTiktokenTokenCounter::test_count_messages_conversation PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTokenCounterEdgeCases::test_unicode_text PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTokenCounterEdgeCases::test_code_snippet PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTokenCounterEdgeCases::test_json_content PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTokenCounterEdgeCases::test_very_long_text PASSED [ 99%]
tests/utils/test_tiktoken_integration.py::TestTokenCounterEdgeCases::test_message_with_none_content PASSED [ 99%]
tests/utils/test_token_counter_extended.py::test_count_text_empty PASSED [ 99%]
tests/utils/test_token_counter_extended.py::test_count_messages_with_tool_calls PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_preserves_single_tool_sequence PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_preserves_multiple_tool_calls PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_does_not_split_tool_sequence_when_pruning PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_preserves_nested_tool_sequences PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_with_empty_tool_results PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_validation_sequence_integrity PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_edge_case_tool_message_at_beginning PASSED [ 99%]
tests/utils/test_tool_sequence_compaction.py::TestCompactionWithToolSequences::test_compaction_with_large_token_count PASSED [ 99%]
tests/utils/test_truncation_refactor.py::TestTruncationRefactor::test_truncate_with_marker_consolidated PASSED [ 99%]
tests/utils/test_truncation_refactor.py::TestTruncationRefactor::test_original_methods_still_work PASSED [ 99%]
tests/utils/test_truncation_refactor.py::TestTruncationRefactor::test_edge_case_empty_content PASSED [ 99%]
tests/utils/test_truncation_refactor.py::TestTruncationRefactor::test_truncation_logic_preserved PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_valid_single_tool_sequence PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_valid_multiple_tool_calls PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_tool_without_assistant PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_tool_without_tool_calls PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_mismatched_tool_call_id PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_missing_tool_response PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_zero_tool_responses PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_invalid_tool_separated_by_user PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_valid_complex_sequence PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_format_debug_output PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_empty_sequence PASSED [ 99%]
tests/utils/test_validation.py::TestMessageSequenceValidation::test_sequence_without_tools PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_empty_sequence PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_valid_sequence_unchanged PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_orphaned_tool_at_start PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_orphaned_tool_after_compaction PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_mismatched_tool_call_id PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_strips_assistant_tool_calls_without_responses PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_zero_tool_responses PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_preserves_valid_tool_sequences PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_mixed_valid_and_orphaned PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_multiple_orphans PASSED [ 99%]
tests/utils/test_validation.py::TestRepairMessageSequence::test_repair_tool_separated_by_user_message PASSED [100%]

=============================== warnings summary ===============================
tests/rag/test_concurrency_smoke.py:142
  /home/matthew/mlg-cli/tests/rag/test_concurrency_smoke.py:142: PytestUnknownMarkWarning: Unknown pytest.mark.e2e - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.e2e

tests/cli/test_app_coverage_100.py::TestProcessToolCalls::test_process_tool_calls_with_collect_events[asyncio]
tests/cli/test_output_handler.py::TestOutputHandler::test_start_background_indexing_no_index_async
tests/cli/test_output_stream_coverage.py::TestToolExecutorCoverage::test_handle_confirmation_approved[asyncio]
tests/tools/test_diff_view.py::TestDiffViewTool::test_run_git_method
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:2208: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    def __init__(self, name, parent):
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/cli/test_coverage_gaps_cli.py::TestModelCommandMissingLines::test_test_provider_connection_no_default_model
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:2208: RuntimeWarning: coroutine 'TestOutputHandlerMissingLines.test_show_turn_status_rag_index.<locals>.fake_index_async' was never awaited
    def __init__(self, name, parent):
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/cli/test_coverage_gaps_cli.py::TestConsoleMissingLines::test_markdown_with_open_code_fence
  /home/matthew/anaconda3/lib/python3.12/site-packages/rich/control.py:192: RuntimeWarning: coroutine 'initialize_mcp.<locals>.connect_mcp' was never awaited
    return text.translate(_translate_table)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_resolve_provider_from_env_handles_all_exceptions
  /home/matthew/mlg-cli/src/henchman/cli/textual_mixins.py:648: RuntimeWarning: Failed to load settings: Corrupted settings file. Using defaults.
    self.settings = self._load_settings_safe()  # type: ignore[attr-defined]

tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_resolve_provider_from_env_handles_all_exceptions
  /home/matthew/mlg-cli/src/henchman/cli/textual_mixins.py:650: RuntimeWarning: Failed to gather environment: Format error.
    self.environment_context = self._gather_env_safe()  # type: ignore[attr-defined]

tests/cli/test_textual_app.py::TestHenchmanTextualApp::test_resolve_provider_from_env_handles_all_exceptions
  /home/matthew/mlg-cli/src/henchman/cli/textual_mixins.py:650: RuntimeWarning: Failed to gather environment: Cannot gather env.
    self.environment_context = self._gather_env_safe()  # type: ignore[attr-defined]

tests/e2e/test_context_safety.py::TestContextSafety::test_compactor_safety_limit
  tests/e2e/test_context_safety.py:53: PytestWarning: The test <Function test_compactor_safety_limit> is marked with '@pytest.mark.asyncio' but it is not an async function. Please remove the asyncio mark. If the test is not marked explicitly, check for global marks applied via 'pytestmark'.
    def test_compactor_safety_limit(self):

tests/empty_message_validation/test_empty_messages.py::TestEmptyMessageValidation::test_agent_validates_messages_before_sending
  /home/matthew/anaconda3/lib/python3.12/site-packages/tiktoken/model.py:101: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    if model_name.startswith(model_prefix):
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/extensions/test_missing_coverage.py::TestPluginInstallerUnsupportedSource::test_unsupported_source_raises[asyncio]
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:529: PydanticDeprecatedSince20: The `__fields__` attribute is deprecated, use the `model_fields` class property instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/
    if iscoroutinefunction(getattr(spec, attr, None)):

tests/extensions/test_missing_coverage.py::TestPluginInstallerUnsupportedSource::test_unsupported_source_raises[asyncio]
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:529: PydanticDeprecatedSince20: The `__fields_set__` attribute is deprecated, use `model_fields_set` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/
    if iscoroutinefunction(getattr(spec, attr, None)):

tests/extensions/test_missing_coverage.py::TestPluginInstallerUnsupportedSource::test_unsupported_source_raises[asyncio]
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:529: PydanticDeprecatedSince211: Accessing the 'model_computed_fields' attribute on the instance is deprecated. Instead, you should access this attribute from the model class. Deprecated in Pydantic V2.11 to be removed in V3.0.
    if iscoroutinefunction(getattr(spec, attr, None)):

tests/extensions/test_missing_coverage.py::TestPluginInstallerUnsupportedSource::test_unsupported_source_raises[asyncio]
  /home/matthew/anaconda3/lib/python3.12/unittest/mock.py:529: PydanticDeprecatedSince211: Accessing the 'model_fields' attribute on the instance is deprecated. Instead, you should access this attribute from the model class. Deprecated in Pydantic V2.11 to be removed in V3.0.
    if iscoroutinefunction(getattr(spec, attr, None)):

tests/extensions/test_plugin_coverage.py::TestPluginManagerExtended::test_search_plugins_delegates_to_client[asyncio]
  /home/matthew/mlg-cli/src/henchman/extensions/plugin_manager.py:238: DeprecationWarning: Using individual query/page/page_size/category parameters is deprecated. Use the search_params parameter instead.
    resolved_search_params = _build_search_params(search_params, legacy_request)

tests/extensions/test_plugin_coverage.py::TestPluginInstallerHelpers::test_extract_archive_file_tar_gz
  /home/matthew/mlg-cli/src/henchman/extensions/plugin_installer.py:266: DeprecationWarning: Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.
    tar_ref.extractall(target_dir)

tests/rag/test_rag_concurrency_integration.py::TestMultiProcessRag::test_lock_across_processes
  /home/matthew/anaconda3/lib/python3.12/multiprocessing/popen_fork.py:66: DeprecationWarning: This process (pid=37705) is multi-threaded, use of fork() may lead to deadlocks in the child.
    self.pid = os.fork()

tests/test_interactive.py::test_tool_form
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_interactive.py::test_tool_form returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_interactive.py::test_tab_completion
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_interactive.py::test_tab_completion returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_phase5.py::test_accessibility
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_phase5.py::test_accessibility returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_phase5.py::test_keybindings
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_phase5.py::test_keybindings returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_phase6_1.py::test_style_overrides
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_phase6_1.py::test_style_overrides returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_phase6_2.py::test_plugin_system
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_phase6_2.py::test_plugin_system returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_phase6_3.py::test_layout_settings
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_phase6_3.py::test_layout_settings returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_progress.py::test_progress_manager
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_progress.py::test_progress_manager returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_settings_persistence.py::test_settings_persistence
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_settings_persistence.py::test_settings_persistence returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/test_visualization.py::test_visualization
  /home/matthew/anaconda3/lib/python3.12/site-packages/_pytest/python.py:170: PytestReturnNotNoneWarning: Test functions should return None, but tests/test_visualization.py::test_visualization returned <class 'bool'>.
  Did you mean to use `assert` instead of `return`?
  See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information.
    warnings.warn(

tests/tools/test_coverage_map.py::TestCoverageMapTool::test_fully_covered_file_not_reported
  /home/matthew/anaconda3/lib/python3.12/xml/etree/ElementTree.py:569: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    self._root = parser._parse_whole(source)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/tools/test_kg_common.py::TestFindGitRoot::test_returns_path_on_success
  /home/matthew/anaconda3/lib/python3.12/inspect.py:3072: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    params = OrderedDict((param.name, param) for param in parameters)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/tools/test_lint_check.py::TestLintCheckTool::test_output_truncation
  /home/matthew/anaconda3/lib/python3.12/pathlib.py:407: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    def _load_parts(self):
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_user_input_sent_to_llm
tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_llm_response_displayed_in_ui
tests/ui_integration/test_llm.py::TestLLMCommunicationBasic::test_streaming_response_displayed
tests/ui_integration/test_llm.py::TestToolCallExecutionFlow::test_tool_call_requested_and_executed
tests/ui_integration/test_llm.py::TestToolCallExecutionFlow::test_tool_result_included_in_conversation
tests/ui_integration/test_llm.py::TestLLMErrorHandling::test_llm_error_handled_gracefully
tests/ui_integration/test_llm.py::TestEndToEndLLMIntegration::test_complete_conversation_flow
  /home/matthew/mlg-cli/src/henchman/core/agent_streaming.py:215: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    async for chunk in ctx.provider.chat_completion_stream(
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_unknown_subcommand
  /home/matthew/anaconda3/lib/python3.12/site-packages/coverage/collector.py:239: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    def lock_data(self) -> None:
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/ui_integration/test_mcp.py::TestMCPUIIntegration::test_mcp_unknown_subcommand
  /home/matthew/anaconda3/lib/python3.12/site-packages/prompt_toolkit/key_binding/key_bindings.py:431: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    def _parse_key(key: Keys | str) -> str | Keys:
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/utils/test_compaction_validation.py::TestMessageSummarizer::test_summarize_handles_exception
tests/utils/test_summarization.py::TestCompactWithSummarization::test_summarize_comprehensive_coverage[asyncio]
  /home/matthew/mlg-cli/src/henchman/utils/compaction.py:836: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited
    async for chunk in provider.chat_completion_stream(
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================ tests coverage ================================
_______________ coverage: platform linux, python 3.12.7-final-0 ________________

Name                                                        Stmts   Miss Branch BrPart  Cover   Missing
-------------------------------------------------------------------------------------------------------
src/henchman/__init__.py                                        5      0      0      0   100%
src/henchman/__main__.py                                        1      0      0      0   100%
src/henchman/agents/__init__.py                                 7      0      0      0   100%
src/henchman/agents/config.py                                   2      0      0      0   100%
src/henchman/agents/delegation.py                             401      0    126      0   100%
src/henchman/agents/file_read_decision_maker.py               105      7     56      0    93%   147-148, 281-285
src/henchman/agents/identity.py                                 9      0      0      0   100%
src/henchman/agents/ledger.py                                 153      2     22      1    98%   400-401
src/henchman/agents/line_range_utils.py                       113     23     52      1    78%   138-139, 146-147, 164-165, 172-173, 189, 246-269
src/henchman/agents/metrics.py                                162      0     22      0   100%
src/henchman/agents/metrics_reporter.py                       123      0     16      0   100%
src/henchman/agents/orchestrator.py                            50      0      8      0   100%
src/henchman/agents/orchestrator_anchoring.py                  67      0     34      0   100%
src/henchman/agents/orchestrator_components.py                 21      0      6      0   100%
src/henchman/agents/orchestrator_delegation_ctrl.py            81      0     34      2    98%   143->182, 177->143
src/henchman/agents/orchestrator_events.py                     17      0      4      0   100%
src/henchman/agents/orchestrator_execution.py                  66      3     26      1    93%   89, 107-108
src/henchman/agents/orchestrator_init.py                       58      0      6      0   100%
src/henchman/agents/orchestrator_loop.py                       87      0     26      0   100%
src/henchman/agents/orchestrator_metrics_ctrl.py               14      0      2      0   100%
src/henchman/agents/orchestrator_prompts.py                    18      0      0      0   100%
src/henchman/agents/orchestrator_run.py                        21      0      2      0   100%
src/henchman/agents/orchestrator_tech_lead.py                  15      0      2      0   100%
src/henchman/agents/orchestrator_timeout.py                    39      0     20      0   100%
src/henchman/agents/orchestrator_tools.py                      30      0     10      0   100%
src/henchman/agents/orchestrator_turns.py                      35      0      6      0   100%
src/henchman/agents/orchestrator_types.py                      90      0      0      0   100%
src/henchman/agents/orchestrator_validation.py                 27      0      4      0   100%
src/henchman/agents/pool.py                                    91      1     34      0    99%   173
src/henchman/agents/presets.py                                 51      0     18      0   100%
src/henchman/agents/prompts.py                                 58      0     14      0   100%
src/henchman/agents/working_memory.py                         256     10     68      7    95%   66, 115, 127-128, 150-151, 154, 241-242, 428->exit, 455->exit, 507
src/henchman/api/__init__.py                                    2      0      0      0   100%
src/henchman/api/auth.py                                       12      0      6      0   100%
src/henchman/api/endpoints/__init__.py                          2      0      0      0   100%
src/henchman/api/endpoints/chat.py                            182      0     68      0   100%
src/henchman/api/endpoints/health.py                           38      0      4      0   100%
src/henchman/api/server.py                                     61      0      4      0   100%
src/henchman/api/state.py                                      10      0      0      0   100%
src/henchman/chat/__init__.py                                  10      5      2      0    42%   34-39
src/henchman/chat/base.py                                      37      0      0      0   100%
src/henchman/chat/discord_bot.py                              129     56     38      1    53%   85-91, 100-149, 154-155, 160-161, 187-188, 196-198, 217-234, 245-251, 303->306, 315
src/henchman/chat/manager.py                                  208     91     84      9    51%   85, 113, 157, 160-170, 255-339, 366-367, 379-426, 442, 466, 518-524, 533->532
src/henchman/cli/__init__.py                                    4      0      0      0   100%
src/henchman/cli/app.py                                       281      2     72      0    99%   673-674
src/henchman/cli/chat_serve.py                                 53     41      8      0    20%   58-118, 136-144
src/henchman/cli/command_processor.py                          46      0     12      0   100%
src/henchman/cli/commands/__init__.py                          69      1     12      1    98%   167
src/henchman/cli/commands/agent.py                             91      0     24      0   100%
src/henchman/cli/commands/builtins.py                         115      0     20      0   100%
src/henchman/cli/commands/chat.py                             117      0     34      0   100%
src/henchman/cli/commands/context.py                          231      0     48      0   100%
src/henchman/cli/commands/extensions.py                        28      0      4      0   100%
src/henchman/cli/commands/mcp.py                               98      0     30      0   100%
src/henchman/cli/commands/model.py                            165      0     50      0   100%
src/henchman/cli/commands/plan.py                              41      0     12      0   100%
src/henchman/cli/commands/rag.py                              122      0     26      0   100%
src/henchman/cli/commands/session.py                          411      0     96      0   100%
src/henchman/cli/commands/team.py                              43      0     12      0   100%
src/henchman/cli/commands/theme.py                            115      0     30      0   100%
src/henchman/cli/commands/unlimited.py                         39      0     12      0   100%
src/henchman/cli/console.py                                   294      0     58      0   100%
src/henchman/cli/console_helpers.py                            40      0      8      0   100%
src/henchman/cli/core_init.py                                  52      0      6      0   100%
src/henchman/cli/input.py                                     167      0     54      0   100%
src/henchman/cli/input_handler.py                              44      2     10      0    96%   14-15
src/henchman/cli/json_output.py                                31      0      8      0   100%
src/henchman/cli/output_handler.py                            123      2     30      0    99%   222-223
src/henchman/cli/plugins.py                                    59      0     20      0   100%
src/henchman/cli/prompts.py                                     9      0      0      0   100%
src/henchman/cli/repl.py                                      202      0     42      0   100%
src/henchman/cli/serve.py                                      35      0      6      0   100%
src/henchman/cli/session_manager.py                            70      0     22      0   100%
src/henchman/cli/stream_event_handlers.py                     156      0     70      0   100%
src/henchman/cli/textual_app.py                                82      0      6      0   100%
src/henchman/cli/textual_bridge.py                            178      0     46      0   100%
src/henchman/cli/textual_config.py                            108      0     22      0   100%
src/henchman/cli/textual_driver.py                             11      0      0      0   100%
src/henchman/cli/textual_messages.py                           52      0      0      0   100%
src/henchman/cli/textual_mixins.py                            844    159    218     53    75%   121, 130, 150, 169-176, 223-224, 239-240, 244-245, 249->251, 252->254, 273-274, 302-303, 308, 317, 326, 335, 344, 387, 490->exit, 529-566, 573, 578->582, 584-593, 603, 615-624, 633->exit, 661-667, 696-702, 741, 744, 758-767, 779, 794, 860-861, 902->exit, 919, 944, 951, 967, 981-982, 997-998, 1010-1018, 1060, 1070->1072, 1083-1084, 1089, 1095, 1106->exit, 1116-1132, 1144-1145, 1149, 1175, 1330->exit, 1354->exit, 1373, 1377-1378, 1392, 1396-1397, 1414->exit, 1433, 1439, 1464->exit, 1491-1493, 1504, 1585->1587, 1600->exit, 1606, 1620, 1636, 1650-1651, 1666, 1668-1672, 1688->1686, 1704-1710, 1719, 1723-1724, 1737->1735, 1752, 1755, 1763-1768, 1774, 1776, 1780, 1803-1809, 1826->exit, 1843->1845, 1845->exit
src/henchman/cli/textual_screens.py                           126      6     30      3    94%   261->exit, 352, 385, 447-451
src/henchman/cli/textual_widgets.py                           471     33     92     11    91%   109, 169, 268-269, 317-318, 349-351, 448, 456-459, 467-471, 475-477, 654, 684, 698-700, 766, 772-773, 785, 801, 836, 883, 909, 986->exit
src/henchman/cli/tool_executor.py                              96      0     36      0   100%
src/henchman/cli/tool_manager.py                               32      0      8      0   100%
src/henchman/cli/ui_renderer.py                               103      0     18      0   100%
src/henchman/config/__init__.py                                 5      0      0      0   100%
src/henchman/config/context.py                                 97      0     46      0   100%
src/henchman/config/environment.py                            114      0     42      0   100%
src/henchman/config/schema.py                                 115      0      2      0   100%
src/henchman/config/settings.py                                78      0     30      0   100%
src/henchman/core/__init__.py                                   9      0      0      0   100%
src/henchman/core/agent.py                                    276      1     84      2    99%   110, 616->620
src/henchman/core/agent_config.py                              14      0      0      0   100%
src/henchman/core/agent_stall.py                               38      0     12      0   100%
src/henchman/core/agent_streaming.py                           70      0     24      0   100%
src/henchman/core/eventbus.py                                  51      0     12      0   100%
src/henchman/core/events.py                                    29      0      0      0   100%
src/henchman/core/session.py                                    5      0      0      0   100%
src/henchman/core/session_branch.py                            15      0      2      0   100%
src/henchman/core/session_data.py                              34      0      0      0   100%
src/henchman/core/session_export.py                            53      0     24      0   100%
src/henchman/core/session_helpers.py                           29      0      2      0   100%
src/henchman/core/session_manager.py                           61      0     10      0   100%
src/henchman/core/session_manager_base.py                      58      0     16      0   100%
src/henchman/core/session_merge.py                             56      0     20      0   100%
src/henchman/core/session_models.py                            51      0     10      0   100%
src/henchman/core/session_templates.py                         59      0     10      0   100%
src/henchman/core/turn.py                                     119      0     32      0   100%
src/henchman/extensions/__init__.py                             5      0      0      0   100%
src/henchman/extensions/base.py                                20      0      0      0   100%
src/henchman/extensions/constants.py                           16      0      0      0   100%
src/henchman/extensions/manager.py                            107      0     26      0   100%
src/henchman/extensions/models.py                             116      0      0      0   100%
src/henchman/extensions/plugin_compatibility.py                38      0      4      0   100%
src/henchman/extensions/plugin_database.py                     73      2      4      0    97%   200, 206
src/henchman/extensions/plugin_installer.py                   200      0     54      0   100%
src/henchman/extensions/plugin_manager.py                     188      2     44      1    99%   351-352
src/henchman/extensions/plugin_registry_client.py              70      0     16      0   100%
src/henchman/extensions/plugin_security_scanner.py             16      0      2      0   100%
src/henchman/knowledge/__init__.py                              3      0      0      0   100%
src/henchman/knowledge/models.py                               27      0      0      0   100%
src/henchman/knowledge/scanner.py                             190      0     80      0   100%
src/henchman/knowledge/store.py                               206      0     62      0   100%
src/henchman/mcp/__init__.py                                    5      0      0      0   100%
src/henchman/mcp/client.py                                     76      1     12      1    98%   41
src/henchman/mcp/config.py                                     14      0      0      0   100%
src/henchman/mcp/manager.py                                    75      0     26      0   100%
src/henchman/mcp/tool.py                                       31      0      2      0   100%
src/henchman/metrics/__init__.py                                6      0      0      0   100%
src/henchman/metrics/collector.py                             165      0     44      0   100%
src/henchman/metrics/dashboard.py                             137      0     18      0   100%
src/henchman/metrics/exporter.py                              153      1     42      2    98%   165, 262->256
src/henchman/metrics/models.py                                100      0      0      0   100%
src/henchman/metrics/storage.py                               218      0     46      0   100%
src/henchman/providers/__init__.py                              8      0      0      0   100%
src/henchman/providers/anthropic.py                           212      0     60      0   100%
src/henchman/providers/base.py                                 44      0      0      0   100%
src/henchman/providers/deepseek.py                             12      0      0      0   100%
src/henchman/providers/ollama.py                               15      0      0      0   100%
src/henchman/providers/openai_compat.py                       137      0     40      0   100%
src/henchman/providers/openrouter.py                           14      0      0      0   100%
src/henchman/providers/registry.py                             36      0      4      0   100%
src/henchman/providers/utils.py                                34      0     18      0   100%
src/henchman/rag/__init__.py                                    7      0      0      0   100%
src/henchman/rag/chunker.py                                    68      0     12      0   100%
src/henchman/rag/concurrency.py                                83      0     16      0   100%
src/henchman/rag/embedder.py                                   36      0      0      0   100%
src/henchman/rag/indexer.py                                   143      0     46      0   100%
src/henchman/rag/repo_id.py                                    66      0     16      0   100%
src/henchman/rag/store.py                                      87      0     18      0   100%
src/henchman/rag/system.py                                    102      0     36      0   100%
src/henchman/tools/__init__.py                                  3      0      0      0   100%
src/henchman/tools/base.py                                     45      1      4      1    96%   106
src/henchman/tools/builtins/__init__.py                        35      0      0      0   100%
src/henchman/tools/builtins/ask_user.py                        21      0      0      0   100%
src/henchman/tools/builtins/code_format.py                     55      0     12      0   100%
src/henchman/tools/builtins/coverage_map.py                   239      4     60      0    99%   50, 422, 427, 525
src/henchman/tools/builtins/dead_code.py                      208      0     90      0   100%
src/henchman/tools/builtins/deep_research.py                  145     40     36      4    68%   93, 104->103, 120, 125-132, 145-163, 178-190, 208-216, 268, 308
src/henchman/tools/builtins/delegate.py                        31      0      0      0   100%
src/henchman/tools/builtins/diff_view.py                       74      0     18      0   100%
src/henchman/tools/builtins/env_inspect.py                     82      0     34      0   100%
src/henchman/tools/builtins/file_edit.py                      115      0     28      0   100%
src/henchman/tools/builtins/file_overview.py                  163     11     68      9    91%   64, 67-70, 73, 78->84, 103->109, 106-107, 111->110, 161, 209->213, 289-290
src/henchman/tools/builtins/file_read.py                       64      1     12      1    97%   192
src/henchman/tools/builtins/file_write.py                      29      0      0      0   100%
src/henchman/tools/builtins/git_ops.py                        114      1     30      1    99%   249
src/henchman/tools/builtins/glob_tool.py                       48      0     10      0   100%
src/henchman/tools/builtins/grep.py                           208      1     48      1    99%   512
src/henchman/tools/builtins/import_graph.py                   260      1     84      1    99%   169
src/henchman/tools/builtins/kg_common.py                       17      0      2      0   100%
src/henchman/tools/builtins/kg_query.py                       113      0     44      0   100%
src/henchman/tools/builtins/kg_update.py                      108      0     36      0   100%
src/henchman/tools/builtins/lint_check.py                      79      1     20      0    99%   184
src/henchman/tools/builtins/ls.py                              48      0     16      0   100%
src/henchman/tools/builtins/patch_apply.py                    225      0     62      0   100%
src/henchman/tools/builtins/pattern_search.py                 130      3     42      2    97%   171-172, 181->187, 329
src/henchman/tools/builtins/pip_inspect.py                     44      0      8      0   100%
src/henchman/tools/builtins/pytest_run.py                     105      3     20      0    98%   292, 296, 304
src/henchman/tools/builtins/python_ast.py                      33      0      2      0   100%
src/henchman/tools/builtins/python_ast_helpers.py             110      0     58      0   100%
src/henchman/tools/builtins/python_exec.py                     62      0     10      0   100%
src/henchman/tools/builtins/rag_search.py                      45      0      8      0   100%
src/henchman/tools/builtins/research_notes.py                 127      6     38      4    94%   72, 176-177, 203->196, 204->203, 208-209, 254
src/henchman/tools/builtins/shell.py                          257      0     48      0   100%
src/henchman/tools/builtins/symbol_trace.py                   203     12     58      5    93%   94, 109-111, 244-245, 265-266, 274->276, 293, 315-316, 339
src/henchman/tools/builtins/test_gen.py                       180      0     52      0   100%
src/henchman/tools/builtins/traceback_parse.py                101      0     32      0   100%
src/henchman/tools/builtins/web_fetch.py                       52      0      4      0   100%
src/henchman/tools/builtins/web_search.py                      52     23     10      0    47%   27, 40-51, 56, 61-80
src/henchman/tools/registry.py                                 93      0     24      0   100%
src/henchman/tools/security.py                                162      0     62      0   100%
src/henchman/tools/security/__init__.py                        11      0      4      0   100%
src/henchman/tools/security/shell_secure.py                   180      0     36      0   100%
src/henchman/tools/utils.py                                    31      0     16      0   100%
src/henchman/utils/__init__.py                                  4      0      0      0   100%
src/henchman/utils/cluster_utils.py                            20      0      8      0   100%
src/henchman/utils/compaction.py                              343      0    110      1    99%   346->348
src/henchman/utils/compression_strategy.py                    103      3     36      4    95%   210, 233, 235->238, 273
src/henchman/utils/importance_scorer.py                        88      5     34      5    92%   55, 144, 204, 247, 254
src/henchman/utils/intelligent_context.py                      81      5      8      1    91%   130-135, 466
src/henchman/utils/intelligent_context_aggregator.py          177     38     98     19    74%   37, 119->122, 138, 161, 164->168, 178, 197-198, 221, 225, 233, 237, 273-286, 306-312, 327, 331-332, 371, 407, 418->417, 489, 526, 552->548, 583-596
src/henchman/utils/intelligent_context_config.py               44      0      2      0   100%
src/henchman/utils/intelligent_context_detector.py             32      1      8      1    95%   184
src/henchman/utils/intelligent_context_extractor.py           159     10     54     11    90%   85, 199, 202-203, 222->221, 231, 233-234, 271, 294->291, 302, 346, 364->362
src/henchman/utils/intelligent_context_formatter.py           150     49     52      9    63%   56, 127-142, 193->196, 233, 246, 276-278, 300, 320-344, 367-368, 375, 407, 428-448
src/henchman/utils/intelligent_context_parser.py              267      3    128      5    98%   48, 53, 61, 210->219, 251->255
src/henchman/utils/intelligent_context_summarizer.py           49      2     18      3    93%   49, 111->110, 204
src/henchman/utils/intelligent_context_topic_extractor.py      42      4     20      5    85%   58, 85->84, 88->84, 92, 129-130
src/henchman/utils/intelligent_context_types.py               156     11     22      8    88%   226, 257-259, 290, 294, 297, 311, 313, 315, 437
src/henchman/utils/lazy_import.py                               9      0      2      0   100%
src/henchman/utils/message_analyzer.py                         28      2      2      1    90%   56, 115
src/henchman/utils/message_clusterer.py                       149      5     66      2    97%   52, 292-296
src/henchman/utils/message_compactor.py                        84     13     28      6    79%   93, 96, 211-223, 265, 277, 331
src/henchman/utils/ratelimit.py                                30      0      8      0   100%
src/henchman/utils/registry.py                                 27      2      4      1    90%   105-106
src/henchman/utils/retry.py                                    51      0     12      0   100%
src/henchman/utils/serialization.py                            34      5     14      3    79%   43, 63-65, 68
src/henchman/utils/sorting_utils.py                             4      0      0      0   100%
src/henchman/utils/tokens.py                                   65      0     18      0   100%
src/henchman/utils/validation.py                               91      0     36      0   100%
src/henchman/version.py                                         3      0      0      0   100%
-------------------------------------------------------------------------------------------------------
TOTAL                                                       20010    717   5296    210    95%
=========== 5363 passed, 6 skipped, 43 warnings in 181.67s (0:03:01) ===========
