SYMBOL INDEX (2687 symbols across 222 files) FILE: clink/agents/__init__.py function create_agent (line 19) | def create_agent(client: ResolvedCLIClient) -> BaseCLIAgent: FILE: clink/agents/base.py class AgentOutput (line 24) | class AgentOutput: class CLIAgentError (line 37) | class CLIAgentError(RuntimeError): method __init__ (line 40) | def __init__(self, message: str, *, returncode: int | None = None, std... class BaseCLIAgent (line 47) | class BaseCLIAgent: method __init__ (line 50) | def __init__(self, client: ResolvedCLIClient): method run (line 55) | async def run( method _build_command (line 193) | def _build_command(self, *, role: ResolvedCLIRole, system_prompt: str ... method _build_environment (line 201) | def _build_environment(self) -> dict[str, str]: method _recover_from_error (line 210) | def _recover_from_error( FILE: clink/agents/claude.py class ClaudeAgent (line 11) | class ClaudeAgent(BaseCLIAgent): method _build_command (line 14) | def _build_command(self, *, role: ResolvedCLIRole, system_prompt: str ... method _recover_from_error (line 25) | def _recover_from_error( FILE: clink/agents/codex.py class CodexAgent (line 11) | class CodexAgent(BaseCLIAgent): method __init__ (line 14) | def __init__(self, client: ResolvedCLIClient): method _recover_from_error (line 17) | def _recover_from_error( FILE: clink/agents/gemini.py class GeminiAgent (line 14) | class GeminiAgent(BaseCLIAgent): method __init__ (line 17) | def __init__(self, client: ResolvedCLIClient): method _recover_from_error (line 20) | def _recover_from_error( FILE: clink/constants.py class CLIInternalDefaults (line 18) | class CLIInternalDefaults: FILE: clink/models.py class OutputCaptureConfig (line 11) | class OutputCaptureConfig(BaseModel): class CLIRoleConfig (line 21) | class CLIRoleConfig(BaseModel): method _ensure_list (line 33) | def _ensure_list(cls, value: Any) -> list[str]: class CLIClientConfig (line 43) | class CLIClientConfig(BaseModel): method _ensure_args_list (line 57) | def _ensure_args_list(cls, value: Any) -> list[str]: class ResolvedCLIRole (line 67) | class ResolvedCLIRole(BaseModel): class ResolvedCLIClient (line 76) | class ResolvedCLIClient(BaseModel): method list_roles (line 91) | def list_roles(self) -> list[str]: method get_role (line 94) | def get_role(self, role_name: str | None) -> ResolvedCLIRole: FILE: clink/parsers/__init__.py function get_parser (line 17) | def get_parser(name: str) -> BaseParser: FILE: clink/parsers/base.py class ParsedCLIResponse (line 10) | class ParsedCLIResponse: class ParserError (line 17) | class ParserError(RuntimeError): class BaseParser (line 21) | class BaseParser: method parse (line 26) | def parse(self, stdout: str, stderr: str) -> ParsedCLIResponse: FILE: clink/parsers/claude.py class ClaudeJSONParser (line 11) | class ClaudeJSONParser(BaseParser): method parse (line 16) | def parse(self, stdout: str, stderr: str) -> ParsedCLIResponse: method _build_metadata (line 79) | def _build_metadata(self, payload: dict[str, Any], stderr: str) -> dic... method _extract_message (line 126) | def _extract_message(self, payload: dict[str, Any]) -> str | None: FILE: clink/parsers/codex.py class CodexJSONLParser (line 11) | class CodexJSONLParser(BaseParser): method parse (line 16) | def parse(self, stdout: str, stderr: str) -> ParsedCLIResponse: FILE: clink/parsers/gemini.py class GeminiJSONParser (line 11) | class GeminiJSONParser(BaseParser): method parse (line 16) | def parse(self, stdout: str, stderr: str) -> ParsedCLIResponse: method _build_fallback_message (line 59) | def _build_fallback_message(self, payload: dict[str, Any], stderr: str... FILE: clink/registry.py class RegistryLoadError (line 33) | class RegistryLoadError(RuntimeError): class ClinkRegistry (line 37) | class ClinkRegistry: method __init__ (line 40) | def __init__(self) -> None: method _load (line 44) | def _load(self) -> None: method reload (line 71) | def reload(self) -> None: method list_clients (line 75) | def list_clients(self) -> list[str]: method list_roles (line 78) | def list_roles(self, cli_name: str) -> list[str]: method get_client (line 82) | def get_client(self, cli_name: str) -> ResolvedCLIClient: method _iter_config_files (line 93) | def _iter_config_files(self) -> Iterable[Path]: method _resolve_config (line 128) | def _resolve_config(self, raw: CLIClientConfig, *, source_path: Path) ... method _resolve_executable (line 174) | def _resolve_executable( method _merge_env (line 185) | def _merge_env( method _resolve_roles (line 196) | def _resolve_roles( method _resolve_prompt_path (line 224) | def _resolve_prompt_path(self, prompt_path: str, base_dir: Path) -> Path: method _resolve_optional_path (line 230) | def _resolve_optional_path(self, candidate: str | None, base_dir: Path... method _resolve_path (line 235) | def _resolve_path(self, candidate: str, base_dir: Path) -> Path: function get_registry (line 251) | def get_registry() -> ClinkRegistry: FILE: communication_simulator_test.py class CommunicationSimulator (line 79) | class CommunicationSimulator: method __init__ (line 82) | def __init__( method _get_python_path (line 134) | def _get_python_path(self) -> str: method _create_test_runner (line 157) | def _create_test_runner(self, test_class): method setup_test_environment (line 170) | def setup_test_environment(self) -> bool: method _run_server_script (line 191) | def _run_server_script(self) -> bool: method _verify_server_environment (line 221) | def _verify_server_environment(self) -> bool: method simulate_claude_cli_session (line 257) | def simulate_claude_cli_session(self) -> bool: method _run_selected_tests (line 280) | def _run_selected_tests(self) -> bool: method _run_single_test (line 296) | def _run_single_test(self, test_name: str) -> bool: method run_individual_test (line 319) | def run_individual_test(self, test_name: str) -> bool: method get_available_tests (line 352) | def get_available_tests(self) -> dict[str, str]: method print_test_summary (line 361) | def print_test_summary(self): method run_full_test_suite (line 388) | def run_full_test_suite(self) -> bool: method cleanup (line 415) | def cleanup(self): method _run_command (line 443) | def _run_command(self, cmd: list[str], check: bool = True, capture_out... function parse_arguments (line 451) | def parse_arguments(): function list_available_tests (line 469) | def list_available_tests(): function run_individual_test (line 481) | def run_individual_test(simulator, test_name): function run_test_suite (line 504) | def run_test_suite(simulator): function main (line 528) | def main(): FILE: config.py function _calculate_mcp_prompt_limit (line 117) | def _calculate_mcp_prompt_limit() -> int: FILE: docker/scripts/healthcheck.py function check_process (line 20) | def check_process(): function check_python_imports (line 29) | def check_python_imports(): function check_log_directory (line 45) | def check_log_directory(): function check_environment (line 63) | def check_environment(): function main (line 91) | def main(): FILE: providers/azure_openai.py class AzureOpenAIProvider (line 23) | class AzureOpenAIProvider(OpenAICompatibleProvider): method __init__ (line 35) | def __init__( method get_all_model_capabilities (line 78) | def get_all_model_capabilities(self) -> dict[str, ModelCapabilities]: method get_provider_type (line 81) | def get_provider_type(self) -> ProviderType: method get_capabilities (line 84) | def get_capabilities(self, model_name: str) -> ModelCapabilities: # t... method validate_model_name (line 94) | def validate_model_name(self, model_name: str) -> bool: # type: ignor... method _build_capabilities_map (line 100) | def _build_capabilities_map(self) -> dict[str, ModelCapabilities]: method _load_registry_entries (line 161) | def _load_registry_entries(self) -> dict[str, dict]: method _merge_specs (line 179) | def _merge_specs( method _normalise_deployments (line 206) | def _normalise_deployments(mapping: dict[str, object]) -> dict[str, di... method client (line 233) | def client(self): # type: ignore[override] method generate_content (line 280) | def generate_content( method _resolve_canonical_and_deployment (line 318) | def _resolve_canonical_and_deployment(self, model_name: str) -> tuple[... method _parse_allowed_models (line 331) | def _parse_allowed_models(self) -> set[str] | None: # type: ignore[ov... FILE: providers/base.py class ModelProvider (line 16) | class ModelProvider(ABC): method __init__ (line 42) | def __init__(self, api_key: str, **kwargs): method get_provider_type (line 52) | def get_provider_type(self) -> ProviderType: method get_capabilities (line 55) | def get_capabilities(self, model_name: str) -> ModelCapabilities: method get_all_model_capabilities (line 77) | def get_all_model_capabilities(self) -> dict[str, ModelCapabilities]: method get_capabilities_by_rank (line 85) | def get_capabilities_by_rank(self) -> list[tuple[str, ModelCapabilitie... method _invalidate_capability_cache (line 101) | def _invalidate_capability_cache(self) -> None: method list_models (line 106) | def list_models( method generate_content (line 147) | def generate_content( method count_tokens (line 189) | def count_tokens(self, text: str, model_name: str) -> int: method close (line 201) | def close(self) -> None: method _is_error_retryable (line 209) | def _is_error_retryable(self, error: Exception) -> bool: method _run_with_retries (line 242) | def _run_with_retries( method validate_model_name (line 312) | def validate_model_name(self, model_name: str) -> bool: method validate_parameters (line 326) | def validate_parameters(self, model_name: str, temperature: float, **k... method get_preferred_model (line 343) | def get_preferred_model(self, category: "ToolModelCategory", allowed_m... method get_model_registry (line 348) | def get_model_registry(self) -> Optional[dict[str, Any]]: method _lookup_capabilities (line 356) | def _lookup_capabilities( method _ensure_model_allowed (line 365) | def _ensure_model_allowed( method _finalise_capabilities (line 389) | def _finalise_capabilities( method _raise_unsupported_model (line 399) | def _raise_unsupported_model(self, model_name: str) -> None: method _resolve_model_name (line 404) | def _resolve_model_name(self, model_name: str) -> str: FILE: providers/custom.py class CustomProvider (line 13) | class CustomProvider(OpenAICompatibleProvider): method __init__ (line 37) | def __init__(self, api_key: str = "", base_url: str = "", **kwargs): method _lookup_capabilities (line 92) | def _lookup_capabilities( method get_provider_type (line 114) | def get_provider_type(self) -> ProviderType: method _resolve_model_name (line 123) | def _resolve_model_name(self, model_name: str) -> str: method get_all_model_capabilities (line 166) | def get_all_model_capabilities(self) -> dict[str, ModelCapabilities]: FILE: providers/dial.py class DIALModelProvider (line 17) | class DIALModelProvider(RegistryBackedProviderMixin, OpenAICompatiblePro... method __init__ (line 35) | def __init__(self, api_key: str, **kwargs): method get_provider_type (line 104) | def get_provider_type(self) -> ProviderType: method _get_deployment_client (line 108) | def _get_deployment_client(self, deployment: str): method generate_content (line 152) | def generate_content( method close (line 279) | def close(self) -> None: FILE: providers/gemini.py class GeminiModelProvider (line 24) | class GeminiModelProvider(RegistryBackedProviderMixin, ModelProvider): method __init__ (line 45) | def __init__(self, api_key: str, **kwargs): method client (line 64) | def client(self): method _resolve_http_timeout (line 85) | def _resolve_http_timeout(self) -> Optional[float]: method generate_content (line 114) | def generate_content( method get_provider_type (line 313) | def get_provider_type(self) -> ProviderType: method _extract_usage (line 317) | def _extract_usage(self, response) -> dict[str, int]: method _is_error_retryable (line 355) | def _is_error_retryable(self, error: Exception) -> bool: method _process_image (line 433) | def _process_image(self, image_path: str) -> Optional[dict]: method get_preferred_model (line 456) | def get_preferred_model(self, category: "ToolModelCategory", allowed_m... FILE: providers/openai.py class OpenAIModelProvider (line 17) | class OpenAIModelProvider(RegistryBackedProviderMixin, OpenAICompatibleP... method __init__ (line 28) | def __init__(self, api_key: str, **kwargs): method _lookup_capabilities (line 40) | def _lookup_capabilities( method _finalise_capabilities (line 66) | def _finalise_capabilities( method _raise_unsupported_model (line 78) | def _raise_unsupported_model(self, model_name: str) -> None: method get_provider_type (line 85) | def get_provider_type(self) -> ProviderType: method get_preferred_model (line 93) | def get_preferred_model(self, category: "ToolModelCategory", allowed_m... FILE: providers/openai_compatible.py class OpenAICompatibleProvider (line 22) | class OpenAICompatibleProvider(ModelProvider): method __init__ (line 34) | def __init__(self, api_key: str, base_url: str = None, **kwargs): method _ensure_model_allowed (line 63) | def _ensure_model_allowed( method _parse_allowed_models (line 106) | def _parse_allowed_models(self) -> Optional[set[str]]: method _configure_timeouts (line 134) | def _configure_timeouts(self, **kwargs): method _is_localhost_url (line 197) | def _is_localhost_url(self) -> bool: method _validate_base_url (line 227) | def _validate_base_url(self) -> None: method client (line 257) | def client(self): method _sanitize_for_logging (line 331) | def _sanitize_for_logging(self, params: dict) -> dict: method _safe_extract_output_text (line 359) | def _safe_extract_output_text(self, response) -> str: method _generate_with_responses_endpoint (line 388) | def _generate_with_responses_endpoint( method generate_content (line 499) | def generate_content( method validate_parameters (line 676) | def validate_parameters(self, model_name: str, temperature: float, **k... method _extract_usage (line 703) | def _extract_usage(self, response) -> dict[str, int]: method count_tokens (line 722) | def count_tokens(self, text: str, model_name: str) -> int: method _is_error_retryable (line 742) | def _is_error_retryable(self, error: Exception) -> bool: method _process_image (line 833) | def _process_image(self, image_path: str) -> Optional[dict]: FILE: providers/openrouter.py class OpenRouterProvider (line 16) | class OpenRouterProvider(OpenAICompatibleProvider): method __init__ (line 46) | def __init__(self, api_key: str, **kwargs): method _lookup_capabilities (line 69) | def _lookup_capabilities( method get_provider_type (line 111) | def get_provider_type(self) -> ProviderType: method list_models (line 119) | def list_models( method _resolve_model_name (line 180) | def _resolve_model_name(self, model_name: str) -> str: method get_all_model_capabilities (line 200) | def get_all_model_capabilities(self) -> dict[str, ModelCapabilities]: FILE: providers/registries/azure.py class AzureModelRegistry (line 13) | class AzureModelRegistry(CustomModelRegistryBase): method __init__ (line 16) | def __init__(self, config_path: str | None = None) -> None: method _extra_keys (line 24) | def _extra_keys(self) -> set[str]: method _provider_default (line 27) | def _provider_default(self) -> ProviderType: method _default_friendly_name (line 30) | def _default_friendly_name(self, model_name: str) -> str: method _finalise_entry (line 33) | def _finalise_entry(self, entry: dict) -> tuple[ModelCapabilities, dict]: FILE: providers/registries/base.py class CustomModelRegistryBase (line 23) | class CustomModelRegistryBase: method __init__ (line 26) | def __init__( method reload (line 60) | def reload(self) -> None: method list_models (line 65) | def list_models(self) -> list[str]: method list_aliases (line 68) | def list_aliases(self) -> list[str]: method resolve (line 71) | def resolve(self, name_or_alias: str) -> ModelCapabilities | None: method get_capabilities (line 82) | def get_capabilities(self, name_or_alias: str) -> ModelCapabilities | ... method get_entry (line 85) | def get_entry(self, model_name: str) -> dict | None: method get_model_config (line 88) | def get_model_config(self, model_name: str) -> ModelCapabilities | None: method iter_entries (line 93) | def iter_entries(self) -> Iterable[tuple[str, ModelCapabilities, dict]]: method _load_config_data (line 100) | def _load_config_data(self) -> dict: method use_resources (line 137) | def use_resources(self) -> bool: method _parse_models (line 140) | def _parse_models(self, data: dict) -> Iterable[ModelCapabilities | No... method _convert_entry (line 146) | def _convert_entry(self, raw: dict) -> ModelCapabilities | None: method _default_friendly_name (line 178) | def _default_friendly_name(self, model_name: str) -> str: method _extra_keys (line 181) | def _extra_keys(self) -> set[str]: method _provider_default (line 184) | def _provider_default(self) -> ProviderType: method _finalise_entry (line 187) | def _finalise_entry(self, entry: dict) -> tuple[ModelCapabilities, dict]: method _build_maps (line 190) | def _build_maps(self, configs: Iterable[ModelCapabilities]) -> None: class CapabilityModelRegistry (line 215) | class CapabilityModelRegistry(CustomModelRegistryBase): method __init__ (line 218) | def __init__( method _provider_default (line 236) | def _provider_default(self) -> ProviderType: method _default_friendly_name (line 239) | def _default_friendly_name(self, model_name: str) -> str: method _finalise_entry (line 242) | def _finalise_entry(self, entry: dict) -> tuple[ModelCapabilities, dict]: FILE: providers/registries/custom.py class CustomEndpointModelRegistry (line 9) | class CustomEndpointModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: method _finalise_entry (line 21) | def _finalise_entry(self, entry: dict) -> tuple[ModelCapabilities, dict]: FILE: providers/registries/dial.py class DialModelRegistry (line 9) | class DialModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: FILE: providers/registries/gemini.py class GeminiModelRegistry (line 9) | class GeminiModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: FILE: providers/registries/openai.py class OpenAIModelRegistry (line 9) | class OpenAIModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: FILE: providers/registries/openrouter.py class OpenRouterModelRegistry (line 9) | class OpenRouterModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: method _finalise_entry (line 21) | def _finalise_entry(self, entry: dict) -> tuple[ModelCapabilities, dict]: FILE: providers/registries/xai.py class XAIModelRegistry (line 9) | class XAIModelRegistry(CapabilityModelRegistry): method __init__ (line 12) | def __init__(self, config_path: str | None = None) -> None: FILE: providers/registry.py class ModelProviderRegistry (line 15) | class ModelProviderRegistry: method __new__ (line 48) | def __new__(cls): method register_provider (line 60) | def register_provider(cls, provider_type: ProviderType, provider_class... method get_provider (line 73) | def get_provider(cls, provider_type: ProviderType, force_new: bool = F... method get_provider_for_model (line 154) | def get_provider_for_model(cls, model_name: str) -> Optional[ModelProv... method get_available_providers (line 192) | def get_available_providers(cls) -> list[ProviderType]: method get_available_models (line 198) | def get_available_models(cls, respect_restrictions: bool = True) -> di... method _collect_restricted_display_names (line 260) | def _collect_restricted_display_names( method get_available_model_names (line 304) | def get_available_model_names(cls, provider_type: Optional[ProviderTyp... method _get_api_key_for_provider (line 325) | def _get_api_key_for_provider(cls, provider_type: ProviderType) -> Opt... method _get_allowed_models_for_provider (line 351) | def _get_allowed_models_for_provider(cls, provider: ModelProvider, pro... method get_preferred_fallback_model (line 384) | def get_preferred_fallback_model(cls, tool_category: Optional["ToolMod... method get_available_providers_with_keys (line 436) | def get_available_providers_with_keys(cls) -> list[ProviderType]: method clear_cache (line 450) | def clear_cache(cls) -> None: method reset_for_testing (line 456) | def reset_for_testing(cls) -> None: method unregister_provider (line 467) | def unregister_provider(cls, provider_type: ProviderType) -> None: FILE: providers/registry_provider_mixin.py class RegistryBackedProviderMixin (line 29) | class RegistryBackedProviderMixin: method _registry_logger (line 37) | def _registry_logger(cls) -> logging.Logger: method _ensure_registry (line 42) | def _ensure_registry(cls, *, force_reload: bool = False) -> None: method reload_registry (line 68) | def reload_registry(cls) -> None: method get_all_model_capabilities (line 73) | def get_all_model_capabilities(self) -> dict[str, ModelCapabilities]: method get_model_registry (line 79) | def get_model_registry(self) -> dict[str, ModelCapabilities] | None: FILE: providers/shared/model_capabilities.py class ModelCapabilities (line 14) | class ModelCapabilities: method get_effective_temperature (line 67) | def get_effective_temperature(self, requested_temperature: float) -> O... method get_effective_capability_rank (line 80) | def get_effective_capability_rank(self) -> int: method collect_aliases (line 114) | def collect_aliases(model_configs: dict[str, "ModelCapabilities"]) -> ... method collect_model_names (line 124) | def collect_model_names( FILE: providers/shared/model_response.py class ModelResponse (line 12) | class ModelResponse: method total_tokens (line 23) | def total_tokens(self) -> int: FILE: providers/shared/provider_type.py class ProviderType (line 8) | class ProviderType(Enum): FILE: providers/shared/temperature.py class TemperatureConstraint (line 29) | class TemperatureConstraint(ABC): method validate (line 43) | def validate(self, temperature: float) -> bool: method get_corrected_value (line 47) | def get_corrected_value(self, temperature: float) -> float: method get_description (line 51) | def get_description(self) -> str: method get_default (line 55) | def get_default(self) -> float: method infer_support (line 59) | def infer_support(model_name: str) -> tuple[bool, str]: method resolve_settings (line 84) | def resolve_settings( method create (line 118) | def create(constraint_type: str) -> "TemperatureConstraint": class FixedTemperatureConstraint (line 131) | class FixedTemperatureConstraint(TemperatureConstraint): method __init__ (line 134) | def __init__(self, value: float): method validate (line 137) | def validate(self, temperature: float) -> bool: method get_corrected_value (line 140) | def get_corrected_value(self, temperature: float) -> float: method get_description (line 143) | def get_description(self) -> str: method get_default (line 146) | def get_default(self) -> float: class RangeTemperatureConstraint (line 150) | class RangeTemperatureConstraint(TemperatureConstraint): method __init__ (line 153) | def __init__(self, min_temp: float, max_temp: float, default: Optional... method validate (line 158) | def validate(self, temperature: float) -> bool: method get_corrected_value (line 161) | def get_corrected_value(self, temperature: float) -> float: method get_description (line 164) | def get_description(self) -> str: method get_default (line 167) | def get_default(self) -> float: class DiscreteTemperatureConstraint (line 171) | class DiscreteTemperatureConstraint(TemperatureConstraint): method __init__ (line 174) | def __init__(self, allowed_values: list[float], default: Optional[floa... method validate (line 178) | def validate(self, temperature: float) -> bool: method get_corrected_value (line 181) | def get_corrected_value(self, temperature: float) -> float: method get_description (line 184) | def get_description(self) -> str: method get_default (line 187) | def get_default(self) -> float: FILE: providers/xai.py class XAIModelProvider (line 17) | class XAIModelProvider(RegistryBackedProviderMixin, OpenAICompatibleProv... method __init__ (line 33) | def __init__(self, api_key: str, **kwargs): method get_provider_type (line 41) | def get_provider_type(self) -> ProviderType: method get_preferred_model (line 45) | def get_preferred_model(self, category: "ToolModelCategory", allowed_m... FILE: scripts/sync_version.py function update_config_version (line 13) | def update_config_version(): FILE: server.py class LocalTimeFormatter (line 81) | class LocalTimeFormatter(logging.Formatter): method formatTime (line 82) | def formatTime(self, record, datefmt=None): function parse_disabled_tools_env (line 172) | def parse_disabled_tools_env() -> set[str]: function validate_disabled_tools (line 185) | def validate_disabled_tools(disabled_tools: set[str], all_tools: dict[st... function apply_tool_filter (line 201) | def apply_tool_filter(all_tools: dict[str, Any], disabled_tools: set[str... function log_tool_configuration (line 221) | def log_tool_configuration(disabled_tools: set[str], enabled_tools: dict... function filter_disabled_tools (line 238) | def filter_disabled_tools(all_tools: dict[str, Any]) -> dict[str, Any]: function configure_providers (line 378) | def configure_providers(): function handle_list_tools (line 631) | async def handle_list_tools() -> list[Tool]: function handle_call_tool (line 693) | async def handle_call_tool(name: str, arguments: dict[str, Any]) -> list... function parse_model_option (line 881) | def parse_model_option(model_string: str) -> tuple[str, Optional[str]]: function get_follow_up_instructions (line 915) | def get_follow_up_instructions(current_turn_count: int, max_turns: int =... function reconstruct_thread_context (line 968) | async def reconstruct_thread_context(arguments: dict[str, Any]) -> dict[... function handle_list_prompts (line 1292) | async def handle_list_prompts() -> list[Prompt]: function handle_get_prompt (line 1342) | async def handle_get_prompt(name: str, arguments: dict[str, Any] = None)... function main (line 1449) | async def main(): function run (line 1516) | def run(): FILE: simulator_tests/base_test.py class BaseSimulatorTest (line 17) | class BaseSimulatorTest: method __init__ (line 20) | def __init__(self, verbose: bool = False): method _get_python_path (line 32) | def _get_python_path(self) -> str: method setup_test_files (line 55) | def setup_test_files(self): method call_mcp_tool (line 127) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _parse_mcp_response (line 201) | def _parse_mcp_response(self, stdout: str, expected_id: int = 2) -> Op... method _extract_continuation_id (line 237) | def _extract_continuation_id(self, response_text: str) -> Optional[str]: method run_command (line 271) | def run_command(self, cmd: list[str], check: bool = True, capture_outp... method create_additional_test_file (line 278) | def create_additional_test_file(self, filename: str, content: str) -> ... method cleanup_test_files (line 289) | def cleanup_test_files(self): method get_server_logs_since (line 301) | def get_server_logs_since(self, since_time: Optional[str] = None) -> str: method get_recent_server_logs (line 305) | def get_recent_server_logs(self, lines: int = 500) -> str: method get_server_logs_subprocess (line 309) | def get_server_logs_subprocess(self, lines: int = 500) -> str: method check_server_logs_for_errors (line 313) | def check_server_logs_for_errors(self, lines: int = 500) -> list[str]: method extract_conversation_usage_logs (line 317) | def extract_conversation_usage_logs(self, logs: str) -> list[dict[str,... method extract_conversation_token_usage (line 321) | def extract_conversation_token_usage(self, logs: str) -> list[int]: method extract_thread_creation_logs (line 325) | def extract_thread_creation_logs(self, logs: str) -> list[dict[str, st... method extract_history_traversal_logs (line 329) | def extract_history_traversal_logs(self, logs: str) -> list[dict[str, ... method validate_file_deduplication_in_logs (line 333) | def validate_file_deduplication_in_logs(self, logs: str, tool_name: st... method search_logs_for_pattern (line 337) | def search_logs_for_pattern( method get_log_file_info (line 343) | def get_log_file_info(self) -> dict[str, dict[str, any]]: method run_test (line 347) | def run_test(self) -> bool: method test_name (line 352) | def test_name(self) -> str: method test_description (line 357) | def test_description(self) -> str: FILE: simulator_tests/conversation_base_test.py class ConversationBaseTest (line 46) | class ConversationBaseTest(BaseSimulatorTest): method __init__ (line 49) | def __init__(self, verbose: bool = False): method setUp (line 54) | def setUp(self): method _clear_conversation_memory (line 65) | def _clear_conversation_memory(self): method _import_tools (line 78) | def _import_tools(self): method _get_event_loop (line 99) | def _get_event_loop(self): method call_mcp_tool_direct (line 109) | def call_mcp_tool_direct(self, tool_name: str, params: dict) -> tuple[... method _extract_continuation_id_from_response (line 191) | def _extract_continuation_id_from_response(self, response_text: str) -... method tearDown (line 239) | def tearDown(self): method test_name (line 246) | def test_name(self) -> str: method test_description (line 251) | def test_description(self) -> str: FILE: simulator_tests/log_utils.py class LogUtils (line 14) | class LogUtils: method get_server_logs_since (line 22) | def get_server_logs_since(cls, since_time: Optional[str] = None) -> str: method get_recent_server_logs (line 57) | def get_recent_server_logs(cls, lines: int = 500) -> str: method get_server_logs_subprocess (line 80) | def get_server_logs_subprocess(cls, lines: int = 500) -> str: method check_server_logs_for_errors (line 100) | def check_server_logs_for_errors(cls, lines: int = 500) -> list[str]: method extract_conversation_usage_logs (line 123) | def extract_conversation_usage_logs(cls, logs: str) -> list[dict[str, ... method extract_conversation_token_usage (line 167) | def extract_conversation_token_usage(cls, logs: str) -> list[int]: method extract_thread_creation_logs (line 187) | def extract_thread_creation_logs(cls, logs: str) -> list[dict[str, str]]: method extract_history_traversal_logs (line 207) | def extract_history_traversal_logs(cls, logs: str) -> list[dict[str, U... method validate_file_deduplication_in_logs (line 227) | def validate_file_deduplication_in_logs(cls, logs: str, tool_name: str... method search_logs_for_pattern (line 259) | def search_logs_for_pattern( method get_log_file_info (line 286) | def get_log_file_info(cls) -> dict[str, dict[str, Union[str, int, bool... FILE: simulator_tests/test_analyze_validation.py class AnalyzeValidationTest (line 16) | class AnalyzeValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_analysis_codebase (line 69) | def _create_analysis_codebase(self): method _test_single_analysis_session (line 439) | def _test_single_analysis_session(self) -> bool: method _test_analysis_refocus_flow (line 533) | def _test_analysis_refocus_flow(self) -> bool: method _test_complete_analysis_with_expert (line 619) | def _test_complete_analysis_with_expert(self) -> bool: method _test_certain_confidence (line 732) | def _test_certain_confidence(self) -> bool: method _test_context_aware_file_embedding (line 794) | def _test_context_aware_file_embedding(self) -> bool: method _test_analysis_types (line 899) | def _test_analysis_types(self) -> bool: method call_mcp_tool (line 991) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_analyze_continuation_id (line 1004) | def _extract_analyze_continuation_id(self, response_text: str) -> Opti... method _parse_analyze_response (line 1015) | def _parse_analyze_response(self, response_text: str) -> dict: method _validate_step_response (line 1026) | def _validate_step_response( FILE: simulator_tests/test_basic_conversation.py class BasicConversationTest (line 14) | class BasicConversationTest(BaseSimulatorTest): method test_name (line 18) | def test_name(self) -> str: method test_description (line 22) | def test_description(self) -> str: method run_test (line 25) | def run_test(self) -> bool: FILE: simulator_tests/test_chat_simple_validation.py class ChatSimpleValidationTest (line 20) | class ChatSimpleValidationTest(ConversationBaseTest): method test_name (line 24) | def test_name(self) -> str: method test_description (line 28) | def test_description(self) -> str: method run_test (line 31) | def run_test(self) -> bool: method test_new_conversation_no_continuation (line 71) | def test_new_conversation_no_continuation(self) -> bool: method test_continue_existing_conversation (line 108) | def test_continue_existing_conversation(self) -> bool: method test_file_handling_with_conversation (line 149) | def test_file_handling_with_conversation(self) -> bool: method test_temperature_validation_edge_cases (line 202) | def test_temperature_validation_edge_cases(self) -> bool: method test_image_limits_per_model (line 266) | def test_image_limits_per_model(self) -> bool: method test_conversation_context_preservation (line 328) | def test_conversation_context_preservation(self) -> bool: method test_chat_with_images (line 375) | def test_chat_with_images(self) -> bool: method test_continued_chat_with_previous_files (line 440) | def test_continued_chat_with_previous_files(self) -> bool: FILE: simulator_tests/test_codereview_validation.py class CodeReviewValidationTest (line 16) | class CodeReviewValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_test_code_for_review (line 69) | def _create_test_code_for_review(self): method _test_single_review_session (line 239) | def _test_single_review_session(self) -> bool: method _test_review_refocus_flow (line 339) | def _test_review_refocus_flow(self) -> bool: method _test_complete_review_with_analysis (line 427) | def _test_complete_review_with_analysis(self) -> bool: method _test_certain_confidence (line 546) | def _test_certain_confidence(self) -> bool: method _test_context_aware_file_embedding (line 608) | def _test_context_aware_file_embedding(self) -> bool: method _test_multi_step_file_context (line 752) | def _test_multi_step_file_context(self) -> bool: method call_mcp_tool (line 944) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_review_continuation_id (line 957) | def _extract_review_continuation_id(self, response_text: str) -> Optio... method _parse_review_response (line 968) | def _parse_review_response(self, response_text: str) -> dict: method _validate_step_response (line 979) | def _validate_step_response( FILE: simulator_tests/test_consensus_conversation.py class TestConsensusConversation (line 14) | class TestConsensusConversation(ConversationBaseTest): method call_mcp_tool (line 17) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple: method test_name (line 23) | def test_name(self) -> str: method test_description (line 27) | def test_description(self) -> str: method get_server_logs (line 30) | def get_server_logs(self): method run_test (line 42) | def run_test(self) -> bool: FILE: simulator_tests/test_consensus_three_models.py class TestConsensusThreeModels (line 10) | class TestConsensusThreeModels(BaseSimulatorTest): method test_name (line 14) | def test_name(self) -> str: method test_description (line 18) | def test_description(self) -> str: method run_test (line 21) | def run_test(self) -> bool: FILE: simulator_tests/test_consensus_workflow_accurate.py class TestConsensusWorkflowAccurate (line 18) | class TestConsensusWorkflowAccurate(ConversationBaseTest): method test_name (line 22) | def test_name(self) -> str: method test_description (line 26) | def test_description(self) -> str: method run_test (line 29) | def run_test(self) -> bool: FILE: simulator_tests/test_content_validation.py class ContentValidationTest (line 14) | class ContentValidationTest(BaseSimulatorTest): method test_name (line 18) | def test_name(self) -> str: method test_description (line 22) | def test_description(self) -> str: method run_test (line 25) | def run_test(self) -> bool: FILE: simulator_tests/test_conversation_chain_validation.py class ConversationChainValidationTest (line 28) | class ConversationChainValidationTest(ConversationBaseTest): method test_name (line 32) | def test_name(self) -> str: method test_description (line 36) | def test_description(self) -> str: method run_test (line 39) | def run_test(self) -> bool: method call_mcp_tool (line 361) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple: function main (line 368) | def main(): FILE: simulator_tests/test_cross_tool_comprehensive.py class CrossToolComprehensiveTest (line 19) | class CrossToolComprehensiveTest(ConversationBaseTest): method call_mcp_tool (line 22) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple: method test_name (line 33) | def test_name(self) -> str: method test_description (line 37) | def test_description(self) -> str: method run_test (line 40) | def run_test(self) -> bool: FILE: simulator_tests/test_cross_tool_continuation.py class CrossToolContinuationTest (line 12) | class CrossToolContinuationTest(ConversationBaseTest): method test_name (line 16) | def test_name(self) -> str: method test_description (line 20) | def test_description(self) -> str: method run_test (line 23) | def run_test(self) -> bool: method _test_chat_thinkdeep_codereview (line 59) | def _test_chat_thinkdeep_codereview(self) -> bool: method _test_analyze_debug_thinkdeep (line 123) | def _test_analyze_debug_thinkdeep(self) -> bool: method _test_multi_file_continuation (line 191) | def _test_multi_file_continuation(self) -> bool: FILE: simulator_tests/test_debug_certain_confidence.py class DebugCertainConfidenceTest (line 20) | class DebugCertainConfidenceTest(ConversationBaseTest): method test_name (line 24) | def test_name(self) -> str: method test_description (line 28) | def test_description(self) -> str: method run_test (line 31) | def run_test(self) -> bool: method _create_obvious_bug_scenarios (line 65) | def _create_obvious_bug_scenarios(self): method _test_obvious_import_error_certain (line 145) | def _test_obvious_import_error_certain(self) -> bool: method _test_certain_always_trusted (line 252) | def _test_certain_always_trusted(self) -> bool: method _test_regular_high_confidence_expert_analysis (line 306) | def _test_regular_high_confidence_expert_analysis(self) -> bool: method _test_multi_step_investigation_certain (line 367) | def _test_multi_step_investigation_certain(self) -> bool: method call_mcp_tool_direct (line 473) | def call_mcp_tool_direct(self, tool_name: str, params: dict) -> tuple[... method _extract_debug_continuation_id (line 510) | def _extract_debug_continuation_id(self, response_text: str) -> Option... method _parse_debug_response (line 519) | def _parse_debug_response(self, response_text: str) -> dict: method _validate_investigation_response (line 528) | def _validate_investigation_response( FILE: simulator_tests/test_debug_validation.py class DebugValidationTest (line 16) | class DebugValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_buggy_code (line 69) | def _create_buggy_code(self): method _test_single_investigation_session (line 147) | def _test_single_investigation_session(self) -> bool: method _test_investigation_refine_flow (line 233) | def _test_investigation_refine_flow(self) -> bool: method _test_complete_investigation_with_analysis (line 313) | def _test_complete_investigation_with_analysis(self) -> bool: method _test_certain_confidence (line 421) | def _test_certain_confidence(self) -> bool: method call_mcp_tool (line 476) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_debug_continuation_id (line 489) | def _extract_debug_continuation_id(self, response_text: str) -> Option... method _parse_debug_response (line 500) | def _parse_debug_response(self, response_text: str) -> dict: method _validate_step_response (line 511) | def _validate_step_response( method _test_context_aware_file_embedding (line 559) | def _test_context_aware_file_embedding(self) -> bool: method _test_multi_step_file_context (line 747) | def _test_multi_step_file_context(self) -> bool: FILE: simulator_tests/test_line_number_validation.py class LineNumberValidationTest (line 11) | class LineNumberValidationTest(BaseSimulatorTest): method test_name (line 15) | def test_name(self) -> str: method test_description (line 19) | def test_description(self) -> str: method run_test (line 22) | def run_test(self) -> bool: FILE: simulator_tests/test_logs_validation.py class LogsValidationTest (line 12) | class LogsValidationTest(BaseSimulatorTest): method test_name (line 16) | def test_name(self) -> str: method test_description (line 20) | def test_description(self) -> str: method run_test (line 23) | def run_test(self) -> bool: FILE: simulator_tests/test_model_thinking_config.py class TestModelThinkingConfig (line 12) | class TestModelThinkingConfig(BaseSimulatorTest): method test_name (line 16) | def test_name(self) -> str: method test_description (line 20) | def test_description(self) -> str: method test_pro_model_with_thinking_config (line 23) | def test_pro_model_with_thinking_config(self): method test_flash_model_without_thinking_config (line 48) | def test_flash_model_without_thinking_config(self): method test_model_resolution_logic (line 75) | def test_model_resolution_logic(self): method test_default_model_behavior (line 111) | def test_default_model_behavior(self): method run_test (line 136) | def run_test(self) -> bool: function main (line 165) | def main(): FILE: simulator_tests/test_o3_model_selection.py class O3ModelSelectionTest (line 15) | class O3ModelSelectionTest(BaseSimulatorTest): method test_name (line 19) | def test_name(self) -> str: method test_description (line 23) | def test_description(self) -> str: method run_test (line 26) | def run_test(self) -> bool: method _run_openrouter_o3_test (line 211) | def _run_openrouter_o3_test(self) -> bool: function main (line 339) | def main(): FILE: simulator_tests/test_o3_pro_expensive.py class O3ProExpensiveTest (line 20) | class O3ProExpensiveTest(BaseSimulatorTest): method test_name (line 24) | def test_name(self) -> str: method test_description (line 28) | def test_description(self) -> str: method run_test (line 31) | def run_test(self) -> bool: function main (line 91) | def main(): FILE: simulator_tests/test_ollama_custom_url.py class OllamaCustomUrlTest (line 16) | class OllamaCustomUrlTest(BaseSimulatorTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method validate_successful_response (line 175) | def validate_successful_response(self, response: str, test_name: str, ... method _validate_ai_response_content (line 258) | def _validate_ai_response_content(self, response: str) -> bool: method _check_server_logs_for_errors (line 313) | def _check_server_logs_for_errors(self): method validate_local_model_response (line 331) | def validate_local_model_response(self, response: str) -> bool: FILE: simulator_tests/test_openrouter_fallback.py class OpenRouterFallbackTest (line 15) | class OpenRouterFallbackTest(BaseSimulatorTest): method test_name (line 19) | def test_name(self) -> str: method test_description (line 23) | def test_description(self) -> str: method run_test (line 26) | def run_test(self) -> bool: function main (line 227) | def main(): FILE: simulator_tests/test_openrouter_models.py class OpenRouterModelsTest (line 16) | class OpenRouterModelsTest(BaseSimulatorTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: function main (line 240) | def main(): FILE: simulator_tests/test_per_tool_deduplication.py class PerToolDeduplicationTest (line 19) | class PerToolDeduplicationTest(ConversationBaseTest): method test_name (line 23) | def test_name(self) -> str: method test_description (line 27) | def test_description(self) -> str: method run_test (line 32) | def run_test(self) -> bool: FILE: simulator_tests/test_planner_continuation_history.py class PlannerContinuationHistoryTest (line 18) | class PlannerContinuationHistoryTest(ConversationBaseTest): method test_name (line 22) | def test_name(self) -> str: method test_description (line 26) | def test_description(self) -> str: method run_test (line 29) | def run_test(self) -> bool: method _test_first_planning_session (line 60) | def _test_first_planning_session(self) -> bool: method _test_second_planning_session (line 135) | def _test_second_planning_session(self) -> bool: method _test_third_planning_session (line 204) | def _test_third_planning_session(self) -> bool: method _test_context_accumulation (line 278) | def _test_context_accumulation(self) -> bool: method call_mcp_tool (line 331) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_planner_continuation_id (line 344) | def _extract_planner_continuation_id(self, response_text: str) -> Opti... method _parse_planner_response (line 355) | def _parse_planner_response(self, response_text: str) -> dict: FILE: simulator_tests/test_planner_validation.py class PlannerValidationTest (line 17) | class PlannerValidationTest(ConversationBaseTest): method test_name (line 21) | def test_name(self) -> str: method test_description (line 25) | def test_description(self) -> str: method run_test (line 28) | def run_test(self) -> bool: method _test_single_planning_session (line 67) | def _test_single_planning_session(self) -> bool: method _test_planning_with_continuation (line 213) | def _test_planning_with_continuation(self) -> bool: method _test_complex_plan_deep_thinking (line 275) | def _test_complex_plan_deep_thinking(self) -> bool: method _test_self_contained_completion (line 391) | def _test_self_contained_completion(self) -> bool: method _test_branching_and_revision (line 468) | def _test_branching_and_revision(self) -> bool: method _test_workflow_file_context (line 572) | def _test_workflow_file_context(self) -> bool: method call_mcp_tool (line 636) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_planner_continuation_id (line 649) | def _extract_planner_continuation_id(self, response_text: str) -> Opti... method _parse_planner_response (line 660) | def _parse_planner_response(self, response_text: str) -> dict: method _validate_step_response (line 671) | def _validate_step_response( FILE: simulator_tests/test_planner_validation_old.py class PlannerValidationTest (line 19) | class PlannerValidationTest(ConversationBaseTest): method test_name (line 23) | def test_name(self) -> str: method test_description (line 27) | def test_description(self) -> str: method run_test (line 30) | def run_test(self) -> bool: method _test_single_planning_session (line 57) | def _test_single_planning_session(self) -> bool: method _test_plan_continuation (line 143) | def _test_plan_continuation(self) -> bool: method _test_branching_and_revision (line 215) | def _test_branching_and_revision(self) -> bool: method call_mcp_tool (line 316) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_planner_continuation_id (line 329) | def _extract_planner_continuation_id(self, response_text: str) -> Opti... method _parse_planner_response (line 340) | def _parse_planner_response(self, response_text: str) -> dict: method _validate_step_response (line 351) | def _validate_step_response( method _validate_final_step_response (line 404) | def _validate_final_step_response(self, response_data: dict, expected_... FILE: simulator_tests/test_precommitworkflow_validation.py class PrecommitWorkflowValidationTest (line 16) | class PrecommitWorkflowValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_test_git_changes (line 69) | def _create_test_git_changes(self): method _test_single_validation_session (line 171) | def _test_single_validation_session(self) -> bool: method _test_validation_refocus_flow (line 266) | def _test_validation_refocus_flow(self) -> bool: method _test_complete_validation_with_analysis (line 348) | def _test_complete_validation_with_analysis(self) -> bool: method _test_certain_confidence (line 464) | def _test_certain_confidence(self) -> bool: method call_mcp_tool (line 527) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_precommit_continuation_id (line 540) | def _extract_precommit_continuation_id(self, response_text: str) -> Op... method _parse_precommit_response (line 551) | def _parse_precommit_response(self, response_text: str) -> dict: method _validate_step_response (line 562) | def _validate_step_response( method _test_context_aware_file_embedding (line 610) | def _test_context_aware_file_embedding(self) -> bool: method _test_multi_step_file_context (line 826) | def _test_multi_step_file_context(self) -> bool: FILE: simulator_tests/test_prompt_size_limit_bug.py class PromptSizeLimitBugTest (line 25) | class PromptSizeLimitBugTest(ConversationBaseTest): method test_name (line 29) | def test_name(self) -> str: method test_description (line 33) | def test_description(self) -> str: method run_test (line 36) | def run_test(self) -> bool: function main (line 190) | def main(): FILE: simulator_tests/test_refactor_validation.py class RefactorValidationTest (line 15) | class RefactorValidationTest(ConversationBaseTest): method test_name (line 19) | def test_name(self) -> str: method test_description (line 23) | def test_description(self) -> str: method run_test (line 26) | def run_test(self) -> bool: method _create_refactoring_test_code (line 68) | def _create_refactoring_test_code(self): method _test_single_refactoring_session (line 279) | def _test_single_refactoring_session(self) -> bool: method _test_refactoring_refocus_flow (line 392) | def _test_refactoring_refocus_flow(self) -> bool: method _test_complete_refactoring_with_analysis (line 486) | def _test_complete_refactoring_with_analysis(self) -> bool: method _test_certain_confidence_complete_refactoring (line 629) | def _test_certain_confidence_complete_refactoring(self) -> bool: method _test_context_aware_refactoring_file_embedding (line 689) | def _test_context_aware_refactoring_file_embedding(self) -> bool: method _test_different_refactor_types (line 843) | def _test_different_refactor_types(self) -> bool: method call_mcp_tool (line 948) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_refactor_continuation_id (line 961) | def _extract_refactor_continuation_id(self, response_text: str) -> Opt... method _parse_refactor_response (line 972) | def _parse_refactor_response(self, response_text: str) -> dict: method _validate_refactoring_step_response (line 983) | def _validate_refactoring_step_response( FILE: simulator_tests/test_secaudit_validation.py class SecauditValidationTest (line 15) | class SecauditValidationTest(ConversationBaseTest): method test_name (line 19) | def test_name(self) -> str: method test_description (line 23) | def test_description(self) -> str: method run_test (line 26) | def run_test(self) -> bool: method _create_test_code_for_audit (line 68) | def _create_test_code_for_audit(self): method _test_single_audit_session (line 214) | def _test_single_audit_session(self) -> bool: method _test_focused_security_audit (line 290) | def _test_focused_security_audit(self) -> bool: method _test_complete_audit_with_analysis (line 333) | def _test_complete_audit_with_analysis(self) -> bool: method _test_certain_confidence (line 438) | def _test_certain_confidence(self) -> bool: method _test_continuation_with_chat (line 488) | def _test_continuation_with_chat(self) -> bool: method _test_model_selection (line 549) | def _test_model_selection(self) -> bool: FILE: simulator_tests/test_testgen_validation.py class TestGenValidationTest (line 16) | class TestGenValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_test_code_files (line 69) | def _create_test_code_files(self): method _test_single_test_generation_session (line 141) | def _test_single_test_generation_session(self) -> bool: method _test_generation_with_pattern_following (line 223) | def _test_generation_with_pattern_following(self) -> bool: method _test_complete_generation_with_analysis (line 276) | def _test_complete_generation_with_analysis(self) -> bool: method _test_certain_confidence (line 379) | def _test_certain_confidence(self) -> bool: method call_mcp_tool (line 433) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_testgen_continuation_id (line 446) | def _extract_testgen_continuation_id(self, response_text: str) -> Opti... method _parse_testgen_response (line 457) | def _parse_testgen_response(self, response_text: str) -> dict: method _validate_step_response (line 468) | def _validate_step_response( method _test_context_aware_file_embedding (line 516) | def _test_context_aware_file_embedding(self) -> bool: method _test_multi_step_test_planning (line 638) | def _test_multi_step_test_planning(self) -> bool: FILE: simulator_tests/test_thinkdeep_validation.py class ThinkDeepWorkflowValidationTest (line 16) | class ThinkDeepWorkflowValidationTest(ConversationBaseTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: method _create_thinking_context (line 69) | def _create_thinking_context(self): method _test_single_thinking_session (line 157) | def _test_single_thinking_session(self) -> bool: method _test_thinking_refocus_flow (line 246) | def _test_thinking_refocus_flow(self) -> bool: method _test_complete_thinking_with_analysis (line 331) | def _test_complete_thinking_with_analysis(self) -> bool: method _test_certain_confidence (line 451) | def _test_certain_confidence(self) -> bool: method call_mcp_tool (line 505) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple[Optiona... method _extract_thinkdeep_continuation_id (line 518) | def _extract_thinkdeep_continuation_id(self, response_text: str) -> Op... method _parse_thinkdeep_response (line 529) | def _parse_thinkdeep_response(self, response_text: str) -> dict: method _validate_step_response (line 540) | def _validate_step_response( method _test_context_aware_file_embedding (line 588) | def _test_context_aware_file_embedding(self) -> bool: method _test_multi_step_file_context (line 734) | def _test_multi_step_file_context(self) -> bool: FILE: simulator_tests/test_token_allocation_validation.py class TokenAllocationValidationTest (line 17) | class TokenAllocationValidationTest(ConversationBaseTest): method call_mcp_tool (line 20) | def call_mcp_tool(self, tool_name: str, params: dict) -> tuple: method test_name (line 26) | def test_name(self) -> str: method test_description (line 30) | def test_description(self) -> str: method run_test (line 33) | def run_test(self) -> bool: function main (line 338) | def main(): FILE: simulator_tests/test_vision_capability.py class VisionCapabilityTest (line 18) | class VisionCapabilityTest(BaseSimulatorTest): method test_name (line 22) | def test_name(self) -> str: method test_description (line 26) | def test_description(self) -> str: method get_triangle_png_path (line 29) | def get_triangle_png_path(self) -> str: method create_base64_triangle_data_url (line 42) | def create_base64_triangle_data_url(self) -> str: method run_test (line 53) | def run_test(self) -> bool: FILE: simulator_tests/test_xai_models.py class XAIModelsTest (line 16) | class XAIModelsTest(BaseSimulatorTest): method test_name (line 20) | def test_name(self) -> str: method test_description (line 24) | def test_description(self) -> str: method run_test (line 27) | def run_test(self) -> bool: function main (line 210) | def main(): FILE: tests/conftest.py function custom_provider_factory (line 64) | def custom_provider_factory(api_key=None): function project_path (line 73) | def project_path(tmp_path): function _set_dummy_keys_if_missing (line 85) | def _set_dummy_keys_if_missing(): function pytest_configure (line 93) | def pytest_configure(config): function pytest_collection_modifyitems (line 101) | def pytest_collection_modifyitems(session, config, items): function mock_provider_availability (line 109) | def mock_provider_availability(request, monkeypatch): function clear_model_restriction_env (line 179) | def clear_model_restriction_env(monkeypatch): function disable_force_env_override (line 195) | def disable_force_env_override(monkeypatch): FILE: tests/http_transport_recorder.py class RecordingTransport (line 30) | class RecordingTransport(httpx.HTTPTransport): method __init__ (line 33) | def __init__(self, cassette_path: str, capture_content: bool = True, s... method handle_request (line 40) | def handle_request(self, request: httpx.Request) -> httpx.Response: method _record_interaction (line 98) | def _record_interaction(self, request_data: dict[str, Any], response_d... method _serialize_request (line 105) | def _serialize_request(self, request: httpx.Request) -> dict[str, Any]: method _serialize_response (line 135) | def _serialize_response(self, response: httpx.Response) -> dict[str, A... method _serialize_response_with_content (line 145) | def _serialize_response_with_content(self, response: httpx.Response, c... method _sanitize_request_content (line 184) | def _sanitize_request_content(self, content: str) -> Any: method _save_cassette (line 195) | def _save_cassette(self): class ReplayTransport (line 206) | class ReplayTransport(httpx.MockTransport): method __init__ (line 209) | def __init__(self, cassette_path: str): method _load_cassette (line 214) | def _load_cassette(self) -> list: method _handle_request (line 225) | def _handle_request(self, request: httpx.Request) -> httpx.Response: method _find_matching_interaction (line 281) | def _find_matching_interaction(self, request: httpx.Request) -> Option... method _get_request_signature (line 292) | def _get_request_signature(self, request: httpx.Request) -> str: method _is_o3_model_request (line 330) | def _is_o3_model_request(self, content_dict: dict) -> bool: method _extract_semantic_fields (line 335) | def _extract_semantic_fields(self, content_dict: dict) -> dict: method _get_saved_request_signature (line 374) | def _get_saved_request_signature(self, saved_request: dict[str, Any]) ... class TransportFactory (line 394) | class TransportFactory: method create_transport (line 398) | def create_transport(cassette_path: str) -> httpx.HTTPTransport: method should_record (line 412) | def should_record(cassette_path: str, api_key: Optional[str] = None) -... method should_replay (line 420) | def should_replay(cassette_path: str) -> bool: FILE: tests/mock_helpers.py function create_mock_provider (line 8) | def create_mock_provider(model_name="gemini-2.5-flash", context_window=1... FILE: tests/pii_sanitizer.py class PIIPattern (line 21) | class PIIPattern: method create (line 30) | def create(cls, name: str, pattern: str, replacement: str, description... class PIISanitizer (line 35) | class PIISanitizer: method __init__ (line 38) | def __init__(self, patterns: Optional[list[PIIPattern]] = None): method _add_default_patterns (line 47) | def _add_default_patterns(self): method add_pattern (line 143) | def add_pattern(self, pattern: PIIPattern): method sanitize_string (line 148) | def sanitize_string(self, text: str) -> str: method sanitize_headers (line 161) | def sanitize_headers(self, headers: dict[str, str]) -> dict[str, str]: method sanitize_value (line 182) | def sanitize_value(self, value: Any) -> Any: method sanitize_url (line 199) | def sanitize_url(self, url: str) -> str: method sanitize_request (line 229) | def sanitize_request(self, request_data: dict[str, Any]) -> dict[str, ... method sanitize_response (line 247) | def sanitize_response(self, response_data: dict[str, Any]) -> dict[str... FILE: tests/sanitize_cassettes.py function sanitize_cassette (line 24) | def sanitize_cassette(cassette_path: Path, backup: bool = True) -> bool: function main (line 80) | def main(): FILE: tests/test_alias_target_restrictions.py class TestAliasTargetRestrictions (line 17) | class TestAliasTargetRestrictions: method test_openai_alias_target_validation_comprehensive (line 20) | def test_openai_alias_target_validation_comprehensive(self): method test_gemini_alias_target_validation_comprehensive (line 33) | def test_gemini_alias_target_validation_comprehensive(self): method test_restriction_policy_allows_alias_when_target_allowed (line 47) | def test_restriction_policy_allows_alias_when_target_allowed(self): method test_restriction_policy_alias_allows_canonical (line 66) | def test_restriction_policy_alias_allows_canonical(self): method test_restriction_policy_alias_allows_short_name (line 79) | def test_restriction_policy_alias_allows_short_name(self): method test_gemini_restriction_policy_allows_alias_when_target_allowed (line 91) | def test_gemini_restriction_policy_allows_alias_when_target_allowed(se... method test_gemini_restriction_policy_alias_allows_canonical (line 105) | def test_gemini_restriction_policy_alias_allows_canonical(self): method test_restriction_service_validation_includes_all_targets (line 116) | def test_restriction_service_validation_includes_all_targets(self): method test_both_alias_and_target_allowed_when_both_specified (line 137) | def test_both_alias_and_target_allowed_when_both_specified(self): method test_service_alias_allows_canonical_openai (line 157) | def test_service_alias_allows_canonical_openai(self): method test_service_alias_allows_canonical_gemini (line 169) | def test_service_alias_allows_canonical_gemini(self): method test_alias_target_policy_regression_prevention (line 180) | def test_alias_target_policy_regression_prevention(self): method test_no_duplicate_models_in_alias_aware_listing (line 217) | def test_no_duplicate_models_in_alias_aware_listing(self): method test_restriction_validation_uses_polymorphic_interface (line 232) | def test_restriction_validation_uses_polymorphic_interface(self): method test_complex_alias_chains_handled_correctly (line 259) | def test_complex_alias_chains_handled_correctly(self): method test_critical_regression_validation_sees_alias_targets (line 275) | def test_critical_regression_validation_sees_alias_targets(self): method test_critical_regression_prevents_policy_bypass (line 341) | def test_critical_regression_prevents_policy_bypass(self): FILE: tests/test_auto_mode.py class TestAutoMode (line 13) | class TestAutoMode: method test_auto_mode_detection (line 16) | def test_auto_mode_detection(self): method test_model_capabilities_descriptions (line 46) | def test_model_capabilities_descriptions(self): method test_tool_schema_in_auto_mode (line 76) | def test_tool_schema_in_auto_mode(self): method test_tool_schema_in_normal_mode (line 108) | def test_tool_schema_in_normal_mode(self): method test_auto_mode_requires_model_parameter (line 141) | async def test_auto_mode_requires_model_parameter(self, tmp_path): method test_unavailable_model_error_message (line 175) | async def test_unavailable_model_error_message(self): method test_model_field_schema_generation (line 270) | def test_model_field_schema_generation(self): FILE: tests/test_auto_mode_comprehensive.py class TestAutoModeComprehensive (line 23) | class TestAutoModeComprehensive: method setup_method (line 26) | def setup_method(self): method teardown_method (line 41) | def teardown_method(self): method test_auto_mode_model_selection_by_provider (line 146) | def test_auto_mode_model_selection_by_provider(self, provider_config, ... method test_tool_model_categories (line 198) | def test_tool_model_categories(self, tool_class, expected_category): method test_auto_mode_with_gemini_only_uses_correct_models (line 204) | async def test_auto_mode_with_gemini_only_uses_correct_models(self, tm... method test_auto_mode_schema_includes_all_available_models (line 241) | def test_auto_mode_schema_includes_all_available_models(self): method test_auto_mode_schema_with_all_providers (line 299) | def test_auto_mode_schema_with_all_providers(self): method test_auto_mode_model_parameter_required_error (line 348) | async def test_auto_mode_model_parameter_required_error(self, tmp_path): method test_model_availability_with_restrictions (line 399) | def test_model_availability_with_restrictions(self): method test_openrouter_fallback_when_no_native_apis (line 447) | def test_openrouter_fallback_when_no_native_apis(self): method test_actual_model_name_resolution_in_auto_mode (line 499) | async def test_actual_model_name_resolution_in_auto_mode(self, tmp_path): FILE: tests/test_auto_mode_custom_provider_only.py class TestAutoModeCustomProviderOnly (line 14) | class TestAutoModeCustomProviderOnly: method setup_method (line 17) | def setup_method(self): method teardown_method (line 40) | def teardown_method(self): method test_reproduce_auto_mode_custom_provider_only_issue (line 62) | def test_reproduce_auto_mode_custom_provider_only_issue(self): method test_custom_provider_models_available_via_registry (line 101) | def test_custom_provider_models_available_via_registry(self): method test_custom_provider_validate_model_name (line 140) | def test_custom_provider_validate_model_name(self): method test_auto_mode_fallback_with_custom_only_should_work (line 168) | def test_auto_mode_fallback_with_custom_only_should_work(self): FILE: tests/test_auto_mode_model_listing.py function _extract_available_models (line 20) | def _extract_available_models(message: str) -> list[str]: function reset_registry (line 40) | def reset_registry(): function _register_core_providers (line 51) | def _register_core_providers(*, include_xai: bool = False): function test_error_listing_respects_env_restrictions (line 60) | def test_error_listing_respects_env_restrictions(monkeypatch, reset_regi... function test_error_listing_without_restrictions_shows_full_catalog (line 146) | def test_error_listing_without_restrictions_shows_full_catalog(monkeypat... FILE: tests/test_auto_mode_provider_selection.py class TestAutoModeProviderSelection (line 13) | class TestAutoModeProviderSelection: method setup_method (line 16) | def setup_method(self): method teardown_method (line 28) | def teardown_method(self): method test_gemini_only_fallback_selection (line 35) | def test_gemini_only_fallback_selection(self): method test_openai_only_fallback_selection (line 74) | def test_openai_only_fallback_selection(self): method test_both_gemini_and_openai_priority (line 113) | def test_both_gemini_and_openai_priority(self): method test_xai_only_fallback_selection (line 155) | def test_xai_only_fallback_selection(self): method test_available_models_respects_restrictions (line 194) | def test_available_models_respects_restrictions(self): method test_model_validation_across_providers (line 243) | def test_model_validation_across_providers(self): method test_alias_resolution_before_api_calls (line 294) | def test_alias_resolution_before_api_calls(self): FILE: tests/test_auto_model_planner_fix.py class TestAutoModelPlannerFix (line 18) | class TestAutoModelPlannerFix: method test_planner_requires_model_false (line 21) | def test_planner_requires_model_false(self): method test_chat_requires_model_true (line 26) | def test_chat_requires_model_true(self): method test_base_tool_requires_model_default (line 31) | def test_base_tool_requires_model_default(self): method test_auto_model_error_before_fix_simulation (line 61) | def test_auto_model_error_before_fix_simulation(self, mock_get_provider): method test_planner_execution_bypasses_model_resolution (line 79) | async def test_planner_execution_bypasses_model_resolution(self): method test_server_model_resolution_logic (line 107) | def test_server_model_resolution_logic(self): method test_provider_registry_auto_handling (line 135) | def test_provider_registry_auto_handling(self): method test_end_to_end_planner_with_auto_mode (line 148) | async def test_end_to_end_planner_with_auto_mode(self): method test_other_tools_still_require_models (line 196) | def test_other_tools_still_require_models(self): FILE: tests/test_azure_openai_provider.py class _DummyResponse (line 15) | class _DummyResponse: method __init__ (line 16) | def __init__(self): function dummy_azure_client (line 34) | def dummy_azure_client(monkeypatch): function test_generate_content_uses_deployment_mapping (line 56) | def test_generate_content_uses_deployment_mapping(dummy_azure_client): function test_generate_content_accepts_deployment_alias (line 71) | def test_generate_content_accepts_deployment_alias(dummy_azure_client): function test_client_initialization_uses_endpoint_and_version (line 85) | def test_client_initialization_uses_endpoint_and_version(dummy_azure_cli... function test_deployment_overrides_capabilities (line 99) | def test_deployment_overrides_capabilities(dummy_azure_client): function test_registry_configuration_merges_capabilities (line 120) | def test_registry_configuration_merges_capabilities(dummy_azure_client, ... FILE: tests/test_buggy_behavior_prevention.py class TestBuggyBehaviorPrevention (line 20) | class TestBuggyBehaviorPrevention: method test_alias_listing_includes_targets_for_restriction_validation (line 23) | def test_alias_listing_includes_targets_for_restriction_validation(self): method test_target_models_are_recognized_during_validation (line 64) | def test_target_models_are_recognized_during_validation(self): method test_policy_enforcement_remains_comprehensive (line 95) | def test_policy_enforcement_remains_comprehensive(self): method test_alias_aware_listing_extends_canonical_view (line 132) | def test_alias_aware_listing_extends_canonical_view(self): method test_restriction_validation_uses_alias_aware_variant (line 155) | def test_restriction_validation_uses_alias_aware_variant(self): method test_alias_listing_covers_targets_for_all_providers (line 208) | def test_alias_listing_covers_targets_for_all_providers(self): method test_validation_correctly_identifies_invalid_models (line 228) | def test_validation_correctly_identifies_invalid_models(self): method test_custom_provider_alias_listing (line 258) | def test_custom_provider_alias_listing(self): method test_openrouter_provider_alias_listing (line 274) | def test_openrouter_provider_alias_listing(self): FILE: tests/test_cassette_semantic_matching.py class TestCassetteSemanticMatching (line 16) | class TestCassetteSemanticMatching: method dummy_cassette (line 20) | def dummy_cassette(self, tmp_path): method test_o3_model_semantic_matching (line 26) | def test_o3_model_semantic_matching(self, dummy_cassette): method test_non_o3_model_exact_matching (line 80) | def test_non_o3_model_exact_matching(self, dummy_cassette): method test_o3_mini_semantic_matching (line 92) | def test_o3_mini_semantic_matching(self, dummy_cassette): method test_o3_without_request_markers (line 114) | def test_o3_without_request_markers(self, dummy_cassette): FILE: tests/test_challenge.py class TestChallengeTool (line 18) | class TestChallengeTool: method setup_method (line 21) | def setup_method(self): method test_tool_metadata (line 25) | def test_tool_metadata(self): method test_requires_model (line 33) | def test_requires_model(self): method test_schema_structure (line 37) | def test_schema_structure(self): method test_request_model_validation (line 60) | def test_request_model_validation(self): method test_required_fields (line 73) | def test_required_fields(self): method test_execute_success (line 82) | async def test_execute_success(self): method test_execute_error_handling (line 110) | async def test_execute_error_handling(self): method test_wrap_prompt_for_challenge (line 121) | def test_wrap_prompt_for_challenge(self): method test_multiple_prompts (line 133) | def test_multiple_prompts(self): method test_tool_fields (line 151) | def test_tool_fields(self): method test_required_fields_list (line 160) | def test_required_fields_list(self): method test_not_used_methods (line 166) | async def test_not_used_methods(self): method test_special_characters_in_prompt (line 177) | def test_special_characters_in_prompt(self): method test_unicode_support (line 187) | async def test_unicode_support(self): FILE: tests/test_chat_codegen_integration.py function test_chat_codegen_saves_file (line 35) | async def test_chat_codegen_saves_file(monkeypatch, tmp_path): FILE: tests/test_chat_cross_model_continuation.py function _extract_number (line 44) | def _extract_number(text: str) -> str: function test_chat_cross_model_continuation (line 58) | async def test_chat_cross_model_continuation(monkeypatch, tmp_path): FILE: tests/test_chat_openai_integration.py function test_chat_auto_mode_with_openai (line 26) | async def test_chat_auto_mode_with_openai(monkeypatch, tmp_path): function test_chat_openai_continuation (line 92) | async def test_chat_openai_continuation(monkeypatch, tmp_path): FILE: tests/test_chat_simple.py class TestChatTool (line 18) | class TestChatTool: method setup_method (line 21) | def setup_method(self): method test_tool_metadata (line 25) | def test_tool_metadata(self): method test_schema_structure (line 33) | def test_schema_structure(self): method test_request_model_validation (line 53) | def test_request_model_validation(self): method test_required_fields (line 73) | def test_required_fields(self): method test_model_availability (line 81) | def test_model_availability(self): method test_model_field_schema (line 87) | def test_model_field_schema(self): method test_prompt_preparation (line 104) | async def test_prompt_preparation(self): method test_response_formatting (line 124) | def test_response_formatting(self): method test_format_response_multiple_generated_code_blocks (line 135) | def test_format_response_multiple_generated_code_blocks(self, tmp_path): method test_format_response_single_generated_code_block (line 160) | def test_format_response_single_generated_code_block(self, tmp_path): method test_format_response_ignores_unclosed_generated_code (line 183) | def test_format_response_ignores_unclosed_generated_code(self, tmp_path): method test_format_response_ignores_orphaned_closing_tag (line 198) | def test_format_response_ignores_orphaned_closing_tag(self, tmp_path): method test_format_response_preserves_narrative_after_generated_code (line 213) | def test_format_response_preserves_narrative_after_generated_code(self... method test_tool_name (line 234) | def test_tool_name(self): method test_websearch_guidance (line 238) | def test_websearch_guidance(self): method test_convenience_methods (line 247) | def test_convenience_methods(self): class TestChatRequestModel (line 262) | class TestChatRequestModel: method test_field_descriptions (line 265) | def test_field_descriptions(self): method test_working_directory_absolute_path_description_matches_behavior (line 277) | def test_working_directory_absolute_path_description_matches_behavior(... method test_working_directory_absolute_path_must_exist (line 285) | async def test_working_directory_absolute_path_must_exist(self, tmp_pa... method test_default_values (line 304) | def test_default_values(self): method test_inheritance (line 312) | def test_inheritance(self): FILE: tests/test_clink_claude_agent.py class DummyProcess (line 13) | class DummyProcess: method __init__ (line 14) | def __init__(self, *, stdout: bytes = b"", stderr: bytes = b"", return... method communicate (line 20) | async def communicate(self, input_data): function claude_agent (line 26) | def claude_agent(): function _run_agent_with_process (line 45) | async def _run_agent_with_process(monkeypatch, agent, role, process, *, ... function test_claude_agent_injects_system_prompt (line 65) | async def test_claude_agent_injects_system_prompt(monkeypatch, claude_ag... function test_claude_agent_recovers_error_payload (line 86) | async def test_claude_agent_recovers_error_payload(monkeypatch, claude_a... function test_claude_agent_propagates_unparseable_output (line 106) | async def test_claude_agent_propagates_unparseable_output(monkeypatch, c... FILE: tests/test_clink_claude_parser.py function _build_success_payload (line 11) | def _build_success_payload() -> str: function test_claude_parser_extracts_result_and_metadata (line 20) | def test_claude_parser_extracts_result_and_metadata(): function test_claude_parser_falls_back_to_message (line 32) | def test_claude_parser_falls_back_to_message(): function test_claude_parser_requires_output (line 43) | def test_claude_parser_requires_output(): function test_claude_parser_handles_array_payload_with_result_event (line 50) | def test_claude_parser_handles_array_payload_with_result_event(): FILE: tests/test_clink_codex_agent.py class DummyProcess (line 12) | class DummyProcess: method __init__ (line 13) | def __init__(self, *, stdout: bytes = b"", stderr: bytes = b"", return... method communicate (line 18) | async def communicate(self, _input): function codex_agent (line 23) | def codex_agent(): function _run_agent_with_process (line 41) | async def _run_agent_with_process(monkeypatch, agent, role, process): function test_codex_agent_recovers_jsonl (line 54) | async def test_codex_agent_recovers_jsonl(monkeypatch, codex_agent): function test_codex_agent_propagates_invalid_json (line 69) | async def test_codex_agent_propagates_invalid_json(monkeypatch, codex_ag... FILE: tests/test_clink_gemini_agent.py class DummyProcess (line 12) | class DummyProcess: method __init__ (line 13) | def __init__(self, *, stdout: bytes = b"", stderr: bytes = b"", return... method communicate (line 18) | async def communicate(self, _input): function gemini_agent (line 23) | def gemini_agent(): function _run_agent_with_process (line 41) | async def _run_agent_with_process(monkeypatch, agent, role, process): function test_gemini_agent_recovers_tool_error (line 54) | async def test_gemini_agent_recovers_tool_error(monkeypatch, gemini_agent): function test_gemini_agent_propagates_unrecoverable_error (line 75) | async def test_gemini_agent_propagates_unrecoverable_error(monkeypatch, ... FILE: tests/test_clink_gemini_parser.py function _build_rate_limit_stdout (line 8) | def _build_rate_limit_stdout() -> str: function test_gemini_parser_handles_rate_limit_empty_response (line 30) | def test_gemini_parser_handles_rate_limit_empty_response(): function test_gemini_parser_still_errors_when_no_fallback_available (line 43) | def test_gemini_parser_still_errors_when_no_fallback_available(): FILE: tests/test_clink_integration.py function test_clink_gemini_single_digit_sum (line 12) | async def test_clink_gemini_single_digit_sum(): function test_clink_claude_single_digit_sum (line 49) | async def test_clink_claude_single_digit_sum(): FILE: tests/test_clink_parsers.py function test_codex_parser_success (line 7) | def test_codex_parser_success(): function test_codex_parser_requires_agent_message (line 18) | def test_codex_parser_requires_agent_message(): FILE: tests/test_clink_tool.py function test_clink_tool_execute (line 12) | async def test_clink_tool_execute(monkeypatch): function test_registry_lists_roles (line 55) | def test_registry_lists_roles(): function test_clink_tool_defaults_to_first_cli (line 73) | async def test_clink_tool_defaults_to_first_cli(monkeypatch): function test_clink_tool_truncates_large_output (line 108) | async def test_clink_tool_truncates_large_output(monkeypatch): function test_clink_tool_truncates_without_summary (line 150) | async def test_clink_tool_truncates_without_summary(monkeypatch): FILE: tests/test_collaboration.py class TestDynamicContextRequests (line 17) | class TestDynamicContextRequests: method analyze_tool (line 21) | def analyze_tool(self): method debug_tool (line 25) | def debug_tool(self): method test_clarification_request_parsing (line 30) | async def test_clarification_request_parsing(self, mock_get_provider, ... method test_normal_response_not_parsed_as_clarification (line 86) | async def test_normal_response_not_parsed_as_clarification( method test_malformed_clarification_request_treated_as_normal (line 119) | async def test_malformed_clarification_request_treated_as_normal(self,... method test_clarification_with_suggested_action (line 159) | async def test_clarification_with_suggested_action(self, mock_get_prov... method test_tool_output_model_serialization (line 276) | def test_tool_output_model_serialization(self): method test_clarification_request_model (line 293) | def test_clarification_request_model(self): method test_error_response_format (line 307) | async def test_error_response_format(self, mock_get_provider, analyze_... class TestCollaborationWorkflow (line 344) | class TestCollaborationWorkflow: method teardown_method (line 347) | def teardown_method(self): method test_dependency_analysis_triggers_clarification (line 357) | async def test_dependency_analysis_triggers_clarification(self, mock_e... method test_multi_step_collaboration (line 423) | async def test_multi_step_collaboration(self, mock_expert_analysis, mo... FILE: tests/test_config.py class TestConfig (line 16) | class TestConfig: method test_version_info (line 19) | def test_version_info(self): method test_model_config (line 31) | def test_model_config(self): method test_temperature_defaults (line 36) | def test_temperature_defaults(self): FILE: tests/test_consensus.py class TestConsensusTool (line 13) | class TestConsensusTool: method test_tool_metadata (line 16) | def test_tool_metadata(self): method test_request_validation_step1 (line 26) | def test_request_validation_step1(self): method test_request_validation_missing_models_step1 (line 45) | def test_request_validation_missing_models_step1(self): method test_request_validation_later_steps (line 57) | def test_request_validation_later_steps(self): method test_request_validation_duplicate_model_stance (line 74) | def test_request_validation_duplicate_model_stance(self): method test_input_schema_generation (line 108) | def test_input_schema_generation(self): method test_get_required_actions (line 152) | def test_get_required_actions(self): method test_prepare_step_data (line 170) | def test_prepare_step_data(self): method test_stance_enhanced_prompt_generation (line 197) | def test_stance_enhanced_prompt_generation(self): method test_should_call_expert_analysis (line 217) | def test_should_call_expert_analysis(self): method test_execute_workflow_step1_basic (line 223) | def test_execute_workflow_step1_basic(self): method test_execute_workflow_total_steps_calculation (line 243) | def test_execute_workflow_total_steps_calculation(self): method test_consult_model_basic_structure (line 261) | def test_consult_model_basic_structure(self): method test_model_configuration_validation (line 274) | def test_model_configuration_validation(self): method test_handle_work_continuation (line 294) | def test_handle_work_continuation(self): method test_customize_workflow_response (line 317) | def test_customize_workflow_response(self): method test_consensus_with_relevant_files_model_context_fix (line 334) | async def test_consensus_with_relevant_files_model_context_fix(self): FILE: tests/test_consensus_integration.py function test_consensus_multi_model_consultations (line 36) | async def test_consensus_multi_model_consultations(monkeypatch, openai_m... function test_consensus_auto_mode_with_openrouter_and_gemini (line 201) | async def test_consensus_auto_mode_with_openrouter_and_gemini(monkeypatch): FILE: tests/test_consensus_schema.py function test_consensus_models_field_includes_available_models (line 8) | def test_consensus_models_field_includes_available_models(monkeypatch): FILE: tests/test_conversation_continuation_integration.py function test_first_response_persisted_in_conversation_history (line 8) | def test_first_response_persisted_in_conversation_history(tmp_path): FILE: tests/test_conversation_field_mapping.py function test_conversation_history_field_mapping (line 16) | async def test_conversation_history_field_mapping(): function test_unknown_tool_defaults_to_prompt (line 100) | async def test_unknown_tool_defaults_to_prompt(): function test_tool_parameter_standardization (line 142) | async def test_tool_parameter_standardization(): FILE: tests/test_conversation_file_features.py class TestConversationFileList (line 24) | class TestConversationFileList: method test_get_conversation_file_list_basic (line 27) | def test_get_conversation_file_list_basic(self): method test_get_conversation_file_list_deduplication (line 61) | def test_get_conversation_file_list_deduplication(self): class TestFileInclusionPlanning (line 98) | class TestFileInclusionPlanning: method test_plan_file_inclusion_within_budget (line 101) | def test_plan_file_inclusion_within_budget(self, project_path): method test_plan_file_inclusion_exceeds_budget (line 121) | def test_plan_file_inclusion_exceeds_budget(self, project_path): method test_plan_file_inclusion_empty_list (line 141) | def test_plan_file_inclusion_empty_list(self): method test_plan_file_inclusion_nonexistent_files (line 149) | def test_plan_file_inclusion_nonexistent_files(self): class TestConversationHistoryBuilding (line 160) | class TestConversationHistoryBuilding: method test_build_conversation_history_with_file_content (line 164) | def test_build_conversation_history_with_file_content(self, project_pa... method test_build_conversation_history_file_deduplication (line 213) | def test_build_conversation_history_file_deduplication(self, project_p... method test_build_conversation_history_empty_turns (line 260) | def test_build_conversation_history_empty_turns(self): class TestCrossToolFileContext (line 277) | class TestCrossToolFileContext: method test_cross_tool_file_context_preservation (line 281) | def test_cross_tool_file_context_preservation(self, project_path): class TestLargeConversations (line 352) | class TestLargeConversations: method test_large_conversation_with_many_files (line 356) | def test_large_conversation_with_many_files(self, project_path): class TestSmallAndNewConversations (line 418) | class TestSmallAndNewConversations: method test_empty_conversation (line 421) | def test_empty_conversation(self): method test_single_turn_conversation (line 438) | def test_single_turn_conversation(self, project_path): class TestFailureScenarios (line 477) | class TestFailureScenarios: method test_file_list_with_missing_files (line 480) | def test_file_list_with_missing_files(self): method test_conversation_with_unreadable_files (line 507) | def test_conversation_with_unreadable_files(self, project_path): FILE: tests/test_conversation_memory.py class TestConversationMemory (line 26) | class TestConversationMemory: method test_create_thread (line 30) | def test_create_thread(self, mock_storage): method test_get_thread_valid (line 47) | def test_get_thread_valid(self, mock_storage): method test_get_thread_invalid_uuid (line 73) | def test_get_thread_invalid_uuid(self, mock_storage): method test_get_thread_not_found (line 79) | def test_get_thread_not_found(self, mock_storage): method test_add_turn_success (line 89) | def test_add_turn_success(self, mock_storage): method test_add_turn_max_limit (line 115) | def test_add_turn_max_limit(self, mock_storage): method test_build_conversation_history (line 142) | def test_build_conversation_history(self, project_path): method test_build_conversation_history_empty (line 221) | def test_build_conversation_history_empty(self): class TestConversationFlow (line 239) | class TestConversationFlow: method test_complete_conversation_cycle (line 243) | def test_complete_conversation_cycle(self, mock_storage): method test_invalid_continuation_id_error (line 347) | def test_invalid_continuation_id_error(self, mock_storage): method test_dynamic_max_turns_configuration (line 371) | def test_dynamic_max_turns_configuration(self): method test_follow_up_instructions_dynamic_behavior (line 404) | def test_follow_up_instructions_dynamic_behavior(self): method test_follow_up_instructions_defaults_to_config (line 438) | def test_follow_up_instructions_defaults_to_config(self): method test_complete_conversation_with_dynamic_turns (line 445) | def test_complete_conversation_with_dynamic_turns(self, mock_storage): method test_conversation_with_files_and_context_preservation (line 502) | def test_conversation_with_files_and_context_preservation(self, mock_s... method test_stateless_request_isolation (line 667) | def test_stateless_request_isolation(self, mock_storage): method test_token_limit_optimization_in_conversation_history (line 712) | def test_token_limit_optimization_in_conversation_history(self): FILE: tests/test_conversation_missing_files.py class TestConversationMissingFiles (line 17) | class TestConversationMissingFiles: method test_build_conversation_history_handles_missing_files (line 20) | def test_build_conversation_history_handles_missing_files(self): FILE: tests/test_custom_openai_temperature_fix.py class TestCustomOpenAITemperatureParameterFix (line 17) | class TestCustomOpenAITemperatureParameterFix: method _create_test_config (line 20) | def _create_test_config(self, models_config: list[dict]) -> str: method test_custom_openai_models_exclude_temperature_from_api_call (line 31) | def test_custom_openai_models_exclude_temperature_from_api_call(self, ... method test_custom_openai_models_include_temperature_when_supported (line 139) | def test_custom_openai_models_include_temperature_when_supported(self,... method test_custom_openai_model_validation (line 217) | def test_custom_openai_model_validation(self, mock_restriction_service): method test_fallback_to_builtin_models_when_registry_fails (line 263) | def test_fallback_to_builtin_models_when_registry_fails(self, mock_res... FILE: tests/test_custom_provider.py class TestCustomProvider (line 13) | class TestCustomProvider: method test_provider_initialization_with_params (line 16) | def test_provider_initialization_with_params(self): method test_provider_initialization_with_env_vars (line 24) | def test_provider_initialization_with_env_vars(self): method test_provider_initialization_missing_url (line 32) | def test_provider_initialization_missing_url(self): method test_validate_model_names_always_true (line 38) | def test_validate_model_names_always_true(self): method test_get_capabilities_from_registry (line 50) | def test_get_capabilities_from_registry(self): method test_get_capabilities_generic_fallback (line 77) | def test_get_capabilities_generic_fallback(self): method test_model_alias_resolution (line 85) | def test_model_alias_resolution(self): method test_no_thinking_mode_support (line 98) | def test_no_thinking_mode_support(self): method test_generate_content_with_alias_resolution (line 110) | def test_generate_content_with_alias_resolution(self, mock_generate): class TestCustomProviderRegistration (line 132) | class TestCustomProviderRegistration: method setup_method (line 135) | def setup_method(self): method teardown_method (line 140) | def teardown_method(self): method test_custom_provider_factory_registration (line 145) | def test_custom_provider_factory_registration(self): method test_dual_provider_setup (line 163) | def test_dual_provider_setup(self): method test_provider_priority_selection (line 197) | def test_provider_priority_selection(self): class TestConfigureProvidersFunction (line 223) | class TestConfigureProvidersFunction: method setup_method (line 226) | def setup_method(self): method teardown_method (line 235) | def teardown_method(self): method test_configure_providers_custom_only (line 243) | def test_configure_providers_custom_only(self): method test_configure_providers_openrouter_only (line 266) | def test_configure_providers_openrouter_only(self): method test_configure_providers_dual_setup (line 288) | def test_configure_providers_dual_setup(self): method test_configure_providers_no_valid_keys (line 311) | def test_configure_providers_no_valid_keys(self): FILE: tests/test_debug.py class TestDebugTool (line 9) | class TestDebugTool: method test_tool_metadata (line 12) | def test_tool_metadata(self): method test_request_validation (line 22) | def test_request_validation(self): method test_input_schema_generation (line 42) | def test_input_schema_generation(self): method test_model_category_for_debugging (line 61) | def test_model_category_for_debugging(self): method test_relevant_context_handling (line 66) | def test_relevant_context_handling(self): FILE: tests/test_deploy_scripts.py class TestDeploymentScripts (line 12) | class TestDeploymentScripts: method setup (line 16) | def setup(self): method test_deployment_scripts_exist (line 21) | def test_deployment_scripts_exist(self): method test_bash_scripts_executable (line 29) | def test_bash_scripts_executable(self): method test_powershell_scripts_format (line 40) | def test_powershell_scripts_format(self): method test_deploy_script_docker_commands (line 62) | def test_deploy_script_docker_commands(self, mock_run): method test_build_script_functionality (line 75) | def test_build_script_functionality(self): method test_deploy_script_health_check_integration (line 87) | def test_deploy_script_health_check_integration(self): method test_script_error_handling (line 104) | def test_script_error_handling(self): method test_docker_compose_commands (line 127) | def test_docker_compose_commands(self, mock_run): method test_script_parameter_handling (line 143) | def test_script_parameter_handling(self): method test_environment_preparation (line 157) | def test_environment_preparation(self): class TestHealthCheckScript (line 175) | class TestHealthCheckScript: method setup (line 179) | def setup(self): method test_healthcheck_script_syntax (line 184) | def test_healthcheck_script_syntax(self): method test_healthcheck_functions_exist (line 197) | def test_healthcheck_functions_exist(self): method test_healthcheck_process_check (line 211) | def test_healthcheck_process_check(self, mock_run): method test_healthcheck_import_validation (line 222) | def test_healthcheck_import_validation(self): method test_healthcheck_exit_codes (line 233) | def test_healthcheck_exit_codes(self): class TestScriptIntegration (line 253) | class TestScriptIntegration: method test_scripts_work_with_compose_file (line 256) | def test_scripts_work_with_compose_file(self): method test_cross_platform_compatibility (line 277) | def test_cross_platform_compatibility(self): method test_script_logging_integration (line 295) | def test_script_logging_integration(self): FILE: tests/test_dial_provider.py class TestDIALProvider (line 12) | class TestDIALProvider: method test_initialization_with_host (line 16) | def test_initialization_with_host(self): method test_initialization_default_host (line 25) | def test_initialization_default_host(self): method test_initialization_host_normalization (line 32) | def test_initialization_host_normalization(self): method test_model_validation (line 44) | def test_model_validation(self): method test_resolve_model_name (line 59) | def test_resolve_model_name(self): method test_get_capabilities (line 80) | def test_get_capabilities(self): method test_get_capabilities_invalid_model (line 120) | def test_get_capabilities_invalid_model(self): method test_get_capabilities_restricted_model (line 128) | def test_get_capabilities_restricted_model(self, mock_get_restriction): method test_supports_vision (line 142) | def test_supports_vision(self): method test_generate_content_with_alias (line 155) | def test_generate_content_with_alias(self, mock_openai_class): method test_provider_type (line 190) | def test_provider_type(self): method test_friendly_name (line 195) | def test_friendly_name(self): method test_configurable_api_version (line 201) | def test_configurable_api_version(self): method test_default_api_version (line 207) | def test_default_api_version(self): method test_allowed_models_restriction (line 223) | def test_allowed_models_restriction(self): method test_close_method (line 240) | def test_close_method(self, mock_openai_class, mock_httpx_client_class): FILE: tests/test_directory_expansion_tracking.py class TestDirectoryExpansionTracking (line 21) | class TestDirectoryExpansionTracking: method tool (line 25) | def tool(self): method temp_directory_with_files (line 29) | def temp_directory_with_files(self, project_path): method test_directory_expansion_tracked_in_conversation_memory (line 78) | async def test_directory_expansion_tracked_in_conversation_memory( method test_conversation_continuation_with_directory_files (line 127) | async def test_conversation_continuation_with_directory_files( method test_get_conversation_embedded_files_with_expanded_files (line 202) | def test_get_conversation_embedded_files_with_expanded_files(self, moc... method test_file_filtering_with_mixed_files_and_directories (line 243) | def test_file_filtering_with_mixed_files_and_directories(self, mock_st... method test_actually_processed_files_stored_correctly (line 290) | async def test_actually_processed_files_stored_correctly(self, mock_ge... FILE: tests/test_disabled_tools.py class MockTool (line 17) | class MockTool: method __init__ (line 18) | def __init__(self, name): class TestDisabledTools (line 22) | class TestDisabledTools: method test_parse_disabled_tools_empty (line 25) | def test_parse_disabled_tools_empty(self): method test_parse_disabled_tools_not_set (line 30) | def test_parse_disabled_tools_not_set(self): method test_parse_disabled_tools_single (line 38) | def test_parse_disabled_tools_single(self): method test_parse_disabled_tools_multiple (line 43) | def test_parse_disabled_tools_multiple(self): method test_parse_disabled_tools_extra_spaces (line 48) | def test_parse_disabled_tools_extra_spaces(self): method test_parse_disabled_tools_duplicates (line 53) | def test_parse_disabled_tools_duplicates(self): method test_tool_filtering_logic (line 58) | def test_tool_filtering_logic(self): method test_unknown_tools_warning (line 95) | def test_unknown_tools_warning(self, caplog): method test_essential_tools_warning (line 110) | def test_essential_tools_warning(self, caplog): method test_parse_disabled_tools_parametrized (line 137) | def test_parse_disabled_tools_parametrized(self, env_value, expected): FILE: tests/test_docker_claude_desktop_integration.py class TestDockerClaudeDesktopIntegration (line 13) | class TestDockerClaudeDesktopIntegration: method setup (line 17) | def setup(self): method test_mcp_config_docker_run_format (line 21) | def test_mcp_config_docker_run_format(self): method test_mcp_config_docker_compose_format (line 52) | def test_mcp_config_docker_compose_format(self): method test_mcp_config_environment_variables (line 72) | def test_mcp_config_environment_variables(self): method test_windows_path_format (line 102) | def test_windows_path_format(self): method test_mcp_config_validation (line 131) | def test_mcp_config_validation(self): method test_mcp_stdio_communication (line 143) | def test_mcp_stdio_communication(self): method test_docker_image_reference (line 168) | def test_docker_image_reference(self): method temp_mcp_config (line 184) | def temp_mcp_config(self): method test_mcp_config_file_parsing (line 202) | def test_mcp_config_file_parsing(self, temp_mcp_config): method test_environment_file_integration (line 211) | def test_environment_file_integration(self): method test_docker_volume_mount_paths (line 231) | def test_docker_volume_mount_paths(self): class TestDockerMCPErrorHandling (line 249) | class TestDockerMCPErrorHandling: method test_missing_docker_image_handling (line 252) | def test_missing_docker_image_handling(self): method test_invalid_env_file_path (line 263) | def test_invalid_env_file_path(self): method test_docker_permission_issues (line 278) | def test_docker_permission_issues(self): method test_resource_limit_configurations (line 293) | def test_resource_limit_configurations(self): FILE: tests/test_docker_config_complete.py class TestDockerMCPConfiguration (line 12) | class TestDockerMCPConfiguration: method test_dockerfile_configuration (line 15) | def test_dockerfile_configuration(self): method test_environment_file_template (line 40) | def test_environment_file_template(self): method test_logs_directory_setup (line 59) | def test_logs_directory_setup(self): class TestDockerCommandValidation (line 77) | class TestDockerCommandValidation: method test_docker_build_command (line 81) | def test_docker_build_command(self, mock_run): method test_docker_run_mcp_command (line 94) | def test_docker_run_mcp_command(self, mock_run): method test_docker_command_structure (line 118) | def test_docker_command_structure(self): class TestIntegrationChecks (line 145) | class TestIntegrationChecks: method test_complete_setup_checklist (line 148) | def test_complete_setup_checklist(self): method test_mcp_integration_readiness (line 171) | def test_mcp_integration_readiness(self): class TestErrorHandling (line 193) | class TestErrorHandling: method test_missing_api_key_handling (line 196) | def test_missing_api_key_handling(self): method test_docker_not_available_handling (line 212) | def test_docker_not_available_handling(self): FILE: tests/test_docker_healthcheck.py class TestDockerHealthCheck (line 13) | class TestDockerHealthCheck: method setup (line 17) | def setup(self): method test_healthcheck_script_exists (line 22) | def test_healthcheck_script_exists(self): method test_healthcheck_script_executable (line 26) | def test_healthcheck_script_executable(self): method test_process_check_success (line 36) | def test_process_check_success(self, mock_run): method test_process_check_failure (line 49) | def test_process_check_failure(self, mock_run): method test_critical_modules_import (line 59) | def test_critical_modules_import(self): method test_optional_modules_graceful_failure (line 69) | def test_optional_modules_graceful_failure(self): method test_log_directory_check (line 80) | def test_log_directory_check(self): method test_health_check_timeout_handling (line 88) | def test_health_check_timeout_handling(self): method test_health_check_docker_configuration (line 99) | def test_health_check_docker_configuration(self): class TestDockerHealthCheckIntegration (line 113) | class TestDockerHealthCheckIntegration: method test_dockerfile_health_check_setup (line 116) | def test_dockerfile_health_check_setup(self): method test_health_check_failure_scenarios (line 129) | def test_health_check_failure_scenarios(self): method test_health_check_recovery (line 142) | def test_health_check_recovery(self): method test_health_check_with_missing_env_vars (line 154) | def test_health_check_with_missing_env_vars(self): method test_health_check_performance (line 165) | def test_health_check_performance(self): FILE: tests/test_docker_implementation.py class TestDockerConfiguration (line 26) | class TestDockerConfiguration: method setup_method (line 29) | def setup_method(self): method test_dockerfile_exists (line 35) | def test_dockerfile_exists(self): method test_docker_compose_configuration (line 47) | def test_docker_compose_configuration(self): method test_environment_file_template (line 57) | def test_environment_file_template(self): class TestDockerCommands (line 68) | class TestDockerCommands: method setup_method (line 71) | def setup_method(self): method test_docker_build_command (line 76) | def test_docker_build_command(self, mock_run): method test_docker_run_command_structure (line 89) | def test_docker_run_command_structure(self, mock_run): method test_docker_health_check (line 117) | def test_docker_health_check(self, mock_run): class TestEnvironmentValidation (line 132) | class TestEnvironmentValidation: method test_required_api_keys_validation (line 135) | def test_required_api_keys_validation(self): method test_environment_file_parsing (line 149) | def test_environment_file_parsing(self): class TestMCPIntegration (line 182) | class TestMCPIntegration: method test_mcp_configuration_generation (line 185) | def test_mcp_configuration_generation(self): method test_stdio_communication_structure (line 217) | def test_stdio_communication_structure(self): class TestDockerSecurity (line 231) | class TestDockerSecurity: method test_non_root_user_configuration (line 234) | def test_non_root_user_configuration(self): method test_readonly_filesystem_configuration (line 243) | def test_readonly_filesystem_configuration(self): method test_environment_variable_security (line 258) | def test_environment_variable_security(self): class TestDockerPerformance (line 272) | class TestDockerPerformance: method test_image_size_optimization (line 275) | def test_image_size_optimization(self): method test_startup_time_expectations (line 289) | def test_startup_time_expectations(self): function temp_project_dir (line 303) | def temp_project_dir(): class TestIntegration (line 324) | class TestIntegration: method test_complete_docker_setup_validation (line 327) | def test_complete_docker_setup_validation(self, temp_project_dir): FILE: tests/test_docker_mcp_validation.py class TestDockerMCPValidation (line 19) | class TestDockerMCPValidation: method setup (line 23) | def setup(self): method test_dockerfile_exists_and_valid (line 28) | def test_dockerfile_exists_and_valid(self): method test_docker_command_validation (line 37) | def test_docker_command_validation(self, mock_run): method test_environment_variables_validation (line 47) | def test_environment_variables_validation(self): method test_docker_security_configuration (line 61) | def test_docker_security_configuration(self): class TestDockerIntegration (line 79) | class TestDockerIntegration: method temp_env_file (line 83) | def temp_env_file(self): method test_env_file_parsing (line 97) | def test_env_file_parsing(self, temp_env_file): method test_mcp_message_structure (line 112) | def test_mcp_message_structure(self): class TestDockerPerformance (line 125) | class TestDockerPerformance: method test_image_size_expectation (line 128) | def test_image_size_expectation(self): method test_startup_performance (line 138) | def test_startup_performance(self): class TestFullIntegration (line 147) | class TestFullIntegration: method test_complete_setup_simulation (line 150) | def test_complete_setup_simulation(self): method test_docker_mcp_workflow (line 164) | def test_docker_mcp_workflow(self): FILE: tests/test_docker_security.py class TestDockerSecurity (line 12) | class TestDockerSecurity: method setup (line 16) | def setup(self): method test_non_root_user_configuration (line 22) | def test_non_root_user_configuration(self): method test_no_unnecessary_privileges (line 34) | def test_no_unnecessary_privileges(self): method test_read_only_filesystem (line 47) | def test_read_only_filesystem(self): method test_environment_variable_security (line 58) | def test_environment_variable_security(self): method test_network_security (line 81) | def test_network_security(self): method test_volume_security (line 94) | def test_volume_security(self): method test_secret_management (line 107) | def test_secret_management(self): method test_container_capabilities (line 117) | def test_container_capabilities(self): class TestDockerSecretsHandling (line 135) | class TestDockerSecretsHandling: method test_env_file_not_in_image (line 138) | def test_env_file_not_in_image(self): method test_dockerignore_for_sensitive_files (line 149) | def test_dockerignore_for_sensitive_files(self): method test_no_default_api_keys (line 167) | def test_no_default_api_keys(self): method test_api_key_format_validation (line 175) | def test_api_key_format_validation(self): class TestDockerComplianceChecks (line 192) | class TestDockerComplianceChecks: method test_dockerfile_best_practices (line 195) | def test_dockerfile_best_practices(self): method test_container_security_context (line 218) | def test_container_security_context(self): FILE: tests/test_docker_volume_persistence.py class TestDockerVolumePersistence (line 14) | class TestDockerVolumePersistence: method setup (line 18) | def setup(self): method test_docker_compose_volumes_configuration (line 23) | def test_docker_compose_volumes_configuration(self): method test_persistent_volume_creation (line 38) | def test_persistent_volume_creation(self): method test_configuration_persistence_between_runs (line 54) | def test_configuration_persistence_between_runs(self): method test_log_persistence_configuration (line 71) | def test_log_persistence_configuration(self): method test_volume_backup_restore_capability (line 79) | def test_volume_backup_restore_capability(self): method test_volume_permissions (line 104) | def test_volume_permissions(self): class TestDockerVolumeIntegration (line 123) | class TestDockerVolumeIntegration: method test_mcp_config_persistence (line 126) | def test_mcp_config_persistence(self): method test_docker_compose_run_volume_usage (line 137) | def test_docker_compose_run_volume_usage(self): method test_volume_data_isolation (line 149) | def test_volume_data_isolation(self): FILE: tests/test_file_protection.py class TestMCPDirectoryDetection (line 19) | class TestMCPDirectoryDetection: method test_detect_mcp_directory_dynamically (line 22) | def test_detect_mcp_directory_dynamically(self, tmp_path): method test_no_detection_on_non_mcp_directory (line 40) | def test_no_detection_on_non_mcp_directory(self, tmp_path): method test_no_detection_on_regular_directory (line 48) | def test_no_detection_on_regular_directory(self, tmp_path): method test_no_detection_on_file (line 57) | def test_no_detection_on_file(self, tmp_path): method test_mcp_directory_excluded_from_scan (line 64) | def test_mcp_directory_excluded_from_scan(self, tmp_path): class TestHomeDirectoryProtection (line 100) | class TestHomeDirectoryProtection: method test_detect_exact_home_directory (line 103) | def test_detect_exact_home_directory(self): method test_allow_home_subdirectories (line 111) | def test_allow_home_subdirectories(self): method test_detect_home_patterns_macos (line 119) | def test_detect_home_patterns_macos(self): method test_detect_home_patterns_linux (line 127) | def test_detect_home_patterns_linux(self): method test_detect_home_patterns_windows (line 134) | def test_detect_home_patterns_windows(self): method test_home_directory_excluded_from_scan (line 141) | def test_home_directory_excluded_from_scan(self, tmp_path): class TestUserHomeEnvironmentVariable (line 151) | class TestUserHomeEnvironmentVariable: method test_user_home_from_pathlib (line 154) | def test_user_home_from_pathlib(self): method test_get_home_directory_uses_pathlib (line 161) | def test_get_home_directory_uses_pathlib(self): method test_home_directory_on_different_platforms (line 170) | def test_home_directory_on_different_platforms(self): class TestExcludedDirectories (line 186) | class TestExcludedDirectories: method test_excluded_dirs_not_scanned (line 189) | def test_excluded_dirs_not_scanned(self, tmp_path): method test_new_excluded_directories (line 224) | def test_new_excluded_directories(self, tmp_path): class TestIntegrationScenarios (line 246) | class TestIntegrationScenarios: method test_project_with_mcp_clone_inside (line 249) | def test_project_with_mcp_clone_inside(self, tmp_path): method test_security_without_workspace_root (line 300) | def test_security_without_workspace_root(self, tmp_path): FILE: tests/test_gemini_token_usage.py class TestGeminiTokenUsage (line 9) | class TestGeminiTokenUsage(unittest.TestCase): method setUp (line 12) | def setUp(self): method test_extract_usage_with_valid_tokens (line 16) | def test_extract_usage_with_valid_tokens(self): method test_extract_usage_with_none_input_tokens (line 29) | def test_extract_usage_with_none_input_tokens(self): method test_extract_usage_with_none_output_tokens (line 44) | def test_extract_usage_with_none_output_tokens(self): method test_extract_usage_with_both_none_tokens (line 59) | def test_extract_usage_with_both_none_tokens(self): method test_extract_usage_without_usage_metadata (line 71) | def test_extract_usage_without_usage_metadata(self): method test_extract_usage_with_zero_tokens (line 80) | def test_extract_usage_with_zero_tokens(self): method test_extract_usage_missing_attributes (line 93) | def test_extract_usage_missing_attributes(self): FILE: tests/test_image_support_integration.py class TestImageSupportIntegration (line 33) | class TestImageSupportIntegration: method test_conversation_turn_includes_images (line 36) | def test_conversation_turn_includes_images(self): method test_get_conversation_image_list_newest_first (line 51) | def test_get_conversation_image_list_newest_first(self): method test_add_turn_with_images (line 86) | def test_add_turn_with_images(self, mock_storage): method test_chat_tool_schema_includes_images (line 148) | def test_chat_tool_schema_includes_images(self): method test_debug_tool_schema_includes_images (line 159) | def test_debug_tool_schema_includes_images(self): method test_tool_image_validation_limits (line 170) | def test_tool_image_validation_limits(self): method test_image_validation_model_specific_limits (line 204) | def test_image_validation_model_specific_limits(self): method test_chat_tool_execution_with_images (line 242) | async def test_chat_tool_execution_with_images(self): method test_cross_tool_image_context_preservation (line 318) | def test_cross_tool_image_context_preservation(self, mock_storage): method test_tool_request_base_class_has_images (line 410) | def test_tool_request_base_class_has_images(self): method test_data_url_image_format_support (line 422) | def test_data_url_image_format_support(self): method test_empty_images_handling (line 443) | def test_empty_images_handling(self): method test_conversation_memory_thread_chaining_with_images (line 456) | def test_conversation_memory_thread_chaining_with_images(self, mock_st... FILE: tests/test_image_validation.py class TestImageValidation (line 13) | class TestImageValidation: method test_validate_data_url_valid (line 16) | def test_validate_data_url_valid(self) -> None: method test_validate_data_url_invalid_format (line 37) | def test_validate_data_url_invalid_format(self, invalid_url: str, expe... method test_non_data_url_treated_as_file_path (line 43) | def test_non_data_url_treated_as_file_path(self) -> None: method test_validate_data_url_unsupported_type (line 50) | def test_validate_data_url_unsupported_type(self) -> None: method test_validate_data_url_invalid_base64 (line 58) | def test_validate_data_url_invalid_base64(self) -> None: method test_validate_large_data_url (line 66) | def test_validate_large_data_url(self) -> None: method test_validate_file_path_valid (line 87) | def test_validate_file_path_valid(self) -> None: method test_validate_file_path_not_found (line 106) | def test_validate_file_path_not_found(self) -> None: method test_validate_file_path_unsupported_extension (line 112) | def test_validate_file_path_unsupported_extension(self) -> None: method test_validate_file_path_read_error (line 125) | def test_validate_file_path_read_error(self) -> None: method test_validate_image_size_limit (line 137) | def test_validate_image_size_limit(self) -> None: method test_validate_image_custom_size_limit (line 153) | def test_validate_image_custom_size_limit(self) -> None: method test_validate_image_default_size_limit (line 175) | def test_validate_image_default_size_limit(self) -> None: method test_validate_all_supported_formats (line 197) | def test_validate_all_supported_formats(self) -> None: class TestProviderIntegration (line 220) | class TestProviderIntegration: method test_gemini_provider_uses_validation (line 224) | def test_gemini_provider_uses_validation(self, mock_logger: Mock) -> N... method test_openai_compatible_provider_uses_validation (line 237) | def test_openai_compatible_provider_uses_validation(self, mock_logging... method test_data_url_preservation (line 249) | def test_data_url_preservation(self) -> None: FILE: tests/test_integration_utf8.py function run_utf8_integration_tests (line 16) | def run_utf8_integration_tests(): function test_utf8_json_encoding (line 50) | def test_utf8_json_encoding(): function test_language_instruction_generation (line 124) | def test_language_instruction_generation(): function test_file_utf8_handling (line 161) | def test_file_utf8_handling(): function test_mcp_tools_integration (line 278) | def test_mcp_tools_integration(): function run_unit_tests (line 409) | def run_unit_tests(): function main (line 460) | def main(): FILE: tests/test_intelligent_fallback.py class TestIntelligentFallback (line 16) | class TestIntelligentFallback: method setup_method (line 19) | def setup_method(self): method teardown_method (line 29) | def teardown_method(self): method test_prefers_openai_o3_mini_when_available (line 39) | def test_prefers_openai_o3_mini_when_available(self): method test_prefers_gemini_flash_when_openai_unavailable (line 50) | def test_prefers_gemini_flash_when_openai_unavailable(self): method test_prefers_openai_when_both_available (line 61) | def test_prefers_openai_when_both_available(self): method test_fallback_when_no_keys_available (line 74) | def test_fallback_when_no_keys_available(self): method test_available_providers_with_keys (line 86) | def test_available_providers_with_keys(self): method test_auto_mode_conversation_memory_integration (line 111) | def test_auto_mode_conversation_memory_integration(self): method test_auto_mode_with_gemini_only (line 153) | def test_auto_mode_with_gemini_only(self): method test_non_auto_mode_unchanged (line 192) | def test_non_auto_mode_unchanged(self): FILE: tests/test_issue_245_simple.py function test_issue_245_custom_openai_temperature_ignored (line 12) | def test_issue_245_custom_openai_temperature_ignored(): FILE: tests/test_large_prompt_handling.py class TestLargePromptHandling (line 25) | class TestLargePromptHandling: method teardown_method (line 28) | def teardown_method(self): method large_prompt (line 36) | def large_prompt(self): method normal_prompt (line 41) | def normal_prompt(self): method temp_prompt_file (line 46) | def temp_prompt_file(self, large_prompt): method test_chat_large_prompt_detection (line 56) | async def test_chat_large_prompt_detection(self, large_prompt): method test_chat_normal_prompt_works (line 75) | async def test_chat_normal_prompt_works(self, normal_prompt): method test_chat_prompt_file_handling (line 100) | async def test_chat_prompt_file_handling(self): method test_codereview_large_focus (line 136) | async def test_codereview_large_focus(self, large_prompt): method test_multiple_files_with_prompt_txt (line 256) | async def test_multiple_files_with_prompt_txt(self, temp_prompt_file): method test_boundary_case_exactly_at_limit (line 318) | async def test_boundary_case_exactly_at_limit(self): method test_boundary_case_just_over_limit (line 350) | async def test_boundary_case_just_over_limit(self): method test_empty_prompt_no_file (line 368) | async def test_empty_prompt_no_file(self): method test_prompt_file_read_error (line 397) | async def test_prompt_file_read_error(self): method test_large_file_context_does_not_trigger_mcp_prompt_limit (line 443) | async def test_large_file_context_does_not_trigger_mcp_prompt_limit(se... method test_mcp_boundary_with_large_internal_context (line 493) | async def test_mcp_boundary_with_large_internal_context(self): method test_mcp_boundary_vs_internal_processing_distinction (line 563) | async def test_mcp_boundary_vs_internal_processing_distinction(self): method test_continuation_with_huge_conversation_history (line 610) | async def test_continuation_with_huge_conversation_history(self): FILE: tests/test_line_numbers_integration.py class TestLineNumbersIntegration (line 14) | class TestLineNumbersIntegration: method test_all_tools_want_line_numbers (line 17) | def test_all_tools_want_line_numbers(self): method test_no_tools_override_line_numbers (line 32) | def test_no_tools_override_line_numbers(self): FILE: tests/test_listmodels.py class TestListModelsTool (line 13) | class TestListModelsTool: method tool (line 17) | def tool(self): method test_tool_metadata (line 21) | def test_tool_metadata(self, tool): method test_execute_with_no_providers (line 28) | async def test_execute_with_no_providers(self, tool): method test_execute_with_gemini_configured (line 56) | async def test_execute_with_gemini_configured(self, tool): method test_execute_with_multiple_providers (line 77) | async def test_execute_with_multiple_providers(self, tool): method test_execute_with_openrouter (line 105) | async def test_execute_with_openrouter(self, tool): method test_execute_with_custom_api (line 123) | async def test_execute_with_custom_api(self, tool): method test_output_includes_usage_tips (line 139) | async def test_output_includes_usage_tips(self, tool): method test_model_category (line 151) | def test_model_category(self, tool): FILE: tests/test_listmodels_restrictions.py class TestListModelsRestrictions (line 14) | class TestListModelsRestrictions(unittest.TestCase): method setUp (line 17) | def setUp(self): method tearDown (line 84) | def tearDown(self): method test_listmodels_respects_openrouter_restrictions (line 103) | def test_listmodels_respects_openrouter_restrictions( method test_listmodels_shows_all_models_without_restrictions (line 244) | def test_listmodels_shows_all_models_without_restrictions(self, mock_g... FILE: tests/test_mcp_error_handling.py function _install_dummy_provider (line 11) | def _install_dummy_provider(monkeypatch): function test_tool_execution_error_sets_is_error_flag_for_mcp_response (line 40) | async def test_tool_execution_error_sets_is_error_flag_for_mcp_response(... FILE: tests/test_model_enumeration.py class TestModelEnumeration (line 19) | class TestModelEnumeration: method setup_method (line 22) | def setup_method(self): method teardown_method (line 37) | def teardown_method(self): method _setup_environment (line 54) | def _setup_environment(self, provider_config): method test_no_models_when_no_providers_configured (line 78) | def test_no_models_when_no_providers_configured(self): method test_openrouter_models_without_api_key (line 99) | def test_openrouter_models_without_api_key(self): method test_custom_models_without_custom_url (line 112) | def test_custom_models_without_custom_url(self): method test_custom_models_not_exposed_with_openrouter_only (line 125) | def test_custom_models_not_exposed_with_openrouter_only(self): method test_no_duplicates_with_overlapping_providers (line 135) | def test_no_duplicates_with_overlapping_providers(self): method test_specific_native_models_only_with_api_keys (line 167) | def test_specific_native_models_only_with_api_keys(self, model_name, s... method test_openrouter_free_model_aliases_available (line 179) | def test_openrouter_free_model_aliases_available(self, tmp_path, monke... FILE: tests/test_model_metadata_continuation.py class TestModelMetadataContinuation (line 20) | class TestModelMetadataContinuation: method test_model_preserved_from_previous_turn (line 24) | async def test_model_preserved_from_previous_turn(self): method test_reconstruct_thread_context_preserves_model (line 62) | async def test_reconstruct_thread_context_preserves_model(self): method test_multiple_turns_uses_last_assistant_model (line 90) | async def test_multiple_turns_uses_last_assistant_model(self): method test_no_previous_assistant_turn_defaults (line 122) | async def test_no_previous_assistant_turn_defaults(self): method test_explicit_model_overrides_previous_turn (line 179) | async def test_explicit_model_overrides_previous_turn(self): method test_thread_chain_model_preservation (line 206) | async def test_thread_chain_model_preservation(self): FILE: tests/test_model_resolution_bug.py class TestModelResolutionBug (line 17) | class TestModelResolutionBug: method setup_method (line 20) | def setup_method(self): method test_openrouter_registry_resolves_gemini_alias (line 24) | def test_openrouter_registry_resolves_gemini_alias(self): method test_consensus_tool_model_resolution_bug_reproduction (line 47) | def test_consensus_tool_model_resolution_bug_reproduction(self): method test_bug_reproduction_with_malformed_model_name (line 98) | def test_bug_reproduction_with_malformed_model_name(self): FILE: tests/test_model_restrictions.py class TestModelRestrictionService (line 14) | class TestModelRestrictionService: method test_no_restrictions_by_default (line 17) | def test_no_restrictions_by_default(self): method test_load_single_model_restriction (line 35) | def test_load_single_model_restriction(self): method test_load_multiple_models_restriction (line 49) | def test_load_multiple_models_restriction(self): method test_case_insensitive_and_whitespace_handling (line 79) | def test_case_insensitive_and_whitespace_handling(self): method test_empty_string_allows_all (line 90) | def test_empty_string_allows_all(self): method test_filter_models (line 106) | def test_filter_models(self): method test_get_allowed_models (line 116) | def test_get_allowed_models(self): method test_shorthand_names_in_restrictions (line 127) | def test_shorthand_names_in_restrictions(self): method test_validation_against_known_models (line 152) | def test_validation_against_known_models(self, caplog): method test_openrouter_model_restrictions (line 173) | def test_openrouter_model_restrictions(self): method test_openrouter_filter_models (line 195) | def test_openrouter_filter_models(self): method test_combined_provider_restrictions (line 205) | def test_combined_provider_restrictions(self): class TestProviderIntegration (line 236) | class TestProviderIntegration: method test_openai_provider_respects_restrictions (line 240) | def test_openai_provider_respects_restrictions(self): method test_gemini_provider_respects_restrictions (line 261) | def test_gemini_provider_respects_restrictions(self): method test_gemini_parameter_order_regression_protection (line 284) | def test_gemini_parameter_order_regression_protection(self): method test_gemini_parameter_order_edge_case_full_name_only (line 323) | def test_gemini_parameter_order_edge_case_full_name_only(self): class TestCustomProviderOpenRouterRestrictions (line 349) | class TestCustomProviderOpenRouterRestrictions: method test_custom_provider_respects_openrouter_restrictions (line 353) | def test_custom_provider_respects_openrouter_restrictions(self): method test_custom_provider_openrouter_capabilities_restrictions (line 373) | def test_custom_provider_openrouter_capabilities_restrictions(self): method test_custom_provider_no_openrouter_key_ignores_restrictions (line 397) | def test_custom_provider_no_openrouter_key_ignores_restrictions(self): method test_custom_provider_empty_restrictions_allows_all_openrouter (line 419) | def test_custom_provider_empty_restrictions_allows_all_openrouter(self): class TestRegistryIntegration (line 436) | class TestRegistryIntegration: method test_registry_with_shorthand_restrictions (line 440) | def test_registry_with_shorthand_restrictions(self): method test_get_available_models_respects_restrictions (line 461) | def test_get_available_models_respects_restrictions(self, mock_get_pro... class TestShorthandRestrictions (line 585) | class TestShorthandRestrictions: method test_providers_validate_shorthands_correctly (line 589) | def test_providers_validate_shorthands_correctly(self): method test_multiple_shorthands_for_same_model (line 621) | def test_multiple_shorthands_for_same_model(self): method test_both_shorthand_and_full_name_allowed (line 646) | def test_both_shorthand_and_full_name_allowed(self): class TestAutoModeWithRestrictions (line 664) | class TestAutoModeWithRestrictions: method test_fallback_model_respects_restrictions (line 668) | def test_fallback_model_respects_restrictions(self, mock_get_provider): method test_fallback_with_shorthand_restrictions (line 747) | def test_fallback_with_shorthand_restrictions(self, monkeypatch): FILE: tests/test_o3_pro_output_text_fix.py class TestO3ProOutputTextFix (line 37) | class TestO3ProOutputTextFix: method setup_method (line 40) | def setup_method(self): method teardown_method (line 53) | def teardown_method(self): method test_o3_pro_uses_output_text_field (line 60) | async def test_o3_pro_uses_output_text_field(self, monkeypatch): method _execute_chat_tool_test (line 93) | async def _execute_chat_tool_test(self): method _verify_chat_tool_response (line 106) | def _verify_chat_tool_response(self, result): FILE: tests/test_o3_temperature_fix_simple.py class TestO3TemperatureParameterFixSimple (line 13) | class TestO3TemperatureParameterFixSimple: method test_o3_models_exclude_temperature_from_api_call (line 18) | def test_o3_models_exclude_temperature_from_api_call(self, mock_openai... method test_regular_models_include_temperature_in_api_call (line 66) | def test_regular_models_include_temperature_in_api_call(self, mock_ope... method test_o3_models_filter_unsupported_parameters (line 115) | def test_o3_models_filter_unsupported_parameters(self, mock_openai_cla... method test_all_o3_models_have_correct_temperature_capability (line 176) | def test_all_o3_models_have_correct_temperature_capability(self, mock_... method test_openai_provider_temperature_constraints (line 212) | def test_openai_provider_temperature_constraints(self, mock_restrictio... FILE: tests/test_openai_compatible_token_usage.py class TestOpenAICompatibleTokenUsage (line 9) | class TestOpenAICompatibleTokenUsage(unittest.TestCase): method setUp (line 12) | def setUp(self): method test_extract_usage_with_valid_tokens (line 34) | def test_extract_usage_with_valid_tokens(self): method test_extract_usage_with_none_prompt_tokens (line 48) | def test_extract_usage_with_none_prompt_tokens(self): method test_extract_usage_with_none_completion_tokens (line 63) | def test_extract_usage_with_none_completion_tokens(self): method test_extract_usage_with_all_none_tokens (line 78) | def test_extract_usage_with_all_none_tokens(self): method test_extract_usage_without_usage (line 93) | def test_extract_usage_without_usage(self): method test_extract_usage_with_zero_tokens (line 102) | def test_extract_usage_with_zero_tokens(self): method test_alternative_token_format_with_none (line 116) | def test_alternative_token_format_with_none(self): FILE: tests/test_openai_provider.py class TestOpenAIProvider (line 10) | class TestOpenAIProvider: method setup_method (line 13) | def setup_method(self): method teardown_method (line 20) | def teardown_method(self): method test_initialization (line 28) | def test_initialization(self): method test_initialization_with_custom_url (line 35) | def test_initialization_with_custom_url(self): method test_model_validation (line 41) | def test_model_validation(self): method test_resolve_model_name (line 75) | def test_resolve_model_name(self): method test_get_capabilities_o3 (line 105) | def test_get_capabilities_o3(self): method test_get_capabilities_with_alias (line 122) | def test_get_capabilities_with_alias(self): method test_get_capabilities_gpt5 (line 132) | def test_get_capabilities_gpt5(self): method test_get_capabilities_gpt5_mini (line 148) | def test_get_capabilities_gpt5_mini(self): method test_get_capabilities_gpt52 (line 164) | def test_get_capabilities_gpt52(self): method test_get_capabilities_gpt51_codex (line 175) | def test_get_capabilities_gpt51_codex(self): method test_get_capabilities_gpt51_codex_mini (line 185) | def test_get_capabilities_gpt51_codex_mini(self): method test_generate_content_resolves_alias_before_api_call (line 195) | def test_generate_content_resolves_alias_before_api_call(self, mock_op... method test_generate_content_other_aliases (line 247) | def test_generate_content_other_aliases(self, mock_openai_class): method test_generate_content_no_alias_passthrough (line 277) | def test_generate_content_no_alias_passthrough(self, mock_openai_class): method test_extended_thinking_capabilities (line 300) | def test_extended_thinking_capabilities(self): method test_o3_pro_routes_to_responses_endpoint (line 327) | def test_o3_pro_routes_to_responses_endpoint(self, mock_openai_class): method test_non_o3_pro_uses_chat_completions (line 364) | def test_non_o3_pro_uses_chat_completions(self, mock_openai_class): FILE: tests/test_openrouter_provider.py class TestOpenRouterProvider (line 13) | class TestOpenRouterProvider: method test_provider_initialization (line 16) | def test_provider_initialization(self): method test_custom_headers (line 23) | def test_custom_headers(self): method test_model_validation (line 41) | def test_model_validation(self): method test_get_capabilities (line 56) | def test_get_capabilities(self): method test_model_alias_resolution (line 77) | def test_model_alias_resolution(self): method test_openrouter_registration (line 114) | def test_openrouter_registration(self): class TestOpenRouterAutoMode (line 129) | class TestOpenRouterAutoMode: method setup_method (line 132) | def setup_method(self): method teardown_method (line 145) | def teardown_method(self): method test_openrouter_only_auto_mode (line 159) | def test_openrouter_only_auto_mode(self): method test_openrouter_with_restrictions (line 204) | def test_openrouter_with_restrictions(self): method test_no_providers_fails_auto_mode (line 249) | def test_no_providers_fails_auto_mode(self): method test_openrouter_without_registry (line 261) | def test_openrouter_without_registry(self): class TestOpenRouterRegistry (line 282) | class TestOpenRouterRegistry: method test_registry_loading (line 285) | def test_registry_loading(self): method test_registry_capabilities (line 304) | def test_registry_capabilities(self): method test_multiple_aliases_same_model (line 340) | def test_multiple_aliases_same_model(self): class TestOpenRouterFunctionality (line 359) | class TestOpenRouterFunctionality: method test_openrouter_always_uses_correct_url (line 362) | def test_openrouter_always_uses_correct_url(self): method test_openrouter_headers_set_correctly (line 374) | def test_openrouter_headers_set_correctly(self): method test_openrouter_model_registry_initialized (line 383) | def test_openrouter_model_registry_initialized(self): FILE: tests/test_openrouter_registry.py class TestOpenRouterModelRegistry (line 14) | class TestOpenRouterModelRegistry: method test_registry_initialization (line 17) | def test_registry_initialization(self): method test_custom_config_path (line 25) | def test_custom_config_path(self): method test_environment_variable_override (line 52) | def test_environment_variable_override(self): method test_alias_resolution (line 85) | def test_alias_resolution(self): method test_direct_model_name_lookup (line 107) | def test_direct_model_name_lookup(self): method test_unknown_model_resolution (line 120) | def test_unknown_model_resolution(self): method test_model_capabilities_conversion (line 129) | def test_model_capabilities_conversion(self): method test_duplicate_alias_detection (line 144) | def test_duplicate_alias_detection(self): method test_backwards_compatibility_max_tokens (line 168) | def test_backwards_compatibility_max_tokens(self): method test_missing_config_file (line 192) | def test_missing_config_file(self): method test_invalid_json_config (line 203) | def test_invalid_json_config(self): method test_model_with_all_capabilities (line 217) | def test_model_with_all_capabilities(self): FILE: tests/test_openrouter_store_parameter.py class MockOpenRouterProvider (line 19) | class MockOpenRouterProvider(OpenAICompatibleProvider): method get_provider_type (line 24) | def get_provider_type(self): method get_capabilities (line 27) | def get_capabilities(self, model_name): method validate_model_name (line 32) | def validate_model_name(self, model_name): method list_models (line 35) | def list_models(self, **kwargs): class MockOpenAIProvider (line 39) | class MockOpenAIProvider(OpenAICompatibleProvider): method get_provider_type (line 44) | def get_provider_type(self): method get_capabilities (line 47) | def get_capabilities(self, model_name): method validate_model_name (line 52) | def validate_model_name(self, model_name): method list_models (line 55) | def list_models(self, **kwargs): class TestStoreParameterHandling (line 59) | class TestStoreParameterHandling(unittest.TestCase): method test_openrouter_responses_omits_store_parameter (line 66) | def test_openrouter_responses_omits_store_parameter(self): method test_openai_responses_includes_store_parameter (line 104) | def test_openai_responses_includes_store_parameter(self): FILE: tests/test_parse_model_option.py class TestParseModelOption (line 6) | class TestParseModelOption: method test_openrouter_free_suffix_preserved (line 9) | def test_openrouter_free_suffix_preserved(self): method test_openrouter_beta_suffix_preserved (line 15) | def test_openrouter_beta_suffix_preserved(self): method test_openrouter_preview_suffix_preserved (line 21) | def test_openrouter_preview_suffix_preserved(self): method test_ollama_tag_parsed_as_option (line 27) | def test_ollama_tag_parsed_as_option(self): method test_consensus_stance_parsed_as_option (line 33) | def test_consensus_stance_parsed_as_option(self): method test_openrouter_unknown_suffix_parsed_as_option (line 43) | def test_openrouter_unknown_suffix_parsed_as_option(self): method test_plain_model_name (line 49) | def test_plain_model_name(self): method test_url_not_parsed (line 55) | def test_url_not_parsed(self): method test_whitespace_handling (line 61) | def test_whitespace_handling(self): method test_case_insensitive_suffix_matching (line 71) | def test_case_insensitive_suffix_matching(self): FILE: tests/test_path_traversal_security.py class TestPathTraversalFix (line 22) | class TestPathTraversalFix: method test_exact_match_still_works (line 25) | def test_exact_match_still_works(self): method test_subdirectory_now_blocked (line 31) | def test_subdirectory_now_blocked(self): method test_deeply_nested_blocked (line 39) | def test_deeply_nested_blocked(self): method test_root_blocked (line 44) | def test_root_blocked(self): method test_safe_paths_allowed (line 48) | def test_safe_paths_allowed(self): method test_similar_names_not_blocked (line 54) | def test_similar_names_not_blocked(self): class TestHomeDirectoryHandling (line 61) | class TestHomeDirectoryHandling: method test_home_container_blocked (line 69) | def test_home_container_blocked(self): method test_home_subdirectories_allowed (line 73) | def test_home_subdirectories_allowed(self): method test_home_deeply_nested_allowed (line 86) | def test_home_deeply_nested_allowed(self): class TestRegressionPrevention (line 91) | class TestRegressionPrevention: method test_etc_passwd_blocked (line 94) | def test_etc_passwd_blocked(self): method test_etc_shadow_blocked (line 98) | def test_etc_shadow_blocked(self): class TestWindowsPathHandling (line 103) | class TestWindowsPathHandling: method test_windows_root_drive_blocked (line 111) | def test_windows_root_drive_blocked(self): method test_windows_dangerous_subdirectory_detection (line 120) | def test_windows_dangerous_subdirectory_detection(self): method test_windows_path_not_relative_to_different_drive (line 141) | def test_windows_path_not_relative_to_different_drive(self): FILE: tests/test_per_tool_model_defaults.py class TestToolModelCategories (line 25) | class TestToolModelCategories: method test_thinkdeep_category (line 28) | def test_thinkdeep_category(self): method test_debug_category (line 32) | def test_debug_category(self): method test_analyze_category (line 36) | def test_analyze_category(self): method test_precommit_category (line 40) | def test_precommit_category(self): method test_chat_category (line 44) | def test_chat_category(self): method test_codereview_category (line 48) | def test_codereview_category(self): method test_base_tool_default_category (line 52) | def test_base_tool_default_category(self): class TestModelSelection (line 77) | class TestModelSelection: method teardown_method (line 80) | def teardown_method(self): method test_extended_reasoning_with_openai (line 87) | def test_extended_reasoning_with_openai(self): method test_extended_reasoning_with_gemini_only (line 104) | def test_extended_reasoning_with_gemini_only(self): method test_fast_response_with_openai (line 122) | def test_fast_response_with_openai(self): method test_fast_response_with_gemini_only (line 139) | def test_fast_response_with_gemini_only(self): method test_balanced_category_fallback (line 156) | def test_balanced_category_fallback(self): method test_no_category_uses_balanced_logic (line 173) | def test_no_category_uses_balanced_logic(self): class TestFlexibleModelSelection (line 186) | class TestFlexibleModelSelection: method test_fallback_handles_mixed_model_names (line 189) | def test_fallback_handles_mixed_model_names(self): class TestCustomProviderFallback (line 238) | class TestCustomProviderFallback: method test_extended_reasoning_custom_fallback (line 241) | def test_extended_reasoning_custom_fallback(self): method test_extended_reasoning_final_fallback (line 256) | def test_extended_reasoning_final_fallback(self): class TestAutoModeErrorMessages (line 270) | class TestAutoModeErrorMessages: method teardown_method (line 273) | def teardown_method(self): method test_chat_auto_error_message (line 279) | async def test_chat_auto_error_message(self): class TestProviderHelperMethods (line 315) | class TestProviderHelperMethods: method test_extended_reasoning_with_custom_provider (line 318) | def test_extended_reasoning_with_custom_provider(self): method test_extended_reasoning_with_openrouter (line 332) | def test_extended_reasoning_with_openrouter(self): method test_fallback_when_no_providers_available (line 345) | def test_fallback_when_no_providers_available(self): class TestEffectiveAutoMode (line 359) | class TestEffectiveAutoMode: method test_explicit_auto_mode (line 362) | def test_explicit_auto_mode(self): method test_unavailable_model_triggers_auto_mode (line 369) | def test_unavailable_model_triggers_auto_mode(self): method test_available_model_no_auto_mode (line 379) | def test_available_model_no_auto_mode(self): class TestRuntimeModelSelection (line 390) | class TestRuntimeModelSelection: method teardown_method (line 393) | def teardown_method(self): method test_explicit_auto_in_request (line 399) | async def test_explicit_auto_in_request(self): method test_unavailable_model_in_request (line 419) | async def test_unavailable_model_in_request(self): class TestSchemaGeneration (line 444) | class TestSchemaGeneration: method test_schema_with_explicit_auto_mode (line 447) | def test_schema_with_explicit_auto_mode(self): method test_schema_with_unavailable_default_model (line 457) | def test_schema_with_unavailable_default_model(self): method test_schema_with_available_default_model (line 470) | def test_schema_with_available_default_model(self): class TestUnavailableModelFallback (line 484) | class TestUnavailableModelFallback: method test_unavailable_default_model_fallback (line 488) | async def test_unavailable_default_model_fallback(self): method test_available_default_model_no_fallback (line 515) | async def test_available_default_model_no_fallback(self): FILE: tests/test_pii_sanitizer.py class TestPIISanitizer (line 9) | class TestPIISanitizer(unittest.TestCase): method setUp (line 12) | def setUp(self): method test_api_key_sanitization (line 16) | def test_api_key_sanitization(self): method test_personal_info_sanitization (line 36) | def test_personal_info_sanitization(self): method test_header_sanitization (line 58) | def test_header_sanitization(self): method test_nested_structure_sanitization (line 76) | def test_nested_structure_sanitization(self): method test_url_sanitization (line 99) | def test_url_sanitization(self): method test_disable_sanitization (line 117) | def test_disable_sanitization(self): method test_custom_pattern (line 127) | def test_custom_pattern(self): FILE: tests/test_pip_detection_fix.py class TestPipDetectionFix (line 15) | class TestPipDetectionFix: method test_run_server_script_syntax_valid (line 18) | def test_run_server_script_syntax_valid(self): method test_run_server_has_proper_shebang (line 23) | def test_run_server_has_proper_shebang(self): method test_critical_functions_exist (line 28) | def test_critical_functions_exist(self): method test_pip_detection_consistency_issue (line 36) | def test_pip_detection_consistency_issue(self): method test_pip_detection_with_non_interactive_shell (line 52) | def test_pip_detection_with_non_interactive_shell(self): method test_enhanced_diagnostic_messages_included (line 81) | def test_enhanced_diagnostic_messages_included(self): method test_setup_env_file_does_not_create_bsd_backup (line 103) | def test_setup_env_file_does_not_create_bsd_backup(self, tmp_path): FILE: tests/test_planner.py class TestPlannerTool (line 14) | class TestPlannerTool: method test_tool_metadata (line 17) | def test_tool_metadata(self): method test_request_validation (line 27) | def test_request_validation(self): method test_input_schema_generation (line 45) | def test_input_schema_generation(self): method test_model_category_for_planning (line 74) | def test_model_category_for_planning(self): method test_execute_first_step (line 83) | async def test_execute_first_step(self): method test_execute_subsequent_step (line 120) | async def test_execute_subsequent_step(self): method test_execute_with_continuation_context (line 155) | async def test_execute_with_continuation_context(self): method test_execute_final_step (line 204) | async def test_execute_final_step(self): method test_execute_with_branching (line 236) | async def test_execute_with_branching(self): method test_execute_with_revision (line 267) | async def test_execute_with_revision(self): method test_execute_adjusts_total_steps (line 305) | async def test_execute_adjusts_total_steps(self): method test_execute_error_handling (line 335) | async def test_execute_error_handling(self): method test_execute_step_history_tracking (line 355) | async def test_execute_step_history_tracking(self): class TestPlannerToolIntegration (line 383) | class TestPlannerToolIntegration: method setup_method (line 386) | def setup_method(self): method test_interactive_planning_flow (line 394) | async def test_interactive_planning_flow(self): method test_simple_planning_flow (line 427) | async def test_simple_planning_flow(self): FILE: tests/test_precommit_workflow.py class TestPrecommitWorkflowTool (line 17) | class TestPrecommitWorkflowTool: method test_tool_metadata (line 20) | def test_tool_metadata(self): method test_tool_model_category (line 28) | def test_tool_model_category(self): method test_default_temperature (line 33) | def test_default_temperature(self): method test_request_model_basic_validation (line 40) | def test_request_model_basic_validation(self): method test_request_model_step_one_validation (line 59) | def test_request_model_step_one_validation(self): method test_request_model_later_steps_no_path_required (line 72) | def test_request_model_later_steps_no_path_required(self): method test_request_model_optional_fields (line 87) | def test_request_model_optional_fields(self): method test_precommit_specific_fields (line 111) | def test_precommit_specific_fields(self): method test_precommit_type_validation (line 133) | def test_precommit_type_validation(self): method test_severity_filter_options (line 160) | def test_severity_filter_options(self): method test_input_schema_generation (line 176) | def test_input_schema_generation(self): method test_workflow_request_model_method (line 194) | def test_workflow_request_model_method(self): method test_system_prompt_integration (line 200) | def test_system_prompt_integration(self): FILE: tests/test_prompt_regression.py function skip_if_no_custom_api (line 46) | def skip_if_no_custom_api(): class TestPromptIntegration (line 54) | class TestPromptIntegration: method test_chat_normal_prompt (line 59) | async def test_chat_normal_prompt(self): method test_chat_with_files (line 81) | async def test_chat_with_files(self): method test_thinkdeep_normal_analysis (line 123) | async def test_thinkdeep_normal_analysis(self): method test_codereview_normal_review (line 150) | async def test_codereview_normal_review(self): method test_analyze_normal_question (line 236) | async def test_analyze_normal_question(self): method test_empty_optional_fields (line 294) | async def test_empty_optional_fields(self): method test_thinking_modes_work (line 316) | async def test_thinking_modes_work(self): method test_special_characters_in_prompts (line 341) | async def test_special_characters_in_prompts(self): method test_mixed_file_paths (line 367) | async def test_mixed_file_paths(self): method test_unicode_content (line 415) | async def test_unicode_content(self): FILE: tests/test_prompt_size_limit_bug_fix.py class TestPromptSizeLimitBugFix (line 12) | class TestPromptSizeLimitBugFix: method test_prompt_size_validation_with_conversation_history (line 15) | def test_prompt_size_validation_with_conversation_history(self): method test_prompt_size_validation_without_original_prompt (line 57) | def test_prompt_size_validation_without_original_prompt(self): method test_prompt_size_validation_with_missing_original_prompt (line 71) | def test_prompt_size_validation_with_missing_original_prompt(self): method test_base_tool_default_behavior (line 89) | def test_base_tool_default_behavior(self): FILE: tests/test_provider_retry_logic.py function _mock_chat_response (line 10) | def _mock_chat_response(content: str = "retry success") -> SimpleNamespace: function test_openai_provider_retries_on_transient_error (line 19) | def test_openai_provider_retries_on_transient_error(monkeypatch): function test_openai_provider_bails_on_non_retryable_error (line 45) | def test_openai_provider_bails_on_non_retryable_error(monkeypatch): FILE: tests/test_provider_routing_bugs.py class MockRequest (line 22) | class MockRequest(ToolRequest): class TestProviderRoutingBugs (line 28) | class TestProviderRoutingBugs: method setup_method (line 31) | def setup_method(self): method teardown_method (line 43) | def teardown_method(self): method test_fallback_routing_bug_reproduction (line 51) | def test_fallback_routing_bug_reproduction(self): method test_fallback_should_not_register_without_api_key (line 115) | def test_fallback_should_not_register_without_api_key(self): method test_mixed_api_keys_correct_routing (line 167) | def test_mixed_api_keys_correct_routing(self): class TestOpenRouterAliasRestrictions (line 223) | class TestOpenRouterAliasRestrictions: method setup_method (line 226) | def setup_method(self): method teardown_method (line 238) | def teardown_method(self): method test_openrouter_alias_restrictions_bug_reproduction (line 246) | def test_openrouter_alias_restrictions_bug_reproduction(self): method test_openrouter_mixed_alias_and_full_names (line 322) | def test_openrouter_mixed_alias_and_full_names(self): class TestProviderMetadataBug (line 374) | class TestProviderMetadataBug: method test_provider_used_metadata_included (line 377) | def test_provider_used_metadata_included(self): FILE: tests/test_provider_utf8.py class TestProviderUTF8Encoding (line 18) | class TestProviderUTF8Encoding(unittest.TestCase): method setUp (line 21) | def setUp(self): method tearDown (line 25) | def tearDown(self): method test_base_provider_utf8_support (line 32) | def test_base_provider_utf8_support(self): method test_gemini_provider_utf8_request (line 46) | def test_gemini_provider_utf8_request(self, mock_model_class): method test_openai_provider_utf8_logging (line 86) | def test_openai_provider_utf8_logging(self, mock_openai_class): method test_openai_compatible_o3_pro_utf8 (line 118) | def test_openai_compatible_o3_pro_utf8(self, mock_openai_class): method test_provider_type_enum_utf8_safe (line 158) | def test_provider_type_enum_utf8_safe(self): method test_model_response_utf8_serialization (line 178) | def test_model_response_utf8_serialization(self): method test_error_handling_with_utf8 (line 217) | def test_error_handling_with_utf8(self): method test_temperature_handling_utf8_locale (line 233) | def test_temperature_handling_utf8_locale(self): method test_provider_registry_utf8 (line 252) | def test_provider_registry_utf8(self): method test_gemini_provider_handles_api_encoding_error (line 280) | def test_gemini_provider_handles_api_encoding_error(self, mock_model_c... class DummyToolForLocaleTest (line 302) | class DummyToolForLocaleTest: method get_language_instruction (line 305) | def get_language_instruction(self): class TestLocaleModelIntegration (line 312) | class TestLocaleModelIntegration(unittest.TestCase): method setUp (line 315) | def setUp(self): method tearDown (line 319) | def tearDown(self): method test_system_prompt_enhancement_french (line 326) | def test_system_prompt_enhancement_french(self): method test_system_prompt_enhancement_multiple_locales (line 336) | def test_system_prompt_enhancement_multiple_locales(self): method test_model_name_resolution_utf8 (line 351) | def test_model_name_resolution_utf8(self): method test_system_prompt_enhancement_with_unusual_locale_formats (line 370) | def test_system_prompt_enhancement_with_unusual_locale_formats(self): FILE: tests/test_providers.py class TestModelProviderRegistry (line 14) | class TestModelProviderRegistry: method setup_method (line 17) | def setup_method(self): method teardown_method (line 25) | def teardown_method(self): method test_register_provider (line 33) | def test_register_provider(self): method test_get_provider (line 42) | def test_get_provider(self): method test_get_provider_no_api_key (line 53) | def test_get_provider_no_api_key(self): method test_get_provider_for_model (line 63) | def test_get_provider_for_model(self): method test_get_available_providers (line 72) | def test_get_available_providers(self): class TestGeminiProvider (line 84) | class TestGeminiProvider: method test_provider_initialization (line 87) | def test_provider_initialization(self): method test_get_capabilities (line 94) | def test_get_capabilities(self): method test_get_capabilities_pro_model (line 105) | def test_get_capabilities_pro_model(self): method test_model_shorthand_resolution (line 113) | def test_model_shorthand_resolution(self): method test_generate_content (line 124) | def test_generate_content(self, mock_client_class): class TestOpenAIProvider (line 155) | class TestOpenAIProvider: method setup_method (line 158) | def setup_method(self): method teardown_method (line 164) | def teardown_method(self): method test_provider_initialization (line 170) | def test_provider_initialization(self): method test_get_capabilities_o3 (line 178) | def test_get_capabilities_o3(self): method test_get_capabilities_o4_mini (line 189) | def test_get_capabilities_o4_mini(self): method test_validate_model_names (line 202) | def test_validate_model_names(self): method test_openai_models_do_not_support_extended_thinking (line 218) | def test_openai_models_do_not_support_extended_thinking(self): method test_gpt52_family_capabilities (line 226) | def test_gpt52_family_capabilities(self): FILE: tests/test_rate_limit_patterns.py function test_openai_structured_error_retry_logic (line 9) | def test_openai_structured_error_retry_logic(): function test_gemini_structured_error_retry_logic (line 45) | def test_gemini_structured_error_retry_logic(): function test_actual_log_error_from_issue_with_structured_parsing (line 75) | def test_actual_log_error_from_issue_with_structured_parsing(): function test_non_429_errors_still_work (line 93) | def test_non_429_errors_still_work(): function test_edge_cases_and_fallbacks (line 121) | def test_edge_cases_and_fallbacks(): FILE: tests/test_refactor.py class TestRefactorTool (line 13) | class TestRefactorTool: method refactor_tool (line 17) | def refactor_tool(self): method mock_model_response (line 22) | def mock_model_response(self): method test_get_name (line 64) | def test_get_name(self, refactor_tool): method test_get_description (line 68) | def test_get_description(self, refactor_tool): method test_get_input_schema (line 77) | def test_get_input_schema(self, refactor_tool): method test_model_category (line 104) | def test_model_category(self, refactor_tool): method test_default_temperature (line 111) | def test_default_temperature(self, refactor_tool): class TestFileUtilsLineNumbers (line 121) | class TestFileUtilsLineNumbers: method test_read_file_content_with_line_numbers (line 124) | def test_read_file_content_with_line_numbers(self, project_path): method test_read_file_content_without_line_numbers (line 142) | def test_read_file_content_without_line_numbers(self, project_path): method test_read_file_content_auto_detect_programming (line 159) | def test_read_file_content_auto_detect_programming(self, project_path): method test_read_file_content_auto_detect_text (line 175) | def test_read_file_content_auto_detect_text(self, project_path): method test_line_ending_normalization (line 190) | def test_line_ending_normalization(self): method test_detect_file_type (line 213) | def test_detect_file_type(self): method test_should_add_line_numbers (line 230) | def test_should_add_line_numbers(self): method test_line_numbers_double_triple_digits (line 245) | def test_line_numbers_double_triple_digits(self, project_path): method test_line_numbers_with_file_reading (line 286) | def test_line_numbers_with_file_reading(self, project_path): method test_line_numbers_large_files_22k_lines (line 332) | def test_line_numbers_large_files_22k_lines(self, project_path): method test_line_numbers_boundary_conditions (line 367) | def test_line_numbers_boundary_conditions(self): FILE: tests/test_secaudit.py class TestSecauditTool (line 11) | class TestSecauditTool: method test_tool_metadata (line 14) | def test_tool_metadata(self): method test_request_validation (line 24) | def test_request_validation(self): method test_request_validation_defaults (line 49) | def test_request_validation_defaults(self): method test_request_validation_invalid_threat_level (line 64) | def test_request_validation_invalid_threat_level(self): method test_request_validation_invalid_audit_focus (line 76) | def test_request_validation_invalid_audit_focus(self): method test_input_schema_generation (line 88) | def test_input_schema_generation(self): method test_step_guidance_step_1 (line 110) | def test_step_guidance_step_1(self): method test_step_guidance_step_2 (line 131) | def test_step_guidance_step_2(self): method test_step_guidance_step_4 (line 152) | def test_step_guidance_step_4(self): method test_expert_analysis_trigger (line 169) | def test_expert_analysis_trigger(self): method test_expert_analysis_context_preparation (line 200) | def test_expert_analysis_context_preparation(self): method test_security_issues_formatting_empty (line 255) | def test_security_issues_formatting_empty(self): method test_security_issues_formatting_with_issues (line 261) | def test_security_issues_formatting_with_issues(self): method test_tool_field_definitions (line 284) | def test_tool_field_definitions(self): method test_workflow_request_model (line 320) | def test_workflow_request_model(self): method test_workflow_system_prompt (line 326) | def test_workflow_system_prompt(self): method test_compliance_requirements_validation (line 337) | def test_compliance_requirements_validation(self): method test_comprehensive_workflow_scenario (line 362) | def test_comprehensive_workflow_scenario(self): FILE: tests/test_server.py class TestServerTools (line 10) | class TestServerTools: method test_handle_call_tool_unknown (line 14) | async def test_handle_call_tool_unknown(self): method test_handle_chat (line 21) | async def test_handle_chat(self): method test_handle_version (line 90) | async def test_handle_version(self): FILE: tests/test_supported_models_aliases.py class TestSupportedModelsAliases (line 9) | class TestSupportedModelsAliases: method test_gemini_provider_aliases (line 12) | def test_gemini_provider_aliases(self): method test_openai_provider_aliases (line 40) | def test_openai_provider_aliases(self): method test_xai_provider_aliases (line 77) | def test_xai_provider_aliases(self): method test_dial_provider_aliases (line 101) | def test_dial_provider_aliases(self): method test_list_models_includes_aliases (line 127) | def test_list_models_includes_aliases(self): method test_list_models_all_known_variant_includes_aliases (line 159) | def test_list_models_all_known_variant_includes_aliases(self): method test_no_string_shorthand_in_supported_models (line 191) | def test_no_string_shorthand_in_supported_models(self): method test_resolve_returns_original_if_not_found (line 210) | def test_resolve_returns_original_if_not_found(self): FILE: tests/test_thinking_modes.py function setup_test_env (line 16) | def setup_test_env(): class TestThinkingModes (line 22) | class TestThinkingModes: method test_default_thinking_modes (line 26) | def test_default_thinking_modes(self): method test_thinking_mode_minimal (line 41) | async def test_thinking_mode_minimal(self): method test_thinking_mode_low (line 124) | async def test_thinking_mode_low(self): method test_thinking_mode_medium (line 203) | async def test_thinking_mode_medium(self): method test_thinking_mode_high (line 283) | async def test_thinking_mode_high(self): method test_thinking_mode_max (line 362) | async def test_thinking_mode_max(self): FILE: tests/test_tools.py class TestThinkDeepTool (line 15) | class TestThinkDeepTool: method tool (line 19) | def tool(self): method test_tool_metadata (line 22) | def test_tool_metadata(self, tool): method test_execute_success (line 41) | async def test_execute_success(self, tool): class TestCodeReviewTool (line 116) | class TestCodeReviewTool: method tool (line 120) | def tool(self): method test_tool_metadata (line 123) | def test_tool_metadata(self, tool): method test_execute_with_review_type (line 135) | async def test_execute_with_review_type(self, tool, tmp_path): class TestAnalyzeTool (line 209) | class TestAnalyzeTool: method tool (line 213) | def tool(self): method test_tool_metadata (line 216) | def test_tool_metadata(self, tool): method test_execute_with_analysis_type (line 237) | async def test_execute_with_analysis_type(self, tool, tmp_path): class TestAbsolutePathValidation (line 313) | class TestAbsolutePathValidation: method test_thinkdeep_tool_relative_path_rejected (line 325) | async def test_thinkdeep_tool_relative_path_rejected(self): method test_chat_tool_relative_path_rejected (line 346) | async def test_chat_tool_relative_path_rejected(self): method test_analyze_tool_accepts_absolute_paths (line 368) | async def test_analyze_tool_accepts_absolute_paths(self): class TestSpecialStatusModels (line 440) | class TestSpecialStatusModels: method test_trace_complete_status_in_registry (line 443) | def test_trace_complete_status_in_registry(self): method test_trace_complete_model_validation (line 450) | def test_trace_complete_model_validation(self): FILE: tests/test_tracer.py class TestTracerTool (line 11) | class TestTracerTool: method tracer_tool (line 15) | def tracer_tool(self): method test_get_name (line 19) | def test_get_name(self, tracer_tool): method test_get_description (line 23) | def test_get_description(self, tracer_tool): method test_get_input_schema (line 31) | def test_get_input_schema(self, tracer_tool): method test_get_model_category (line 51) | def test_get_model_category(self, tracer_tool): method test_request_model_validation (line 56) | def test_request_model_validation(self, tracer_tool): method test_get_required_actions (line 83) | def test_get_required_actions(self, tracer_tool): method test_workflow_tool_characteristics (line 110) | def test_workflow_tool_characteristics(self, tracer_tool): method test_get_rendering_instructions_precision (line 121) | def test_get_rendering_instructions_precision(self, tracer_tool): method test_get_rendering_instructions_dependencies (line 131) | def test_get_rendering_instructions_dependencies(self, tracer_tool): method test_rendering_instructions_consistency (line 143) | def test_rendering_instructions_consistency(self, tracer_tool): method test_mode_selection_guidance (line 160) | def test_mode_selection_guidance(self, tracer_tool): FILE: tests/test_utf8_localization.py class MockTestTool (line 22) | class MockTestTool(BaseTool): method __init__ (line 25) | def __init__(self): method get_name (line 28) | def get_name(self) -> str: method get_description (line 31) | def get_description(self) -> str: method get_input_schema (line 34) | def get_input_schema(self) -> dict: method get_system_prompt (line 37) | def get_system_prompt(self) -> str: method get_request_model (line 40) | def get_request_model(self): method prepare_prompt (line 45) | async def prepare_prompt(self, request) -> str: method execute (line 48) | async def execute(self, arguments: dict) -> list: class TestUTF8Localization (line 52) | class TestUTF8Localization(unittest.TestCase): method setUp (line 55) | def setUp(self): method tearDown (line 59) | def tearDown(self): method test_language_instruction_generation_french (line 66) | def test_language_instruction_generation_french(self): method test_language_instruction_generation_english (line 78) | def test_language_instruction_generation_english(self): method test_language_instruction_empty_locale (line 89) | def test_language_instruction_empty_locale(self): method test_language_instruction_no_locale (line 100) | def test_language_instruction_no_locale(self): method test_json_dumps_utf8_encoding (line 111) | def test_json_dumps_utf8_encoding(self): method test_json_dumps_ascii_encoding_comparison (line 144) | def test_json_dumps_ascii_encoding_comparison(self): method test_french_characters_in_file_content (line 160) | def test_french_characters_in_file_content(self): method test_unicode_normalization (line 218) | def test_unicode_normalization(self): method test_emoji_preservation (line 238) | def test_emoji_preservation(self): class TestLocalizationIntegration (line 271) | class TestLocalizationIntegration(unittest.TestCase): method setUp (line 274) | def setUp(self): method tearDown (line 278) | def tearDown(self): method test_codereview_tool_french_locale_simple (line 285) | def test_codereview_tool_french_locale_simple(self): method test_multiple_locales_switching (line 313) | def test_multiple_locales_switching(self): function run_async_test (line 351) | def run_async_test(test_func): FILE: tests/test_utils.py class TestFileUtils (line 8) | class TestFileUtils: method test_read_file_content_success (line 11) | def test_read_file_content_success(self, project_path): method test_read_file_content_not_found (line 23) | def test_read_file_content_not_found(self, project_path): method test_read_file_content_dangerous_files_blocked (line 32) | def test_read_file_content_dangerous_files_blocked(self): method test_read_file_content_relative_path_rejected (line 40) | def test_read_file_content_relative_path_rejected(self): method test_read_file_content_directory (line 48) | def test_read_file_content_directory(self, project_path): method test_read_files_multiple (line 55) | def test_read_files_multiple(self, project_path): method test_read_files_with_code (line 73) | def test_read_files_with_code(self): method test_read_files_directory_support (line 85) | def test_read_files_directory_support(self, project_path): method test_read_files_mixed_paths (line 124) | def test_read_files_mixed_paths(self, project_path): method test_read_files_token_limit (line 149) | def test_read_files_token_limit(self, project_path): method test_read_files_large_file (line 170) | def test_read_files_large_file(self, project_path): method test_read_files_file_extensions (line 183) | def test_read_files_file_extensions(self, project_path): class TestTokenUtils (line 202) | class TestTokenUtils: method test_estimate_tokens (line 205) | def test_estimate_tokens(self): method test_check_token_limit_within (line 211) | def test_check_token_limit_within(self): method test_check_token_limit_exceeded (line 218) | def test_check_token_limit_exceeded(self): FILE: tests/test_uvx_resource_packaging.py class TestUvxPathResolution (line 11) | class TestUvxPathResolution: method test_normal_operation (line 14) | def test_normal_operation(self): method test_config_path_resolution (line 20) | def test_config_path_resolution(self): method test_explicit_config_path_override (line 37) | def test_explicit_config_path_override(self): method test_environment_variable_override (line 47) | def test_environment_variable_override(self): method test_multiple_path_fallback (line 59) | def test_multiple_path_fallback(self, mock_files): method test_missing_config_handling (line 100) | def test_missing_config_handling(self): method test_resource_loading_success (line 110) | def test_resource_loading_success(self): method test_use_resources_attribute (line 120) | def test_use_resources_attribute(self): FILE: tests/test_uvx_support.py class TestUvxEnvironmentHandling (line 14) | class TestUvxEnvironmentHandling: method test_dotenv_import_success (line 17) | def test_dotenv_import_success(self): method test_dotenv_import_failure_graceful_handling (line 50) | def test_dotenv_import_failure_graceful_handling(self): method test_env_file_path_resolution (line 70) | def test_env_file_path_resolution(self): method test_environment_variables_still_work_without_dotenv (line 82) | def test_environment_variables_still_work_without_dotenv(self): method test_dotenv_graceful_fallback_behavior (line 92) | def test_dotenv_graceful_fallback_behavior(self): class TestUvxProjectConfiguration (line 109) | class TestUvxProjectConfiguration: method test_pyproject_toml_has_required_uvx_fields (line 112) | def test_pyproject_toml_has_required_uvx_fields(self): method test_pyproject_dependencies_match_requirements (line 145) | def test_pyproject_dependencies_match_requirements(self): method test_uvx_entry_point_callable (line 178) | def test_uvx_entry_point_callable(self): FILE: tests/test_workflow_file_embedding.py class TestWorkflowFileEmbedding (line 18) | class TestWorkflowFileEmbedding: method setup_method (line 21) | def setup_method(self): method teardown_method (line 43) | def teardown_method(self): method test_intermediate_step_no_embedding (line 51) | def test_intermediate_step_no_embedding(self): method test_intermediate_step_with_continuation_no_embedding (line 62) | def test_intermediate_step_with_continuation_no_embedding(self): method test_final_step_embeds_files (line 73) | def test_final_step_embeds_files(self): method test_final_step_new_conversation_embeds_files (line 84) | def test_final_step_new_conversation_embeds_files(self): method test_comprehensive_file_collection_for_expert_analysis (line 99) | def test_comprehensive_file_collection_for_expert_analysis( method test_force_embed_bypasses_conversation_history (line 170) | def test_force_embed_bypasses_conversation_history(self, mock_expand_p... method test_embedding_decision_logic_comprehensive (line 204) | def test_embedding_decision_logic_comprehensive(self): FILE: tests/test_workflow_metadata.py class TestWorkflowMetadata (line 19) | class TestWorkflowMetadata: method setup_method (line 22) | def setup_method(self): method teardown_method (line 34) | def teardown_method(self): method test_workflow_metadata_in_response (line 42) | def test_workflow_metadata_in_response(self): method test_workflow_metadata_in_error_response (line 129) | def test_workflow_metadata_in_error_response(self): method test_workflow_metadata_fallback_handling (line 194) | def test_workflow_metadata_fallback_handling(self): method test_workflow_metadata_preserves_existing_response_fields (line 254) | def test_workflow_metadata_preserves_existing_response_fields(self): FILE: tests/test_workflow_prompt_size_validation_simple.py function build_debug_arguments (line 18) | def build_debug_arguments(**overrides) -> dict[str, object]: function test_workflow_tool_accepts_normal_step_content (line 41) | async def test_workflow_tool_accepts_normal_step_content() -> None: function test_workflow_tool_rejects_oversized_step_with_guidance (line 57) | async def test_workflow_tool_rejects_oversized_step_with_guidance() -> N... FILE: tests/test_workflow_utf8.py class TestWorkflowToolsUTF8 (line 16) | class TestWorkflowToolsUTF8(unittest.IsolatedAsyncioTestCase): method setUp (line 19) | def setUp(self): method tearDown (line 25) | def tearDown(self): method test_workflow_json_response_structure (line 32) | def test_workflow_json_response_structure(self): method test_analyze_tool_utf8_response (line 63) | async def test_analyze_tool_utf8_response(self, mock_model_context, mo... method test_codereview_tool_french_findings (line 130) | async def test_codereview_tool_french_findings(self, mock_get_provider): method test_debug_tool_french_error_analysis (line 203) | async def test_debug_tool_french_error_analysis(self, mock_get_provider): method test_utf8_emoji_preservation_in_workflow_responses (line 266) | def test_utf8_emoji_preservation_in_workflow_responses(self): FILE: tests/test_xai_provider.py class TestXAIProvider (line 12) | class TestXAIProvider: method setup_method (line 15) | def setup_method(self): method teardown_method (line 22) | def teardown_method(self): method test_initialization (line 30) | def test_initialization(self): method test_initialization_with_custom_url (line 37) | def test_initialization_with_custom_url(self): method test_model_validation (line 43) | def test_model_validation(self): method test_resolve_model_name (line 66) | def test_resolve_model_name(self): method test_get_capabilities_grok4 (line 80) | def test_get_capabilities_grok4(self): method test_get_capabilities_grok4_1_fast (line 101) | def test_get_capabilities_grok4_1_fast(self): method test_get_capabilities_with_shorthand (line 115) | def test_get_capabilities_with_shorthand(self): method test_unsupported_model_capabilities (line 126) | def test_unsupported_model_capabilities(self): method test_extended_thinking_flags (line 133) | def test_extended_thinking_flags(self): method test_provider_type (line 148) | def test_provider_type(self): method test_model_restrictions (line 154) | def test_model_restrictions(self): method test_multiple_model_restrictions (line 174) | def test_multiple_model_restrictions(self): method test_both_shorthand_and_full_name_allowed (line 195) | def test_both_shorthand_and_full_name_allowed(self): method test_empty_restrictions_allows_all (line 211) | def test_empty_restrictions_allows_all(self): method test_friendly_name (line 226) | def test_friendly_name(self): method test_supported_models_structure (line 234) | def test_supported_models_structure(self): method test_generate_content_resolves_alias_before_api_call (line 265) | def test_generate_content_resolves_alias_before_api_call(self, mock_op... method test_generate_content_other_aliases (line 315) | def test_generate_content_other_aliases(self, mock_openai_class): FILE: tests/transport_helpers.py function inject_transport (line 6) | def inject_transport(monkeypatch, cassette_path: str): FILE: tools/analyze.py class AnalyzeWorkflowRequest (line 83) | class AnalyzeWorkflowRequest(WorkflowRequest): method validate_step_one_requirements (line 125) | def validate_step_one_requirements(self): class AnalyzeTool (line 133) | class AnalyzeTool(WorkflowTool): method __init__ (line 143) | def __init__(self): method get_name (line 148) | def get_name(self) -> str: method get_description (line 151) | def get_description(self) -> str: method get_system_prompt (line 158) | def get_system_prompt(self) -> str: method get_default_temperature (line 161) | def get_default_temperature(self) -> float: method get_model_category (line 164) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 170) | def get_workflow_request_model(self): method get_input_schema (line 174) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 253) | def get_required_actions( method should_call_expert_analysis (line 288) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 301) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_analysis_summary (line 339) | def _build_analysis_summary(self, consolidated_findings) -> str: method should_include_files_in_expert_prompt (line 356) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 360) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 364) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 368) | def get_expert_analysis_instruction(self) -> str: method prepare_step_data (line 378) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 396) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 405) | def store_initial_issue(self, step_description: str): method get_completion_status (line 411) | def get_completion_status(self) -> str: method get_completion_data_key (line 415) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 419) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 423) | def get_confidence_level(self, request) -> str: method get_completion_message (line 427) | def get_completion_message(self) -> str: method get_skip_reason (line 437) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 441) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 445) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 449) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 469) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 483) | def get_step_guidance_message(self, request) -> str: method get_analyze_step_guidance (line 490) | def get_analyze_step_guidance(self, step_number: int, request) -> dict... method customize_workflow_response (line 527) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 577) | def get_request_model(self): method prepare_prompt (line 581) | async def prepare_prompt(self, request) -> str: FILE: tools/apilookup.py class LookupRequest (line 23) | class LookupRequest(ToolRequest): class LookupTool (line 70) | class LookupTool(SimpleTool): method get_name (line 73) | def get_name(self) -> str: method get_description (line 76) | def get_description(self) -> str: method get_system_prompt (line 82) | def get_system_prompt(self) -> str: method get_default_temperature (line 85) | def get_default_temperature(self) -> float: method requires_model (line 88) | def requires_model(self) -> bool: method get_model_category (line 91) | def get_model_category(self) -> ToolModelCategory: method get_request_model (line 96) | def get_request_model(self): method get_tool_fields (line 99) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method prepare_prompt (line 107) | async def prepare_prompt(self, request) -> str: # pragma: no cover - ... method get_input_schema (line 110) | def get_input_schema(self) -> dict[str, Any]: method execute (line 122) | async def execute(self, arguments: dict[str, Any]) -> list: FILE: tools/challenge.py class ChallengeRequest (line 33) | class ChallengeRequest(ToolRequest): class ChallengeTool (line 39) | class ChallengeTool(SimpleTool): method get_name (line 52) | def get_name(self) -> str: method get_description (line 55) | def get_description(self) -> str: method get_system_prompt (line 61) | def get_system_prompt(self) -> str: method get_default_temperature (line 65) | def get_default_temperature(self) -> float: method get_model_category (line 68) | def get_model_category(self) -> "ToolModelCategory": method requires_model (line 74) | def requires_model(self) -> bool: method get_request_model (line 86) | def get_request_model(self): method get_input_schema (line 90) | def get_input_schema(self) -> dict[str, Any]: method execute (line 109) | async def execute(self, arguments: dict[str, Any]) -> list: method _wrap_prompt_for_challenge (line 158) | def _wrap_prompt_for_challenge(self, prompt: str) -> str: method prepare_prompt (line 179) | async def prepare_prompt(self, request: ChallengeRequest) -> str: method format_response (line 183) | def format_response(self, response: str, request: ChallengeRequest, mo... method get_tool_fields (line 187) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_fields (line 196) | def get_required_fields(self) -> list[str]: FILE: tools/chat.py class ChatRequest (line 42) | class ChatRequest(ToolRequest): class ChatTool (line 57) | class ChatTool(SimpleTool): method __init__ (line 68) | def __init__(self) -> None: method get_name (line 72) | def get_name(self) -> str: method get_description (line 75) | def get_description(self) -> str: method get_annotations (line 81) | def get_annotations(self) -> Optional[dict[str, Any]]: method get_system_prompt (line 86) | def get_system_prompt(self) -> str: method get_capability_system_prompts (line 89) | def get_capability_system_prompts(self, capabilities: Optional["ModelC... method get_default_temperature (line 95) | def get_default_temperature(self) -> float: method get_model_category (line 98) | def get_model_category(self) -> "ToolModelCategory": method get_request_model (line 104) | def get_request_model(self): method get_input_schema (line 110) | def get_input_schema(self) -> dict[str, Any]: method get_tool_fields (line 161) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_fields (line 185) | def get_required_fields(self) -> list[str]: method prepare_prompt (line 191) | async def prepare_prompt(self, request: ChatRequest) -> str: method _validate_file_paths (line 201) | def _validate_file_paths(self, request) -> Optional[str]: method format_response (line 236) | def format_response(self, response: str, request: ChatRequest, model_i... method _record_assistant_turn (line 300) | def _record_assistant_turn( method _model_supports_code_generation (line 309) | def _model_supports_code_generation(self) -> bool: method _extract_generated_code_block (line 321) | def _extract_generated_code_block(self, text: str) -> tuple[Optional[s... method _persist_generated_code_block (line 336) | def _persist_generated_code_block(self, block: str, working_directory:... method _build_agent_instruction (line 355) | def _build_agent_instruction(artifact_path: Path) -> str: method _join_sections (line 373) | def _join_sections(*sections: str) -> str: method get_websearch_guidance (line 382) | def get_websearch_guidance(self) -> str: FILE: tools/clink.py class CLinkRequest (line 29) | class CLinkRequest(BaseModel): class CLinkTool (line 55) | class CLinkTool(SimpleTool): method __init__ (line 63) | def __init__(self) -> None: method get_name (line 76) | def get_name(self) -> str: method get_description (line 79) | def get_description(self) -> str: method get_annotations (line 85) | def get_annotations(self) -> dict[str, Any]: method requires_model (line 88) | def requires_model(self) -> bool: method get_model_category (line 91) | def get_model_category(self) -> ToolModelCategory: method get_default_temperature (line 94) | def get_default_temperature(self) -> float: method get_system_prompt (line 97) | def get_system_prompt(self) -> str: method get_request_model (line 100) | def get_request_model(self): method get_input_schema (line 103) | def get_input_schema(self) -> dict[str, Any]: method get_tool_fields (line 160) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method execute (line 164) | async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: method prepare_prompt (line 261) | async def prepare_prompt(self, request) -> str: method _prepare_prompt_for_role (line 273) | async def _prepare_prompt_for_role( method _use_external_system_prompt (line 301) | def _use_external_system_prompt(self, client: ResolvedCLIClient) -> bool: method _build_success_metadata (line 305) | def _build_success_metadata( method _merge_metadata (line 328) | def _merge_metadata(self, base: dict[str, Any] | None, extra: dict[str... method _apply_output_limit (line 333) | def _apply_output_limit( method _extract_summary (line 399) | def _extract_summary(self, content: str) -> str | None: method _prune_metadata (line 406) | def _prune_metadata( method _build_error_metadata (line 425) | def _build_error_metadata(self, client: ResolvedCLIClient, exc: CLIAge... method _raise_tool_error (line 437) | def _raise_tool_error(self, message: str, metadata: dict[str, Any] | N... method _agent_capabilities_guidance (line 441) | def _agent_capabilities_guidance(self) -> str: method _format_file_references (line 449) | def _format_file_references(self, files: list[str]) -> str: FILE: tools/codereview.py class CodeReviewRequest (line 64) | class CodeReviewRequest(WorkflowRequest): method validate_step_one_requirements (line 111) | def validate_step_one_requirements(self): class CodeReviewTool (line 118) | class CodeReviewTool(WorkflowTool): method __init__ (line 128) | def __init__(self): method get_name (line 133) | def get_name(self) -> str: method get_description (line 136) | def get_description(self) -> str: method get_system_prompt (line 143) | def get_system_prompt(self) -> str: method get_default_temperature (line 146) | def get_default_temperature(self) -> float: method get_model_category (line 149) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 155) | def get_workflow_request_model(self): method get_input_schema (line 159) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 244) | def get_required_actions( method should_call_expert_analysis (line 306) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 329) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_code_review_summary (line 376) | def _build_code_review_summary(self, consolidated_findings) -> str: method should_include_files_in_expert_prompt (line 394) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 398) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 402) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 406) | def get_expert_analysis_instruction(self) -> str: method prepare_step_data (line 417) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 436) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 451) | def store_initial_issue(self, step_description: str): method get_review_validation_type (line 457) | def get_review_validation_type(self, request) -> str: method get_completion_status (line 464) | def get_completion_status(self) -> str: method get_completion_data_key (line 468) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 472) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 476) | def get_confidence_level(self, request) -> str: method get_completion_message (line 480) | def get_completion_message(self) -> str: method get_skip_reason (line 489) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 493) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 497) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 501) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 521) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 534) | def get_step_guidance_message(self, request) -> str: method get_code_review_step_guidance (line 541) | def get_code_review_step_guidance(self, step_number: int, request) -> ... method customize_workflow_response (line 666) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 718) | def get_request_model(self): method prepare_prompt (line 722) | async def prepare_prompt(self, request) -> str: FILE: tools/consensus.py class ConsensusRequest (line 62) | class ConsensusRequest(WorkflowRequest): method validate_step_one_requirements (line 106) | def validate_step_one_requirements(self): class ConsensusTool (line 129) | class ConsensusTool(WorkflowTool): method __init__ (line 138) | def __init__(self): method get_name (line 146) | def get_name(self) -> str: method get_description (line 149) | def get_description(self) -> str: method get_system_prompt (line 156) | def get_system_prompt(self) -> str: method get_default_temperature (line 178) | def get_default_temperature(self) -> float: method get_model_category (line 181) | def get_model_category(self) -> ToolModelCategory: method get_workflow_request_model (line 187) | def get_workflow_request_model(self): method get_input_schema (line 191) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 318) | def get_required_actions( method should_call_expert_analysis (line 348) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 352) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method requires_expert_analysis (line 356) | def requires_expert_analysis(self) -> bool: method requires_model (line 360) | def requires_model(self) -> bool: method prepare_step_data (line 373) | def prepare_step_data(self, request) -> dict: method handle_work_completion (line 389) | async def handle_work_completion(self, response_data: dict, request, a... method handle_work_continuation (line 413) | def handle_work_continuation(self, response_data: dict, request) -> dict: method execute_workflow (line 436) | async def execute_workflow(self, arguments: dict[str, Any]) -> list: method _build_continuation_offer (line 547) | def _build_continuation_offer(self, continuation_id: str) -> dict[str,... method _consult_model (line 574) | async def _consult_model(self, model_config: dict, request) -> dict: method _get_stance_enhanced_prompt (line 647) | def _get_stance_enhanced_prompt(self, stance: str, custom_stance_promp... method customize_workflow_response (line 724) | def customize_workflow_response(self, response_data: dict, request) ->... method _customize_consensus_metadata (line 743) | def _customize_consensus_metadata(self, response_data: dict, request) ... method _add_workflow_metadata (line 798) | def _add_workflow_metadata(self, response_data: dict, arguments: dict[... method store_initial_issue (line 822) | def store_initial_issue(self, step_description: str): method get_request_model (line 828) | def get_request_model(self): method prepare_prompt (line 832) | async def prepare_prompt(self, request) -> str: # noqa: ARG002 FILE: tools/debug.py class DebugInvestigationRequest (line 72) | class DebugInvestigationRequest(WorkflowRequest): class DebugIssueTool (line 103) | class DebugIssueTool(WorkflowTool): method __init__ (line 113) | def __init__(self): method get_name (line 117) | def get_name(self) -> str: method get_description (line 120) | def get_description(self) -> str: method get_system_prompt (line 127) | def get_system_prompt(self) -> str: method get_default_temperature (line 130) | def get_default_temperature(self) -> float: method get_model_category (line 133) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 139) | def get_workflow_request_model(self): method get_input_schema (line 143) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 205) | def get_required_actions( method should_call_expert_analysis (line 250) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 267) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_investigation_summary (line 327) | def _build_investigation_summary(self, consolidated_findings) -> str: method _extract_error_context (line 344) | def _extract_error_context(self, consolidated_findings) -> Optional[str]: method get_step_guidance (line 355) | def get_step_guidance(self, step_number: int, confidence: str, request... method prepare_step_data (line 419) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 437) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method get_completion_status (line 445) | def get_completion_status(self) -> str: method get_completion_data_key (line 449) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 453) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 457) | def get_confidence_level(self, request) -> str: method get_completion_message (line 461) | def get_completion_message(self) -> str: method get_skip_reason (line 470) | def get_skip_reason(self) -> str: method get_request_relevant_context (line 474) | def get_request_relevant_context(self, request) -> list: method get_skip_expert_analysis_status (line 481) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 485) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 489) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 512) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 528) | def get_step_guidance_message(self, request) -> str: method customize_workflow_response (line 535) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 576) | def get_request_model(self): method prepare_prompt (line 580) | async def prepare_prompt(self, request) -> str: FILE: tools/docgen.py class DocgenRequest (line 58) | class DocgenRequest(WorkflowRequest): class DocgenTool (line 85) | class DocgenTool(WorkflowTool): method __init__ (line 98) | def __init__(self): method get_name (line 102) | def get_name(self) -> str: method get_description (line 105) | def get_description(self) -> str: method get_system_prompt (line 112) | def get_system_prompt(self) -> str: method get_default_temperature (line 115) | def get_default_temperature(self) -> float: method get_model_category (line 118) | def get_model_category(self) -> "ToolModelCategory": method requires_model (line 124) | def requires_model(self) -> bool: method requires_expert_analysis (line 136) | def requires_expert_analysis(self) -> bool: method get_workflow_request_model (line 140) | def get_workflow_request_model(self): method get_tool_fields (line 144) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_fields (line 181) | def get_required_fields(self) -> list[str]: method get_input_schema (line 192) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 221) | def get_required_actions( method should_call_expert_analysis (line 284) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 288) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method get_step_guidance (line 292) | def get_step_guidance(self, step_number: int, confidence: str, request... method handle_work_completion (line 360) | async def handle_work_completion(self, response_data: dict, request, a... method prepare_step_data (line 393) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 431) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method get_completion_status (line 439) | def get_completion_status(self) -> str: method get_completion_data_key (line 443) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 447) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 451) | def get_confidence_level(self, request) -> str: method get_completion_message (line 455) | def get_completion_message(self) -> str: method get_skip_reason (line 464) | def get_skip_reason(self) -> str: method get_request_relevant_context (line 468) | def get_request_relevant_context(self, request) -> list: method get_request_num_files_documented (line 475) | def get_request_num_files_documented(self, request) -> int: method get_request_total_files_to_document (line 482) | def get_request_total_files_to_document(self, request) -> int: method get_skip_expert_analysis_status (line 489) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 493) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 500) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_step_guidance_message (line 519) | def get_step_guidance_message(self, request) -> str: method customize_workflow_response (line 526) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 569) | def get_request_model(self): method prepare_prompt (line 573) | async def prepare_prompt(self, request) -> str: FILE: tools/listmodels.py class ListModelsTool (line 24) | class ListModelsTool(BaseTool): method get_name (line 35) | def get_name(self) -> str: method get_description (line 38) | def get_description(self) -> str: method get_input_schema (line 41) | def get_input_schema(self) -> dict[str, Any]: method get_annotations (line 50) | def get_annotations(self) -> Optional[dict[str, Any]]: method get_system_prompt (line 54) | def get_system_prompt(self) -> str: method get_request_model (line 58) | def get_request_model(self): method requires_model (line 62) | def requires_model(self) -> bool: method prepare_prompt (line 65) | async def prepare_prompt(self, request: ToolRequest) -> str: method format_response (line 69) | def format_response(self, response: str, request: ToolRequest, model_i... method execute (line 73) | async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: method get_model_category (line 401) | def get_model_category(self) -> ToolModelCategory: FILE: tools/models.py class ToolModelCategory (line 11) | class ToolModelCategory(Enum): class ContinuationOffer (line 19) | class ContinuationOffer(BaseModel): class ToolOutput (line 29) | class ToolOutput(BaseModel): class FilesNeededRequest (line 55) | class FilesNeededRequest(BaseModel): class FullCodereviewRequired (line 69) | class FullCodereviewRequired(BaseModel): class FocusedReviewRequired (line 77) | class FocusedReviewRequired(BaseModel): class TestSampleNeeded (line 87) | class TestSampleNeeded(BaseModel): class MoreTestsRequired (line 94) | class MoreTestsRequired(BaseModel): class RefactorOpportunity (line 101) | class RefactorOpportunity(BaseModel): class RefactorAction (line 124) | class RefactorAction(BaseModel): class RefactorAnalysisComplete (line 135) | class RefactorAnalysisComplete(BaseModel): class CodeTooLargeRequest (line 144) | class CodeTooLargeRequest(BaseModel): class ResendPromptRequest (line 153) | class ResendPromptRequest(BaseModel): class TraceEntryPoint (line 162) | class TraceEntryPoint(BaseModel): class TraceTarget (line 172) | class TraceTarget(BaseModel): class CallPathStep (line 181) | class CallPathStep(BaseModel): class BranchingPoint (line 191) | class BranchingPoint(BaseModel): class SideEffect (line 202) | class SideEffect(BaseModel): class UnresolvedDependency (line 212) | class UnresolvedDependency(BaseModel): class IncomingDependency (line 220) | class IncomingDependency(BaseModel): class OutgoingDependency (line 230) | class OutgoingDependency(BaseModel): class TypeDependency (line 240) | class TypeDependency(BaseModel): class StateAccess (line 249) | class StateAccess(BaseModel): class TraceComplete (line 258) | class TraceComplete(BaseModel): class DiagnosticHypothesis (line 285) | class DiagnosticHypothesis(BaseModel): class StructuredDebugResponse (line 295) | class StructuredDebugResponse(BaseModel): class DebugHypothesis (line 310) | class DebugHypothesis(BaseModel): class DebugAnalysisComplete (line 324) | class DebugAnalysisComplete(BaseModel): class NoBugFound (line 343) | class NoBugFound(BaseModel): FILE: tools/planner.py class PlannerRequest (line 57) | class PlannerRequest(WorkflowRequest): method validate_step_number (line 95) | def validate_step_number(cls, v): method validate_total_steps (line 102) | def validate_total_steps(cls, v): class PlannerTool (line 108) | class PlannerTool(WorkflowTool): method __init__ (line 122) | def __init__(self): method get_name (line 126) | def get_name(self) -> str: method get_description (line 129) | def get_description(self) -> str: method get_system_prompt (line 136) | def get_system_prompt(self) -> str: method get_default_temperature (line 139) | def get_default_temperature(self) -> float: method get_model_category (line 142) | def get_model_category(self) -> "ToolModelCategory": method requires_model (line 148) | def requires_model(self) -> bool: method get_workflow_request_model (line 160) | def get_workflow_request_model(self): method get_input_schema (line 164) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 237) | def get_required_actions( method should_call_expert_analysis (line 274) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 278) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method requires_expert_analysis (line 282) | def requires_expert_analysis(self) -> bool: method prepare_step_data (line 290) | def prepare_step_data(self, request) -> dict: method build_base_response (line 315) | def build_base_response(self, request, continuation_id: str = None) ->... method handle_work_continuation (line 355) | def handle_work_continuation(self, response_data: dict, request) -> dict: method customize_workflow_response (line 415) | def customize_workflow_response(self, response_data: dict, request) ->... method get_completion_status (line 490) | def get_completion_status(self) -> str: method get_completion_data_key (line 494) | def get_completion_data_key(self) -> str: method get_completion_message (line 498) | def get_completion_message(self) -> str: method get_skip_reason (line 505) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 509) | def get_skip_expert_analysis_status(self) -> str: method store_initial_issue (line 513) | def store_initial_issue(self, step_description: str): method get_initial_request (line 517) | def get_initial_request(self, fallback_step: str) -> str: method get_request_model (line 525) | def get_request_model(self): method prepare_prompt (line 529) | async def prepare_prompt(self, request) -> str: FILE: tools/precommit.py class PrecommitRequest (line 64) | class PrecommitRequest(WorkflowRequest): method validate_step_one_requirements (line 112) | def validate_step_one_requirements(self): class PrecommitTool (line 119) | class PrecommitTool(WorkflowTool): method __init__ (line 129) | def __init__(self): method get_name (line 134) | def get_name(self) -> str: method get_description (line 137) | def get_description(self) -> str: method get_system_prompt (line 144) | def get_system_prompt(self) -> str: method get_default_temperature (line 147) | def get_default_temperature(self) -> float: method get_model_category (line 150) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 156) | def get_workflow_request_model(self): method get_input_schema (line 160) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 253) | def get_required_actions( method should_call_expert_analysis (line 352) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 374) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_precommit_summary (line 420) | def _build_precommit_summary(self, consolidated_findings) -> str: method should_include_files_in_expert_prompt (line 438) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 442) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 446) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 450) | def get_expert_analysis_instruction(self) -> str: method prepare_step_data (line 460) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 479) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 492) | def store_initial_issue(self, step_description: str): method get_completion_status (line 498) | def get_completion_status(self) -> str: method get_completion_data_key (line 502) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 506) | def get_final_analysis_from_request(self, request): method get_precommit_type (line 510) | def get_precommit_type(self, request) -> str: method get_consolidated_issues_count (line 517) | def get_consolidated_issues_count(self) -> int: method get_completion_message (line 524) | def get_completion_message(self) -> str: method get_skip_reason (line 533) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 539) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 543) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 547) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 570) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 585) | def get_step_guidance_message(self, request) -> str: method get_precommit_step_guidance (line 592) | def get_precommit_step_guidance(self, step_number: int, request) -> di... method customize_workflow_response (line 723) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 770) | def get_request_model(self): method prepare_prompt (line 774) | async def prepare_prompt(self, request) -> str: FILE: tools/refactor.py class RefactorRequest (line 94) | class RefactorRequest(WorkflowRequest): method validate_step_one_requirements (line 132) | def validate_step_one_requirements(self): class RefactorTool (line 141) | class RefactorTool(WorkflowTool): method __init__ (line 152) | def __init__(self): method get_name (line 157) | def get_name(self) -> str: method get_description (line 160) | def get_description(self) -> str: method get_system_prompt (line 167) | def get_system_prompt(self) -> str: method get_default_temperature (line 170) | def get_default_temperature(self) -> float: method get_model_category (line 173) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 179) | def get_workflow_request_model(self): method get_input_schema (line 183) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 265) | def get_required_actions( method should_call_expert_analysis (line 311) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 332) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_refactoring_summary (line 381) | def _build_refactoring_summary(self, consolidated_findings) -> str: method should_include_files_in_expert_prompt (line 399) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 403) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 407) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 411) | def get_expert_analysis_instruction(self) -> str: method prepare_step_data (line 422) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 440) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 446) | def store_initial_issue(self, step_description: str): method get_completion_status (line 454) | def get_completion_status(self) -> str: method get_completion_data_key (line 458) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 462) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 466) | def get_confidence_level(self, request) -> str: method get_completion_message (line 470) | def get_completion_message(self) -> str: method get_skip_reason (line 480) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 484) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 488) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 492) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 516) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 532) | def get_step_guidance_message(self, request) -> str: method get_refactor_step_guidance (line 539) | def get_refactor_step_guidance(self, step_number: int, confidence: str... method customize_workflow_response (line 587) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 639) | def get_request_model(self): method prepare_prompt (line 643) | async def prepare_prompt(self, request) -> str: FILE: tools/secaudit.py class SecauditRequest (line 59) | class SecauditRequest(WorkflowRequest): method validate_security_audit_request (line 103) | def validate_security_audit_request(self): class SecauditTool (line 119) | class SecauditTool(WorkflowTool): method __init__ (line 129) | def __init__(self): method get_name (line 134) | def get_name(self) -> str: method get_description (line 138) | def get_description(self) -> str: method get_system_prompt (line 146) | def get_system_prompt(self) -> str: method get_default_temperature (line 150) | def get_default_temperature(self) -> float: method get_model_category (line 154) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 160) | def get_workflow_request_model(self) -> type: method get_tool_fields (line 164) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_actions (line 173) | def get_required_actions( method should_call_expert_analysis (line 231) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 249) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _format_security_issues (line 305) | def _format_security_issues(self, issues_found: list[dict]) -> str: method _build_security_audit_summary (line 334) | def _build_security_audit_summary(self, consolidated_findings) -> str: method get_input_schema (line 352) | def get_input_schema(self) -> dict[str, Any]: method prepare_step_data (line 445) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 472) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 476) | def store_initial_issue(self, step_description: str): method should_include_files_in_expert_prompt (line 480) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 484) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 488) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 492) | def get_expert_analysis_instruction(self) -> str: method get_completion_next_steps_message (line 501) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 521) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 534) | def get_step_guidance_message(self, request) -> str: method get_security_audit_step_guidance (line 541) | def get_security_audit_step_guidance(self, step_number: int, confidenc... method customize_workflow_response (line 588) | def customize_workflow_response(self, response_data: dict, request) ->... method get_completion_status (line 642) | def get_completion_status(self) -> str: method get_completion_data_key (line 646) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 650) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 654) | def get_confidence_level(self, request) -> str: method get_completion_message (line 658) | def get_completion_message(self) -> str: method get_skip_reason (line 667) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 671) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 675) | def prepare_work_summary(self) -> str: method get_request_model (line 679) | def get_request_model(self): method prepare_prompt (line 683) | async def prepare_prompt(self, request: SecauditRequest) -> str: FILE: tools/shared/base_models.py class ToolRequest (line 60) | class ToolRequest(BaseModel): class BaseWorkflowRequest (line 81) | class BaseWorkflowRequest(ToolRequest): class WorkflowRequest (line 96) | class WorkflowRequest(BaseWorkflowRequest): method convert_string_to_list (line 128) | def convert_string_to_list(cls, v): class ConsolidatedFindings (line 136) | class ConsolidatedFindings(BaseModel): FILE: tools/shared/base_tool.py class BaseTool (line 46) | class BaseTool(ABC): method _get_openrouter_registry (line 89) | def _get_openrouter_registry(cls): method _get_custom_registry (line 100) | def _get_custom_registry(cls): method __init__ (line 109) | def __init__(self): method get_name (line 117) | def get_name(self) -> str: method get_description (line 130) | def get_description(self) -> str: method get_input_schema (line 144) | def get_input_schema(self) -> dict[str, Any]: method get_system_prompt (line 157) | def get_system_prompt(self) -> str: method get_capability_system_prompts (line 169) | def get_capability_system_prompts(self, capabilities: Optional["ModelC... method _augment_system_prompt_with_capabilities (line 186) | def _augment_system_prompt_with_capabilities( method get_annotations (line 205) | def get_annotations(self) -> Optional[dict[str, Any]]: method requires_model (line 218) | def requires_model(self) -> bool: method is_effective_auto_mode (line 230) | def is_effective_auto_mode(self) -> bool: method _should_require_model_selection (line 255) | def _should_require_model_selection(self, model_name: str) -> bool: method _get_available_models (line 283) | def _get_available_models(self) -> list[str]: method _format_available_models_list (line 336) | def _format_available_models_list(self) -> str: method _format_context_window (line 352) | def _format_context_window(tokens: int) -> Optional[str]: method _collect_ranked_capabilities (line 370) | def _collect_ranked_capabilities(self) -> list[tuple[int, str, Any]]: method _normalize_model_identifier (line 395) | def _normalize_model_identifier(name: str) -> str: method _get_ranked_model_summaries (line 405) | def _get_ranked_model_summaries(self, limit: int = 5) -> tuple[list[st... method _get_restriction_note (line 470) | def _get_restriction_note(self) -> Optional[str]: method _build_model_unavailable_message (line 498) | def _build_model_unavailable_message(self, model_name: str) -> str: method _build_auto_mode_required_message (line 512) | def _build_auto_mode_required_message(self) -> str: method get_model_field_schema (line 526) | def get_model_field_schema(self) -> dict[str, Any]: method get_default_temperature (line 590) | def get_default_temperature(self) -> float: method wants_line_numbers_by_default (line 602) | def wants_line_numbers_by_default(self) -> bool: method get_default_thinking_mode (line 614) | def get_default_thinking_mode(self) -> str: method get_model_category (line 626) | def get_model_category(self) -> "ToolModelCategory": method get_request_model (line 642) | def get_request_model(self): method validate_file_paths (line 654) | def validate_file_paths(self, request) -> Optional[str]: method _validate_token_limit (line 696) | def _validate_token_limit(self, content: str, content_type: str = "Con... method get_model_provider (line 731) | def get_model_provider(self, model_name: str) -> ModelProvider: method get_conversation_embedded_files (line 760) | def get_conversation_embedded_files(self, continuation_id: Optional[st... method filter_new_files (line 788) | def filter_new_files(self, requested_files: list[str], continuation_id... method format_conversation_turn (line 851) | def format_conversation_turn(self, turn: ConversationTurn) -> list[str]: method handle_prompt_file (line 886) | def handle_prompt_file(self, files: Optional[list[str]]) -> tuple[Opti... method get_prompt_content_for_size_validation (line 948) | def get_prompt_content_for_size_validation(self, user_content: str) ->... method check_prompt_size (line 965) | def check_prompt_size(self, text: str) -> Optional[dict[str, Any]]: method _prepare_file_content_for_prompt (line 999) | def _prepare_file_content_for_prompt( method get_websearch_instruction (line 1166) | def get_websearch_instruction(self, tool_specific: Optional[str] = Non... method get_language_instruction (line 1213) | def get_language_instruction(self) -> str: method prepare_prompt (line 1235) | async def prepare_prompt(self, request) -> str: method format_response (line 1253) | def format_response(self, response: str, request, model_info: dict = N... method execute (line 1277) | async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: method _should_require_model_selection (line 1283) | def _should_require_model_selection(self, model_name: str) -> bool: method _get_available_models (line 1310) | def _get_available_models(self) -> list[str]: method _resolve_model_context (line 1363) | def _resolve_model_context(self, arguments: dict, request) -> tuple[st... method validate_and_correct_temperature (line 1414) | def validate_and_correct_temperature(self, temperature: float, model_c... method _validate_image_limits (line 1452) | def _validate_image_limits( method _parse_response (line 1603) | def _parse_response(self, raw_text: str, request, model_info: Optional... FILE: tools/shared/exceptions.py class ToolExecutionError (line 11) | class ToolExecutionError(RuntimeError): method __init__ (line 14) | def __init__(self, payload: str): FILE: tools/shared/schema_builders.py class SchemaBuilder (line 14) | class SchemaBuilder: method build_schema (line 56) | def build_schema( method get_common_fields (line 110) | def get_common_fields() -> dict[str, dict[str, Any]]: method create_field_schema (line 115) | def create_field_schema( FILE: tools/simple/base.py class SimpleTool (line 24) | class SimpleTool(BaseTool): method get_tool_fields (line 65) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_fields (line 92) | def get_required_fields(self) -> list[str]: method get_annotations (line 104) | def get_annotations(self) -> Optional[dict[str, Any]]: method format_response (line 119) | def format_response(self, response: str, request, model_info: Optional... method get_input_schema (line 136) | def get_input_schema(self) -> dict[str, Any]: method get_request_model (line 160) | def get_request_model(self): method get_request_model_name (line 171) | def get_request_model_name(self, request) -> Optional[str]: method get_request_images (line 178) | def get_request_images(self, request) -> list: method get_request_continuation_id (line 185) | def get_request_continuation_id(self, request) -> Optional[str]: method get_request_prompt (line 192) | def get_request_prompt(self, request) -> str: method get_request_temperature (line 199) | def get_request_temperature(self, request) -> Optional[float]: method get_validated_temperature (line 206) | def get_validated_temperature(self, request, model_context: Any) -> tu... method get_request_thinking_mode (line 225) | def get_request_thinking_mode(self, request) -> Optional[str]: method get_request_files (line 232) | def get_request_files(self, request) -> list: method get_request_as_dict (line 242) | def get_request_as_dict(self, request) -> dict: method set_request_files (line 255) | def set_request_files(self, request, files: list) -> None: method get_actually_processed_files (line 262) | def get_actually_processed_files(self) -> list: method execute (line 269) | async def execute(self, arguments: dict[str, Any]) -> list: method _parse_response (line 590) | def _parse_response(self, raw_text: str, request, model_info: Optional... method _create_continuation_offer (line 637) | def _create_continuation_offer(self, request, model_info: Optional[dic... method _create_continuation_offer_response (line 687) | def _create_continuation_offer_response( method _record_assistant_turn (line 737) | def _record_assistant_turn( method build_standard_prompt (line 780) | def build_standard_prompt( method get_prompt_content_for_size_validation (line 832) | def get_prompt_content_for_size_validation(self, user_content: str) ->... method get_websearch_guidance (line 858) | def get_websearch_guidance(self) -> Optional[str]: method handle_prompt_file_with_fallback (line 870) | def handle_prompt_file_with_fallback(self, request) -> str: method get_chat_style_websearch_guidance (line 911) | def get_chat_style_websearch_guidance(self) -> str: method supports_custom_request_model (line 927) | def supports_custom_request_model(self) -> bool: method _validate_file_paths (line 940) | def _validate_file_paths(self, request) -> Optional[str]: method prepare_chat_style_prompt (line 968) | def prepare_chat_style_prompt(self, request, system_prompt: str = None... FILE: tools/testgen.py class TestGenRequest (line 58) | class TestGenRequest(WorkflowRequest): method validate_step_one_requirements (line 88) | def validate_step_one_requirements(self): class TestGenTool (line 95) | class TestGenTool(WorkflowTool): method __init__ (line 107) | def __init__(self): method get_name (line 111) | def get_name(self) -> str: method get_description (line 114) | def get_description(self) -> str: method get_system_prompt (line 121) | def get_system_prompt(self) -> str: method get_default_temperature (line 124) | def get_default_temperature(self) -> float: method get_model_category (line 127) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 133) | def get_workflow_request_model(self): method get_input_schema (line 137) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 195) | def get_required_actions( method should_call_expert_analysis (line 239) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 252) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method _build_test_generation_summary (line 276) | def _build_test_generation_summary(self, consolidated_findings) -> str: method should_include_files_in_expert_prompt (line 293) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 297) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 301) | def get_expert_thinking_mode(self) -> str: method get_expert_analysis_instruction (line 305) | def get_expert_analysis_instruction(self) -> str: method prepare_step_data (line 316) | def prepare_step_data(self, request) -> dict: method should_skip_expert_analysis (line 332) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method store_initial_issue (line 338) | def store_initial_issue(self, step_description: str): method get_completion_status (line 344) | def get_completion_status(self) -> str: method get_completion_data_key (line 348) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 352) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 356) | def get_confidence_level(self, request) -> str: method get_completion_message (line 360) | def get_completion_message(self) -> str: method get_skip_reason (line 369) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 373) | def get_skip_expert_analysis_status(self) -> str: method prepare_work_summary (line 377) | def prepare_work_summary(self) -> str: method get_completion_next_steps_message (line 381) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 401) | def get_expert_analysis_guidance(self) -> str: method get_step_guidance_message (line 413) | def get_step_guidance_message(self, request) -> str: method get_test_generation_step_guidance (line 420) | def get_test_generation_step_guidance(self, step_number: int, confiden... method customize_workflow_response (line 467) | def customize_workflow_response(self, response_data: dict, request) ->... method get_request_model (line 507) | def get_request_model(self): method prepare_prompt (line 511) | async def prepare_prompt(self, request) -> str: FILE: tools/thinkdeep.py class ThinkDeepWorkflowRequest (line 33) | class ThinkDeepWorkflowRequest(WorkflowRequest): class ThinkDeepTool (line 97) | class ThinkDeepTool(WorkflowTool): method __init__ (line 112) | def __init__(self): method get_name (line 118) | def get_name(self) -> str: method get_description (line 122) | def get_description(self) -> str: method get_model_category (line 126) | def get_model_category(self) -> "ToolModelCategory": method get_workflow_request_model (line 132) | def get_workflow_request_model(self): method get_input_schema (line 136) | def get_input_schema(self) -> dict[str, Any]: method get_system_prompt (line 161) | def get_system_prompt(self) -> str: method get_default_temperature (line 165) | def get_default_temperature(self) -> float: method get_default_thinking_mode (line 169) | def get_default_thinking_mode(self) -> str: method customize_workflow_response (line 175) | def customize_workflow_response(self, response_data: dict, request, **... method should_skip_expert_analysis (line 232) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method get_completion_status (line 238) | def get_completion_status(self) -> str: method get_completion_data_key (line 242) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 246) | def get_final_analysis_from_request(self, request): method get_skip_expert_analysis_status (line 250) | def get_skip_expert_analysis_status(self) -> str: method get_skip_reason (line 254) | def get_skip_reason(self) -> str: method get_completion_message (line 258) | def get_completion_message(self) -> str: method customize_expert_analysis_prompt (line 262) | def customize_expert_analysis_prompt(self, base_prompt: str, request, ... method get_expert_analysis_instructions (line 301) | def get_expert_analysis_instructions(self) -> str: method get_request_temperature (line 315) | def get_request_temperature(self, request) -> float: method get_request_thinking_mode (line 325) | def get_request_thinking_mode(self, request) -> str: method _get_problem_context (line 335) | def _get_problem_context(self, request) -> str: method _get_focus_areas (line 342) | def _get_focus_areas(self, request) -> list[str]: method get_required_actions (line 349) | def get_required_actions( method should_call_expert_analysis (line 410) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 436) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method get_step_guidance_message (line 469) | def get_step_guidance_message(self, request) -> str: method format_final_response (line 523) | def format_final_response(self, assistant_response: str, request, **kw... method format_step_response (line 546) | def format_step_response( method get_request_model (line 574) | def get_request_model(self): method prepare_prompt (line 578) | async def prepare_prompt(self, request) -> str: FILE: tools/tracer.py class TracerRequest (line 84) | class TracerRequest(WorkflowRequest): method validate_step_number (line 125) | def validate_step_number(cls, v): method validate_total_steps (line 132) | def validate_total_steps(cls, v): class TracerTool (line 138) | class TracerTool(WorkflowTool): method __init__ (line 148) | def __init__(self): method get_name (line 153) | def get_name(self) -> str: method get_description (line 156) | def get_description(self) -> str: method get_system_prompt (line 163) | def get_system_prompt(self) -> str: method get_default_temperature (line 166) | def get_default_temperature(self) -> float: method get_model_category (line 169) | def get_model_category(self) -> "ToolModelCategory": method requires_model (line 175) | def requires_model(self) -> bool: method get_workflow_request_model (line 187) | def get_workflow_request_model(self): method get_tool_fields (line 191) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_input_schema (line 211) | def get_input_schema(self) -> dict[str, Any]: method get_required_actions (line 242) | def get_required_actions( method should_call_expert_analysis (line 292) | def should_call_expert_analysis(self, consolidated_findings, request=N... method prepare_expert_analysis_context (line 296) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method requires_expert_analysis (line 300) | def requires_expert_analysis(self) -> bool: method prepare_step_data (line 308) | def prepare_step_data(self, request) -> dict: method build_base_response (line 329) | def build_base_response(self, request, continuation_id: str = None) ->... method handle_work_continuation (line 363) | def handle_work_continuation(self, response_data: dict, request) -> dict: method customize_workflow_response (line 432) | def customize_workflow_response(self, response_data: dict, request) ->... method _get_rendering_instructions (line 503) | def _get_rendering_instructions(self, trace_mode: str) -> str: method _get_precision_rendering_instructions (line 518) | def _get_precision_rendering_instructions(self) -> str: method _get_dependencies_rendering_instructions (line 624) | def _get_dependencies_rendering_instructions(self) -> str: method get_completion_status (line 706) | def get_completion_status(self) -> str: method get_completion_data_key (line 710) | def get_completion_data_key(self) -> str: method get_completion_message (line 714) | def get_completion_message(self) -> str: method get_skip_reason (line 721) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 725) | def get_skip_expert_analysis_status(self) -> str: method store_initial_issue (line 729) | def store_initial_issue(self, step_description: str): method get_initial_request (line 733) | def get_initial_request(self, fallback_step: str) -> str: method get_request_confidence (line 740) | def get_request_confidence(self, request) -> str: method get_trace_mode (line 747) | def get_trace_mode(self) -> str: method get_request_model (line 755) | def get_request_model(self): method prepare_prompt (line 759) | async def prepare_prompt(self, request) -> str: FILE: tools/version.py function parse_version (line 34) | def parse_version(version_str: str) -> tuple[int, int, int]: function compare_versions (line 58) | def compare_versions(current: str, remote: str) -> int: function fetch_github_version (line 82) | def fetch_github_version() -> Optional[tuple[str, str]]: class VersionTool (line 127) | class VersionTool(BaseTool): method get_name (line 139) | def get_name(self) -> str: method get_description (line 142) | def get_description(self) -> str: method get_input_schema (line 145) | def get_input_schema(self) -> dict[str, Any]: method get_annotations (line 154) | def get_annotations(self) -> Optional[dict[str, Any]]: method get_system_prompt (line 158) | def get_system_prompt(self) -> str: method get_request_model (line 162) | def get_request_model(self): method requires_model (line 166) | def requires_model(self) -> bool: method prepare_prompt (line 169) | async def prepare_prompt(self, request: ToolRequest) -> str: method format_response (line 173) | def format_response(self, response: str, request: ToolRequest, model_i... method execute (line 177) | async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: method get_model_category (line 367) | def get_model_category(self) -> ToolModelCategory: FILE: tools/workflow/base.py class WorkflowTool (line 25) | class WorkflowTool(BaseTool, BaseWorkflowMixin): method __init__ (line 67) | def __init__(self): method get_tool_fields (line 72) | def get_tool_fields(self) -> dict[str, dict[str, Any]]: method get_required_fields (line 98) | def get_required_fields(self) -> list[str]: method get_annotations (line 113) | def get_annotations(self) -> Optional[dict[str, Any]]: method get_input_schema (line 128) | def get_input_schema(self) -> dict[str, Any]: method get_workflow_request_model (line 154) | def get_workflow_request_model(self): method get_work_steps (line 165) | def get_work_steps(self, request) -> list[str]: method get_standard_required_actions (line 176) | def get_standard_required_actions(self, step_number: int, confidence: ... method should_call_expert_analysis_default (line 225) | def should_call_expert_analysis_default(self, consolidated_findings) -... method prepare_standard_expert_context (line 248) | def prepare_standard_expert_context( method handle_completion_without_expert_analysis (line 302) | def handle_completion_without_expert_analysis( method prepare_work_summary (line 345) | def prepare_work_summary(self) -> str: method get_completion_status (line 358) | def get_completion_status(self) -> str: method get_completion_data_key (line 362) | def get_completion_data_key(self) -> str: method get_final_analysis_from_request (line 366) | def get_final_analysis_from_request(self, request) -> Optional[str]: method get_confidence_level (line 373) | def get_confidence_level(self, request) -> str: method get_completion_message (line 380) | def get_completion_message(self) -> str: method get_skip_reason (line 389) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 393) | def get_skip_expert_analysis_status(self) -> str: method is_continuation_workflow (line 397) | def is_continuation_workflow(self, request) -> bool: method get_required_actions (line 418) | def get_required_actions( method should_call_expert_analysis (line 436) | def should_call_expert_analysis(self, consolidated_findings) -> bool: method prepare_expert_analysis_context (line 441) | def prepare_expert_analysis_context(self, consolidated_findings) -> str: method execute (line 446) | async def execute(self, arguments: dict[str, Any]) -> list: FILE: tools/workflow/schema_builders.py class WorkflowSchemaBuilder (line 14) | class WorkflowSchemaBuilder: method build_schema (line 83) | def build_schema( method get_workflow_fields (line 159) | def get_workflow_fields() -> dict[str, dict[str, Any]]: method get_workflow_only_fields (line 167) | def get_workflow_only_fields() -> dict[str, dict[str, Any]]: FILE: tools/workflow/workflow_mixin.py class BaseWorkflowMixin (line 41) | class BaseWorkflowMixin(ABC): method __init__ (line 69) | def __init__(self) -> None: method get_name (line 80) | def get_name(self) -> str: method get_workflow_request_model (line 85) | def get_workflow_request_model(self) -> type: method get_system_prompt (line 90) | def get_system_prompt(self) -> str: method get_language_instruction (line 95) | def get_language_instruction(self) -> str: method get_default_temperature (line 100) | def get_default_temperature(self) -> float: method get_model_provider (line 105) | def get_model_provider(self, model_name: str) -> Any: method _resolve_model_context (line 110) | def _resolve_model_context(self, arguments: dict[str, Any], request: A... method _prepare_file_content_for_prompt (line 115) | def _prepare_file_content_for_prompt( method get_work_steps (line 134) | def get_work_steps(self, request: Any) -> list[str]: method get_required_actions (line 139) | def get_required_actions( method should_call_expert_analysis (line 160) | def should_call_expert_analysis(self, consolidated_findings: Consolida... method prepare_expert_analysis_context (line 185) | def prepare_expert_analysis_context(self, consolidated_findings: Conso... method requires_expert_analysis (line 210) | def requires_expert_analysis(self) -> bool: method should_include_files_in_expert_prompt (line 219) | def should_include_files_in_expert_prompt(self) -> bool: method should_embed_system_prompt (line 226) | def should_embed_system_prompt(self) -> bool: method get_expert_thinking_mode (line 233) | def get_expert_thinking_mode(self) -> str: method get_request_temperature (line 240) | def get_request_temperature(self, request) -> float: method get_validated_temperature (line 247) | def get_validated_temperature(self, request, model_context: Any) -> tu... method get_request_thinking_mode (line 264) | def get_request_thinking_mode(self, request) -> str: method get_expert_analysis_instruction (line 271) | def get_expert_analysis_instruction(self) -> str: method get_request_use_assistant_model (line 278) | def get_request_use_assistant_model(self, request) -> bool: method get_step_guidance_message (line 293) | def get_step_guidance_message(self, request) -> str: method _prepare_files_for_expert_analysis (line 312) | def _prepare_files_for_expert_analysis(self) -> str: method _force_embed_files_for_expert_analysis (line 375) | def _force_embed_files_for_expert_analysis(self, files: list[str]) -> ... method wants_line_numbers_by_default (line 426) | def wants_line_numbers_by_default(self) -> bool: method _add_files_to_expert_context (line 433) | def _add_files_to_expert_context(self, expert_context: str, file_conte... method _handle_workflow_file_context (line 444) | def _handle_workflow_file_context(self, request: Any, arguments: dict[... method _should_embed_files_in_workflow_step (line 481) | def _should_embed_files_in_workflow_step( method _embed_workflow_files (line 511) | def _embed_workflow_files(self, request: Any, arguments: dict[str, Any... method _reference_workflow_files (line 567) | def _reference_workflow_files(self, request: Any) -> None: method execute_workflow (line 600) | async def execute_workflow(self, arguments: dict[str, Any]) -> list[Te... method prepare_step_data (line 759) | def prepare_step_data(self, request) -> dict: method build_base_response (line 777) | def build_base_response(self, request, continuation_id: str = None) ->... method should_skip_expert_analysis (line 828) | def should_skip_expert_analysis(self, request, consolidated_findings) ... method handle_completion_without_expert_analysis (line 837) | def handle_completion_without_expert_analysis(self, request, consolida... method get_request_confidence (line 876) | def get_request_confidence(self, request: Any) -> str: method get_request_relevant_context (line 883) | def get_request_relevant_context(self, request: Any) -> list[str]: method get_request_issues_found (line 890) | def get_request_issues_found(self, request: Any) -> list[str]: method get_request_hypothesis (line 897) | def get_request_hypothesis(self, request: Any) -> Optional[str]: method get_request_images (line 904) | def get_request_images(self, request: Any) -> list[str]: method get_embedded_file_content (line 913) | def get_embedded_file_content(self) -> str: method get_file_reference_note (line 920) | def get_file_reference_note(self) -> str: method get_actually_processed_files (line 927) | def get_actually_processed_files(self) -> list[str]: method get_current_model_context (line 934) | def get_current_model_context(self): method get_request_model_name (line 941) | def get_request_model_name(self, request: Any) -> str: method get_request_continuation_id (line 948) | def get_request_continuation_id(self, request: Any) -> Optional[str]: method get_request_next_step_required (line 955) | def get_request_next_step_required(self, request: Any) -> bool: method get_request_step_number (line 962) | def get_request_step_number(self, request: Any) -> int: method get_request_relevant_files (line 969) | def get_request_relevant_files(self, request: Any) -> list[str]: method get_request_files_checked (line 976) | def get_request_files_checked(self, request: Any) -> list[str]: method get_current_arguments (line 983) | def get_current_arguments(self) -> dict[str, Any]: method store_initial_issue (line 990) | def store_initial_issue(self, step_description: str): method get_initial_request (line 995) | def get_initial_request(self, fallback_step: str) -> str: method prepare_work_summary (line 1004) | def prepare_work_summary(self) -> str: method get_completion_status (line 1008) | def get_completion_status(self) -> str: method get_final_analysis_from_request (line 1012) | def get_final_analysis_from_request(self, request): method get_confidence_level (line 1016) | def get_confidence_level(self, request) -> str: method get_completion_message (line 1020) | def get_completion_message(self) -> str: method get_skip_reason (line 1027) | def get_skip_reason(self) -> str: method get_skip_expert_analysis_status (line 1031) | def get_skip_expert_analysis_status(self) -> str: method get_completion_next_steps_message (line 1035) | def get_completion_next_steps_message(self, expert_analysis_used: bool... method get_expert_analysis_guidance (line 1059) | def get_expert_analysis_guidance(self) -> str: method customize_workflow_response (line 1086) | def customize_workflow_response(self, response_data: dict, request) ->... method store_conversation_turn (line 1115) | def store_conversation_turn(self, continuation_id: str, response_data:... method _add_workflow_metadata (line 1135) | def _add_workflow_metadata(self, response_data: dict, arguments: dict[... method _extract_clean_workflow_content_for_history (line 1201) | def _extract_clean_workflow_content_for_history(self, response_data: d... method handle_work_completion (line 1267) | async def handle_work_completion(self, response_data: dict, request, a... method handle_work_continuation (line 1351) | def handle_work_continuation(self, response_data: dict, request) -> dict: method _update_consolidated_findings (line 1369) | def _update_consolidated_findings(self, step_data: dict): method _reprocess_consolidated_findings (line 1391) | def _reprocess_consolidated_findings(self): method _prepare_work_summary (line 1397) | def _prepare_work_summary(self) -> str: method _call_expert_analysis (line 1437) | async def _call_expert_analysis(self, arguments: dict, request) -> dict: method _process_work_step (line 1537) | def _process_work_step(self, step_data: dict): method execute (line 1556) | async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: method prepare_prompt (line 1587) | async def prepare_prompt(self, request) -> str: method format_response (line 1603) | def format_response(self, response: str, request, model_info=None): FILE: utils/client_info.py function get_friendly_name (line 47) | def get_friendly_name(client_name: str) -> str: function get_cached_client_info (line 72) | def get_cached_client_info() -> Optional[dict[str, Any]]: function get_client_info_from_context (line 83) | def get_client_info_from_context(server: Any) -> Optional[dict[str, Any]]: function format_client_info (line 195) | def format_client_info(client_info: Optional[dict[str, Any]], use_friend... function get_client_friendly_name (line 223) | def get_client_friendly_name() -> str: function log_client_info (line 239) | def log_client_info(server: Any, logger_instance: Optional[logging.Logge... FILE: utils/conversation_memory.py class ConversationTurn (line 151) | class ConversationTurn(BaseModel): class ThreadContext (line 181) | class ThreadContext(BaseModel): function get_storage (line 208) | def get_storage(): function create_thread (line 220) | def create_thread(tool_name: str, initial_request: dict[str, Any], paren... function get_thread (line 272) | def get_thread(thread_id: str) -> Optional[ThreadContext]: function add_turn (line 308) | def add_turn( function get_thread_chain (line 391) | def get_thread_chain(thread_id: str, max_depth: int = 20) -> list[Thread... function get_conversation_file_list (line 433) | def get_conversation_file_list(context: ThreadContext) -> list[str]: function get_conversation_image_list (line 505) | def get_conversation_image_list(context: ThreadContext) -> list[str]: function _plan_file_inclusion_by_size (line 577) | def _plan_file_inclusion_by_size(all_files: list[str], max_file_tokens: ... function build_conversation_history (line 638) | def build_conversation_history(context: ThreadContext, model_context=Non... function _get_tool_formatted_content (line 1029) | def _get_tool_formatted_content(turn: ConversationTurn) -> list[str]: function _default_turn_formatting (line 1065) | def _default_turn_formatting(turn: ConversationTurn) -> list[str]: function _is_valid_uuid (line 1091) | def _is_valid_uuid(val: str) -> bool: FILE: utils/env.py function _read_dotenv_values (line 23) | def _read_dotenv_values() -> dict[str, str | None]: function _compute_force_override (line 30) | def _compute_force_override(values: Mapping[str, str | None]) -> bool: function reload_env (line 35) | def reload_env(dotenv_mapping: Mapping[str, str | None] | None = None) -... function env_override_enabled (line 60) | def env_override_enabled() -> bool: function get_env (line 66) | def get_env(key: str, default: str | None = None) -> str | None: function get_env_bool (line 78) | def get_env_bool(key: str, default: bool = False) -> bool: function get_all_env (line 86) | def get_all_env() -> dict[str, str | None]: function suppress_env_vars (line 93) | def suppress_env_vars(*names: str): FILE: utils/file_types.py function get_file_category (line 143) | def get_file_category(file_path: str) -> str: function is_code_file (line 164) | def is_code_file(file_path: str) -> bool: function is_text_file (line 171) | def is_text_file(file_path: str) -> bool: function is_binary_file (line 178) | def is_binary_file(file_path: str) -> bool: function get_token_estimation_ratio (line 231) | def get_token_estimation_ratio(file_path: str) -> float: function get_image_mime_type (line 258) | def get_image_mime_type(extension: str) -> str: FILE: utils/file_utils.py function _is_builtin_custom_models_config (line 52) | def _is_builtin_custom_models_config(path_str: str) -> bool: function is_mcp_directory (line 84) | def is_mcp_directory(path: Path) -> bool: function get_user_home_directory (line 114) | def get_user_home_directory() -> Optional[Path]: function is_home_directory_root (line 124) | def is_home_directory_root(path: Path) -> bool: function detect_file_type (line 183) | def detect_file_type(file_path: str) -> str: function should_add_line_numbers (line 222) | def should_add_line_numbers(file_path: str, include_line_numbers: Option... function _normalize_line_endings (line 241) | def _normalize_line_endings(content: str) -> str: function _add_line_numbers (line 255) | def _add_line_numbers(content: str) -> str: function resolve_and_validate_path (line 282) | def resolve_and_validate_path(path_str: str) -> Path: function expand_paths (line 327) | def expand_paths(paths: list[str], extensions: Optional[set[str]] = None... function read_file_content (line 421) | def read_file_content( function read_files (line 523) | def read_files( function estimate_file_tokens (line 628) | def estimate_file_tokens(file_path: str) -> int: function check_files_size_limit (line 654) | def check_files_size_limit(files: list[str], max_tokens: int, threshold_... function read_json_file (line 687) | def read_json_file(file_path: str) -> Optional[dict]: function write_json_file (line 707) | def write_json_file(file_path: str, data: dict, indent: int = 2) -> bool: function get_file_size (line 729) | def get_file_size(file_path: str) -> int: function ensure_directory_exists (line 747) | def ensure_directory_exists(file_path: str) -> bool: function is_text_file (line 766) | def is_text_file(file_path: str) -> bool: function read_file_safely (line 781) | def read_file_safely(file_path: str, max_size: int = 10 * 1024 * 1024) -... function check_total_file_size (line 806) | def check_total_file_size(files: list[str], model_name: str) -> Optional... FILE: utils/image_utils.py function _valid_mime_types (line 15) | def _valid_mime_types() -> Iterable[str]: function validate_image (line 20) | def validate_image(image_path: str, max_size_mb: float = None) -> tuple[... function _validate_data_url (line 42) | def _validate_data_url(image_data_url: str, max_size_mb: float) -> tuple... function _validate_file_path (line 67) | def _validate_file_path(file_path: str, max_size_mb: float) -> tuple[byt... function _validate_size (line 90) | def _validate_size(image_bytes: bytes, max_size_mb: float) -> None: FILE: utils/model_context.py class TokenAllocation (line 40) | class TokenAllocation: method available_for_prompt (line 50) | def available_for_prompt(self) -> int: class ModelContext (line 55) | class ModelContext: method __init__ (line 63) | def __init__(self, model_name: str, model_option: Optional[str] = None): method provider (line 71) | def provider(self): method capabilities (line 90) | def capabilities(self) -> ModelCapabilities: method calculate_token_allocation (line 96) | def calculate_token_allocation(self, reserved_for_response: Optional[i... method estimate_tokens (line 165) | def estimate_tokens(self, text: str) -> int: method from_arguments (line 177) | def from_arguments(cls, arguments: dict[str, Any]) -> "ModelContext": FILE: utils/model_restrictions.py class ModelRestrictionService (line 33) | class ModelRestrictionService: method __init__ (line 59) | def __init__(self): method _load_from_env (line 65) | def _load_from_env(self) -> None: method validate_against_known_models (line 90) | def validate_against_known_models(self, provider_instances: dict[Provi... method is_allowed (line 128) | def is_allowed(self, provider_type: ProviderType, model_name: str, ori... method get_allowed_models (line 192) | def get_allowed_models(self, provider_type: ProviderType) -> Optional[... method has_restrictions (line 204) | def has_restrictions(self, provider_type: ProviderType) -> bool: method filter_models (line 216) | def filter_models(self, provider_type: ProviderType, models: list[str]... method get_restriction_summary (line 232) | def get_restriction_summary(self) -> dict[str, any]: function get_restriction_service (line 253) | def get_restriction_service() -> ModelRestrictionService: FILE: utils/security_config.py function is_dangerous_path (line 98) | def is_dangerous_path(path: Path) -> bool: FILE: utils/storage_backend.py class InMemoryStorage (line 31) | class InMemoryStorage: method __init__ (line 34) | def __init__(self): method set_with_ttl (line 52) | def set_with_ttl(self, key: str, ttl_seconds: int, value: str) -> None: method get (line 59) | def get(self, key: str) -> Optional[str]: method setex (line 73) | def setex(self, key: str, ttl_seconds: int, value: str) -> None: method _cleanup_worker (line 77) | def _cleanup_worker(self): method _cleanup_expired (line 83) | def _cleanup_expired(self): method shutdown (line 94) | def shutdown(self): function get_storage_backend (line 106) | def get_storage_backend() -> InMemoryStorage: FILE: utils/token_utils.py function estimate_tokens (line 16) | def estimate_tokens(text: str) -> int: function check_token_limit (line 36) | def check_token_limit(text: str, context_window: int = DEFAULT_CONTEXT_W...