SYMBOL INDEX (9257 symbols across 550 files) FILE: core/antigravity_auth.py function _fetch_credentials_from_public_source (line 64) | def _fetch_credentials_from_public_source() -> tuple[str | None, str | N... function get_client_id (line 90) | def get_client_id() -> str: function get_client_secret (line 116) | def get_client_secret() -> str | None: function find_free_port (line 139) | def find_free_port() -> int: class OAuthCallbackHandler (line 147) | class OAuthCallbackHandler(BaseHTTPRequestHandler): method log_message (line 154) | def log_message(self, format: str, *args: Any) -> None: method do_GET (line 157) | def do_GET(self) -> None: method _send_response (line 179) | def _send_response(self, message: str) -> None: function wait_for_callback (line 197) | def wait_for_callback(port: int, timeout: int = 300) -> tuple[str | None... function exchange_code_for_tokens (line 215) | def exchange_code_for_tokens( function get_user_email (line 245) | def get_user_email(access_token: str) -> str | None: function load_accounts (line 259) | def load_accounts() -> dict[str, Any]: function save_accounts (line 270) | def save_accounts(data: dict[str, Any]) -> None: function validate_credentials (line 278) | def validate_credentials(access_token: str, project_id: str = _DEFAULT_P... function refresh_access_token (line 319) | def refresh_access_token( function cmd_account_add (line 346) | def cmd_account_add(args: argparse.Namespace) -> int: function cmd_account_list (line 511) | def cmd_account_list(args: argparse.Namespace) -> int: function cmd_account_remove (line 530) | def cmd_account_remove(args: argparse.Namespace) -> int: function main (line 549) | def main() -> int: FILE: core/codex_oauth.py function _base64url (line 46) | def _base64url(data: bytes) -> str: function generate_pkce (line 50) | def generate_pkce() -> tuple[str, str]: function build_authorize_url (line 58) | def build_authorize_url(state: str, challenge: str) -> str: function exchange_code_for_tokens (line 77) | def exchange_code_for_tokens(code: str, verifier: str) -> dict | None: function decode_jwt_payload (line 110) | def decode_jwt_payload(token: str) -> dict | None: function get_account_id (line 127) | def get_account_id(access_token: str) -> str | None: function save_credentials (line 140) | def save_credentials(token_data: dict, account_id: str) -> None: function open_browser (line 160) | def open_browser(url: str) -> bool: class OAuthCallbackHandler (line 176) | class OAuthCallbackHandler(http.server.BaseHTTPRequestHandler): method do_GET (line 182) | def do_GET(self) -> None: method log_message (line 212) | def log_message(self, format: str, *args: object) -> None: function wait_for_callback (line 217) | def wait_for_callback(state: str, timeout_secs: int = 120) -> str | None: function _serve_until_done (line 241) | def _serve_until_done(server: http.server.HTTPServer, deadline: float, s... function parse_manual_input (line 248) | def parse_manual_input(value: str, expected_state: str) -> str | None: function main (line 269) | def main() -> int: FILE: core/examples/manual_agent.py class GreeterNode (line 24) | class GreeterNode(NodeProtocol): method execute (line 27) | async def execute(self, ctx: NodeContext) -> NodeResult: class UppercaserNode (line 34) | class UppercaserNode(NodeProtocol): method execute (line 37) | async def execute(self, ctx: NodeContext) -> NodeResult: function main (line 44) | async def main(): FILE: core/examples/mcp_integration_example.py function example_1_programmatic_registration (line 17) | async def example_1_programmatic_registration(): function example_2_http_transport (line 50) | async def example_2_http_transport(): function example_3_config_file (line 72) | async def example_3_config_file(): function main (line 98) | async def main(): FILE: core/framework/agents/__init__.py function list_framework_agents (line 8) | def list_framework_agents() -> list[Path]: FILE: core/framework/agents/credential_tester/__main__.py function setup_logging (line 10) | def setup_logging(verbose=False, debug=False): function pick_account (line 21) | def pick_account(agent: CredentialTesterAgent) -> dict | None: function cli (line 48) | def cli(): function shell (line 56) | def shell(verbose, debug): function _interactive_shell (line 62) | async def _interactive_shell(verbose=False): function list_accounts (line 91) | def list_accounts(): FILE: core/framework/agents/credential_tester/agent.py function get_tools_for_provider (line 63) | def get_tools_for_provider(provider_name: str) -> list[str]: function _list_aden_accounts (line 78) | def _list_aden_accounts() -> list[dict]: function _list_local_accounts (line 114) | def _list_local_accounts() -> list[dict]: function _list_env_fallback_accounts (line 126) | def _list_env_fallback_accounts() -> list[dict]: function list_connected_accounts (line 193) | def list_connected_accounts() -> list[dict]: function configure_for_account (line 218) | def configure_for_account(runner: AgentRunner, account: dict) -> None: function _activate_local_account (line 241) | def _activate_local_account(credential_id: str, alias: str) -> None: function _configure_aden_node (line 307) | def _configure_aden_node( function _configure_local_node (line 350) | def _configure_local_node( class CredentialTesterAgent (line 466) | class CredentialTesterAgent: method __init__ (line 477) | def __init__(self, config=None): method list_accounts (line 484) | def list_accounts(self) -> list[dict]: method select_account (line 488) | def select_account(self, account: dict) -> None: method selected_provider (line 498) | def selected_provider(self) -> str: method selected_alias (line 504) | def selected_alias(self) -> str: method _build_graph (line 509) | def _build_graph(self) -> GraphSpec: method _setup (line 553) | def _setup(self) -> None: method start (line 599) | async def start(self) -> None: method stop (line 606) | async def stop(self) -> None: method run (line 612) | async def run(self) -> ExecutionResult: FILE: core/framework/agents/credential_tester/config.py class AgentMetadata (line 9) | class AgentMetadata: FILE: core/framework/agents/credential_tester/nodes/__init__.py function build_tester_node (line 6) | def build_tester_node( FILE: core/framework/agents/discovery.py class AgentEntry (line 11) | class AgentEntry: function _get_last_active (line 26) | def _get_last_active(agent_path: Path) -> str | None: function _count_sessions (line 79) | def _count_sessions(agent_name: str) -> int: function _count_runs (line 87) | def _count_runs(agent_name: str) -> int: function _extract_agent_stats (line 112) | def _extract_agent_stats(agent_path: Path) -> tuple[int, int, list[str]]: function discover_agents (line 153) | def discover_agents() -> dict[str, list[AgentEntry]]: FILE: core/framework/agents/queen/config.py function _load_preferred_model (line 8) | def _load_preferred_model() -> str: class RuntimeConfig (line 24) | class RuntimeConfig: class AgentMetadata (line 36) | class AgentMetadata: FILE: core/framework/agents/queen/nodes/__init__.py function _is_gcu_enabled (line 16) | def _is_gcu_enabled() -> bool: function _build_appendices (line 25) | def _build_appendices() -> str: FILE: core/framework/agents/queen/nodes/thinking_hook.py function select_expert_persona (line 43) | async def select_expert_persona(user_message: str, llm: LLMProvider) -> ... FILE: core/framework/agents/queen/queen_memory.py function _queen_dir (line 30) | def _queen_dir() -> Path: function semantic_memory_path (line 34) | def semantic_memory_path() -> Path: function episodic_memory_path (line 38) | def episodic_memory_path(d: date | None = None) -> Path: function read_semantic_memory (line 43) | def read_semantic_memory() -> str: function read_episodic_memory (line 48) | def read_episodic_memory(d: date | None = None) -> str: function _find_recent_episodic (line 53) | def _find_recent_episodic(lookback: int = 7) -> tuple[date, str] | None: function format_for_injection (line 70) | def format_for_injection() -> str: function append_episodic_entry (line 121) | def append_episodic_entry(content: str) -> None: function seed_if_missing (line 141) | def seed_if_missing() -> None: function read_session_context (line 194) | def read_session_context(session_dir: Path, max_messages: int = 80) -> str: function _compact_context (line 254) | async def _compact_context(text: str, llm: object, *, _depth: int = 0) -... function consolidate_queen_memory (line 293) | async def consolidate_queen_memory( FILE: core/framework/agents/queen/tests/conftest.py function mock_mode (line 19) | def mock_mode(): function runner (line 24) | async def runner(tmp_path_factory, mock_mode): FILE: core/framework/agents/worker_memory.py function _worker_runs_dir (line 42) | def _worker_runs_dir(agent_name: str) -> Path: function digest_path (line 46) | def digest_path(agent_name: str, run_id: str) -> Path: function _collect_run_events (line 50) | def _collect_run_events(bus: EventBus, run_id: str, limit: int = 2000) -... function _build_run_context (line 78) | def _build_run_context( function consolidate_worker_run (line 167) | async def consolidate_worker_run( function read_recent_digests (line 258) | def read_recent_digests(agent_name: str, max_runs: int = 5) -> list[tupl... FILE: core/framework/cli.py function _configure_paths (line 24) | def _configure_paths(): function main (line 67) | def main(): FILE: core/framework/config.py function get_hive_config (line 29) | def get_hive_config() -> dict[str, Any]: function get_preferred_model (line 50) | def get_preferred_model() -> str: function get_preferred_worker_model (line 64) | def get_preferred_worker_model() -> str | None: function get_worker_api_key (line 82) | def get_worker_api_key() -> str | None: function get_worker_api_base (line 137) | def get_worker_api_base() -> str | None: function get_worker_llm_extra_kwargs (line 157) | def get_worker_llm_extra_kwargs() -> dict[str, Any]: function get_worker_max_tokens (line 192) | def get_worker_max_tokens() -> int: function get_worker_max_context_tokens (line 200) | def get_worker_max_context_tokens() -> int: function get_max_tokens (line 208) | def get_max_tokens() -> int: function get_max_context_tokens (line 217) | def get_max_context_tokens() -> int: function get_api_key (line 222) | def get_api_key() -> str | None: function _fetch_antigravity_credentials (line 295) | def _fetch_antigravity_credentials() -> tuple[str | None, str | None]: function get_antigravity_client_id (line 322) | def get_antigravity_client_id() -> str: function get_antigravity_client_secret (line 343) | def get_antigravity_client_secret() -> str | None: function get_gcu_enabled (line 365) | def get_gcu_enabled() -> bool: function get_gcu_viewport_scale (line 370) | def get_gcu_viewport_scale() -> float: function get_api_base (line 378) | def get_api_base() -> str | None: function get_llm_extra_kwargs (line 397) | def get_llm_extra_kwargs() -> dict[str, Any]: class RuntimeConfig (line 444) | class RuntimeConfig: FILE: core/framework/credentials/aden/client.py class AdenClientError (line 46) | class AdenClientError(Exception): class AdenAuthenticationError (line 52) | class AdenAuthenticationError(AdenClientError): class AdenNotFoundError (line 58) | class AdenNotFoundError(AdenClientError): class AdenRefreshError (line 64) | class AdenRefreshError(AdenClientError): method __init__ (line 67) | def __init__( class AdenRateLimitError (line 78) | class AdenRateLimitError(AdenClientError): method __init__ (line 81) | def __init__(self, message: str, retry_after: int = 60): class AdenClientConfig (line 87) | class AdenClientConfig: method __post_init__ (line 108) | def __post_init__(self) -> None: class AdenIntegrationInfo (line 119) | class AdenIntegrationInfo: method integration_type (line 154) | def integration_type(self) -> str: method from_dict (line 158) | def from_dict(cls, data: dict[str, Any]) -> AdenIntegrationInfo: class AdenCredentialResponse (line 174) | class AdenCredentialResponse: method integration_type (line 213) | def integration_type(self) -> str: method from_dict (line 217) | def from_dict(cls, data: dict[str, Any], integration_id: str = "") -> ... class AdenCredentialClient (line 240) | class AdenCredentialClient: method __init__ (line 260) | def __init__(self, config: AdenClientConfig): method _parse_json (line 265) | def _parse_json(response: httpx.Response) -> Any: method _get_client (line 269) | def _get_client(self) -> httpx.Client: method _request_with_retry (line 286) | def _request_with_retry( method list_integrations (line 354) | def list_integrations(self) -> list[AdenIntegrationInfo]: method get_credential (line 371) | def get_credential(self, integration_id: str) -> AdenCredentialRespons... method request_refresh (line 390) | def request_refresh(self, integration_id: str) -> AdenCredentialResponse: method validate_token (line 406) | def validate_token(self, integration_id: str) -> dict[str, Any]: method health_check (line 418) | def health_check(self) -> dict[str, Any]: method close (line 431) | def close(self) -> None: method __enter__ (line 436) | def __enter__(self) -> AdenCredentialClient: method __exit__ (line 439) | def __exit__(self, *args: Any) -> None: FILE: core/framework/credentials/aden/provider.py class AdenSyncProvider (line 62) | class AdenSyncProvider(CredentialProvider): method __init__ (line 95) | def __init__( method provider_id (line 119) | def provider_id(self) -> str: method supported_types (line 124) | def supported_types(self) -> list[CredentialType]: method can_handle (line 128) | def can_handle(self, credential: CredentialObject) -> bool: method refresh (line 151) | def refresh(self, credential: CredentialObject) -> CredentialObject: method validate (line 213) | def validate(self, credential: CredentialObject) -> bool: method should_refresh (line 238) | def should_refresh(self, credential: CredentialObject) -> bool: method fetch_from_aden (line 260) | def fetch_from_aden(self, integration_id: str) -> CredentialObject | N... method sync_all (line 281) | def sync_all(self, store: CredentialStore) -> int: method report_credential_usage (line 318) | def report_credential_usage( method _update_credential_from_aden (line 342) | def _update_credential_from_aden( method _aden_response_to_credential (line 395) | def _aden_response_to_credential( FILE: core/framework/credentials/aden/storage.py class AdenCachedStorage (line 59) | class AdenCachedStorage(CredentialStorage): method __init__ (line 94) | def __init__( method save (line 122) | def save(self, credential: CredentialObject) -> None: method load (line 134) | def load(self, credential_id: str) -> CredentialObject | None: method _load_by_id (line 179) | def _load_by_id(self, credential_id: str) -> CredentialObject | None: method load_all_for_provider (line 216) | def load_all_for_provider(self, provider_name: str) -> list[Credential... method delete (line 232) | def delete(self, credential_id: str) -> bool: method list_all (line 248) | def list_all(self) -> list[str]: method exists (line 257) | def exists(self, credential_id: str) -> bool: method _is_cache_fresh (line 277) | def _is_cache_fresh(self, credential_id: str) -> bool: method invalidate_cache (line 292) | def invalidate_cache(self, credential_id: str) -> None: method invalidate_all (line 304) | def invalidate_all(self) -> None: method _index_provider (line 309) | def _index_provider(self, credential: CredentialObject) -> None: method load_by_alias (line 341) | def load_by_alias(self, provider_name: str, alias: str) -> CredentialO... method rebuild_provider_index (line 356) | def rebuild_provider_index(self) -> int: method sync_all_from_aden (line 378) | def sync_all_from_aden(self) -> int: method get_cache_info (line 412) | def get_cache_info(self) -> dict[str, dict]: FILE: core/framework/credentials/aden/tests/test_aden_sync.py function aden_config (line 40) | def aden_config(): function mock_client (line 53) | def mock_client(aden_config): function aden_response (line 61) | def aden_response(): function provider (line 77) | def provider(mock_client): function local_storage (line 88) | def local_storage(): function cached_storage (line 94) | def cached_storage(local_storage, provider): class TestAdenCredentialResponse (line 109) | class TestAdenCredentialResponse: method test_from_dict_basic (line 112) | def test_from_dict_basic(self): method test_from_dict_full (line 131) | def test_from_dict_full(self): class TestAdenIntegrationInfo (line 156) | class TestAdenIntegrationInfo: method test_from_dict (line 159) | def test_from_dict(self): method test_from_dict_minimal (line 180) | def test_from_dict_minimal(self): class TestAdenSyncProvider (line 204) | class TestAdenSyncProvider: method test_provider_id (line 207) | def test_provider_id(self, provider): method test_supported_types (line 211) | def test_supported_types(self, provider): method test_can_handle_oauth2 (line 216) | def test_can_handle_oauth2(self, provider): method test_can_handle_aden_managed (line 227) | def test_can_handle_aden_managed(self, provider): method test_can_handle_wrong_type (line 242) | def test_can_handle_wrong_type(self, provider): method test_refresh_success (line 252) | def test_refresh_success(self, provider, mock_client, aden_response): method test_refresh_requires_reauth (line 276) | def test_refresh_requires_reauth(self, provider, mock_client): method test_refresh_aden_unavailable_cached_valid (line 297) | def test_refresh_aden_unavailable_cached_valid(self, provider, mock_cl... method test_should_refresh_expired (line 320) | def test_should_refresh_expired(self, provider): method test_should_refresh_within_buffer (line 337) | def test_should_refresh_within_buffer(self, provider): method test_should_refresh_still_valid (line 355) | def test_should_refresh_still_valid(self, provider): method test_fetch_from_aden (line 372) | def test_fetch_from_aden(self, provider, mock_client, aden_response): method test_fetch_from_aden_not_found (line 384) | def test_fetch_from_aden_not_found(self, provider, mock_client): method test_sync_all (line 392) | def test_sync_all(self, provider, mock_client, aden_response): method test_validate_via_aden (line 416) | def test_validate_via_aden(self, provider, mock_client): method test_validate_fallback_to_local (line 428) | def test_validate_fallback_to_local(self, provider, mock_client): class TestAdenCachedStorage (line 453) | class TestAdenCachedStorage: method test_save_updates_cache_timestamp (line 456) | def test_save_updates_cache_timestamp(self, cached_storage): method test_load_from_fresh_cache (line 474) | def test_load_from_fresh_cache(self, cached_storage, local_storage): method test_load_from_aden_when_stale (line 496) | def test_load_from_aden_when_stale( method test_load_falls_back_to_stale_when_aden_fails (line 524) | def test_load_falls_back_to_stale_when_aden_fails( method test_delete_removes_cache_timestamp (line 550) | def test_delete_removes_cache_timestamp(self, cached_storage, local_st... method test_invalidate_cache (line 566) | def test_invalidate_cache(self, cached_storage, local_storage): method test_invalidate_all (line 581) | def test_invalidate_all(self, cached_storage): method test_is_cache_fresh (line 590) | def test_is_cache_fresh(self, cached_storage): method test_get_cache_info (line 603) | def test_get_cache_info(self, cached_storage, local_storage): method test_save_indexes_provider (line 627) | def test_save_indexes_provider(self, cached_storage): method test_load_by_provider_name (line 648) | def test_load_by_provider_name(self, cached_storage): method test_load_by_direct_id_still_works (line 676) | def test_load_by_direct_id_still_works(self, cached_storage): method test_exists_by_provider_name (line 702) | def test_exists_by_provider_name(self, cached_storage): method test_rebuild_provider_index (line 726) | def test_rebuild_provider_index(self, cached_storage, local_storage): method test_save_without_integration_type_no_index (line 752) | def test_save_without_integration_type_no_index(self, cached_storage): class TestAdenIntegration (line 776) | class TestAdenIntegration: method test_full_workflow (line 779) | def test_full_workflow(self, mock_client, aden_response): method test_cached_storage_with_store (line 831) | def test_cached_storage_with_store(self, mock_client, aden_response): FILE: core/framework/credentials/key_storage.py function load_credential_key (line 32) | def load_credential_key() -> str | None: function save_credential_key (line 58) | def save_credential_key(key: str) -> Path: function generate_and_save_credential_key (line 79) | def generate_and_save_credential_key() -> str: function load_aden_api_key (line 97) | def load_aden_api_key() -> str | None: function save_aden_api_key (line 126) | def save_aden_api_key(key: str) -> None: function delete_aden_api_key (line 145) | def delete_aden_api_key() -> bool: function _read_credential_key_file (line 173) | def _read_credential_key_file() -> str | None: function _read_from_shell_config (line 187) | def _read_from_shell_config(env_var: str) -> str | None: function _read_aden_from_encrypted_store (line 200) | def _read_aden_from_encrypted_store() -> str | None: FILE: core/framework/credentials/local/models.py class LocalAccountInfo (line 17) | class LocalAccountInfo: method storage_id (line 41) | def storage_id(self) -> str: method to_account_dict (line 45) | def to_account_dict(self) -> dict: FILE: core/framework/credentials/local/registry.py class LocalCredentialRegistry (line 53) | class LocalCredentialRegistry: method __init__ (line 61) | def __init__(self, storage: EncryptedFileStorage) -> None: method list_accounts (line 68) | def list_accounts(self, credential_id: str | None = None) -> list[Loca... method save_account (line 109) | def save_account( method get_account (line 189) | def get_account(self, credential_id: str, alias: str) -> CredentialObj... method get_key (line 193) | def get_key(self, credential_id: str, alias: str, key_name: str = "api... method get_account_info (line 210) | def get_account_info(self, credential_id: str, alias: str) -> LocalAcc... method delete_account (line 221) | def delete_account(self, credential_id: str, alias: str) -> bool: method validate_account (line 234) | def validate_account(self, credential_id: str, alias: str) -> HealthCh... method default (line 293) | def default(cls) -> LocalCredentialRegistry: method at_path (line 298) | def at_path(cls, path: str | Path) -> LocalCredentialRegistry: method _to_account_info (line 306) | def _to_account_info(self, cred_obj: CredentialObject) -> LocalAccount... FILE: core/framework/credentials/models.py function _utc_now (line 17) | def _utc_now() -> datetime: class CredentialType (line 22) | class CredentialType(StrEnum): class CredentialKey (line 41) | class CredentialKey(BaseModel): method is_expired (line 62) | def is_expired(self) -> bool: method get_secret_value (line 68) | def get_secret_value(self) -> str: class CredentialIdentity (line 73) | class CredentialIdentity(BaseModel): method label (line 82) | def label(self) -> str: method is_known (line 87) | def is_known(self) -> bool: method to_dict (line 91) | def to_dict(self) -> dict[str, str]: class CredentialObject (line 96) | class CredentialObject(BaseModel): method get_key (line 146) | def get_key(self, key_name: str) -> str | None: method set_key (line 161) | def set_key( method has_key (line 185) | def has_key(self, key_name: str) -> bool: method needs_refresh (line 190) | def needs_refresh(self) -> bool: method is_valid (line 198) | def is_valid(self) -> bool: method record_usage (line 204) | def record_usage(self) -> None: method get_default_key (line 209) | def get_default_key(self) -> str | None: method identity (line 229) | def identity(self) -> CredentialIdentity: method provider_type (line 240) | def provider_type(self) -> str | None: method alias (line 246) | def alias(self) -> str | None: method set_identity (line 251) | def set_identity(self, **fields: str) -> None: class CredentialUsageSpec (line 258) | class CredentialUsageSpec(BaseModel): class CredentialError (line 312) | class CredentialError(Exception): class CredentialNotFoundError (line 318) | class CredentialNotFoundError(CredentialError): class CredentialKeyNotFoundError (line 324) | class CredentialKeyNotFoundError(CredentialError): class CredentialRefreshError (line 330) | class CredentialRefreshError(CredentialError): class CredentialValidationError (line 336) | class CredentialValidationError(CredentialError): class CredentialDecryptionError (line 342) | class CredentialDecryptionError(CredentialError): FILE: core/framework/credentials/oauth2/base_provider.py class BaseOAuth2Provider (line 27) | class BaseOAuth2Provider(CredentialProvider): method __init__ (line 70) | def __init__(self, config: OAuth2Config, provider_id: str = "oauth2"): method provider_id (line 83) | def provider_id(self) -> str: method supported_types (line 87) | def supported_types(self) -> list[CredentialType]: method _get_client (line 90) | def _get_client(self) -> Any: method _close_client (line 103) | def _close_client(self) -> None: method __del__ (line 109) | def __del__(self) -> None: method get_authorization_url (line 115) | def get_authorization_url( method exchange_code (line 151) | def exchange_code( method client_credentials_grant (line 183) | def client_credentials_grant( method refresh_access_token (line 216) | def refresh_access_token( method revoke_token (line 251) | def revoke_token( method refresh (line 290) | def refresh(self, credential: CredentialObject) -> CredentialObject: method validate (line 331) | def validate(self, credential: CredentialObject) -> bool: method should_refresh (line 346) | def should_refresh(self, credential: CredentialObject) -> bool: method revoke (line 362) | def revoke(self, credential: CredentialObject) -> bool: method _token_request (line 390) | def _token_request(self, data: dict[str, Any]) -> OAuth2Token: method _parse_form_response (line 431) | def _parse_form_response(self, text: str) -> dict[str, str]: method format_for_request (line 440) | def format_for_request(self, token: OAuth2Token) -> dict[str, Any]: method format_credential_for_request (line 467) | def format_credential_for_request(self, credential: CredentialObject) ... FILE: core/framework/credentials/oauth2/hubspot_provider.py class HubSpotOAuth2Provider (line 48) | class HubSpotOAuth2Provider(BaseOAuth2Provider): method __init__ (line 65) | def __init__( method supported_types (line 81) | def supported_types(self) -> list[CredentialType]: method validate (line 84) | def validate(self, credential: CredentialObject) -> bool: method _parse_token_response (line 108) | def _parse_token_response(self, response_data: dict[str, Any]) -> Any: FILE: core/framework/credentials/oauth2/lifecycle.py class TokenRefreshResult (line 30) | class TokenRefreshResult: class TokenLifecycleManager (line 39) | class TokenLifecycleManager: method __init__ (line 70) | def __init__( method get_valid_token (line 103) | async def get_valid_token(self) -> OAuth2Token | None: method acquire_token_client_credentials (line 144) | async def acquire_token_client_credentials( method revoke (line 169) | async def revoke(self) -> bool: method sync_get_valid_token (line 186) | def sync_get_valid_token(self) -> OAuth2Token | None: method sync_acquire_token_client_credentials (line 221) | def sync_acquire_token_client_credentials( method _needs_refresh (line 233) | def _needs_refresh(self, token: OAuth2Token) -> bool: method _credential_to_token (line 239) | def _credential_to_token(self, credential: CredentialObject) -> OAuth2... method _save_token_to_store (line 258) | def _save_token_to_store(self, token: OAuth2Token) -> None: method _async_refresh_token (line 288) | async def _async_refresh_token(self, credential: CredentialObject) -> ... method _sync_refresh_token (line 293) | def _sync_refresh_token(self, credential: CredentialObject) -> TokenRe... method invalidate_cache (line 333) | def invalidate_cache(self) -> None: method get_request_headers (line 340) | def get_request_headers(self) -> dict[str, str]: method get_request_kwargs (line 353) | def get_request_kwargs(self) -> dict: FILE: core/framework/credentials/oauth2/provider.py class TokenPlacement (line 18) | class TokenPlacement(StrEnum): class OAuth2Token (line 35) | class OAuth2Token: method is_expired (line 56) | def is_expired(self) -> bool: method can_refresh (line 69) | def can_refresh(self) -> bool: method expires_in_seconds (line 74) | def expires_in_seconds(self) -> int | None: method from_token_response (line 82) | def from_token_response(cls, data: dict[str, Any]) -> OAuth2Token: class OAuth2Config (line 107) | class OAuth2Config: method __post_init__ (line 163) | def __post_init__(self) -> None: class OAuth2Error (line 172) | class OAuth2Error(Exception): method __init__ (line 182) | def __init__( class TokenExpiredError (line 194) | class TokenExpiredError(OAuth2Error): method __init__ (line 197) | def __init__(self, credential_id: str): class RefreshTokenInvalidError (line 205) | class RefreshTokenInvalidError(OAuth2Error): method __init__ (line 208) | def __init__(self, credential_id: str, reason: str = ""): FILE: core/framework/credentials/oauth2/zoho_provider.py class ZohoOAuth2Provider (line 45) | class ZohoOAuth2Provider(BaseOAuth2Provider): method __init__ (line 65) | def __init__( method supported_types (line 108) | def supported_types(self) -> list[CredentialType]: method format_for_request (line 111) | def format_for_request(self, token: OAuth2Token) -> dict[str, Any]: method validate (line 126) | def validate(self, credential: CredentialObject) -> bool: method _parse_token_response (line 152) | def _parse_token_response(self, response_data: dict[str, Any]) -> OAut... method refresh (line 170) | def refresh(self, credential: CredentialObject) -> CredentialObject: FILE: core/framework/credentials/provider.py class CredentialProvider (line 23) | class CredentialProvider(ABC): method provider_id (line 56) | def provider_id(self) -> str: method supported_types (line 66) | def supported_types(self) -> list[CredentialType]: method refresh (line 76) | def refresh(self, credential: CredentialObject) -> CredentialObject: method validate (line 98) | def validate(self, credential: CredentialObject) -> bool: method should_refresh (line 115) | def should_refresh(self, credential: CredentialObject) -> bool: method revoke (line 137) | def revoke(self, credential: CredentialObject) -> bool: method can_handle (line 153) | def can_handle(self, credential: CredentialObject) -> bool: class StaticProvider (line 166) | class StaticProvider(CredentialProvider): method provider_id (line 179) | def provider_id(self) -> str: method supported_types (line 183) | def supported_types(self) -> list[CredentialType]: method refresh (line 186) | def refresh(self, credential: CredentialObject) -> CredentialObject: method validate (line 195) | def validate(self, credential: CredentialObject) -> bool: method should_refresh (line 216) | def should_refresh(self, credential: CredentialObject) -> bool: class BearerTokenProvider (line 221) | class BearerTokenProvider(CredentialProvider): method provider_id (line 234) | def provider_id(self) -> str: method supported_types (line 238) | def supported_types(self) -> list[CredentialType]: method refresh (line 241) | def refresh(self, credential: CredentialObject) -> CredentialObject: method validate (line 253) | def validate(self, credential: CredentialObject) -> bool: method should_refresh (line 266) | def should_refresh(self, credential: CredentialObject) -> bool: FILE: core/framework/credentials/setup.py class Colors (line 42) | class Colors: method disable (line 53) | def disable(cls): class MissingCredential (line 60) | class MissingCredential: class SetupResult (line 98) | class SetupResult: class CredentialSetupSession (line 114) | class CredentialSetupSession: method __init__ (line 135) | def __init__( method from_nodes (line 161) | def from_nodes(cls, nodes: list[NodeSpec]) -> CredentialSetupSession: method from_agent_path (line 170) | def from_agent_path( method run_interactive (line 194) | def run_interactive(self) -> SetupResult: method _print (line 236) | def _print(self, msg: str) -> None: method _input (line 240) | def _input(self, prompt: str) -> str: method _print_header (line 244) | def _print_header(self) -> None: method _ensure_credential_key (line 257) | def _ensure_credential_key(self) -> bool: method _setup_single_credential (line 276) | def _setup_single_credential(self, cred: MissingCredential) -> bool: method _get_auth_options (line 299) | def _get_auth_options(self, cred: MissingCredential) -> list[tuple[str... method _prompt_choice (line 331) | def _prompt_choice(self, options: list[tuple[str, str, str]]) -> str: method _setup_direct_api_key (line 354) | def _setup_direct_api_key(self, cred: MissingCredential) -> bool: method _setup_via_aden (line 391) | def _setup_via_aden(self, cred: MissingCredential) -> bool: method _run_health_check (line 449) | def _run_health_check(self, cred: MissingCredential, value: str) -> di... method _store_credential (line 464) | def _store_credential(self, cred: MissingCredential, value: str) -> None: method _print_summary (line 489) | def _print_summary(self, configured: list[str], skipped: list[str], er... function load_agent_nodes (line 520) | def load_agent_nodes(agent_path: str | Path) -> list: function _load_nodes_from_python_agent (line 540) | def _load_nodes_from_python_agent(agent_path: Path) -> list: function _load_nodes_from_json_agent (line 568) | def _load_nodes_from_json_agent(agent_json: Path) -> list: function run_credential_setup_cli (line 595) | def run_credential_setup_cli(agent_path: str | Path | None = None) -> int: FILE: core/framework/credentials/storage.py class CredentialStorage (line 28) | class CredentialStorage(ABC): method save (line 37) | def save(self, credential: CredentialObject) -> None: method load (line 47) | def load(self, credential_id: str) -> CredentialObject | None: method delete (line 60) | def delete(self, credential_id: str) -> bool: method list_all (line 73) | def list_all(self) -> list[str]: method exists (line 83) | def exists(self, credential_id: str) -> bool: class EncryptedFileStorage (line 96) | class EncryptedFileStorage(CredentialStorage): method __init__ (line 121) | def __init__( method _ensure_dirs (line 164) | def _ensure_dirs(self) -> None: method _cred_path (line 169) | def _cred_path(self, credential_id: str) -> Path: method save (line 175) | def save(self, credential: CredentialObject) -> None: method load (line 193) | def load(self, credential_id: str) -> CredentialObject | None: method delete (line 215) | def delete(self, credential_id: str) -> bool: method list_all (line 225) | def list_all(self) -> list[str]: method exists (line 234) | def exists(self, credential_id: str) -> bool: method _serialize_credential (line 238) | def _serialize_credential(self, credential: CredentialObject) -> dict[... method _deserialize_credential (line 252) | def _deserialize_credential(self, data: dict[str, Any]) -> CredentialO... method _update_index (line 261) | def _update_index( class EnvVarStorage (line 290) | class EnvVarStorage(CredentialStorage): method __init__ (line 307) | def __init__( method _get_env_var_name (line 324) | def _get_env_var_name(self, credential_id: str) -> str: method _read_env_value (line 331) | def _read_env_value(self, env_var: str) -> str | None: method save (line 351) | def save(self, credential: CredentialObject) -> None: method load (line 358) | def load(self, credential_id: str) -> CredentialObject | None: method delete (line 373) | def delete(self, credential_id: str) -> bool: method list_all (line 379) | def list_all(self) -> list[str]: method exists (line 390) | def exists(self, credential_id: str) -> bool: method add_mapping (line 395) | def add_mapping(self, credential_id: str, env_var: str) -> None: class InMemoryStorage (line 406) | class InMemoryStorage(CredentialStorage): method __init__ (line 418) | def __init__(self, initial_data: dict[str, CredentialObject] | None = ... method save (line 427) | def save(self, credential: CredentialObject) -> None: method load (line 431) | def load(self, credential_id: str) -> CredentialObject | None: method delete (line 435) | def delete(self, credential_id: str) -> bool: method list_all (line 442) | def list_all(self) -> list[str]: method exists (line 446) | def exists(self, credential_id: str) -> bool: method clear (line 450) | def clear(self) -> None: class CompositeStorage (line 455) | class CompositeStorage(CredentialStorage): method __init__ (line 470) | def __init__( method save (line 485) | def save(self, credential: CredentialObject) -> None: method load (line 489) | def load(self, credential_id: str) -> CredentialObject | None: method delete (line 504) | def delete(self, credential_id: str) -> bool: method list_all (line 508) | def list_all(self) -> list[str]: method exists (line 515) | def exists(self, credential_id: str) -> bool: FILE: core/framework/credentials/store.py class CredentialStore (line 34) | class CredentialStore: method __init__ (line 68) | def __init__( method register_provider (line 104) | def register_provider(self, provider: CredentialProvider) -> None: method get_provider (line 114) | def get_provider(self, provider_id: str) -> CredentialProvider | None: method get_provider_for_credential (line 126) | def get_provider_for_credential( method register_usage (line 153) | def register_usage(self, spec: CredentialUsageSpec) -> None: method get_usage_spec (line 162) | def get_usage_spec(self, credential_id: str) -> CredentialUsageSpec | ... method get_credential (line 176) | def get_credential( method get_key (line 213) | def get_key(self, credential_id: str, key_name: str) -> str | None: method get (line 229) | def get(self, credential_id: str) -> str | None: method resolve (line 249) | def resolve(self, template: str) -> str: method resolve_headers (line 265) | def resolve_headers(self, headers: dict[str, str]) -> dict[str, str]: method resolve_params (line 283) | def resolve_params(self, params: dict[str, str]) -> dict[str, str]: method resolve_for_usage (line 295) | def resolve_for_usage(self, credential_id: str) -> dict[str, Any]: method save_credential (line 327) | def save_credential(self, credential: CredentialObject) -> None: method delete_credential (line 339) | def delete_credential(self, credential_id: str) -> bool: method list_credentials (line 356) | def list_credentials(self) -> list[str]: method list_accounts (line 365) | def list_accounts(self, provider_name: str) -> list[dict[str, Any]]: method get_credential_by_alias (line 389) | def get_credential_by_alias(self, provider_name: str, alias: str) -> C... method get_credential_by_identity (line 414) | def get_credential_by_identity(self, provider_name: str, label: str) -... method is_available (line 418) | def is_available(self, credential_id: str) -> bool: method exists (line 430) | def exists(self, credential_id: str) -> bool: method validate_for_usage (line 436) | def validate_for_usage(self, credential_id: str) -> list[str]: method validate_all (line 461) | def validate_all(self) -> dict[str, list[str]]: method validate_credential (line 476) | def validate_credential(self, credential_id: str) -> bool: method _should_refresh (line 499) | def _should_refresh(self, credential: CredentialObject) -> bool: method _refresh_credential (line 513) | def _refresh_credential(self, credential: CredentialObject) -> Credent... method refresh_credential (line 535) | def refresh_credential(self, credential_id: str) -> CredentialObject |... method _get_from_cache (line 556) | def _get_from_cache(self, credential_id: str) -> CredentialObject | None: method _add_to_cache (line 570) | def _add_to_cache(self, credential: CredentialObject) -> None: method _remove_from_cache (line 574) | def _remove_from_cache(self, credential_id: str) -> None: method clear_cache (line 578) | def clear_cache(self) -> None: method for_testing (line 586) | def for_testing( method with_encrypted_storage (line 624) | def with_encrypted_storage( method with_env_storage (line 650) | def with_env_storage( method with_aden_sync (line 674) | def with_aden_sync( FILE: core/framework/credentials/template.py class TemplateResolver (line 28) | class TemplateResolver: method __init__ (line 48) | def __init__(self, credential_store: CredentialStore): method resolve (line 57) | def resolve(self, template: str, fail_on_missing: bool = True) -> str: method resolve_headers (line 107) | def resolve_headers( method resolve_params (line 133) | def resolve_params( method has_templates (line 150) | def has_templates(self, text: str) -> bool: method extract_references (line 162) | def extract_references(self, text: str) -> list[tuple[str, str | None]]: method validate_references (line 179) | def validate_references(self, text: str) -> list[str]: method get_required_credentials (line 208) | def get_required_credentials(self, text: str) -> list[str]: FILE: core/framework/credentials/tests/test_credential_store.py class TestCredentialKey (line 38) | class TestCredentialKey: method test_create_basic_key (line 41) | def test_create_basic_key(self): method test_key_with_expiration (line 49) | def test_key_with_expiration(self): method test_expired_key (line 55) | def test_expired_key(self): method test_key_with_metadata (line 61) | def test_key_with_metadata(self): class TestCredentialObject (line 71) | class TestCredentialObject: method test_create_simple_credential (line 74) | def test_create_simple_credential(self): method test_create_multi_key_credential (line 85) | def test_create_multi_key_credential(self): method test_set_key (line 99) | def test_set_key(self): method test_set_key_with_expiration (line 105) | def test_set_key_with_expiration(self): method test_needs_refresh (line 112) | def test_needs_refresh(self): method test_get_default_key (line 121) | def test_get_default_key(self): method test_record_usage (line 139) | def test_record_usage(self): class TestCredentialUsageSpec (line 150) | class TestCredentialUsageSpec: method test_create_usage_spec (line 153) | def test_create_usage_spec(self): class TestInMemoryStorage (line 165) | class TestInMemoryStorage: method test_save_and_load (line 168) | def test_save_and_load(self): method test_load_nonexistent (line 183) | def test_load_nonexistent(self): method test_delete (line 188) | def test_delete(self): method test_list_all (line 198) | def test_list_all(self): method test_exists (line 208) | def test_exists(self): method test_clear (line 216) | def test_clear(self): class TestEnvVarStorage (line 225) | class TestEnvVarStorage: method test_load_from_env (line 228) | def test_load_from_env(self): method test_load_nonexistent (line 237) | def test_load_nonexistent(self): method test_default_env_var_pattern (line 242) | def test_default_env_var_pattern(self): method test_save_raises (line 251) | def test_save_raises(self): method test_delete_raises (line 257) | def test_delete_raises(self): class TestEncryptedFileStorage (line 264) | class TestEncryptedFileStorage: method temp_dir (line 268) | def temp_dir(self): method storage (line 274) | def storage(self, temp_dir): method test_save_and_load (line 278) | def test_save_and_load(self, storage): method test_encryption_key_from_env (line 293) | def test_encryption_key_from_env(self, temp_dir): method test_list_all (line 311) | def test_list_all(self, storage): method test_delete (line 320) | def test_delete(self, storage): class TestCompositeStorage (line 327) | class TestCompositeStorage: method test_read_from_primary (line 330) | def test_read_from_primary(self): method test_fallback_when_not_in_primary (line 352) | def test_fallback_when_not_in_primary(self): method test_write_to_primary_only (line 367) | def test_write_to_primary_only(self): class TestStaticProvider (line 379) | class TestStaticProvider: method test_provider_id (line 382) | def test_provider_id(self): method test_supported_types (line 387) | def test_supported_types(self): method test_refresh_returns_unchanged (line 393) | def test_refresh_returns_unchanged(self): method test_validate_with_keys (line 403) | def test_validate_with_keys(self): method test_validate_without_keys (line 412) | def test_validate_without_keys(self): method test_should_refresh (line 419) | def test_should_refresh(self): class TestTemplateResolver (line 427) | class TestTemplateResolver: method store (line 431) | def store(self): method resolver (line 441) | def resolver(self, store): method test_resolve_simple (line 445) | def test_resolve_simple(self, resolver): method test_resolve_multiple (line 450) | def test_resolve_multiple(self, resolver): method test_resolve_default_key (line 456) | def test_resolve_default_key(self, resolver): method test_resolve_headers (line 461) | def test_resolve_headers(self, resolver): method test_resolve_missing_credential (line 472) | def test_resolve_missing_credential(self, resolver): method test_resolve_missing_key (line 477) | def test_resolve_missing_key(self, resolver): method test_has_templates (line 482) | def test_has_templates(self, resolver): method test_extract_references (line 488) | def test_extract_references(self, resolver): class TestCredentialStore (line 495) | class TestCredentialStore: method test_for_testing_factory (line 498) | def test_for_testing_factory(self): method test_get_credential (line 505) | def test_get_credential(self): method test_get_nonexistent (line 513) | def test_get_nonexistent(self): method test_save_and_load (line 519) | def test_save_and_load(self): method test_delete_credential (line 530) | def test_delete_credential(self): method test_list_credentials (line 537) | def test_list_credentials(self): method test_is_available (line 545) | def test_is_available(self): method test_resolve_templates (line 552) | def test_resolve_templates(self): method test_resolve_headers (line 559) | def test_resolve_headers(self): method test_register_provider (line 566) | def test_register_provider(self): method test_register_usage_spec (line 574) | def test_register_usage_spec(self): method test_validate_for_usage (line 586) | def test_validate_for_usage(self): method test_validate_for_usage_missing_key (line 595) | def test_validate_for_usage_missing_key(self): method test_caching (line 604) | def test_caching(self): method test_clear_cache (line 623) | def test_clear_cache(self): class TestOAuth2Module (line 638) | class TestOAuth2Module: method test_oauth2_token_from_response (line 641) | def test_oauth2_token_from_response(self): method test_token_is_expired (line 660) | def test_token_is_expired(self): method test_token_can_refresh (line 674) | def test_token_can_refresh(self): method test_oauth2_config_validation (line 684) | def test_oauth2_config_validation(self): FILE: core/framework/credentials/validation.py function ensure_credential_key_env (line 16) | def ensure_credential_key_env() -> None: class CredentialStatus (line 69) | class CredentialStatus: class CredentialValidationResult (line 91) | class CredentialValidationResult: method failed (line 98) | def failed(self) -> list[CredentialStatus]: method has_errors (line 129) | def has_errors(self) -> bool: method failed_cred_names (line 133) | def failed_cred_names(self) -> list[str]: method format_error_message (line 137) | def format_error_message(self) -> str: function _label (line 176) | def _label(c: CredentialStatus) -> str: function _presync_aden_tokens (line 185) | def _presync_aden_tokens(credential_specs: dict, *, force: bool = False)... function validate_agent_credentials (line 239) | def validate_agent_credentials( function build_setup_session_from_error (line 481) | def build_setup_session_from_error( function _status_to_missing (line 512) | def _status_to_missing(c: CredentialStatus): FILE: core/framework/debugger/cli.py function register_debugger_commands (line 11) | def register_debugger_commands(subparsers: argparse._SubParsersAction) -... function cmd_debugger (line 59) | def cmd_debugger(args: argparse.Namespace) -> int: FILE: core/framework/graph/checkpoint_config.py class CheckpointConfig (line 9) | class CheckpointConfig: method should_checkpoint_node_start (line 35) | def should_checkpoint_node_start(self) -> bool: method should_checkpoint_node_complete (line 39) | def should_checkpoint_node_complete(self) -> bool: method should_prune_checkpoints (line 43) | def should_prune_checkpoints(self, nodes_executed: int) -> bool: FILE: core/framework/graph/client_io.py class NodeClientIO (line 24) | class NodeClientIO(ABC): method emit_output (line 28) | async def emit_output(self, content: str, is_final: bool = False) -> N... method request_input (line 32) | async def request_input(self, prompt: str = "", timeout: float | None ... class ActiveNodeClientIO (line 36) | class ActiveNodeClientIO(NodeClientIO): method __init__ (line 45) | def __init__( method emit_output (line 61) | async def emit_output(self, content: str, is_final: bool = False) -> N... method request_input (line 77) | async def request_input(self, prompt: str = "", timeout: float | None ... method provide_input (line 106) | async def provide_input(self, content: str) -> None: method output_stream (line 113) | async def output_stream(self) -> AsyncIterator[str]: class InertNodeClientIO (line 122) | class InertNodeClientIO(NodeClientIO): method __init__ (line 130) | def __init__( method emit_output (line 138) | async def emit_output(self, content: str, is_final: bool = False) -> N... method request_input (line 146) | async def request_input(self, prompt: str = "", timeout: float | None ... class ClientIOGateway (line 159) | class ClientIOGateway: method __init__ (line 162) | def __init__(self, event_bus: EventBus | None = None) -> None: method create_io (line 165) | def create_io(self, node_id: str, client_facing: bool, execution_id: s... FILE: core/framework/graph/context_handoff.py class HandoffContext (line 26) | class HandoffContext: class ContextHandoff (line 41) | class ContextHandoff: method __init__ (line 51) | def __init__(self, llm: LLMProvider | None = None) -> None: method summarize_conversation (line 58) | def summarize_conversation( method format_as_input (line 109) | def format_as_input(handoff: HandoffContext) -> str: method _extractive_summary (line 137) | def _extractive_summary(messages: list) -> str: method _llm_summary (line 163) | def _llm_summary(self, messages: list, output_keys: list[str]) -> str: FILE: core/framework/graph/conversation.py class Message (line 13) | class Message: method to_llm_dict (line 39) | def to_llm_dict(self) -> dict[str, Any]: method to_storage_dict (line 58) | def to_storage_dict(self) -> dict[str, Any]: method from_storage_dict (line 80) | def from_storage_dict(cls, data: dict[str, Any]) -> Message: function _extract_spillover_filename (line 95) | def _extract_spillover_filename(content: str) -> str | None: function _compact_tool_calls (line 109) | def _compact_tool_calls(tool_calls: list[dict[str, Any]]) -> list[dict[s... function extract_tool_call_history (line 157) | def extract_tool_call_history(messages: list[Message], max_entries: int ... class ConversationStore (line 229) | class ConversationStore(Protocol): method write_part (line 232) | async def write_part(self, seq: int, data: dict[str, Any]) -> None: ... method read_parts (line 234) | async def read_parts(self) -> list[dict[str, Any]]: ... method write_meta (line 236) | async def write_meta(self, data: dict[str, Any]) -> None: ... method read_meta (line 238) | async def read_meta(self) -> dict[str, Any] | None: ... method write_cursor (line 240) | async def write_cursor(self, data: dict[str, Any]) -> None: ... method read_cursor (line 242) | async def read_cursor(self) -> dict[str, Any] | None: ... method delete_parts_before (line 244) | async def delete_parts_before(self, seq: int) -> None: ... method close (line 246) | async def close(self) -> None: ... method destroy (line 248) | async def destroy(self) -> None: ... function _try_extract_key (line 256) | def _try_extract_key(content: str, key: str) -> str | None: class NodeConversation (line 300) | class NodeConversation: method __init__ (line 309) | def __init__( method system_prompt (line 331) | def system_prompt(self) -> str: method update_system_prompt (line 334) | def update_system_prompt(self, new_prompt: str) -> None: method set_current_phase (line 343) | def set_current_phase(self, phase_id: str) -> None: method current_phase (line 348) | def current_phase(self) -> str | None: method messages (line 352) | def messages(self) -> list[Message]: method turn_count (line 357) | def turn_count(self) -> int: method message_count (line 362) | def message_count(self) -> int: method next_seq (line 367) | def next_seq(self) -> int: method add_user_message (line 372) | async def add_user_message( method add_assistant_message (line 392) | async def add_assistant_message( method add_tool_result (line 409) | async def add_tool_result( method to_llm_messages (line 432) | def to_llm_messages(self) -> list[dict[str, Any]]: method _repair_orphaned_tool_calls (line 443) | def _repair_orphaned_tool_calls( method estimate_tokens (line 502) | def estimate_tokens(self) -> int: method update_token_count (line 522) | def update_token_count(self, actual_input_tokens: int) -> None: method usage_ratio (line 531) | def usage_ratio(self) -> float: method needs_compaction (line 540) | def needs_compaction(self) -> bool: method _extract_protected_values (line 545) | def _extract_protected_values(self, messages: list[Message]) -> dict[s... method _try_extract_key (line 569) | def _try_extract_key(self, content: str, key: str) -> str | None: method prune_old_tool_results (line 575) | async def prune_old_tool_results( method compact (line 677) | async def compact( method compact_preserving_structure (line 755) | async def compact_preserving_structure( method _find_phase_graduated_split (line 960) | def _find_phase_graduated_split(self) -> int | None: method clear (line 987) | async def clear(self) -> None: method export_summary (line 995) | def export_summary(self) -> str: method _persist (line 1026) | async def _persist(self, message: Message) -> None: method _persist_meta (line 1035) | async def _persist_meta(self) -> None: method restore (line 1052) | async def restore( FILE: core/framework/graph/conversation_judge.py class PhaseVerdict (line 25) | class PhaseVerdict: function evaluate_phase_completion (line 33) | async def evaluate_phase_completion( function _extract_recent_context (line 105) | def _extract_recent_context(conversation: NodeConversation, max_messages... function _format_outputs (line 144) | def _format_outputs(accumulator_state: dict[str, Any]) -> str: function _parse_verdict (line 182) | def _parse_verdict(response: str) -> PhaseVerdict: FILE: core/framework/graph/edge.py class EdgeCondition (line 39) | class EdgeCondition(StrEnum): class EdgeSpec (line 49) | class EdgeSpec(BaseModel): method should_traverse (line 107) | async def should_traverse( method _evaluate_condition (line 160) | def _evaluate_condition( method _llm_decide (line 206) | async def _llm_decide( method map_inputs (line 276) | def map_inputs( class AsyncEntryPointSpec (line 306) | class AsyncEntryPointSpec(BaseModel): method get_isolation_level (line 356) | def get_isolation_level(self): class GraphSpec (line 363) | class GraphSpec(BaseModel): method _resolve_max_tokens (line 456) | def _resolve_max_tokens(cls, values: Any) -> Any: method get_node (line 464) | def get_node(self, node_id: str) -> Any | None: method get_outgoing_edges (line 471) | def get_outgoing_edges(self, node_id: str) -> list[EdgeSpec]: method get_incoming_edges (line 476) | def get_incoming_edges(self, node_id: str) -> list[EdgeSpec]: method detect_fan_out_nodes (line 480) | def detect_fan_out_nodes(self) -> dict[str, list[str]]: method detect_fan_in_nodes (line 499) | def detect_fan_in_nodes(self) -> dict[str, list[str]]: method get_entry_point (line 516) | def get_entry_point(self, session_state: dict | None = None) -> str: method validate (line 548) | def validate(self) -> dict[str, list[str]]: FILE: core/framework/graph/event_loop_node.py class TriggerEvent (line 41) | class TriggerEvent: function _is_context_too_large_error (line 64) | def _is_context_too_large_error(exc: BaseException) -> bool: class _EscalationReceiver (line 77) | class _EscalationReceiver: method __init__ (line 88) | def __init__(self) -> None: method inject_event (line 93) | async def inject_event(self, content: str, *, is_client_input: bool = ... method wait (line 98) | async def wait(self) -> str | None: class TurnCancelled (line 109) | class TurnCancelled(Exception): class JudgeVerdict (line 116) | class JudgeVerdict: class JudgeProtocol (line 127) | class JudgeProtocol(Protocol): method evaluate (line 134) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: ... class SubagentJudge (line 137) | class SubagentJudge: method __init__ (line 146) | def __init__(self, task: str, max_iterations: int = 10): method evaluate (line 150) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: class LoopConfig (line 180) | class LoopConfig: method __post_init__ (line 258) | def __post_init__(self) -> None: class HookContext (line 269) | class HookContext: class HookResult (line 278) | class HookResult: class OutputAccumulator (line 291) | class OutputAccumulator: method set (line 308) | async def set(self, key: str, value: Any) -> None: method _auto_spill (line 324) | def _auto_spill(self, key: str, value: Any) -> Any: method get (line 357) | def get(self, key: str) -> Any | None: method to_dict (line 361) | def to_dict(self) -> dict[str, Any]: method has_all_keys (line 365) | def has_all_keys(self, required: list[str]) -> bool: method restore (line 370) | async def restore(cls, store: ConversationStore) -> OutputAccumulator: class EventLoopNode (line 384) | class EventLoopNode(NodeProtocol): method __init__ (line 416) | def __init__( method validate_input (line 446) | def validate_input(self, ctx: NodeContext) -> list[str]: method execute (line 462) | async def execute(self, ctx: NodeContext) -> NodeResult: method inject_event (line 1913) | async def inject_event(self, content: str, *, is_client_input: bool = ... method inject_trigger (line 1933) | async def inject_trigger(self, trigger: TriggerEvent) -> None: method signal_shutdown (line 1942) | def signal_shutdown(self) -> None: method cancel_current_turn (line 1951) | def cancel_current_turn(self) -> None: method _await_user_input (line 1963) | async def _await_user_input( method _run_single_turn (line 2024) | async def _run_single_turn( method _build_ask_user_tool (line 2915) | def _build_ask_user_tool(self) -> Tool: method _build_ask_user_multiple_tool (line 2970) | def _build_ask_user_multiple_tool(self) -> Tool: method _build_set_output_tool (line 3036) | def _build_set_output_tool(self, output_keys: list[str] | None) -> Too... method _build_escalate_tool (line 3072) | def _build_escalate_tool(self) -> Tool: method _build_delegate_tool (line 3101) | def _build_delegate_tool( method _build_report_to_parent_tool (line 3154) | def _build_report_to_parent_tool(self) -> Tool: method _handle_set_output (line 3212) | def _handle_set_output( method _judge_turn (line 3266) | async def _judge_turn( method _extract_tool_call_history (line 3394) | def _extract_tool_call_history( method _build_initial_message (line 3406) | def _build_initial_message(self, ctx: NodeContext) -> str: method _get_missing_output_keys (line 3430) | def _get_missing_output_keys( method _ngram_similarity (line 3443) | def _ngram_similarity(s1: str, s2: str, n: int = 2) -> float: method _is_stalled (line 3464) | def _is_stalled(self, recent_responses: list[str]) -> bool: method _is_transient_error (line 3485) | def _is_transient_error(exc: BaseException) -> bool: method _fingerprint_tool_calls (line 3538) | def _fingerprint_tool_calls( method _is_tool_doom_loop (line 3557) | def _is_tool_doom_loop( method _execute_tool (line 3588) | async def _execute_tool(self, tc: ToolCallEvent) -> ToolResult: method _record_learning (line 3662) | def _record_learning(self, key: str, value: Any) -> None: method _next_spill_filename (line 3704) | def _next_spill_filename(self, tool_name: str) -> str: method _restore_spill_counter (line 3711) | def _restore_spill_counter(self) -> None: method _extract_json_metadata (line 3735) | def _extract_json_metadata(parsed: Any, *, _depth: int = 0, _max_depth... method _build_json_preview (line 3792) | def _build_json_preview(parsed: Any, *, max_chars: int = 5000) -> str ... method _truncate_tool_result (line 3849) | def _truncate_tool_result( method _compact (line 4042) | async def _compact( method _llm_compact (line 4139) | async def _llm_compact( method _llm_compact_split (line 4211) | async def _llm_compact_split( method _format_messages_for_summary (line 4232) | def _format_messages_for_summary(messages: list) -> str: method _build_llm_compaction_prompt (line 4249) | def _build_llm_compaction_prompt( method _build_message_inventory (line 4298) | def _build_message_inventory( method _log_compaction (line 4340) | async def _log_compaction( method _write_compaction_debug_log (line 4406) | def _write_compaction_debug_log( method _build_emergency_summary (line 4479) | def _build_emergency_summary( class _RestoredState (line 4601) | class _RestoredState: method _restore (line 4610) | async def _restore( method _write_cursor (line 4666) | async def _write_cursor( method _drain_injection_queue (line 4701) | async def _drain_injection_queue(self, conversation: NodeConversation)... method _drain_trigger_queue (line 4722) | async def _drain_trigger_queue(self, conversation: NodeConversation) -... method _check_pause (line 4750) | async def _check_pause( method _publish_loop_started (line 4786) | async def _publish_loop_started( method _generate_action_plan (line 4797) | async def _generate_action_plan( method _run_hooks (line 4844) | async def _run_hooks( method _publish_context_usage (line 4883) | async def _publish_context_usage( method _publish_iteration (line 4913) | async def _publish_iteration( method _publish_llm_turn_complete (line 4930) | async def _publish_llm_turn_complete( method _log_skip_judge (line 4955) | def _log_skip_judge( method _publish_loop_completed (line 4981) | async def _publish_loop_completed( method _publish_stalled (line 4992) | async def _publish_stalled(self, stream_id: str, node_id: str, executi... method _publish_text_delta (line 5001) | async def _publish_text_delta( method _publish_tool_started (line 5033) | async def _publish_tool_started( method _publish_tool_completed (line 5052) | async def _publish_tool_completed( method _publish_judge_verdict (line 5073) | async def _publish_judge_verdict( method _publish_output_key_set (line 5094) | async def _publish_output_key_set( method _execute_subagent (line 5110) | async def _execute_subagent( FILE: core/framework/graph/executor.py function _default_max_context_tokens (line 40) | def _default_max_context_tokens() -> int: class ExecutionResult (line 51) | class ExecutionResult: method is_clean_success (line 75) | def is_clean_success(self) -> bool: method is_degraded_success (line 80) | def is_degraded_success(self) -> bool: class ParallelBranch (line 86) | class ParallelBranch: class ParallelExecutionConfig (line 99) | class ParallelExecutionConfig: class GraphExecutor (line 114) | class GraphExecutor: method __init__ (line 133) | def __init__( method _write_progress (line 233) | def _write_progress( method _validate_tools (line 287) | def _validate_tools(self, graph: GraphSpec) -> list[str]: method _phase_llm_compact (line 332) | async def _phase_llm_compact( method _phase_llm_compact_split (line 424) | async def _phase_llm_compact_split( method _get_runtime_log_session_id (line 447) | def _get_runtime_log_session_id(self) -> str: method execute (line 455) | async def execute( method _build_context (line 1808) | def _build_context( method _get_node_implementation (line 1924) | def _get_node_implementation( method _follow_edges (line 1997) | async def _follow_edges( method _get_all_traversable_edges (line 2030) | async def _get_all_traversable_edges( method _find_convergence_node (line 2078) | def _find_convergence_node( method _execute_parallel_branches (line 2112) | async def _execute_parallel_branches( method register_node (line 2370) | def register_node(self, node_id: str, implementation: NodeProtocol) ->... method request_pause (line 2374) | def request_pause(self) -> None: method _create_checkpoint (line 2387) | def _create_checkpoint( FILE: core/framework/graph/goal.py class GoalStatus (line 21) | class GoalStatus(StrEnum): class SuccessCriterion (line 32) | class SuccessCriterion(BaseModel): class Constraint (line 59) | class Constraint(BaseModel): class Goal (line 83) | class Goal(BaseModel): method is_success (line 160) | def is_success(self) -> bool: method to_prompt_context (line 170) | def to_prompt_context(self) -> str: FILE: core/framework/graph/node.py function _fix_unescaped_newlines_in_json (line 33) | def _fix_unescaped_newlines_in_json(json_str: str) -> str: function find_json_object (line 89) | def find_json_object(text: str) -> str | None: class NodeSpec (line 141) | class NodeSpec(BaseModel): class MemoryWriteError (line 278) | class MemoryWriteError(Exception): class SharedMemory (line 285) | class SharedMemory: method __post_init__ (line 303) | def __post_init__(self) -> None: method read (line 308) | def read(self, key: str) -> Any: method write (line 314) | def write(self, key: str, value: Any, validate: bool = True) -> None: method write_async (line 347) | async def write_async(self, key: str, value: Any, validate: bool = Tru... method _contains_code_indicators (line 389) | def _contains_code_indicators(self, value: str) -> bool: method read_all (line 450) | def read_all(self) -> dict[str, Any]: method with_permissions (line 456) | def with_permissions( class NodeContext (line 476) | class NodeContext: class NodeResult (line 580) | class NodeResult: method to_summary (line 609) | def to_summary(self, node_spec: Any = None) -> str: class NodeProtocol (line 630) | class NodeProtocol(ABC): method execute (line 662) | async def execute(self, ctx: NodeContext) -> NodeResult: method validate_input (line 674) | def validate_input(self, ctx: NodeContext) -> list[str]: FILE: core/framework/graph/prompt_composer.py function _with_datetime (line 40) | def _with_datetime(prompt: str) -> str: function build_accounts_prompt (line 47) | def build_accounts_prompt( function compose_system_prompt (line 148) | def compose_system_prompt( function build_narrative (line 213) | def build_narrative( function build_transition_marker (line 261) | def build_transition_marker( FILE: core/framework/graph/safe_eval.py class SafeEvalVisitor (line 56) | class SafeEvalVisitor(ast.NodeVisitor): method __init__ (line 57) | def __init__(self, context: dict[str, Any]): method visit (line 60) | def visit(self, node: ast.AST) -> Any: method generic_visit (line 66) | def generic_visit(self, node: ast.AST): method visit_Expression (line 69) | def visit_Expression(self, node: ast.Expression) -> Any: method visit_Expr (line 72) | def visit_Expr(self, node: ast.Expr) -> Any: method visit_Constant (line 75) | def visit_Constant(self, node: ast.Constant) -> Any: method visit_List (line 79) | def visit_List(self, node: ast.List) -> list: method visit_Tuple (line 82) | def visit_Tuple(self, node: ast.Tuple) -> tuple: method visit_Dict (line 85) | def visit_Dict(self, node: ast.Dict) -> dict: method visit_BinOp (line 93) | def visit_BinOp(self, node: ast.BinOp) -> Any: method visit_UnaryOp (line 99) | def visit_UnaryOp(self, node: ast.UnaryOp) -> Any: method visit_Compare (line 105) | def visit_Compare(self, node: ast.Compare) -> Any: method visit_BoolOp (line 117) | def visit_BoolOp(self, node: ast.BoolOp) -> Any: method visit_IfExp (line 137) | def visit_IfExp(self, node: ast.IfExp) -> Any: method visit_Name (line 145) | def visit_Name(self, node: ast.Name) -> Any: method visit_Subscript (line 152) | def visit_Subscript(self, node: ast.Subscript) -> Any: method visit_Attribute (line 158) | def visit_Attribute(self, node: ast.Attribute) -> Any: method visit_Call (line 185) | def visit_Call(self, node: ast.Call) -> Any: method visit_Index (line 231) | def visit_Index(self, node: ast.Index) -> Any: function safe_eval (line 236) | def safe_eval(expr: str, context: dict[str, Any] | None = None) -> Any: FILE: core/framework/graph/validator.py class ValidationResult (line 17) | class ValidationResult: method error (line 24) | def error(self) -> str: class OutputValidator (line 29) | class OutputValidator: method _contains_code_indicators (line 36) | def _contains_code_indicators(self, value: str) -> bool: method validate_output_keys (line 100) | def validate_output_keys( method validate_with_pydantic (line 142) | def validate_with_pydantic( method format_validation_feedback (line 169) | def format_validation_feedback( method validate_no_hallucination (line 207) | def validate_no_hallucination( method validate_schema (line 246) | def validate_schema( method validate_all (line 276) | def validate_all( FILE: core/framework/llm/anthropic.py function _get_api_key_from_credential_store (line 10) | def _get_api_key_from_credential_store() -> str | None: class AnthropicProvider (line 28) | class AnthropicProvider(LLMProvider): method __init__ (line 37) | def __init__( method complete (line 64) | def complete( method acomplete (line 85) | async def acomplete( FILE: core/framework/llm/antigravity.py function _load_from_json_file (line 86) | def _load_from_json_file() -> tuple[str | None, str | None, str, float]: function _load_from_ide_db (line 147) | def _load_from_ide_db() -> tuple[str | None, str | None, float]: function _do_token_refresh (line 199) | def _do_token_refresh(refresh_token: str) -> tuple[str, float] | None: function _clean_tool_name (line 256) | def _clean_tool_name(name: str) -> str: function _to_gemini_contents (line 264) | def _to_gemini_contents( function _map_finish_reason (line 370) | def _map_finish_reason(reason: str) -> str: function _parse_complete_response (line 376) | def _parse_complete_response(raw: dict[str, Any], model: str) -> LLMResp... function _parse_sse_stream (line 398) | def _parse_sse_stream( class AntigravityProvider (line 477) | class AntigravityProvider(LLMProvider): method __init__ (line 484) | def __init__(self, model: str = "gemini-3-flash") -> None: method _init_credentials (line 500) | def _init_credentials(self) -> None: method has_credentials (line 517) | def has_credentials(self) -> bool: method _ensure_token (line 521) | def _ensure_token(self) -> str: method _build_body (line 547) | def _build_body( method _post (line 589) | def _post(self, body: dict[str, Any], *, streaming: bool) -> Any: method complete (line 651) | def complete( method stream (line 669) | async def stream( FILE: core/framework/llm/litellm.py function _patch_litellm_anthropic_oauth (line 37) | def _patch_litellm_anthropic_oauth() -> None: function _patch_litellm_metadata_nonetype (line 105) | def _patch_litellm_metadata_nonetype() -> None: function _model_supports_cache_control (line 182) | def _model_supports_cache_control(model: str) -> bool: function _sample_js_code_unit (line 198) | def _sample_js_code_unit(text: str, idx: int) -> str: function _claude_code_billing_header (line 208) | def _claude_code_billing_header(messages: list[dict[str, Any]]) -> str: function _estimate_tokens (line 263) | def _estimate_tokens(model: str, messages: list[dict]) -> tuple[int, str]: function _prune_failed_request_dumps (line 278) | def _prune_failed_request_dumps(max_files: int = MAX_FAILED_REQUEST_DUMP... function _remember_openrouter_tool_compat_model (line 296) | def _remember_openrouter_tool_compat_model(model: str) -> None: function _is_openrouter_tool_compat_cached (line 303) | def _is_openrouter_tool_compat_cached(model: str) -> bool: function _dump_failed_request (line 314) | def _dump_failed_request( function _compute_retry_delay (line 351) | def _compute_retry_delay( function _is_stream_transient_error (line 407) | def _is_stream_transient_error(exc: BaseException) -> bool: class LiteLLMProvider (line 441) | class LiteLLMProvider(LLMProvider): method __init__ (line 478) | def __init__( method _default_api_base_for_model (line 543) | def _default_api_base_for_model(model: str) -> str | None: method _completion_with_rate_limit_retry (line 556) | def _completion_with_rate_limit_retry( method complete (line 668) | def complete( method _acompletion_with_rate_limit_retry (line 760) | async def _acompletion_with_rate_limit_retry( method acomplete (line 867) | async def acomplete( method _tool_to_openai_format (line 941) | def _tool_to_openai_format(self, tool: Tool) -> dict[str, Any]: method _is_anthropic_model (line 956) | def _is_anthropic_model(self) -> bool: method _is_minimax_model (line 961) | def _is_minimax_model(self) -> bool: method _is_openrouter_model (line 966) | def _is_openrouter_model(self) -> bool: method _should_use_openrouter_tool_compat (line 974) | def _should_use_openrouter_tool_compat( method _extract_json_object (line 988) | def _extract_json_object(text: str) -> dict[str, Any] | None: method _parse_openrouter_tool_compat_response (line 1020) | def _parse_openrouter_tool_compat_response( method _close_truncated_json_fragment (line 1114) | def _close_truncated_json_fragment(fragment: str) -> str: method _repair_truncated_tool_arguments (line 1153) | def _repair_truncated_tool_arguments(self, raw_arguments: str) -> dict... method _parse_tool_call_arguments (line 1173) | def _parse_tool_call_arguments(self, raw_arguments: str, tool_name: st... method _parse_openrouter_text_tool_calls (line 1196) | def _parse_openrouter_text_tool_calls( method _parse_openrouter_text_tool_call_block (line 1249) | def _parse_openrouter_text_tool_call_block( method _parse_openrouter_text_tool_call_arguments (line 1292) | def _parse_openrouter_text_tool_call_arguments( method _build_openrouter_tool_compat_messages (line 1314) | def _build_openrouter_tool_compat_messages( method _acomplete_via_openrouter_tool_compat (line 1358) | async def _acomplete_via_openrouter_tool_compat( method _stream_via_openrouter_tool_compat (line 1402) | async def _stream_via_openrouter_tool_compat( method _stream_via_nonstream_completion (line 1454) | async def _stream_via_nonstream_completion( method stream (line 1519) | async def stream( method _collect_stream_to_response (line 1930) | async def _collect_stream_to_response( FILE: core/framework/llm/mock.py class MockLLMProvider (line 17) | class MockLLMProvider(LLMProvider): method __init__ (line 35) | def __init__(self, model: str = "mock-model"): method _extract_output_keys (line 44) | def _extract_output_keys(self, system: str) -> list[str]: method _generate_mock_response (line 85) | def _generate_mock_response( method complete (line 115) | def complete( method acomplete (line 149) | async def acomplete( method stream (line 170) | async def stream( FILE: core/framework/llm/provider.py class LLMResponse (line 12) | class LLMResponse: class Tool (line 24) | class Tool: class ToolUse (line 33) | class ToolUse: class ToolResult (line 42) | class ToolResult: class LLMProvider (line 51) | class LLMProvider(ABC): method complete (line 63) | def complete( method acomplete (line 94) | async def acomplete( method stream (line 124) | async def stream( FILE: core/framework/llm/stream_events.py class TextDeltaEvent (line 15) | class TextDeltaEvent: class TextEndEvent (line 24) | class TextEndEvent: class ToolCallEvent (line 32) | class ToolCallEvent: class ToolResultEvent (line 42) | class ToolResultEvent: class ReasoningStartEvent (line 52) | class ReasoningStartEvent: class ReasoningDeltaEvent (line 59) | class ReasoningDeltaEvent: class FinishEvent (line 67) | class FinishEvent: class StreamErrorEvent (line 79) | class StreamErrorEvent: FILE: core/framework/observability/logging.py function strip_ansi_codes (line 37) | def strip_ansi_codes(text: str) -> str: class StructuredFormatter (line 42) | class StructuredFormatter(logging.Formatter): method format (line 52) | def format(self, record: logging.LogRecord) -> str: class HumanReadableFormatter (line 103) | class HumanReadableFormatter(logging.Formatter): method format (line 121) | def format(self, record: logging.LogRecord) -> str: function configure_logging (line 151) | def configure_logging( function _disable_third_party_colors (line 234) | def _disable_third_party_colors() -> None: function set_trace_context (line 251) | def set_trace_context(**kwargs: Any) -> None: function get_trace_context (line 283) | def get_trace_context() -> dict: function clear_trace_context (line 295) | def clear_trace_context() -> None: FILE: core/framework/runner/cli.py function register_commands (line 10) | def register_commands(subparsers: argparse._SubParsersAction) -> None: function _load_resume_state (line 290) | def _load_resume_state( function _prompt_before_start (line 346) | def _prompt_before_start(agent_path: str, runner, model: str | None = No... function cmd_run (line 380) | def cmd_run(args: argparse.Namespace) -> int: function cmd_info (line 566) | def cmd_info(args: argparse.Namespace) -> int: function cmd_validate (line 633) | def cmd_validate(args: argparse.Namespace) -> int: function cmd_list (line 671) | def cmd_list(args: argparse.Namespace) -> int: function cmd_dispatch (line 725) | def cmd_dispatch(args: argparse.Namespace) -> int: function _interactive_approval (line 837) | def _interactive_approval(request): function _format_natural_language_to_json (line 905) | def _format_natural_language_to_json( function cmd_shell (line 923) | def cmd_shell(args: argparse.Namespace) -> int: function _get_framework_agents_dir (line 1156) | def _get_framework_agents_dir() -> Path: function _extract_python_agent_metadata (line 1161) | def _extract_python_agent_metadata(agent_path: Path) -> tuple[str, str]: function _eval_string_binop (line 1219) | def _eval_string_binop(node) -> str | None: function _is_valid_agent_dir (line 1233) | def _is_valid_agent_dir(path: Path) -> bool: function _has_agents (line 1240) | def _has_agents(directory: Path) -> bool: function _getch (line 1247) | def _getch() -> str: function _read_key (line 1271) | def _read_key() -> str: function _select_agent (line 1285) | def _select_agent(agents_dir: Path) -> str | None: function _interactive_multi (line 1412) | def _interactive_multi(agents_dir: Path) -> int: function cmd_setup_credentials (line 1513) | def cmd_setup_credentials(args: argparse.Namespace) -> int: function _open_browser (line 1535) | def _open_browser(url: str) -> None: function _build_frontend (line 1564) | def _build_frontend() -> bool: function cmd_serve (line 1626) | def cmd_serve(args: argparse.Namespace) -> int: function cmd_open (line 1701) | def cmd_open(args: argparse.Namespace) -> int: FILE: core/framework/runner/mcp_client.py class MCPServerConfig (line 21) | class MCPServerConfig: class MCPTool (line 43) | class MCPTool: class MCPClient (line 52) | class MCPClient: method __init__ (line 60) | def __init__(self, config: MCPServerConfig): method _run_async (line 84) | def _run_async(self, coro): method connect (line 137) | def connect(self) -> None: method _connect_stdio (line 157) | def _connect_stdio(self) -> None: method _connect_http (line 253) | def _connect_http(self) -> None: method _connect_unix (line 275) | def _connect_unix(self) -> None: method _connect_sse (line 301) | def _connect_sse(self) -> None: method _discover_tools (line 359) | def _discover_tools(self) -> None: method _list_tools_stdio_async (line 385) | async def _list_tools_stdio_async(self) -> list[dict]: method _list_tools_http (line 406) | def _list_tools_http(self) -> list[dict]: method list_tools (line 432) | def list_tools(self) -> list[MCPTool]: method call_tool (line 444) | def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> Any: method _call_tool_with_retry (line 473) | def _call_tool_with_retry(self, call: Any) -> Any: method _call_tool_stdio_async (line 495) | async def _call_tool_stdio_async(self, tool_name: str, arguments: dict... method _call_tool_http (line 526) | def _call_tool_http(self, tool_name: str, arguments: dict[str, Any]) -... method _reconnect (line 554) | def _reconnect(self) -> None: method _cleanup_stdio_async (line 563) | async def _cleanup_stdio_async(self) -> None: method disconnect (line 623) | def disconnect(self) -> None: method __enter__ (line 704) | def __enter__(self): method __exit__ (line 709) | def __exit__(self, exc_type, exc_val, exc_tb): FILE: core/framework/runner/mcp_connection_manager.py class MCPConnectionManager (line 14) | class MCPConnectionManager: method __init__ (line 20) | def __init__(self) -> None: method get_instance (line 29) | def get_instance(cls) -> "MCPConnectionManager": method _is_connected (line 38) | def _is_connected(client: MCPClient | None) -> bool: method acquire (line 41) | def acquire(self, config: MCPServerConfig) -> MCPClient: method release (line 101) | def release(self, server_name: str) -> None: method health_check (line 139) | def health_check(self, server_name: str) -> bool: method reconnect (line 179) | def reconnect(self, server_name: str) -> MCPClient: method cleanup_all (line 226) | def cleanup_all(self) -> None: FILE: core/framework/runner/orchestrator.py class RoutingDecision (line 24) | class RoutingDecision: class AgentOrchestrator (line 34) | class AgentOrchestrator: method __init__ (line 55) | def __init__( method register (line 84) | def register( method register_runner (line 111) | def register_runner( method list_agents (line 137) | def list_agents(self) -> list[dict]: method dispatch (line 152) | async def dispatch( method relay (line 263) | async def relay( method broadcast (line 299) | async def broadcast( method _check_all_capabilities (line 350) | async def _check_all_capabilities( method _route_request (line 378) | async def _route_request( method _llm_route (line 430) | async def _llm_route( method _send_to_agent (line 496) | async def _send_to_agent( method get_message_log (line 505) | def get_message_log(self) -> list[AgentMessage]: method clear_message_log (line 509) | def clear_message_log(self) -> None: method cleanup (line 513) | def cleanup(self) -> None: FILE: core/framework/runner/preload_validation.py class PreloadValidationError (line 20) | class PreloadValidationError(Exception): method __init__ (line 23) | def __init__(self, errors: list[str]): class PreloadResult (line 30) | class PreloadResult: function validate_graph_structure (line 38) | def validate_graph_structure(graph: GraphSpec) -> list[str]: function validate_credentials (line 49) | def validate_credentials( function credential_errors_to_json (line 115) | def credential_errors_to_json(exc: Exception) -> dict: function run_preload_validation (line 160) | def run_preload_validation( FILE: core/framework/runner/protocol.py class MessageType (line 10) | class MessageType(Enum): class CapabilityLevel (line 21) | class CapabilityLevel(Enum): class AgentMessage (line 31) | class AgentMessage: method reply (line 50) | def reply( class CapabilityResponse (line 69) | class CapabilityResponse: class OrchestratorResult (line 81) | class OrchestratorResult: class RegisteredAgent (line 92) | class RegisteredAgent: FILE: core/framework/runner/runner.py function _read_claude_keychain (line 55) | def _read_claude_keychain() -> dict | None: function _save_claude_keychain (line 94) | def _save_claude_keychain(creds: dict) -> bool: function _read_claude_credentials (line 127) | def _read_claude_credentials() -> dict | None: function _refresh_claude_code_token (line 145) | def _refresh_claude_code_token(refresh_token: str) -> dict | None: function _save_refreshed_credentials (line 182) | def _save_refreshed_credentials(token_data: dict) -> None: function get_claude_code_token (line 212) | def get_claude_code_token() -> str | None: function _get_codex_keychain_account (line 267) | def _get_codex_keychain_account() -> str: function _read_codex_keychain (line 280) | def _read_codex_keychain() -> dict | None: function _read_codex_auth_file (line 319) | def _read_codex_auth_file() -> dict | None: function _is_codex_token_expired (line 330) | def _is_codex_token_expired(auth_data: dict) -> bool: function _refresh_codex_token (line 362) | def _refresh_codex_token(refresh_token: str) -> dict | None: function _save_refreshed_codex_credentials (line 397) | def _save_refreshed_codex_credentials(auth_data: dict, token_data: dict)... function get_codex_token (line 424) | def get_codex_token() -> str | None: function _get_account_id_from_jwt (line 466) | def _get_account_id_from_jwt(access_token: str) -> str | None: function get_codex_account_id (line 497) | def get_codex_account_id() -> str | None: function get_kimi_code_token (line 525) | def get_kimi_code_token() -> str | None: function _read_antigravity_ide_credentials (line 583) | def _read_antigravity_ide_credentials() -> dict | None: function _read_antigravity_credentials (line 659) | def _read_antigravity_credentials() -> dict | None: function _is_antigravity_token_expired (line 687) | def _is_antigravity_token_expired(auth_data: dict) -> bool: function _refresh_antigravity_token (line 728) | def _refresh_antigravity_token(refresh_token: str) -> dict | None: function _save_refreshed_antigravity_credentials (line 771) | def _save_refreshed_antigravity_credentials(auth_data: dict, token_data:... function get_antigravity_token (line 804) | def get_antigravity_token() -> str | None: function _is_antigravity_proxy_available (line 857) | def _is_antigravity_proxy_available() -> bool: class AgentInfo (line 869) | class AgentInfo: class ValidationResult (line 889) | class ValidationResult: function load_agent_export (line 899) | def load_agent_export(data: str | dict) -> tuple[GraphSpec, Goal]: class AgentRunner (line 997) | class AgentRunner: method _resolve_default_model (line 1023) | def _resolve_default_model() -> str: method __init__ (line 1027) | def __init__( method _import_agent_module (line 1125) | def _import_agent_module(agent_path: Path): method load (line 1164) | def load( method register_tool (line 1348) | def register_tool( method register_tools_from_module (line 1370) | def register_tools_from_module(self, module_path: Path) -> int: method register_mcp_server (line 1382) | def register_mcp_server( method _load_mcp_servers_from_config (line 1423) | def _load_mcp_servers_from_config(self, config_path: Path) -> None: method set_approval_callback (line 1427) | def set_approval_callback(self, callback: Callable) -> None: method _setup (line 1436) | def _setup(self, event_bus=None) -> None: method _get_api_key_env_var (line 1699) | def _get_api_key_env_var(self, model: str) -> str | None: method _get_api_key_from_credential_store (line 1739) | def _get_api_key_from_credential_store(self) -> str | None: method _is_local_model (line 1775) | def _is_local_model(model: str) -> bool: method _setup_agent_runtime (line 1790) | def _setup_agent_runtime( method run (line 1880) | async def run( method _run_with_agent_runtime (line 1922) | async def _run_with_agent_runtime( method start (line 2016) | async def start(self) -> None: method stop (line 2028) | async def stop(self) -> None: method trigger (line 2033) | async def trigger( method get_goal_progress (line 2064) | async def get_goal_progress(self) -> dict[str, Any]: method get_entry_points (line 2076) | def get_entry_points(self) -> list[EntryPointSpec]: method is_running (line 2089) | def is_running(self) -> bool: method info (line 2095) | def info(self) -> AgentInfo: method validate (line 2155) | def validate(self) -> ValidationResult: method can_handle (line 2234) | async def can_handle( method _keyword_capability_check (line 2329) | def _keyword_capability_check(self, request: dict) -> "CapabilityRespo... method receive_message (line 2366) | async def receive_message(self, message: "AgentMessage") -> "AgentMess... method setup_as_secondary (line 2433) | async def setup_as_secondary( method cleanup (line 2475) | def cleanup(self) -> None: method cleanup_async (line 2484) | async def cleanup_async(self) -> None: method __aenter__ (line 2493) | async def __aenter__(self) -> "AgentRunner": method __aexit__ (line 2500) | async def __aexit__(self, *args) -> None: method __del__ (line 2504) | def __del__(self) -> None: FILE: core/framework/runner/tool_registry.py class RegisteredTool (line 28) | class RegisteredTool: class ToolRegistry (line 35) | class ToolRegistry: method __init__ (line 54) | def __init__(self): method register (line 68) | def register( method register_function (line 84) | def register_function( method discover_from_module (line 143) | def discover_from_module(self, module_path: Path) -> int: method get_tools (line 232) | def get_tools(self) -> dict[str, Tool]: method get_executor (line 236) | def get_executor(self) -> Callable[[ToolUse], ToolResult]: method get_registered_names (line 292) | def get_registered_names(self) -> list[str]: method has_tool (line 296) | def has_tool(self, name: str) -> bool: method get_server_tool_names (line 300) | def get_server_tool_names(self, server_name: str) -> set[str]: method set_session_context (line 304) | def set_session_context(self, **context) -> None: method set_execution_context (line 314) | def set_execution_context(**context) -> contextvars.Token: method reset_execution_context (line 327) | def reset_execution_context(token: contextvars.Token) -> None: method resolve_mcp_stdio_config (line 332) | def resolve_mcp_stdio_config(server_config: dict[str, Any], base_dir: ... method _resolve_mcp_server_config (line 342) | def _resolve_mcp_server_config( method load_mcp_config (line 428) | def load_mcp_config(self, config_path: Path) -> None: method register_mcp_server (line 482) | def register_mcp_server( method _convert_mcp_tool_to_framework_tool (line 609) | def _convert_mcp_tool_to_framework_tool(self, mcp_tool: Any) -> Tool: method build_provider_index (line 646) | def build_provider_index(self) -> None: method get_by_provider (line 666) | def get_by_provider(self, provider: str) -> dict[str, Tool]: method get_tool_names_by_provider (line 676) | def get_tool_names_by_provider(self, provider: str) -> list[str]: method get_all_provider_tool_names (line 683) | def get_all_provider_tool_names(self) -> list[str]: method _snapshot_credentials (line 696) | def _snapshot_credentials(self) -> set[str]: method resync_mcp_servers_if_needed (line 703) | def resync_mcp_servers_if_needed(self) -> bool: method cleanup (line 748) | def cleanup(self) -> None: method _cleanup_mcp_clients (line 752) | def _cleanup_mcp_clients(self, context: str = "") -> None: method __del__ (line 773) | def __del__(self): function tool (line 778) | def tool( FILE: core/framework/runtime/agent_runtime.py class AgentRuntimeConfig (line 38) | class AgentRuntimeConfig: class _GraphRegistration (line 55) | class _GraphRegistration: class AgentRuntime (line 68) | class AgentRuntime: method __init__ (line 120) | def __init__( method skills_catalog_prompt (line 264) | def skills_catalog_prompt(self) -> str: method protocols_prompt (line 268) | def protocols_prompt(self) -> str: method register_entry_point (line 271) | def register_entry_point(self, spec: EntryPointSpec) -> None: method unregister_entry_point (line 295) | def unregister_entry_point(self, entry_point_id: str) -> bool: method start (line 316) | async def start(self) -> None: method stop (line 772) | async def stop(self) -> None: method pause_timers (line 811) | def pause_timers(self) -> None: method resume_timers (line 819) | def resume_timers(self) -> None: method _resolve_stream (line 824) | def _resolve_stream( method trigger (line 852) | async def trigger( method trigger_and_wait (line 890) | async def trigger_and_wait( method add_graph (line 917) | async def add_graph( method remove_graph (line 1235) | async def remove_graph(self, graph_id: str) -> None: method _teardown_graph (line 1254) | async def _teardown_graph(self, graph_id: str) -> None: method list_graphs (line 1276) | def list_graphs(self) -> list[str]: method graph_id (line 1287) | def graph_id(self) -> str: method active_graph_id (line 1292) | def active_graph_id(self) -> str: method active_graph_id (line 1297) | def active_graph_id(self, value: str) -> None: method get_active_graph (line 1302) | def get_active_graph(self) -> "GraphSpec": method user_idle_seconds (line 1312) | def user_idle_seconds(self) -> float: method agent_idle_seconds (line 1322) | def agent_idle_seconds(self) -> float: method get_graph_registration (line 1336) | def get_graph_registration(self, graph_id: str) -> _GraphRegistration ... method cancel_all_tasks (line 1340) | def cancel_all_tasks(self, loop: asyncio.AbstractEventLoop) -> bool: method cancel_all_tasks_async (line 1358) | async def cancel_all_tasks_async(self) -> bool: method _get_primary_session_state (line 1376) | def _get_primary_session_state( method inject_input (line 1470) | async def inject_input( method get_goal_progress (line 1512) | async def get_goal_progress(self) -> dict[str, Any]: method cancel_execution (line 1522) | async def cancel_execution( method get_entry_points (line 1546) | def get_entry_points(self, graph_id: str | None = None) -> list[EntryP... method get_timer_next_fire_in (line 1566) | def get_timer_next_fire_in(self, entry_point_id: str) -> float | None: method get_stream (line 1583) | def get_stream(self, entry_point_id: str) -> ExecutionStream | None: method find_awaiting_node (line 1587) | def find_awaiting_node(self) -> tuple[str | None, str | None]: method get_execution_result (line 1609) | def get_execution_result( method subscribe_to_events (line 1623) | def subscribe_to_events( method unsubscribe_from_events (line 1649) | def unsubscribe_from_events(self, subscription_id: str) -> bool: method get_stats (line 1655) | def get_stats(self) -> dict: method get_active_streams (line 1671) | def get_active_streams(self) -> list[dict[str, Any]]: method get_waiting_nodes (line 1695) | def get_waiting_nodes(self) -> list[dict[str, Any]]: method state_manager (line 1717) | def state_manager(self) -> SharedStateManager: method event_bus (line 1722) | def event_bus(self) -> EventBus: method outcome_aggregator (line 1727) | def outcome_aggregator(self) -> OutcomeAggregator: method webhook_server (line 1732) | def webhook_server(self) -> Any: method timers_paused (line 1737) | def timers_paused(self) -> bool: method is_running (line 1742) | def is_running(self) -> bool: function create_agent_runtime (line 1750) | def create_agent_runtime( FILE: core/framework/runtime/core.py class Runtime (line 24) | class Runtime: method __init__ (line 58) | def __init__(self, storage_path: str | Path): method execution_id (line 70) | def execution_id(self) -> str: method start_run (line 75) | def start_run( method end_run (line 111) | def end_run( method set_node (line 139) | def set_node(self, node_id: str) -> None: method current_run (line 144) | def current_run(self) -> Run | None: method decide (line 150) | def decide( method record_outcome (line 226) | def record_outcome( method report_problem (line 274) | def report_problem( method decide_and_execute (line 316) | def decide_and_execute( method quick_decision (line 376) | def quick_decision( FILE: core/framework/runtime/escalation_ticket.py class EscalationTicket (line 12) | class EscalationTicket(BaseModel): FILE: core/framework/runtime/event_bus.py function _open_event_log (line 39) | def _open_event_log() -> IO[str] | None: class EventType (line 59) | class EventType(StrEnum): class AgentEvent (line 167) | class AgentEvent: method to_dict (line 180) | def to_dict(self) -> dict: class Subscription (line 202) | class Subscription: class EventBus (line 214) | class EventBus: method __init__ (line 245) | def __init__( method set_session_log (line 270) | def set_session_log(self, path: Path, *, iteration_offset: int = 0) ->... method close_session_log (line 291) | def close_session_log(self) -> None: method _write_session_log_event (line 312) | def _write_session_log_event(self, event: AgentEvent) -> None: method _flush_pending_snapshots (line 350) | def _flush_pending_snapshots( method subscribe (line 386) | def subscribe( method unsubscribe (line 427) | def unsubscribe(self, subscription_id: str) -> bool: method publish (line 443) | async def publish(self, event: AgentEvent) -> None: method _matches (line 503) | def _matches(self, subscription: Subscription, event: AgentEvent) -> b... method _execute_handlers (line 527) | async def _execute_handlers( method emit_execution_started (line 546) | async def emit_execution_started( method emit_execution_completed (line 566) | async def emit_execution_completed( method emit_execution_failed (line 586) | async def emit_execution_failed( method emit_goal_progress (line 606) | async def emit_goal_progress( method emit_constraint_violation (line 624) | async def emit_constraint_violation( method emit_state_changed (line 644) | async def emit_state_changed( method emit_node_loop_started (line 670) | async def emit_node_loop_started( method emit_node_loop_iteration (line 688) | async def emit_node_loop_iteration( method emit_node_loop_completed (line 710) | async def emit_node_loop_completed( method emit_node_action_plan (line 728) | async def emit_node_action_plan( method emit_llm_text_delta (line 748) | async def emit_llm_text_delta( method emit_llm_reasoning_delta (line 768) | async def emit_llm_reasoning_delta( method emit_llm_turn_complete (line 786) | async def emit_llm_turn_complete( method emit_tool_call_started (line 820) | async def emit_tool_call_started( method emit_tool_call_completed (line 844) | async def emit_tool_call_completed( method emit_client_output_delta (line 872) | async def emit_client_output_delta( method emit_client_input_requested (line 896) | async def emit_client_input_requested( method emit_node_internal_output (line 932) | async def emit_node_internal_output( method emit_node_stalled (line 950) | async def emit_node_stalled( method emit_tool_doom_loop (line 968) | async def emit_tool_doom_loop( method emit_node_input_blocked (line 986) | async def emit_node_input_blocked( method emit_judge_verdict (line 1006) | async def emit_judge_verdict( method emit_output_key_set (line 1032) | async def emit_output_key_set( method emit_node_retry (line 1050) | async def emit_node_retry( method emit_edge_traversed (line 1074) | async def emit_edge_traversed( method emit_execution_paused (line 1097) | async def emit_execution_paused( method emit_execution_resumed (line 1115) | async def emit_execution_resumed( method emit_webhook_received (line 1132) | async def emit_webhook_received( method emit_escalation_requested (line 1156) | async def emit_escalation_requested( method emit_worker_escalation_ticket (line 1175) | async def emit_worker_escalation_ticket( method emit_queen_intervention_requested (line 1193) | async def emit_queen_intervention_requested( method emit_subagent_report (line 1221) | async def emit_subagent_report( method get_history (line 1247) | def get_history( method get_stats (line 1278) | def get_stats(self) -> dict: method wait_for (line 1292) | async def wait_for( FILE: core/framework/runtime/execution_stream.py class ExecutionAlreadyRunningError (line 37) | class ExecutionAlreadyRunningError(RuntimeError): method __init__ (line 40) | def __init__(self, stream_id: str, active_ids: list[str]): class GraphScopedEventBus (line 52) | class GraphScopedEventBus(EventBus): method __init__ (line 68) | def __init__(self, bus: "EventBus", graph_id: str) -> None: method publish (line 75) | async def publish(self, event: "AgentEvent") -> None: # type: ignore[... method subscribe (line 84) | def subscribe(self, *args: Any, **kwargs: Any) -> str: method unsubscribe (line 87) | def unsubscribe(self, subscription_id: str) -> bool: method get_history (line 90) | def get_history(self, *args: Any, **kwargs: Any) -> list: method get_stats (line 93) | def get_stats(self) -> dict: method wait_for (line 96) | async def wait_for(self, *args: Any, **kwargs: Any) -> Any: class EntryPointSpec (line 101) | class EntryPointSpec: method get_isolation_level (line 114) | def get_isolation_level(self) -> IsolationLevel: class ExecutionContext (line 120) | class ExecutionContext: class ExecutionStream (line 136) | class ExecutionStream: method __init__ (line 167) | def __init__( method start (line 286) | async def start(self) -> None: method active_execution_ids (line 307) | def active_execution_ids(self) -> list[str]: method agent_idle_seconds (line 312) | def agent_idle_seconds(self) -> float: method is_awaiting_input (line 327) | def is_awaiting_input(self) -> bool: method get_waiting_nodes (line 337) | def get_waiting_nodes(self) -> list[dict[str, str]]: method get_injectable_nodes (line 349) | def get_injectable_nodes(self) -> list[dict[str, str]]: method _record_execution_result (line 369) | def _record_execution_result(self, execution_id: str, result: Executio... method _prune_execution_results (line 376) | def _prune_execution_results(self) -> None: method stop (line 390) | async def stop(self) -> None: method inject_input (line 430) | async def inject_input( method inject_trigger (line 451) | async def inject_trigger( method execute (line 475) | async def execute( method _is_fatal_error (line 590) | def _is_fatal_error(cls, error: str | None) -> bool: method _run_execution (line 597) | async def _run_execution(self, ctx: ExecutionContext) -> None: method _write_run_event (line 949) | def _write_run_event( method _write_session_state (line 979) | async def _write_session_state( method _create_modified_graph (line 1082) | def _create_modified_graph(self) -> "GraphSpec": method wait_for_completion (line 1124) | async def wait_for_completion( method get_result (line 1157) | def get_result(self, execution_id: str) -> ExecutionResult | None: method get_context (line 1162) | def get_context(self, execution_id: str) -> ExecutionContext | None: method cancel_execution (line 1166) | async def cancel_execution(self, execution_id: str, *, reason: str | N... method get_active_count (line 1195) | def get_active_count(self) -> int: method get_stats (line 1199) | def get_stats(self) -> dict: FILE: core/framework/runtime/llm_debug_logger.py function _open_log (line 24) | def _open_log() -> IO[str] | None: function log_llm_turn (line 33) | def log_llm_turn( FILE: core/framework/runtime/outcome_aggregator.py class CriterionStatus (line 24) | class CriterionStatus: class ConstraintCheck (line 36) | class ConstraintCheck: class DecisionRecord (line 49) | class DecisionRecord: class OutcomeAggregator (line 59) | class OutcomeAggregator: method __init__ (line 81) | def __init__( method _initialize_criteria (line 113) | def _initialize_criteria(self) -> None: method record_decision (line 125) | def record_decision( method record_outcome (line 153) | def record_outcome( method record_constraint_violation (line 182) | def record_constraint_violation( method evaluate_goal_progress (line 225) | async def evaluate_goal_progress(self) -> dict[str, Any]: method _evaluate_criterion (line 313) | async def _evaluate_criterion(self, criterion: Any) -> CriterionStatus: method _is_related_to_criterion (line 376) | def _is_related_to_criterion(self, decision: Decision, criterion: Any)... method _get_recommendation (line 385) | def _get_recommendation(self, result: dict) -> str: method _is_hard_constraint (line 404) | def _is_hard_constraint(self, constraint_id: str) -> bool: method get_decisions_by_stream (line 413) | def get_decisions_by_stream(self, stream_id: str) -> list[DecisionReco... method get_decisions_by_execution (line 417) | def get_decisions_by_execution( method get_recent_decisions (line 429) | def get_recent_decisions(self, limit: int = 10) -> list[DecisionRecord]: method get_criterion_status (line 433) | def get_criterion_status(self, criterion_id: str) -> CriterionStatus |... method get_stats (line 437) | def get_stats(self) -> dict: method reset (line 450) | def reset(self) -> None: FILE: core/framework/runtime/runtime_log_schemas.py class ToolCallLog (line 19) | class ToolCallLog(BaseModel): class NodeStepLog (line 31) | class NodeStepLog(BaseModel): class NodeDetail (line 68) | class NodeDetail(BaseModel): class RunSummaryLog (line 104) | class RunSummaryLog(BaseModel): class RunDetailsLog (line 133) | class RunDetailsLog(BaseModel): class RunToolLogs (line 140) | class RunToolLogs(BaseModel): FILE: core/framework/runtime/runtime_log_store.py class RuntimeLogStore (line 43) | class RuntimeLogStore: method __init__ (line 46) | def __init__(self, base_path: Path) -> None: method _session_logs_dir (line 50) | def _session_logs_dir(self, run_id: str) -> Path: method _legacy_run_dir (line 56) | def _legacy_run_dir(self, run_id: str) -> Path: method _get_run_dir (line 60) | def _get_run_dir(self, run_id: str) -> Path: method ensure_run_dir (line 83) | def ensure_run_dir(self, run_id: str) -> None: method ensure_session_run_dir (line 88) | def ensure_session_run_dir(self, run_id: str) -> None: method append_step (line 92) | def append_step(self, run_id: str, step: NodeStepLog) -> None: method append_node_detail (line 99) | def append_node_detail(self, run_id: str, detail: NodeDetail) -> None: method read_node_details_sync (line 106) | def read_node_details_sync(self, run_id: str) -> list[NodeDetail]: method save_summary (line 118) | async def save_summary(self, run_id: str, summary: RunSummaryLog) -> N... method load_summary (line 128) | async def load_summary(self, run_id: str) -> RunSummaryLog | None: method load_details (line 133) | async def load_details(self, run_id: str) -> RunDetailsLog | None: method load_tool_logs (line 145) | async def load_tool_logs(self, run_id: str) -> RunToolLogs | None: method list_runs (line 157) | async def list_runs( method _scan_run_dirs (line 203) | def _scan_run_dirs(self) -> list[str]: method _write_json (line 246) | async def _write_json(path: Path, data: dict) -> None: method _read_json (line 258) | async def _read_json(path: Path) -> dict | None: function _read_jsonl_as_models (line 278) | def _read_jsonl_as_models(path: Path, model_cls: type) -> list: function _infer_started_at (line 303) | def _infer_started_at(run_id: str) -> str: FILE: core/framework/runtime/runtime_logger.py class RuntimeLogger (line 41) | class RuntimeLogger: method __init__ (line 47) | def __init__(self, store: RuntimeLogStore, agent_id: str = "") -> None: method start_run (line 56) | def start_run(self, goal_id: str = "", session_id: str = "") -> str: method log_step (line 81) | def log_step( method log_node_complete (line 151) | def log_node_complete( method ensure_node_logged (line 237) | def ensure_node_logged( method end_run (line 270) | async def end_run( FILE: core/framework/runtime/shared_state.py class IsolationLevel (line 20) | class IsolationLevel(StrEnum): class StateScope (line 28) | class StateScope(StrEnum): class StateChange (line 37) | class StateChange: class SharedStateManager (line 49) | class SharedStateManager: method __init__ (line 78) | def __init__(self): method create_memory (line 96) | def create_memory( method cleanup_execution (line 129) | def cleanup_execution(self, execution_id: str) -> None: method cleanup_stream (line 139) | def cleanup_stream(self, stream_id: str) -> None: method read (line 152) | async def read( method write (line 184) | async def write( method _write_direct (line 229) | async def _write_direct( method _write_with_lock (line 253) | async def _write_with_lock( method _get_lock (line 266) | def _get_lock(self, scope: StateScope, key: str, stream_id: str) -> as... method _record_change (line 280) | def _record_change(self, change: StateChange) -> None: method read_all (line 290) | async def read_all( method write_batch (line 317) | async def write_batch( method get_stats (line 331) | def get_stats(self) -> dict: method get_recent_changes (line 341) | def get_recent_changes(self, limit: int = 10) -> list[StateChange]: class StreamMemory (line 346) | class StreamMemory: method __init__ (line 354) | def __init__( method with_permissions (line 370) | def with_permissions( method read (line 390) | async def read(self, key: str) -> Any: method write (line 403) | async def write( method read_all (line 423) | async def read_all(self) -> dict[str, Any]: method read_sync (line 439) | def read_sync(self, key: str) -> Any: method write_sync (line 466) | def write_sync(self, key: str, value: Any) -> None: method read_all_sync (line 481) | def read_all_sync(self) -> dict[str, Any]: FILE: core/framework/runtime/stream_runtime.py class StreamRuntime (line 26) | class StreamRuntime: method __init__ (line 74) | def __init__( method start_run (line 102) | def start_run( method end_run (line 150) | def end_run( method _save_run (line 180) | async def _save_run(self, execution_id: str, run: Run) -> None: method set_node (line 192) | def set_node(self, execution_id: str, node_id: str) -> None: method get_run (line 196) | def get_run(self, execution_id: str) -> Run | None: method decide (line 202) | def decide( method record_outcome (line 281) | def record_outcome( method report_problem (line 335) | def report_problem( method quick_decision (line 376) | def quick_decision( method get_active_executions (line 413) | def get_active_executions(self) -> list[str]: method get_stats (line 417) | def get_stats(self) -> dict: class StreamRuntimeAdapter (line 426) | class StreamRuntimeAdapter: method __init__ (line 434) | def __init__(self, stream_runtime: StreamRuntime, execution_id: str): method storage (line 448) | def storage(self): method execution_id (line 452) | def execution_id(self) -> str: method current_run (line 456) | def current_run(self) -> Run | None: method start_run (line 459) | def start_run( method end_run (line 472) | def end_run( method set_node (line 485) | def set_node(self, node_id: str) -> None: method decide (line 489) | def decide( method record_outcome (line 512) | def record_outcome( method report_problem (line 535) | def report_problem( method quick_decision (line 552) | def quick_decision( FILE: core/framework/runtime/tests/test_agent_runtime.py function sample_goal (line 33) | def sample_goal(): function sample_graph (line 60) | def sample_graph(): function temp_storage (line 118) | def temp_storage(): class TestSharedStateManager (line 127) | class TestSharedStateManager: method test_create_memory (line 130) | def test_create_memory(self): method test_isolated_state (line 143) | async def test_isolated_state(self): method test_shared_state (line 157) | async def test_shared_state(self): method test_cleanup_execution (line 181) | def test_cleanup_execution(self): class TestEventBus (line 196) | class TestEventBus: method test_publish_subscribe (line 200) | async def test_publish_subscribe(self): method test_stream_filter (line 230) | async def test_stream_filter(self): method test_unsubscribe (line 265) | def test_unsubscribe(self): method test_wait_for (line 285) | async def test_wait_for(self): class TestOutcomeAggregator (line 318) | class TestOutcomeAggregator: method test_record_decision (line 321) | def test_record_decision(self, sample_goal): method test_evaluate_goal_progress (line 343) | async def test_evaluate_goal_progress(self, sample_goal): method test_record_constraint_violation (line 354) | def test_record_constraint_violation(self, sample_goal): class TestAgentRuntime (line 373) | class TestAgentRuntime: method test_register_entry_point (line 376) | def test_register_entry_point(self, sample_graph, sample_goal, temp_st... method test_register_duplicate_entry_point_fails (line 396) | def test_register_duplicate_entry_point_fails(self, sample_graph, samp... method test_register_invalid_entry_node_fails (line 416) | def test_register_invalid_entry_node_fails(self, sample_graph, sample_... method test_start_stop_lifecycle (line 435) | async def test_start_stop_lifecycle(self, sample_graph, sample_goal, t... method test_trigger_requires_running (line 465) | async def test_trigger_requires_running(self, sample_graph, sample_goa... class TestCreateAgentRuntime (line 492) | class TestCreateAgentRuntime: method test_create_with_entry_points (line 495) | def test_create_with_entry_points(self, sample_graph, sample_goal, tem... class TestTimerEntryPoints (line 527) | class TestTimerEntryPoints: method test_interval_timer_starts_task (line 531) | async def test_interval_timer_starts_task(self, sample_graph, sample_g... method test_cron_timer_starts_task (line 561) | async def test_cron_timer_starts_task(self, sample_graph, sample_goal,... method test_invalid_cron_expression_skipped (line 589) | async def test_invalid_cron_expression_skipped( method test_cron_takes_priority_over_interval (line 616) | async def test_cron_takes_priority_over_interval( method test_no_interval_or_cron_warns (line 647) | async def test_no_interval_or_cron_warns(self, sample_graph, sample_go... method test_cron_immediate_fires_first (line 672) | async def test_cron_immediate_fires_first(self, sample_graph, sample_g... class TestCancelAllTasks (line 707) | class TestCancelAllTasks: method test_cancel_all_tasks_async_returns_false_when_no_tasks (line 711) | async def test_cancel_all_tasks_async_returns_false_when_no_tasks( method test_cancel_all_tasks_async_cancels_running_task (line 737) | async def test_cancel_all_tasks_async_cancels_running_task( method test_cancel_all_tasks_async_cancels_multiple_tasks_across_streams (line 782) | async def test_cancel_all_tasks_async_cancels_multiple_tasks_across_st... FILE: core/framework/runtime/tests/test_runtime_logging_paths.py function test_graph_executor_uses_custom_session_dir_name_for_runtime_logs (line 11) | def test_graph_executor_uses_custom_session_dir_name_for_runtime_logs(): function test_runtime_logger_creates_session_log_dir_for_custom_session_id (line 20) | def test_runtime_logger_creates_session_log_dir_for_custom_session_id(tm... FILE: core/framework/runtime/tests/test_webhook_server.py function _make_server (line 26) | def _make_server(event_bus: EventBus, routes: list[WebhookRoute] | None ... function _base_url (line 35) | def _base_url(server: WebhookServer) -> str: class TestWebhookServerLifecycle (line 40) | class TestWebhookServerLifecycle: method test_start_stop (line 44) | async def test_start_stop(self): method test_no_routes_skips_start (line 62) | async def test_no_routes_skips_start(self): method test_stop_when_not_started (line 70) | async def test_stop_when_not_started(self): class TestWebhookEventPublishing (line 79) | class TestWebhookEventPublishing: method test_post_publishes_webhook_received (line 83) | async def test_post_publishes_webhook_received(self): method test_query_params_included (line 126) | async def test_query_params_included(self): method test_non_json_body (line 159) | async def test_non_json_body(self): method test_empty_body (line 193) | async def test_empty_body(self): method test_multiple_routes (line 223) | async def test_multiple_routes(self): method test_filter_stream_subscription (line 262) | async def test_filter_stream_subscription(self): class TestHMACVerification (line 301) | class TestHMACVerification: method test_valid_signature_accepted (line 305) | async def test_valid_signature_accepted(self): method test_invalid_signature_rejected (line 349) | async def test_invalid_signature_rejected(self): method test_missing_signature_rejected (line 386) | async def test_missing_signature_rejected(self): method test_no_secret_skips_verification (line 423) | async def test_no_secret_skips_verification(self): class TestEventDrivenEntryPoints (line 460) | class TestEventDrivenEntryPoints: method _make_graph_and_goal (line 463) | def _make_graph_and_goal(self): method test_event_entry_point_subscribes_to_bus (line 508) | async def test_event_entry_point_subscribes_to_bus(self): method test_event_entry_point_filter_stream (line 579) | async def test_event_entry_point_filter_stream(self): method test_no_webhook_routes_skips_server (line 642) | async def test_no_webhook_routes_skips_server(self): method test_event_entry_point_custom_event (line 669) | async def test_event_entry_point_custom_event(self): FILE: core/framework/runtime/triggers.py class TriggerDefinition (line 10) | class TriggerDefinition: FILE: core/framework/runtime/webhook_server.py class WebhookRoute (line 22) | class WebhookRoute: class WebhookServerConfig (line 32) | class WebhookServerConfig: class WebhookServer (line 39) | class WebhookServer: method __init__ (line 55) | def __init__( method add_route (line 67) | def add_route(self, route: WebhookRoute) -> None: method start (line 71) | async def start(self) -> None: method stop (line 96) | async def stop(self) -> None: method _handle_request (line 105) | async def _handle_request(self, request: web.Request) -> web.Response: method _verify_signature (line 145) | def _verify_signature( method is_running (line 166) | def is_running(self) -> bool: method port (line 171) | def port(self) -> int | None: FILE: core/framework/schemas/checkpoint.py class Checkpoint (line 14) | class Checkpoint(BaseModel): method create (line 49) | def create( class CheckpointSummary (line 102) | class CheckpointSummary(BaseModel): method from_checkpoint (line 121) | def from_checkpoint(cls, checkpoint: Checkpoint) -> "CheckpointSummary": class CheckpointIndex (line 134) | class CheckpointIndex(BaseModel): method add_checkpoint (line 149) | def add_checkpoint(self, checkpoint: Checkpoint) -> None: method get_checkpoint_summary (line 156) | def get_checkpoint_summary(self, checkpoint_id: str) -> CheckpointSumm... method filter_by_type (line 163) | def filter_by_type(self, checkpoint_type: str) -> list[CheckpointSumma... method filter_by_node (line 167) | def filter_by_node(self, node_id: str) -> list[CheckpointSummary]: method get_clean_checkpoints (line 171) | def get_clean_checkpoints(self) -> list[CheckpointSummary]: method get_latest_clean_checkpoint (line 175) | def get_latest_clean_checkpoint(self) -> CheckpointSummary | None: FILE: core/framework/schemas/decision.py class DecisionType (line 19) | class DecisionType(StrEnum): class Option (line 32) | class Option(BaseModel): class Outcome (line 55) | class Outcome(BaseModel): class DecisionEvaluation (line 80) | class DecisionEvaluation(BaseModel): class Decision (line 109) | class Decision(BaseModel): method chosen_option (line 152) | def chosen_option(self) -> Option | None: method was_successful (line 161) | def was_successful(self) -> bool: method was_good_decision (line 167) | def was_good_decision(self) -> bool: method summary_for_builder (line 173) | def summary_for_builder(self) -> str: FILE: core/framework/schemas/run.py class RunStatus (line 17) | class RunStatus(StrEnum): class Problem (line 27) | class Problem(BaseModel): class RunMetrics (line 45) | class RunMetrics(BaseModel): method success_rate (line 60) | def success_rate(self) -> float: class Run (line 68) | class Run(BaseModel): method duration_ms (line 104) | def duration_ms(self) -> int: method add_decision (line 111) | def add_decision(self, decision: Decision) -> None: method record_outcome (line 120) | def record_outcome(self, decision_id: str, outcome: Outcome) -> None: method add_problem (line 133) | def add_problem( method complete (line 154) | def complete(self, status: RunStatus, narrative: str = "") -> None: method _generate_narrative (line 160) | def _generate_narrative(self) -> str: class RunSummary (line 192) | class RunSummary(BaseModel): method from_run (line 225) | def from_run(cls, run: Run) -> "RunSummary": FILE: core/framework/schemas/session_state.py class SessionStatus (line 19) | class SessionStatus(StrEnum): class SessionTimestamps (line 29) | class SessionTimestamps(BaseModel): class SessionProgress (line 40) | class SessionProgress(BaseModel): class SessionResult (line 62) | class SessionResult(BaseModel): class SessionMetrics (line 72) | class SessionMetrics(BaseModel): class SessionState (line 85) | class SessionState(BaseModel): method duration_ms (line 158) | def duration_ms(self) -> int: method is_resumable (line 168) | def is_resumable(self) -> bool: method is_resumable_from_checkpoint (line 179) | def is_resumable_from_checkpoint(self) -> bool: method from_execution_result (line 186) | def from_execution_result( method from_legacy_run (line 251) | def from_legacy_run(cls, run: "Run", session_id: str, stream_id: str =... method to_session_state_dict (line 295) | def to_session_state_dict(self) -> dict[str, Any]: FILE: core/framework/server/app.py function _get_allowed_agent_roots (line 22) | def _get_allowed_agent_roots() -> tuple[Path, ...]: function validate_agent_path (line 39) | def validate_agent_path(agent_path: str | Path) -> Path: function safe_path_segment (line 60) | def safe_path_segment(value: str) -> str: function resolve_session (line 72) | def resolve_session(request: web.Request): function sessions_dir (line 85) | def sessions_dir(session: Session) -> Path: function cold_sessions_dir (line 97) | def cold_sessions_dir(session_id: str) -> Path | None: function _is_cors_allowed (line 124) | def _is_cors_allowed(origin: str) -> bool: function cors_middleware (line 135) | async def cors_middleware(request: web.Request, handler): function error_middleware (line 158) | async def error_middleware(request: web.Request, handler): function _on_shutdown (line 172) | async def _on_shutdown(app: web.Application) -> None: function handle_health (line 178) | async def handle_health(request: web.Request) -> web.Response: function create_app (line 191) | def create_app(model: str | None = None) -> web.Application: function _setup_static_serving (line 259) | def _setup_static_serving(app: web.Application) -> None: FILE: core/framework/server/queen_orchestrator.py function create_queen (line 20) | async def create_queen( FILE: core/framework/server/routes_credentials.py function _get_store (line 16) | def _get_store(request: web.Request) -> CredentialStore: function _credential_to_dict (line 20) | def _credential_to_dict(cred: CredentialObject) -> dict: function handle_list_credentials (line 31) | async def handle_list_credentials(request: web.Request) -> web.Response: function handle_get_credential (line 43) | async def handle_get_credential(request: web.Request) -> web.Response: function handle_save_credential (line 53) | async def handle_save_credential(request: web.Request) -> web.Response: function handle_delete_credential (line 99) | async def handle_delete_credential(request: web.Request) -> web.Response: function handle_check_agent (line 118) | async def handle_check_agent(request: web.Request) -> web.Response: function _status_to_dict (line 189) | def _status_to_dict(c) -> dict: function register_routes (line 209) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/routes_events.py function _parse_event_types (line 58) | def _parse_event_types(query_param: str | None) -> list[EventType]: function handle_events (line 77) | async def handle_events(request: web.Request) -> web.StreamResponse: function register_routes (line 271) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/routes_execution.py function handle_trigger (line 17) | async def handle_trigger(request: web.Request) -> web.Response: function handle_inject (line 81) | async def handle_inject(request: web.Request) -> web.Response: function handle_chat (line 105) | async def handle_chat(request: web.Request) -> web.Response: function handle_queen_context (line 162) | async def handle_queen_context(request: web.Request) -> web.Response: function handle_worker_input (line 205) | async def handle_worker_input(request: web.Request) -> web.Response: function handle_goal_progress (line 245) | async def handle_goal_progress(request: web.Request) -> web.Response: function handle_resume (line 258) | async def handle_resume(request: web.Request) -> web.Response: function handle_pause (line 330) | async def handle_pause(request: web.Request) -> web.Response: function handle_stop (line 384) | async def handle_stop(request: web.Request) -> web.Response: function handle_replay (line 439) | async def handle_replay(request: web.Request) -> web.Response: function handle_cancel_queen (line 491) | async def handle_cancel_queen(request: web.Request) -> web.Response: function register_routes (line 506) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/routes_graphs.py function _get_graph_registration (line 14) | def _get_graph_registration(session, graph_id: str): function _get_graph_spec (line 24) | def _get_graph_spec(session, graph_id: str): function _node_to_dict (line 32) | def _node_to_dict(node) -> dict: function handle_list_nodes (line 53) | async def handle_list_nodes(request: web.Request) -> web.Response: function handle_get_node (line 144) | async def handle_get_node(request: web.Request) -> web.Response: function handle_node_criteria (line 172) | async def handle_node_criteria(request: web.Request) -> web.Response: function handle_node_tools (line 215) | async def handle_node_tools(request: web.Request) -> web.Response: function handle_draft_graph (line 252) | async def handle_draft_graph(request: web.Request) -> web.Response: function handle_flowchart_map (line 265) | async def handle_flowchart_map(request: web.Request) -> web.Response: function register_routes (line 313) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/routes_logs.py function handle_logs (line 13) | async def handle_logs(request: web.Request) -> web.Response: function handle_node_logs (line 72) | async def handle_node_logs(request: web.Request) -> web.Response: function register_routes (line 107) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/routes_sessions.py function _get_manager (line 48) | def _get_manager(request: web.Request) -> SessionManager: function _session_to_live_dict (line 52) | def _session_to_live_dict(session) -> dict: function _credential_error_response (line 74) | def _credential_error_response(exc: Exception, agent_path: str | None) -... function handle_create_session (line 111) | async def handle_create_session(request: web.Request) -> web.Response: function handle_list_live_sessions (line 186) | async def handle_list_live_sessions(request: web.Request) -> web.Response: function handle_get_live_session (line 193) | async def handle_get_live_session(request: web.Request) -> web.Response: function handle_stop_session (line 259) | async def handle_stop_session(request: web.Request) -> web.Response: function handle_load_worker (line 279) | async def handle_load_worker(request: web.Request) -> web.Response: function handle_unload_worker (line 321) | async def handle_unload_worker(request: web.Request) -> web.Response: function handle_session_stats (line 347) | async def handle_session_stats(request: web.Request) -> web.Response: function handle_session_entry_points (line 363) | async def handle_session_entry_points(request: web.Request) -> web.Respo... function handle_update_trigger_task (line 411) | async def handle_update_trigger_task(request: web.Request) -> web.Response: function handle_session_graphs (line 565) | async def handle_session_graphs(request: web.Request) -> web.Response: function handle_list_worker_sessions (line 586) | async def handle_list_worker_sessions(request: web.Request) -> web.Respo... function handle_get_worker_session (line 635) | async def handle_get_worker_session(request: web.Request) -> web.Response: function handle_list_checkpoints (line 660) | async def handle_list_checkpoints(request: web.Request) -> web.Response: function handle_delete_worker_session (line 697) | async def handle_delete_worker_session(request: web.Request) -> web.Resp... function handle_restore_checkpoint (line 717) | async def handle_restore_checkpoint(request: web.Request) -> web.Response: function handle_messages (line 758) | async def handle_messages(request: web.Request) -> web.Response: function handle_session_events_history (line 864) | async def handle_session_events_history(request: web.Request) -> web.Res... function handle_session_history (line 896) | async def handle_session_history(request: web.Request) -> web.Response: function handle_delete_history_session (line 921) | async def handle_delete_history_session(request: web.Request) -> web.Res... function handle_discover (line 952) | async def handle_discover(request: web.Request) -> web.Response: function register_routes (line 986) | def register_routes(app: web.Application) -> None: FILE: core/framework/server/session_manager.py class Session (line 28) | class Session: class SessionManager (line 72) | class SessionManager: method __init__ (line 79) | def __init__(self, model: str | None = None, credential_store=None) ->... method _create_session_core (line 90) | async def _create_session_core( method create_session (line 141) | async def create_session( method create_session_with_worker (line 169) | async def create_session_with_worker( method _load_worker_core (line 269) | async def _load_worker_core( method _cleanup_stale_active_sessions (line 404) | def _cleanup_stale_active_sessions(self, agent_path: Path) -> None: method _is_pid_alive (line 465) | def _is_pid_alive(pid: int) -> bool: method _restore_active_triggers (line 492) | async def _restore_active_triggers(self, session: "Session", session_i... method load_worker (line 537) | async def load_worker( method unload_worker (line 592) | async def unload_worker(self, session_id: str) -> bool: method stop_session (line 651) | async def stop_session(self, session_id: str) -> bool: method _handle_worker_handoff (line 737) | async def _handle_worker_handoff(self, session: Session, executor: Any... method _subscribe_worker_digest (line 762) | def _subscribe_worker_digest(self, session: Session) -> None: method _subscribe_worker_handoffs (line 891) | def _subscribe_worker_handoffs(self, session: Session, executor: Any) ... method _start_queen (line 907) | async def _start_queen( method _notify_queen_worker_loaded (line 1074) | async def _notify_queen_worker_loaded(self, session: Session) -> None: method _emit_worker_loaded (line 1103) | async def _emit_worker_loaded(self, session: Session) -> None: method _emit_flowchart_on_restore (line 1122) | async def _emit_flowchart_on_restore(self, session: Session, agent_pat... method _notify_queen_worker_unloaded (line 1145) | async def _notify_queen_worker_unloaded(self, session: Session) -> None: method _emit_trigger_events (line 1160) | async def _emit_trigger_events( method revive_queen (line 1191) | async def revive_queen(self, session: Session, initial_prompt: str | N... method get_session (line 1216) | def get_session(self, session_id: str) -> Session | None: method get_session_by_worker_id (line 1219) | def get_session_by_worker_id(self, worker_id: str) -> Session | None: method get_session_for_agent (line 1226) | def get_session_for_agent(self, agent_id: str) -> Session | None: method is_loading (line 1236) | def is_loading(self, session_id: str) -> bool: method list_sessions (line 1239) | def list_sessions(self) -> list[Session]: method get_cold_session_info (line 1247) | def get_cold_session_info(session_id: str) -> dict | None: method list_cold_sessions (line 1307) | def list_cold_sessions() -> list[dict]: method shutdown_all (line 1414) | async def shutdown_all(self) -> None: FILE: core/framework/server/sse.py class SSEResponse (line 11) | class SSEResponse: method __init__ (line 21) | def __init__(self) -> None: method prepare (line 24) | async def prepare(self, request: web.Request) -> web.StreamResponse: method send_event (line 38) | async def send_event( method send_keepalive (line 65) | async def send_keepalive(self) -> None: method response (line 72) | def response(self) -> web.StreamResponse | None: FILE: core/framework/server/tests/test_api.py class MockNodeSpec (line 30) | class MockNodeSpec: class MockEdgeSpec (line 49) | class MockEdgeSpec: class MockGraphSpec (line 58) | class MockGraphSpec: method get_node (line 63) | def get_node(self, node_id: str): class MockEntryPoint (line 71) | class MockEntryPoint: class MockStream (line 80) | class MockStream: method cancel_execution (line 86) | async def cancel_execution(self, execution_id: str) -> bool: class MockGraphRegistration (line 91) | class MockGraphRegistration: class MockRuntime (line 97) | class MockRuntime: method __init__ (line 100) | def __init__(self, graph=None, entry_points=None, log_store=None): method list_graphs (line 111) | def list_graphs(self): method get_graph_registration (line 114) | def get_graph_registration(self, graph_id): method get_entry_points (line 119) | def get_entry_points(self): method trigger (line 122) | async def trigger(self, ep_id, input_data=None, session_state=None): method inject_input (line 125) | async def inject_input(self, node_id, content, graph_id=None, *, is_cl... method pause_timers (line 128) | def pause_timers(self): method get_goal_progress (line 131) | async def get_goal_progress(self): method find_awaiting_node (line 134) | def find_awaiting_node(self): method get_stats (line 137) | def get_stats(self): method get_timer_next_fire_in (line 140) | def get_timer_next_fire_in(self, ep_id): class MockAgentInfo (line 144) | class MockAgentInfo: function _make_queen_executor (line 151) | def _make_queen_executor(): function _make_session (line 160) | def _make_session( function tmp_agent_dir (line 202) | def tmp_agent_dir(tmp_path, monkeypatch): function _write_sample_session (line 216) | def _write_sample_session(base: Path, session_id: str): function sample_session (line 299) | def sample_session(tmp_agent_dir): function custom_id_session (line 306) | def custom_id_session(tmp_agent_dir): function _make_app_with_session (line 312) | def _make_app_with_session(session): function nodes_and_edges (line 321) | def nodes_and_edges(): class TestHealth (line 353) | class TestHealth: method test_health (line 355) | async def test_health(self): class TestSessionCRUD (line 366) | class TestSessionCRUD: method test_create_session_with_worker_forwards_session_id (line 368) | async def test_create_session_with_worker_forwards_session_id(self): method test_list_sessions_empty (line 397) | async def test_list_sessions_empty(self): method test_list_sessions_with_loaded (line 406) | async def test_list_sessions_with_loaded(self): method test_get_session_found (line 418) | async def test_get_session_found(self): method test_get_session_not_found (line 431) | async def test_get_session_not_found(self): method test_stop_session (line 438) | async def test_stop_session(self): method test_stop_session_not_found (line 453) | async def test_stop_session_not_found(self): method test_session_stats (line 460) | async def test_session_stats(self): method test_session_entry_points (line 470) | async def test_session_entry_points(self): method test_session_graphs (line 481) | async def test_session_graphs(self): method test_update_trigger_task (line 491) | async def test_update_trigger_task(self, tmp_path): method test_update_trigger_cron_restarts_active_timer (line 512) | async def test_update_trigger_cron_restarts_active_timer(self, tmp_path): method test_update_trigger_cron_rejects_invalid_expression (line 538) | async def test_update_trigger_cron_rejects_invalid_expression(self, tm... class TestExecution (line 555) | class TestExecution: method test_trigger (line 557) | async def test_trigger(self): method test_trigger_not_found (line 570) | async def test_trigger_not_found(self): method test_inject (line 580) | async def test_inject(self): method test_inject_missing_node_id (line 593) | async def test_inject_missing_node_id(self): method test_chat_goes_to_queen_when_not_waiting (line 604) | async def test_chat_goes_to_queen_when_not_waiting(self): method test_chat_injects_when_node_waiting (line 619) | async def test_chat_injects_when_node_waiting(self): method test_chat_503_when_no_queen_or_worker (line 636) | async def test_chat_503_when_no_queen_or_worker(self): method test_chat_missing_message (line 648) | async def test_chat_missing_message(self): method test_pause_no_active_executions (line 659) | async def test_pause_no_active_executions(self): method test_pause_does_not_cancel_queen (line 675) | async def test_pause_does_not_cancel_queen(self): method test_goal_progress (line 690) | async def test_goal_progress(self): class TestResume (line 700) | class TestResume: method test_resume_from_session_state (line 702) | async def test_resume_from_session_state(self, sample_session, tmp_age... method test_resume_with_checkpoint (line 722) | async def test_resume_with_checkpoint(self, sample_session, tmp_agent_... method test_resume_missing_session_id (line 743) | async def test_resume_missing_session_id(self): method test_resume_session_not_found (line 754) | async def test_resume_session_not_found(self): class TestStop (line 765) | class TestStop: method test_stop_found (line 767) | async def test_stop_found(self): method test_stop_not_found (line 782) | async def test_stop_not_found(self): method test_stop_missing_execution_id (line 793) | async def test_stop_missing_execution_id(self): class TestReplay (line 804) | class TestReplay: method test_replay_success (line 806) | async def test_replay_success(self, sample_session, tmp_agent_dir): method test_replay_missing_fields (line 827) | async def test_replay_missing_fields(self): method test_replay_checkpoint_not_found (line 844) | async def test_replay_checkpoint_not_found(self, sample_session, tmp_a... class TestWorkerSessions (line 862) | class TestWorkerSessions: method test_list_sessions (line 864) | async def test_list_sessions(self, sample_session, tmp_agent_dir): method test_list_sessions_includes_custom_id (line 881) | async def test_list_sessions_includes_custom_id(self, custom_id_sessio... method test_list_sessions_empty (line 897) | async def test_list_sessions_empty(self, tmp_agent_dir): method test_get_session (line 909) | async def test_get_session(self, sample_session, tmp_agent_dir): method test_get_session_not_found (line 924) | async def test_get_session_not_found(self, tmp_agent_dir): method test_delete_session (line 934) | async def test_delete_session(self, sample_session, tmp_agent_dir): method test_delete_session_not_found (line 951) | async def test_delete_session_not_found(self, tmp_agent_dir): method test_list_checkpoints (line 961) | async def test_list_checkpoints(self, sample_session, tmp_agent_dir): method test_restore_checkpoint (line 981) | async def test_restore_checkpoint(self, sample_session, tmp_agent_dir): method test_restore_checkpoint_not_found (line 1000) | async def test_restore_checkpoint_not_found(self, sample_session, tmp_... class TestMessages (line 1014) | class TestMessages: method test_get_messages (line 1016) | async def test_get_messages(self, sample_session, tmp_agent_dir): method test_get_messages_filtered_by_node (line 1041) | async def test_get_messages_filtered_by_node(self, sample_session, tmp... method test_get_messages_no_conversations (line 1059) | async def test_get_messages_no_conversations(self, tmp_agent_dir): method test_get_messages_client_only (line 1079) | async def test_get_messages_client_only(self, tmp_agent_dir): method test_get_messages_client_only_no_runner_returns_all (line 1156) | async def test_get_messages_client_only_no_runner_returns_all(self, tm... class TestGraphNodes (line 1185) | class TestGraphNodes: method test_list_nodes (line 1187) | async def test_list_nodes(self, nodes_and_edges): method test_list_nodes_includes_edges (line 1205) | async def test_list_nodes_includes_edges(self, nodes_and_edges): method test_list_nodes_with_session_enrichment (line 1229) | async def test_list_nodes_with_session_enrichment( method test_list_nodes_graph_not_found (line 1257) | async def test_list_nodes_graph_not_found(self): method test_get_node (line 1265) | async def test_get_node(self, nodes_and_edges): method test_node_detail_includes_system_prompt (line 1284) | async def test_node_detail_includes_system_prompt(self, nodes_and_edges): method test_get_node_not_found (line 1306) | async def test_get_node_not_found(self, nodes_and_edges): class TestNodeCriteria (line 1316) | class TestNodeCriteria: method test_criteria_static (line 1318) | async def test_criteria_static(self, nodes_and_edges): method test_criteria_with_log_enrichment (line 1332) | async def test_criteria_with_log_enrichment( method test_criteria_node_not_found (line 1367) | async def test_criteria_node_not_found(self, nodes_and_edges): class TestLogs (line 1379) | class TestLogs: method test_logs_no_log_store (line 1381) | async def test_logs_no_log_store(self): method test_logs_list_summaries (line 1392) | async def test_logs_list_summaries(self, sample_session, tmp_agent_dir): method test_logs_list_summaries_with_custom_id (line 1414) | async def test_logs_list_summaries_with_custom_id(self, custom_id_sess... method test_logs_session_summary (line 1436) | async def test_logs_session_summary(self, sample_session, tmp_agent_dir): method test_logs_session_details (line 1459) | async def test_logs_session_details(self, sample_session, tmp_agent_dir): method test_logs_session_tools (line 1483) | async def test_logs_session_tools(self, sample_session, tmp_agent_dir): class TestNodeLogs (line 1506) | class TestNodeLogs: method test_node_logs (line 1508) | async def test_node_logs(self, sample_session, tmp_agent_dir, nodes_an... method test_node_logs_missing_session_id (line 1540) | async def test_node_logs_missing_session_id(self, nodes_and_edges): class TestCredentials (line 1553) | class TestCredentials: method _make_app (line 1556) | def _make_app(self, initial_creds=None): method test_list_credentials_empty (line 1565) | async def test_list_credentials_empty(self): method test_save_and_list_credential (line 1574) | async def test_save_and_list_credential(self): method test_get_credential (line 1594) | async def test_get_credential(self): method test_get_credential_not_found (line 1606) | async def test_get_credential_not_found(self): method test_delete_credential (line 1613) | async def test_delete_credential(self): method test_delete_credential_not_found (line 1626) | async def test_delete_credential_not_found(self): method test_save_credential_missing_fields (line 1633) | async def test_save_credential_missing_fields(self): method test_save_overwrites_existing (line 1643) | async def test_save_overwrites_existing(self): class TestSSEFormat (line 1656) | class TestSSEFormat: method test_send_event_without_event_field (line 1661) | async def test_send_event_without_event_field(self): method test_send_event_with_event_field_present (line 1678) | async def test_send_event_with_event_field_present(self): method test_events_route_does_not_pass_event_param (line 1692) | def test_events_route_does_not_pass_event_param(self): class TestErrorMiddleware (line 1705) | class TestErrorMiddleware: method test_404_on_unknown_api_route (line 1707) | async def test_404_on_unknown_api_route(self): class TestCleanupStaleActiveSessions (line 1714) | class TestCleanupStaleActiveSessions: method _make_manager (line 1717) | def _make_manager(self): method _write_state (line 1722) | def _write_state(self, session_dir: Path, status: str, pid: int | None... method _read_state (line 1729) | def _read_state(self, session_dir: Path) -> dict: method test_stale_session_is_cancelled (line 1732) | def test_stale_session_is_cancelled(self, tmp_path, monkeypatch): method test_live_in_memory_session_is_skipped (line 1748) | def test_live_in_memory_session_is_skipped(self, tmp_path, monkeypatch): method test_session_with_live_pid_is_skipped (line 1766) | def test_session_with_live_pid_is_skipped(self, tmp_path, monkeypatch): method test_session_with_dead_pid_is_cancelled (line 1784) | def test_session_with_dead_pid_is_cancelled(self, tmp_path, monkeypatch): method test_paused_session_is_never_touched (line 1801) | def test_paused_session_is_never_touched(self, tmp_path, monkeypatch): FILE: core/framework/skills/catalog.py class SkillCatalog (line 26) | class SkillCatalog: method __init__ (line 29) | def __init__(self, skills: list[ParsedSkill] | None = None): method add (line 36) | def add(self, skill: ParsedSkill) -> None: method get (line 40) | def get(self, name: str) -> ParsedSkill | None: method mark_activated (line 44) | def mark_activated(self, name: str) -> None: method is_activated (line 48) | def is_activated(self, name: str) -> bool: method skill_count (line 53) | def skill_count(self) -> int: method allowlisted_dirs (line 57) | def allowlisted_dirs(self) -> list[str]: method to_prompt (line 61) | def to_prompt(self) -> str: method build_pre_activated_prompt (line 87) | def build_pre_activated_prompt(self, skill_names: list[str]) -> str: FILE: core/framework/skills/cli.py function register_skill_commands (line 17) | def register_skill_commands(subparsers) -> None: function cmd_skill_list (line 44) | def cmd_skill_list(args) -> int: function cmd_skill_trust (line 75) | def cmd_skill_trust(args) -> int: FILE: core/framework/skills/config.py class DefaultSkillConfig (line 14) | class DefaultSkillConfig: method from_dict (line 21) | def from_dict(cls, data: dict[str, Any]) -> DefaultSkillConfig: class SkillsConfig (line 28) | class SkillsConfig: method is_default_enabled (line 53) | def is_default_enabled(self, skill_name: str) -> bool: method get_default_overrides (line 62) | def get_default_overrides(self, skill_name: str) -> dict[str, Any]: method from_agent_vars (line 70) | def from_agent_vars( FILE: core/framework/skills/defaults.py class DefaultSkillManager (line 57) | class DefaultSkillManager: method __init__ (line 60) | def __init__(self, config: SkillsConfig | None = None): method load (line 66) | def load(self) -> None: method build_protocols_prompt (line 108) | def build_protocols_prompt(self) -> str: method log_active_skills (line 146) | def log_active_skills(self) -> None: method active_skill_names (line 193) | def active_skill_names(self) -> list[str]: method active_skills (line 198) | def active_skills(self) -> dict[str, ParsedSkill]: FILE: core/framework/skills/discovery.py class DiscoveryConfig (line 44) | class DiscoveryConfig: class SkillDiscovery (line 54) | class SkillDiscovery: method __init__ (line 57) | def __init__(self, config: DiscoveryConfig | None = None): method discover (line 60) | def discover(self) -> list[ParsedSkill]: method _scan_scope (line 117) | def _scan_scope(self, root: Path, scope: str) -> list[ParsedSkill]: method _find_skill_files (line 138) | def _find_skill_files(self, directory: Path, depth: int) -> list[Path]: method _resolve_collisions (line 165) | def _resolve_collisions(self, skills: list[ParsedSkill]) -> list[Parse... FILE: core/framework/skills/manager.py class SkillsManagerConfig (line 36) | class SkillsManagerConfig: class SkillsManager (line 55) | class SkillsManager: method __init__ (line 64) | def __init__(self, config: SkillsManagerConfig | None = None) -> None: method from_precomputed (line 76) | def from_precomputed( method load (line 99) | def load(self) -> None: method _do_load (line 110) | def _do_load(self) -> None: method skills_catalog_prompt (line 178) | def skills_catalog_prompt(self) -> str: method protocols_prompt (line 183) | def protocols_prompt(self) -> str: method allowlisted_dirs (line 188) | def allowlisted_dirs(self) -> list[str]: method is_loaded (line 193) | def is_loaded(self) -> bool: FILE: core/framework/skills/models.py class SkillScope (line 10) | class SkillScope(StrEnum): class TrustStatus (line 18) | class TrustStatus(StrEnum): class SkillEntry (line 27) | class SkillEntry: FILE: core/framework/skills/parser.py class ParsedSkill (line 25) | class ParsedSkill: function _try_fix_yaml (line 42) | def _try_fix_yaml(raw: str) -> str: function parse_skill_md (line 65) | def parse_skill_md(path: Path, source_scope: str = "project") -> ParsedS... FILE: core/framework/skills/skill_errors.py class SkillErrorCode (line 13) | class SkillErrorCode(Enum): class SkillError (line 25) | class SkillError(Exception): method __init__ (line 32) | def __init__(self, code: SkillErrorCode, what: str, why: str, fix: str): function log_skill_error (line 43) | def log_skill_error( FILE: core/framework/skills/trust.py class TrustedRepoEntry (line 43) | class TrustedRepoEntry: class TrustedRepoStore (line 49) | class TrustedRepoStore: method __init__ (line 52) | def __init__(self, path: Path | None = None) -> None: method is_trusted (line 57) | def is_trusted(self, repo_key: str) -> bool: method trust (line 61) | def trust(self, repo_key: str, project_path: str = "") -> None: method revoke (line 71) | def revoke(self, repo_key: str) -> bool: method list_entries (line 80) | def list_entries(self) -> list[TrustedRepoEntry]: method _ensure_loaded (line 84) | def _ensure_loaded(self) -> None: method _load (line 89) | def _load(self) -> None: method _save (line 114) | def _save(self) -> None: class ProjectTrustClassification (line 138) | class ProjectTrustClassification(StrEnum): class ProjectTrustDetector (line 144) | class ProjectTrustDetector: method __init__ (line 158) | def __init__(self, store: TrustedRepoStore | None = None) -> None: method classify (line 161) | def classify(self, project_dir: Path | None) -> tuple[ProjectTrustClas... method _get_remote_origin (line 192) | def _get_remote_origin(self, project_dir: Path) -> str: method _matches_own_remotes (line 212) | def _matches_own_remotes(self, repo_key: str) -> bool: function _normalize_remote_url (line 245) | def _normalize_remote_url(url: str) -> str: function _is_localhost_remote (line 272) | def _is_localhost_remote(remote_url: str) -> bool: class TrustGate (line 293) | class TrustGate: method __init__ (line 300) | def __init__( method filter_and_gate (line 314) | def filter_and_gate( method _run_consent_flow (line 393) | def _run_consent_flow( method _maybe_show_security_notice (line 410) | def _maybe_show_security_notice(self, Colors) -> None: # noqa: N803 method _print_consent_prompt (line 430) | def _print_consent_prompt( method _prompt_consent (line 467) | def _prompt_consent(self, Colors) -> str: # noqa: N803 FILE: core/framework/storage/backend.py class FileStorage (line 18) | class FileStorage: method __init__ (line 40) | def __init__(self, base_path: str | Path): method _ensure_dirs (line 44) | def _ensure_dirs(self) -> None: method _validate_key (line 54) | def _validate_key(self, key: str) -> None: method save_run (line 90) | def save_run(self, run: Run) -> None: method load_run (line 108) | def load_run(self, run_id: str) -> Run | None: method load_summary (line 116) | def load_summary(self, run_id: str) -> RunSummary | None: method delete_run (line 129) | def delete_run(self, run_id: str) -> bool: method get_runs_by_goal (line 153) | def get_runs_by_goal(self, goal_id: str) -> list[str]: method get_runs_by_status (line 169) | def get_runs_by_status(self, status: str | RunStatus) -> list[str]: method get_runs_by_node (line 187) | def get_runs_by_node(self, node_id: str) -> list[str]: method list_all_runs (line 203) | def list_all_runs(self) -> list[str]: method list_all_goals (line 208) | def list_all_goals(self) -> list[str]: method _get_index (line 229) | def _get_index(self, index_type: str, key: str) -> list[str]: method _add_to_index (line 238) | def _add_to_index(self, index_type: str, key: str, value: str) -> None: method _remove_from_index (line 248) | def _remove_from_index(self, index_type: str, key: str, value: str) ->... method get_stats (line 260) | def get_stats(self) -> dict: FILE: core/framework/storage/checkpoint_store.py class CheckpointStore (line 19) | class CheckpointStore: method __init__ (line 32) | def __init__(self, base_path: Path): method save_checkpoint (line 44) | async def save_checkpoint(self, checkpoint: Checkpoint) -> None: method load_checkpoint (line 76) | async def load_checkpoint( method load_index (line 113) | async def load_index(self) -> CheckpointIndex | None: method list_checkpoints (line 135) | async def list_checkpoints( method delete_checkpoint (line 165) | async def delete_checkpoint(self, checkpoint_id: str) -> bool: method prune_checkpoints (line 201) | async def prune_checkpoints( method checkpoint_exists (line 242) | async def checkpoint_exists(self, checkpoint_id: str) -> bool: method _update_index_add (line 259) | async def _update_index_add(self, checkpoint: Checkpoint) -> None: method _update_index_remove (line 293) | async def _update_index_remove(self, checkpoint_id: str) -> None: FILE: core/framework/storage/concurrent.py class CacheEntry (line 26) | class CacheEntry: method is_expired (line 32) | def is_expired(self, ttl: float) -> bool: class ConcurrentStorage (line 36) | class ConcurrentStorage: method __init__ (line 59) | def __init__( method start (line 98) | async def start(self) -> None: method stop (line 107) | async def stop(self) -> None: method _get_lock (line 128) | async def _get_lock(self, lock_key: str) -> asyncio.Lock: method save_run (line 162) | async def save_run(self, run: Run, immediate: bool = False) -> None: method _save_run_locked (line 182) | async def _save_run_locked(self, run: Run) -> None: method load_run (line 218) | async def load_run(self, run_id: str, use_cache: bool = True) -> Run |... method load_summary (line 251) | async def load_summary(self, run_id: str, use_cache: bool = True) -> R... method delete_run (line 273) | async def delete_run(self, run_id: str) -> bool: method get_runs_by_goal (line 288) | async def get_runs_by_goal(self, goal_id: str) -> list[str]: method get_runs_by_status (line 294) | async def get_runs_by_status(self, status: str | RunStatus) -> list[str]: method get_runs_by_node (line 302) | async def get_runs_by_node(self, node_id: str) -> list[str]: method list_all_runs (line 308) | async def list_all_runs(self) -> list[str]: method list_all_goals (line 313) | async def list_all_goals(self) -> list[str]: method _batch_writer (line 320) | async def _batch_writer(self) -> None: method _flush_batch (line 359) | async def _flush_batch(self, batch: list[tuple[str, Any]]) -> None: method _flush_pending (line 377) | async def _flush_pending(self) -> None: method clear_cache (line 392) | def clear_cache(self) -> None: method invalidate_cache (line 396) | def invalidate_cache(self, key: str) -> None: method get_cache_stats (line 400) | def get_cache_stats(self) -> dict: method get_stats (line 411) | async def get_stats(self) -> dict: method save_run_sync (line 425) | def save_run_sync(self, run: Run) -> None: method load_run_sync (line 430) | def load_run_sync(self, run_id: str) -> Run | None: FILE: core/framework/storage/conversation_store.py class FileConversationStore (line 33) | class FileConversationStore: method __init__ (line 41) | def __init__(self, base_path: str | Path) -> None: method _write_json (line 47) | def _write_json(self, path: Path, data: dict) -> None: method _read_json (line 52) | def _read_json(self, path: Path) -> dict | None: method _run (line 63) | async def _run(self, fn, *args): method write_part (line 68) | async def write_part(self, seq: int, data: dict[str, Any]) -> None: method read_parts (line 72) | async def read_parts(self) -> list[dict[str, Any]]: method write_meta (line 86) | async def write_meta(self, data: dict[str, Any]) -> None: method read_meta (line 89) | async def read_meta(self) -> dict[str, Any] | None: method write_cursor (line 92) | async def write_cursor(self, data: dict[str, Any]) -> None: method read_cursor (line 95) | async def read_cursor(self) -> dict[str, Any] | None: method delete_parts_before (line 98) | async def delete_parts_before(self, seq: int) -> None: method close (line 109) | async def close(self) -> None: method destroy (line 113) | async def destroy(self) -> None: FILE: core/framework/storage/session_store.py class SessionStore (line 20) | class SessionStore: method __init__ (line 35) | def __init__(self, base_path: Path): method generate_session_id (line 45) | def generate_session_id(self) -> str: method get_session_path (line 56) | def get_session_path(self, session_id: str) -> Path: method get_state_path (line 68) | def get_state_path(self, session_id: str) -> Path: method write_state (line 80) | async def write_state(self, session_id: str, state: SessionState) -> N... method read_state (line 101) | async def read_state(self, session_id: str) -> SessionState | None: method list_sessions (line 121) | async def list_sessions( method delete_session (line 175) | async def delete_session(self, session_id: str) -> bool: method session_exists (line 199) | async def session_exists(self, session_id: str) -> bool: FILE: core/framework/testing/approval_cli.py function interactive_approval (line 24) | def interactive_approval( function batch_approval (line 68) | def batch_approval( function _display_test (line 156) | def _display_test(test: Test, index: int, total: int) -> None: function _get_user_action (line 185) | def _get_user_action() -> ApprovalAction: function _process_action (line 202) | def _process_action( function _edit_test_code (line 251) | def _edit_test_code(code: str) -> str: function _command_exists (line 292) | def _command_exists(cmd: str) -> bool: FILE: core/framework/testing/approval_types.py class ApprovalAction (line 15) | class ApprovalAction(StrEnum): class ApprovalRequest (line 24) | class ApprovalRequest(BaseModel): method validate_action (line 37) | def validate_action(self) -> tuple[bool, str | None]: class ApprovalResult (line 51) | class ApprovalResult(BaseModel): method success_result (line 64) | def success_result( method error_result (line 76) | def error_result(cls, test_id: str, action: ApprovalAction, error: str... class BatchApprovalRequest (line 86) | class BatchApprovalRequest(BaseModel): method to_dict (line 96) | def to_dict(self) -> dict[str, Any]: class BatchApprovalResult (line 104) | class BatchApprovalResult(BaseModel): method summary (line 118) | def summary(self) -> str: FILE: core/framework/testing/categorizer.py class ErrorCategorizer (line 16) | class ErrorCategorizer: method __init__ (line 81) | def __init__(self): method categorize (line 89) | def categorize(self, result: TestResult) -> ErrorCategory | None: method categorize_with_confidence (line 124) | def categorize_with_confidence(self, result: TestResult) -> tuple[Erro... method _get_error_text (line 162) | def _get_error_text(self, result: TestResult) -> str: method get_fix_suggestion (line 179) | def get_fix_suggestion(self, category: ErrorCategory) -> str: method get_iteration_guidance (line 205) | def get_iteration_guidance(self, category: ErrorCategory) -> dict[str,... FILE: core/framework/testing/cli.py function _check_pytest_available (line 20) | def _check_pytest_available() -> bool: function register_testing_commands (line 43) | def register_testing_commands(subparsers: argparse._SubParsersAction) ->... function cmd_test_run (line 131) | def cmd_test_run(args: argparse.Namespace) -> int: function cmd_test_debug (line 207) | def cmd_test_debug(args: argparse.Namespace) -> int: function _scan_test_files (line 266) | def _scan_test_files(tests_dir: Path) -> list[dict]: function cmd_test_list (line 308) | def cmd_test_list(args: argparse.Namespace) -> int: function cmd_test_stats (line 356) | def cmd_test_stats(args: argparse.Namespace) -> int: FILE: core/framework/testing/debug_tool.py class DebugInfo (line 22) | class DebugInfo(BaseModel): method to_dict (line 51) | def to_dict(self) -> dict[str, Any]: class DebugTool (line 56) | class DebugTool: method __init__ (line 66) | def __init__( method analyze (line 82) | def analyze( method analyze_result (line 147) | def analyze_result( method get_failure_summary (line 196) | def get_failure_summary( method _get_runtime_data (line 230) | def _get_runtime_data(self, run_id: str) -> dict[str, Any]: method _get_iteration_suggestions (line 255) | def _get_iteration_suggestions( FILE: core/framework/testing/llm_judge.py class LLMJudge (line 16) | class LLMJudge: method __init__ (line 22) | def __init__(self, llm_provider: LLMProvider | None = None): method _get_client (line 27) | def _get_client(self): method _get_fallback_provider (line 41) | def _get_fallback_provider(self) -> LLMProvider | None: method evaluate (line 71) | def evaluate( method _parse_json_result (line 125) | def _parse_json_result(self, text: str) -> dict[str, Any]: FILE: core/framework/testing/test_case.py class ApprovalStatus (line 15) | class ApprovalStatus(StrEnum): class TestType (line 24) | class TestType(StrEnum): class Test (line 33) | class Test(BaseModel): method approve (line 93) | def approve(self, approved_by: str = "user") -> None: method modify (line 100) | def modify(self, new_code: str, approved_by: str = "user") -> None: method reject (line 109) | def reject(self, reason: str) -> None: method record_result (line 115) | def record_result(self, passed: bool) -> None: method is_approved (line 127) | def is_approved(self) -> bool: method pass_rate (line 132) | def pass_rate(self) -> float | None: FILE: core/framework/testing/test_result.py class ErrorCategory (line 15) | class ErrorCategory(StrEnum): class TestResult (line 30) | class TestResult(BaseModel): method summary_dict (line 73) | def summary_dict(self) -> dict[str, Any]: class TestSuiteResult (line 84) | class TestSuiteResult(BaseModel): method all_passed (line 108) | def all_passed(self) -> bool: method pass_rate (line 113) | def pass_rate(self) -> float: method summary_dict (line 119) | def summary_dict(self) -> dict[str, Any]: method get_failed_results (line 135) | def get_failed_results(self) -> list[TestResult]: method get_results_by_category (line 139) | def get_results_by_category(self, category: ErrorCategory) -> list[Tes... FILE: core/framework/testing/test_storage.py class TestStorage (line 16) | class TestStorage: method __init__ (line 40) | def __init__(self, base_path: str | Path): method _ensure_dirs (line 44) | def _ensure_dirs(self) -> None: method save_test (line 60) | def save_test(self, test: Test) -> None: method load_test (line 77) | def load_test(self, goal_id: str, test_id: str) -> Test | None: method delete_test (line 85) | def delete_test(self, goal_id: str, test_id: str) -> bool: method update_test (line 111) | def update_test(self, test: Test) -> None: method get_tests_by_goal (line 131) | def get_tests_by_goal(self, goal_id: str) -> list[Test]: method get_tests_by_approval_status (line 141) | def get_tests_by_approval_status(self, status: ApprovalStatus) -> list... method get_tests_by_type (line 145) | def get_tests_by_type(self, test_type: TestType) -> list[str]: method get_tests_by_criteria (line 149) | def get_tests_by_criteria(self, criteria_id: str) -> list[str]: method get_pending_tests (line 153) | def get_pending_tests(self, goal_id: str) -> list[Test]: method get_approved_tests (line 158) | def get_approved_tests(self, goal_id: str) -> list[Test]: method list_all_goals (line 163) | def list_all_goals(self) -> list[str]: method save_result (line 170) | def save_result(self, test_id: str, result: TestResult) -> None: method get_latest_result (line 186) | def get_latest_result(self, test_id: str) -> TestResult | None: method get_result_history (line 194) | def get_result_history(self, test_id: str, limit: int = 10) -> list[Te... method _get_index (line 214) | def _get_index(self, index_type: str, key: str) -> list[str]: method _add_to_index (line 222) | def _add_to_index(self, index_type: str, key: str, value: str) -> None: method _remove_from_index (line 231) | def _remove_from_index(self, index_type: str, key: str, value: str) ->... method get_stats (line 242) | def get_stats(self) -> dict: FILE: core/framework/tools/flowchart_utils.py function save_flowchart_file (line 58) | def save_flowchart_file( function load_flowchart_file (line 83) | def load_flowchart_file( function classify_flowchart_node (line 103) | def classify_flowchart_node( function synthesize_draft_from_runtime (line 198) | def synthesize_draft_from_runtime( function generate_fallback_flowchart (line 332) | def generate_fallback_flowchart( FILE: core/framework/tools/queen_lifecycle_tools.py class WorkerSessionAdapter (line 66) | class WorkerSessionAdapter: class QueenPhaseState (line 79) | class QueenPhaseState: method get_current_tools (line 122) | def get_current_tools(self) -> list: method get_current_prompt (line 132) | def get_current_prompt(self) -> str: method _emit_phase_event (line 153) | async def _emit_phase_event(self) -> None: method switch_to_running (line 167) | async def switch_to_running(self, source: str = "tool") -> None: method switch_to_staging (line 190) | async def switch_to_staging(self, source: str = "tool") -> None: method switch_to_building (line 219) | async def switch_to_building(self, source: str = "tool") -> None: method switch_to_planning (line 238) | async def switch_to_planning(self, source: str = "tool") -> None: function build_worker_profile (line 261) | def build_worker_profile(runtime: AgentRuntime, agent_path: Path | str |... function _read_agent_triggers_json (line 307) | def _read_agent_triggers_json(agent_path: Path) -> list[dict]: function _write_agent_triggers_json (line 319) | def _write_agent_triggers_json(agent_path: Path, triggers: list[dict]) -... function _save_trigger_to_agent (line 328) | def _save_trigger_to_agent(session: Any, trigger_id: str, tdef: Any) -> ... function _remove_trigger_from_agent (line 348) | def _remove_trigger_from_agent(session: Any, trigger_id: str) -> None: function _persist_active_triggers (line 360) | async def _persist_active_triggers(session: Any, session_id: str) -> None: function _start_trigger_timer (line 388) | async def _start_trigger_timer(session: Any, trigger_id: str, tdef: Any)... function _start_trigger_webhook (line 449) | async def _start_trigger_webhook(session: Any, trigger_id: str, tdef: An... function _dissolve_planning_nodes (line 512) | def _dissolve_planning_nodes( function _update_meta_json (line 730) | def _update_meta_json(session_manager, manager_session_id, updates: dict... function register_queen_lifecycle_tools (line 749) | def register_queen_lifecycle_tools( FILE: core/framework/tools/queen_memory_tools.py function write_to_diary (line 17) | def write_to_diary(entry: str) -> str: function recall_diary (line 37) | def recall_diary(query: str = "", days_back: int = 7) -> str: function register_queen_memory_tools (line 97) | def register_queen_memory_tools(registry: ToolRegistry) -> None: FILE: core/framework/tools/session_graph_tools.py function register_graph_tools (line 30) | def register_graph_tools(registry: ToolRegistry, runtime: AgentRuntime) ... FILE: core/framework/tools/worker_monitoring_tools.py function register_worker_monitoring_tools (line 41) | def register_worker_monitoring_tools( FILE: core/framework/utils/io.py function atomic_write (line 7) | def atomic_write(path: Path, mode: str = "w", encoding: str = "utf-8"): FILE: core/frontend/src/App.tsx function App (line 6) | function App() { FILE: core/frontend/src/api/client.ts constant API_BASE (line 1) | const API_BASE = "/api"; class ApiError (line 3) | class ApiError extends Error { method constructor (line 4) | constructor( function request (line 13) | async function request(path: string, options: RequestInit = {}): Prom... FILE: core/frontend/src/api/credentials.ts type CredentialInfo (line 3) | interface CredentialInfo { type AgentCredentialRequirement (line 11) | interface AgentCredentialRequirement { FILE: core/frontend/src/api/types.ts type LiveSession (line 3) | interface LiveSession { type LiveSessionDetail (line 21) | interface LiveSessionDetail extends LiveSession { type EntryPoint (line 28) | interface EntryPoint { type DiscoverEntry (line 40) | interface DiscoverEntry { type DiscoverResult (line 55) | type DiscoverResult = Record; type TriggerResult (line 59) | interface TriggerResult { type InjectResult (line 63) | interface InjectResult { type ChatResult (line 67) | interface ChatResult { type StopResult (line 74) | interface StopResult { type ResumeResult (line 80) | interface ResumeResult { type ReplayResult (line 86) | interface ReplayResult { type GoalProgress (line 92) | interface GoalProgress { type SessionSummary (line 99) | interface SessionSummary { type SessionDetail (line 109) | interface SessionDetail { type Checkpoint (line 126) | interface Checkpoint { type Message (line 135) | interface Message { type NodeSpec (line 150) | interface NodeSpec { type EdgeInfo (line 173) | interface EdgeInfo { type NodeDetail (line 179) | interface NodeDetail extends NodeSpec { type GraphEdge (line 183) | interface GraphEdge { type GraphTopology (line 190) | interface GraphTopology { type DraftNode (line 199) | interface DraftNode { type DraftEdge (line 216) | interface DraftEdge { type DraftGraph (line 226) | interface DraftGraph { type FlowchartMap (line 240) | interface FlowchartMap { type NodeCriteria (line 247) | interface NodeCriteria { type ToolInfo (line 262) | interface ToolInfo { type LogEntry (line 270) | interface LogEntry { type LogNodeDetail (line 274) | interface LogNodeDetail { type LogToolStep (line 285) | interface LogToolStep { type EventTypeName (line 294) | type EventTypeName = type AgentEvent (line 344) | interface AgentEvent { FILE: core/frontend/src/components/ChatPanel.tsx type ContextUsageEntry (line 4) | interface ContextUsageEntry { type ChatMessage (line 15) | interface ChatMessage { type ChatPanelProps (line 35) | interface ChatPanelProps { function getColor (line 69) | function getColor(_agent: string, role?: "queen" | "worker"): string { constant TOOL_HEX (line 76) | const TOOL_HEX = [ function toolHex (line 87) | function toolHex(name: string): string { function ToolActivityRow (line 93) | function ToolActivityRow({ content }: { content: string }) { function ChatPanel (line 258) | function ChatPanel({ messages, onSend, isWaiting, isWorkerWaiting, isBus... FILE: core/frontend/src/components/CredentialsModal.tsx type Credential (line 5) | interface Credential { function createFreshCredentials (line 17) | function createFreshCredentials(_agentType: string): Credential[] { function cloneCredentials (line 22) | function cloneCredentials(existing: Credential[]): Credential[] { function allRequiredCredentialsMet (line 27) | function allRequiredCredentialsMet(creds: Credential[]): boolean { type CredentialRow (line 32) | interface CredentialRow { function requirementToRow (line 46) | function requirementToRow(r: AgentCredentialRequirement): CredentialRow { function clearCredentialCache (line 68) | function clearCredentialCache(agentPath?: string) { type CredentialsModalProps (line 76) | interface CredentialsModalProps { function CredentialsModal (line 88) | function CredentialsModal({ FILE: core/frontend/src/components/DraftGraph.tsx constant TRIGGER_H (line 15) | const TRIGGER_H = 38; constant TRIGGER_PILL_GAP_X (line 16) | const TRIGGER_PILL_GAP_X = 16; constant TRIGGER_ICON_X (line 17) | const TRIGGER_ICON_X = 16; constant TRIGGER_LABEL_X (line 18) | const TRIGGER_LABEL_X = 30; constant TRIGGER_LABEL_INSET (line 19) | const TRIGGER_LABEL_INSET = 38; constant TRIGGER_TEXT_Y (line 20) | const TRIGGER_TEXT_Y = 11; constant TRIGGER_TEXT_STEP (line 21) | const TRIGGER_TEXT_STEP = 11; constant TRIGGER_CLEARANCE (line 22) | const TRIGGER_CLEARANCE = 30; type DraftChromeColors (line 24) | interface DraftChromeColors { function buildDraftChromeColors (line 40) | function buildDraftChromeColors(): DraftChromeColors { function useDraftChromeColors (line 72) | function useDraftChromeColors() { type DraftNodeStatus (line 85) | type DraftNodeStatus = "pending" | "running" | "complete" | "error"; type DraftGraphProps (line 87) | interface DraftGraphProps { constant NODE_H (line 111) | const NODE_H = 52; constant GAP_Y (line 112) | const GAP_Y = 48; constant TOP_Y (line 113) | const TOP_Y = 28; constant MARGIN_X (line 114) | const MARGIN_X = 16; constant GAP_X (line 115) | const GAP_X = 16; constant GROUP_GAP_COLS (line 116) | const GROUP_GAP_COLS = 1; function formatNodeId (line 118) | function formatNodeId(id: string): string { function FlowchartShape (line 126) | function FlowchartShape({ function Tooltip (line 221) | function Tooltip({ node, style }: { node: DraftNode; style: React.CSSPro... function DraftGraph (line 241) | function DraftGraph({ draft, originalDraft, onNodeClick, flowchartMap, r... FILE: core/frontend/src/components/HistorySidebar.tsx type HistorySession (line 23) | type HistorySession = { constant LABEL_STORE_KEY (line 37) | const LABEL_STORE_KEY = "hive:history-labels"; function loadLabelStore (line 39) | function loadLabelStore(): Record { function saveLabelStore (line 48) | function saveLabelStore(store: Record) { function defaultLabel (line 56) | function defaultLabel(s: HistorySession, index: number): string { function formatDateTime (line 68) | function formatDateTime(createdAt: number, sessionId: string): string { function deduplicateByAgent (line 87) | function deduplicateByAgent(sessions: HistorySession[]): HistorySession[] { function groupByDate (line 102) | function groupByDate(sessions: HistorySession[]): { label: string; items... type RowProps (line 126) | interface RowProps { function HistoryRow (line 137) | function HistoryRow({ session: s, label, isActive, isLive, onOpen, onRen... type HistorySidebarProps (line 260) | interface HistorySidebarProps { function HistorySidebar (line 274) | function HistorySidebar({ onOpen, openSessionIds = [], activeSessionId, ... FILE: core/frontend/src/components/MarkdownContent.tsx type MarkdownContentProps (line 84) | interface MarkdownContentProps { function MarkdownContent (line 89) | function MarkdownContent({ content, className }: MarkdownContentProps) { FILE: core/frontend/src/components/MultiQuestionWidget.tsx type QuestionItem (line 4) | interface QuestionItem { type MultiQuestionWidgetProps (line 10) | interface MultiQuestionWidgetProps { function MultiQuestionWidget (line 16) | function MultiQuestionWidget({ questions, onSubmit, onDismiss }: MultiQu... FILE: core/frontend/src/components/NodeDetailPanel.tsx type Tool (line 9) | interface Tool { type ToolCredential (line 16) | interface ToolCredential { type SubagentReport (line 23) | interface SubagentReport { type ContextUsage (line 31) | interface ContextUsage { type NodeDetailPanelProps (line 38) | interface NodeDetailPanelProps { function formatNodeId (line 60) | function formatNodeId(id: string): string { function CredentialRow (line 64) | function CredentialRow({ cred }: { cred: ToolCredential }) { function ToolRow (line 82) | function ToolRow({ tool }: { tool: Tool }) { function LogsTab (line 118) | function LogsTab({ nodeId, isActive: _isActive, sessionId, graphId, work... function SystemPromptTab (line 177) | function SystemPromptTab({ systemPrompt }: { systemPrompt?: string }) { function SubagentStatusBadge (line 216) | function SubagentStatusBadge({ status }: { status?: "running" | "complet... function SubagentsTab (line 245) | function SubagentsTab({ subAgentIds, allNodeSpecs, subagentReports }: { ... type Tab (line 310) | type Tab = "overview" | "breakdown" | "tools" | "logs" | "subagents"; function NodeDetailPanel (line 320) | function NodeDetailPanel({ node, nodeSpec, allNodeSpecs, subagentReports... FILE: core/frontend/src/components/ParallelSubagentBubble.tsx constant SUBAGENT_COLORS (line 12) | const SUBAGENT_COLORS = [ function colorForIndex (line 23) | function colorForIndex(i: number): string { function subagentLabel (line 27) | function subagentLabel(nodeId: string): string { function last (line 37) | function last(arr: T[]): T | undefined { type SubagentGroup (line 41) | interface SubagentGroup { type ParallelSubagentBubbleProps (line 47) | interface ParallelSubagentBubbleProps { function ToolOverlay (line 60) | function ToolOverlay({ function MuxPane (line 94) | function MuxPane({ FILE: core/frontend/src/components/QuestionWidget.tsx type QuestionWidgetProps (line 4) | interface QuestionWidgetProps { function QuestionWidget (line 15) | function QuestionWidget({ question, options, onSubmit, onDismiss }: Ques... FILE: core/frontend/src/components/TopBar.tsx type TopBarTab (line 7) | interface TopBarTab { type TopBarProps (line 14) | interface TopBarProps { function TopBar (line 29) | function TopBar({ tabs: tabsProp, onTabClick, onCloseTab, canCloseTabs, ... function deriveTabs (line 142) | function deriveTabs(persisted: PersistedTabState | null): TopBarTab[] { FILE: core/frontend/src/components/graph-types.ts type NodeStatus (line 1) | type NodeStatus = "running" | "complete" | "pending" | "error" | "looping"; type NodeType (line 3) | type NodeType = "execution" | "trigger"; type GraphNode (line 5) | interface GraphNode { type RunState (line 20) | type RunState = "idle" | "deploying" | "running"; type RunButtonProps (line 22) | interface RunButtonProps { FILE: core/frontend/src/hooks/use-sse.ts type UseSSEOptions (line 4) | interface UseSSEOptions { function useSSE (line 11) | function useSSE({ type UseMultiSSEOptions (line 69) | interface UseMultiSSEOptions { function useMultiSSE (line 79) | function useMultiSSE({ sessions, onEvent }: UseMultiSSEOptions) { FILE: core/frontend/src/lib/chat-helpers.test.ts function makeEvent (line 9) | function makeEvent(overrides: Partial): AgentEvent { FILE: core/frontend/src/lib/chat-helpers.ts function formatAgentDisplayName (line 18) | function formatAgentDisplayName(raw: string): string { function sseEventToChatMessage (line 36) | function sseEventToChatMessage( type QueenPhase (line 153) | type QueenPhase = "planning" | "building" | "staging" | "running"; constant VALID_PHASES (line 154) | const VALID_PHASES = new Set(["planning", "building", "staging",... function extractLastPhase (line 161) | function extractLastPhase(events: AgentEvent[]): QueenPhase | null { FILE: core/frontend/src/lib/graph-converter.test.ts function makeNode (line 9) | function makeNode(id: string, overrides: Partial = {}): NodeSp... FILE: core/frontend/src/lib/graph-converter.ts function topologyToGraphNodes (line 14) | function topologyToGraphNodes(topology: GraphTopology): GraphNode[] { function mapStatus (line 176) | function mapStatus(spec: NodeSpec | undefined): NodeStatus { FILE: core/frontend/src/lib/graphUtils.ts function cssVar (line 8) | function cssVar(name: string): string { function truncateLabel (line 13) | function truncateLabel(label: string, availablePx: number, fontSize: num... type TriggerColorSet (line 22) | type TriggerColorSet = { bg: string; border: string; text: string; icon:... function buildTriggerColors (line 24) | function buildTriggerColors(): TriggerColorSet { constant ACTIVE_TRIGGER_COLORS (line 37) | const ACTIVE_TRIGGER_COLORS: TriggerColorSet = { constant TRIGGER_ICONS (line 44) | const TRIGGER_ICONS: Record = { function cronToLabel (line 52) | function cronToLabel(cron: string): string { function useTriggerColors (line 77) | function useTriggerColors(): TriggerColorSet { FILE: core/frontend/src/lib/tab-persistence.ts constant TAB_STORAGE_KEY (line 9) | const TAB_STORAGE_KEY = "hive:workspace-tabs"; type PersistedTabState (line 11) | interface PersistedTabState { function loadPersistedTabs (line 18) | function loadPersistedTabs(): PersistedTabState | null { constant MAX_PERSISTED_MESSAGES (line 30) | const MAX_PERSISTED_MESSAGES = 50; function savePersistedTabs (line 32) | function savePersistedTabs(state: PersistedTabState): void { FILE: core/frontend/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { FILE: core/frontend/src/pages/home.tsx constant AGENT_ICONS (line 11) | const AGENT_ICONS: Record = { constant AGENT_COLORS (line 26) | const AGENT_COLORS: Record = { function agentSlug (line 41) | function agentSlug(path: string): string { function Home (line 54) | function Home() { FILE: core/frontend/src/pages/my-agents.tsx function timeAgo (line 8) | function timeAgo(iso: string): string { function MyAgents (line 20) | function MyAgents() { FILE: core/frontend/src/pages/workspace.tsx function formatCountdown (line 33) | function formatCountdown(totalSecs: number): string { function TimerCountdown (line 42) | function TimerCountdown({ initialSeconds }: { initialSeconds: number }) { type Session (line 64) | interface Session { function createSession (line 82) | function createSession(agentType: string, label: string, existingCredent... type PopoverStep (line 94) | type PopoverStep = "root" | "new-agent-choice" | "clone-pick"; type NewTabPopoverProps (line 96) | interface NewTabPopoverProps { function NewTabPopover (line 106) | function NewTabPopover({ open, onClose, anchorRef, discoverAgents, onFro... function fmtLogTs (line 239) | function fmtLogTs(ts: string): string { function truncate (line 248) | function truncate(s: string, max: number): string { type SessionRestoreResult (line 252) | type SessionRestoreResult = { function restoreSessionMessages (line 265) | async function restoreSessionMessages( type AgentBackendState (line 308) | interface AgentBackendState { function defaultAgentState (line 359) | function defaultAgentState(): AgentBackendState { function Workspace (line 398) | function Workspace() { FILE: core/tests/debug_codex_stream.py function test_codex_stream (line 19) | async def test_codex_stream(): FILE: core/tests/debug_codex_verbose.py function main (line 26) | async def main(): FILE: core/tests/dummy_agents/conftest.py function set_llm_selection (line 26) | def set_llm_selection( function pytest_collection_modifyitems (line 43) | def pytest_collection_modifyitems(config, items): function llm_provider (line 65) | def llm_provider(): function tool_registry (line 78) | def tool_registry(): function runtime (line 104) | def runtime(tmp_path): function goal (line 110) | def goal(): function make_executor (line 114) | def make_executor( FILE: core/tests/dummy_agents/nodes.py class SuccessNode (line 13) | class SuccessNode(NodeProtocol): method __init__ (line 16) | def __init__(self, output: dict | None = None): method execute (line 21) | async def execute(self, ctx: NodeContext) -> NodeResult: class FailNode (line 27) | class FailNode(NodeProtocol): method __init__ (line 30) | def __init__(self, error: str = "node failed"): method execute (line 34) | async def execute(self, ctx: NodeContext) -> NodeResult: class FlakyNode (line 39) | class FlakyNode(NodeProtocol): method __init__ (line 42) | def __init__(self, fail_times: int = 2, output: dict | None = None): method execute (line 47) | async def execute(self, ctx: NodeContext) -> NodeResult: class StatefulNode (line 54) | class StatefulNode(NodeProtocol): method __init__ (line 57) | def __init__(self, outputs: list[NodeResult]): method execute (line 61) | async def execute(self, ctx: NodeContext) -> NodeResult: FILE: core/tests/dummy_agents/run_all.py function _detect_claude_code_token (line 40) | def _detect_claude_code_token() -> str | None: function _detect_codex_token (line 50) | def _detect_codex_token() -> str | None: function _detect_kimi_code_token (line 60) | def _detect_kimi_code_token() -> str | None: function detect_available (line 70) | def detect_available() -> list[dict]: function prompt_provider_selection (line 130) | def prompt_provider_selection() -> dict: function parse_junit_xml (line 168) | def parse_junit_xml(xml_path: str) -> dict[str, dict]: function print_table (line 219) | def print_table(agents: dict[str, dict], total_time: float, verbose: boo... function main (line 302) | def main() -> int: FILE: core/tests/dummy_agents/test_branch.py function _build_branch_graph (line 21) | def _build_branch_graph() -> GraphSpec: function test_branch_positive_path (line 95) | async def test_branch_positive_path(runtime, goal, llm_provider): function test_branch_negative_path (line 108) | async def test_branch_negative_path(runtime, goal, llm_provider): function test_branch_two_nodes_traversed (line 121) | async def test_branch_two_nodes_traversed(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_echo.py function _build_echo_graph (line 16) | def _build_echo_graph() -> GraphSpec: function test_echo_basic (line 46) | async def test_echo_basic(runtime, goal, llm_provider): function test_echo_empty_input (line 59) | async def test_echo_empty_input(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_feedback_loop.py function _build_feedback_graph (line 17) | def _build_feedback_graph(max_visits: int = 3) -> GraphSpec: function test_feedback_loop_terminates (line 77) | async def test_feedback_loop_terminates(runtime, goal, llm_provider): function test_feedback_loop_visit_counts (line 102) | async def test_feedback_loop_visit_counts(runtime, goal, llm_provider): function test_feedback_loop_early_exit (line 125) | async def test_feedback_loop_early_exit(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_gcu_subagent.py function _has_gcu_server (line 24) | def _has_gcu_server() -> bool: function _build_gcu_subagent_graph (line 34) | def _build_gcu_subagent_graph() -> GraphSpec: function _gcu_goal (line 86) | def _gcu_goal() -> Goal: function test_gcu_subagent_delegation (line 96) | async def test_gcu_subagent_delegation(runtime, llm_provider, tool_regis... function test_gcu_subagent_returns_data (line 137) | async def test_gcu_subagent_returns_data(runtime, llm_provider, tool_reg... FILE: core/tests/dummy_agents/test_parallel_merge.py function _build_parallel_graph (line 23) | def _build_parallel_graph() -> GraphSpec: function test_parallel_both_succeed (line 114) | async def test_parallel_both_succeed(runtime, goal, llm_provider): function test_parallel_branch_failure_fail_all (line 128) | async def test_parallel_branch_failure_fail_all(runtime, goal, llm_provi... function test_parallel_branch_failure_continue_others (line 141) | async def test_parallel_branch_failure_continue_others(runtime, goal, ll... function test_parallel_disjoint_output_keys (line 155) | async def test_parallel_disjoint_output_keys(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_pipeline.py function _build_pipeline_graph (line 21) | def _build_pipeline_graph(conversation_mode: str = "continuous") -> Grap... function test_pipeline_linear_traversal (line 91) | async def test_pipeline_linear_traversal(runtime, goal, llm_provider): function test_pipeline_input_mapping (line 103) | async def test_pipeline_input_mapping(runtime, goal, llm_provider): function test_pipeline_continuous_conversation (line 116) | async def test_pipeline_continuous_conversation(runtime, goal, llm_provi... function test_pipeline_isolated_conversation (line 127) | async def test_pipeline_isolated_conversation(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_retry.py function _build_retry_graph (line 17) | def _build_retry_graph(max_retries: int = 3, with_failure_edge: bool = F... function test_retry_succeeds_within_limit (line 77) | async def test_retry_succeeds_within_limit(runtime, goal, llm_provider): function test_retry_exhaustion (line 92) | async def test_retry_exhaustion(runtime, goal, llm_provider): function test_retry_with_on_failure_edge (line 105) | async def test_retry_with_on_failure_edge(runtime, goal, llm_provider): function test_retry_tracking (line 121) | async def test_retry_tracking(runtime, goal, llm_provider): FILE: core/tests/dummy_agents/test_worker.py function _build_worker_graph (line 19) | def _build_worker_graph(tools: list[str]) -> GraphSpec: function _worker_goal (line 49) | def _worker_goal() -> Goal: function test_worker_example_tool (line 58) | async def test_worker_example_tool(runtime, llm_provider, tool_registry): function test_worker_time_tool (line 75) | async def test_worker_time_tool(runtime, llm_provider, tool_registry): function test_worker_data_tools (line 95) | async def test_worker_data_tools(runtime, llm_provider, tool_registry, t... function test_worker_multi_tool (line 122) | async def test_worker_multi_tool(runtime, llm_provider, tool_registry): FILE: core/tests/test_antigravity_eventloop.py function make_provider (line 27) | def make_provider() -> LiteLLMProvider: function make_context (line 46) | def make_context( function run_test (line 85) | async def run_test( function main (line 110) | async def main(): FILE: core/tests/test_check_llm_key_openrouter.py function _load_check_llm_key_module (line 5) | def _load_check_llm_key_module(): function _run_openrouter_check (line 14) | def _run_openrouter_check(monkeypatch, status_code: int): function _run_openrouter_model_check (line 42) | def _run_openrouter_model_check( function test_check_openrouter_200 (line 82) | def test_check_openrouter_200(monkeypatch): function test_check_openrouter_401 (line 89) | def test_check_openrouter_401(monkeypatch): function test_check_openrouter_403 (line 94) | def test_check_openrouter_403(monkeypatch): function test_check_openrouter_429 (line 99) | def test_check_openrouter_429(monkeypatch): function test_check_openrouter_model_200 (line 104) | def test_check_openrouter_model_200(monkeypatch): function test_check_openrouter_model_200_matches_canonical_slug (line 126) | def test_check_openrouter_model_200_matches_canonical_slug(monkeypatch): function test_check_openrouter_model_200_sanitizes_pasted_unicode (line 147) | def test_check_openrouter_model_200_sanitizes_pasted_unicode(monkeypatch): function test_check_openrouter_model_200_not_found_with_suggestions (line 168) | def test_check_openrouter_model_200_not_found_with_suggestions(monkeypat... function test_check_openrouter_model_404_with_error_message (line 189) | def test_check_openrouter_model_404_with_error_message(monkeypatch): function test_check_openrouter_model_429 (line 204) | def test_check_openrouter_model_429(monkeypatch): FILE: core/tests/test_cli_entry_point.py function project_root (line 14) | def project_root(): class TestConfigurePaths (line 19) | class TestConfigurePaths: method test_adds_exports_to_sys_path (line 22) | def test_adds_exports_to_sys_path(self, project_root): method test_adds_core_to_sys_path (line 38) | def test_adds_core_to_sys_path(self, project_root): method test_does_not_duplicate_paths (line 50) | def test_does_not_duplicate_paths(self): method test_handles_missing_exports_gracefully (line 57) | def test_handles_missing_exports_gracefully(self): class TestFrameworkModule (line 62) | class TestFrameworkModule: method test_module_help (line 65) | def test_module_help(self, project_root): method test_module_list_subcommand (line 77) | def test_module_list_subcommand(self, project_root): class TestHiveEntryPoint (line 90) | class TestHiveEntryPoint: method _require_hive (line 99) | def _require_hive(self): method test_hive_help (line 103) | def test_hive_help(self): method test_hive_list_help (line 115) | def test_hive_list_help(self): method test_hive_run_missing_agent (line 125) | def test_hive_run_missing_agent(self): FILE: core/tests/test_client_facing_validation.py class TestClientFacingFanOut (line 17) | class TestClientFacingFanOut: method test_fan_out_two_client_facing_fails (line 20) | def test_fan_out_two_client_facing_fails(self): method test_fan_out_one_client_facing_passes (line 42) | def test_fan_out_one_client_facing_passes(self): method test_fan_out_zero_client_facing_passes (line 63) | def test_fan_out_zero_client_facing_passes(self): class TestEventLoopOutputKeyOverlap (line 90) | class TestEventLoopOutputKeyOverlap: method test_overlapping_output_keys_event_loop_fails (line 93) | def test_overlapping_output_keys_event_loop_fails(self): method test_disjoint_output_keys_event_loop_passes (line 127) | def test_disjoint_output_keys_event_loop_passes(self): class TestNoFanOutUnaffected (line 166) | class TestNoFanOutUnaffected: method test_no_fan_out_unaffected (line 169) | def test_no_fan_out_unaffected(self): FILE: core/tests/test_client_io.py class MockEventBus (line 25) | class MockEventBus: method __init__ (line 28) | def __init__(self) -> None: method _record (line 31) | async def _record(self, event_type: EventType, **kwargs) -> None: method emit_client_output_delta (line 36) | async def emit_client_output_delta(self, **kwargs) -> None: method emit_client_input_requested (line 39) | async def emit_client_input_requested(self, **kwargs) -> None: method emit_node_internal_output (line 42) | async def emit_node_internal_output(self, **kwargs) -> None: method emit_node_input_blocked (line 45) | async def emit_node_input_blocked(self, **kwargs) -> None: function test_active_emit_and_consume (line 53) | async def test_active_emit_and_consume(): function test_active_request_input (line 74) | async def test_active_request_input(): function test_active_request_input_timeout (line 94) | async def test_active_request_input_timeout(): function test_inert_emit_publishes_internal (line 106) | async def test_inert_emit_publishes_internal(): function test_inert_request_input_returns_redirect (line 119) | async def test_inert_request_input_returns_redirect(): function test_gateway_creates_active_for_client_facing (line 135) | def test_gateway_creates_active_for_client_facing(): function test_gateway_creates_inert_for_internal (line 144) | def test_gateway_creates_inert_for_internal(): FILE: core/tests/test_codex_eventloop.py function make_provider (line 23) | def make_provider() -> LiteLLMProvider: function make_context (line 39) | def make_context( function run_test (line 78) | async def run_test( function main (line 103) | async def main(): FILE: core/tests/test_conditional_edge_direct_key.py class SimpleRuntime (line 18) | class SimpleRuntime(Runtime): method start_run (line 21) | def start_run(self, **kwargs): method end_run (line 24) | def end_run(self, **kwargs): method report_problem (line 27) | def report_problem(self, **kwargs): method decide (line 30) | def decide(self, **kwargs): method record_outcome (line 33) | def record_outcome(self, **kwargs): method set_node (line 36) | def set_node(self, **kwargs): class ScoreNode (line 40) | class ScoreNode(NodeProtocol): method execute (line 43) | async def execute(self, ctx: NodeContext) -> NodeResult: class HighScoreNode (line 47) | class HighScoreNode(NodeProtocol): method execute (line 50) | async def execute(self, ctx: NodeContext) -> NodeResult: class MultiKeyNode (line 54) | class MultiKeyNode(NodeProtocol): method execute (line 57) | async def execute(self, ctx: NodeContext) -> NodeResult: class ConsumerNode (line 61) | class ConsumerNode(NodeProtocol): method execute (line 64) | async def execute(self, ctx: NodeContext) -> NodeResult: function test_direct_key_access_in_conditional_edge (line 69) | async def test_direct_key_access_in_conditional_edge(): function test_backward_compatibility_output_syntax (line 138) | async def test_backward_compatibility_output_syntax(): function test_multiple_keys_in_expression (line 206) | async def test_multiple_keys_in_expression(): function test_negative_case_condition_false (line 274) | async def test_negative_case_condition_false(): FILE: core/tests/test_config.py class TestGetHiveConfig (line 8) | class TestGetHiveConfig: method test_logs_warning_on_malformed_json (line 11) | def test_logs_warning_on_malformed_json(self, tmp_path, monkeypatch, c... class TestOpenRouterConfig (line 26) | class TestOpenRouterConfig: method test_get_preferred_model_for_openrouter (line 29) | def test_get_preferred_model_for_openrouter(self, tmp_path, monkeypatch): method test_get_preferred_model_normalizes_openrouter_prefixed_model (line 39) | def test_get_preferred_model_normalizes_openrouter_prefixed_model(self... method test_get_api_base_falls_back_to_openrouter_default (line 49) | def test_get_api_base_falls_back_to_openrouter_default(self, tmp_path,... method test_get_api_base_keeps_explicit_openrouter_api_base (line 59) | def test_get_api_base_keeps_explicit_openrouter_api_base(self, tmp_pat... FILE: core/tests/test_context_handoff.py class SpyLLMProvider (line 19) | class SpyLLMProvider(MockLLMProvider): method __init__ (line 22) | def __init__(self) -> None: method complete (line 27) | def complete(self, messages: list[dict[str, Any]], **kwargs: Any) -> L... class FailingLLMProvider (line 33) | class FailingLLMProvider(LLMProvider): method complete (line 36) | def complete(self, messages: list[dict[str, Any]], **kwargs: Any) -> L... function _build_conversation (line 40) | async def _build_conversation(*pairs: tuple[str, str]) -> NodeConversation: class TestHandoffContext (line 54) | class TestHandoffContext: method test_instantiation (line 55) | def test_instantiation(self) -> None: method test_field_access (line 69) | def test_field_access(self) -> None: class TestExtractiveSummary (line 85) | class TestExtractiveSummary: method test_extractive_summary_includes_first_last (line 87) | async def test_extractive_summary_includes_first_last(self) -> None: method test_extractive_summary_metadata (line 100) | async def test_extractive_summary_metadata(self) -> None: method test_extractive_with_output_keys_colon (line 113) | async def test_extractive_with_output_keys_colon(self) -> None: method test_extractive_with_output_keys_equals (line 123) | async def test_extractive_with_output_keys_equals(self) -> None: method test_extractive_json_output_keys (line 133) | async def test_extractive_json_output_keys(self) -> None: method test_extractive_empty_conversation (line 144) | async def test_extractive_empty_conversation(self) -> None: method test_extractive_no_assistant_messages (line 154) | async def test_extractive_no_assistant_messages(self) -> None: method test_extractive_most_recent_wins (line 165) | async def test_extractive_most_recent_wins(self) -> None: method test_extractive_truncation (line 176) | async def test_extractive_truncation(self) -> None: class TestLLMSummary (line 193) | class TestLLMSummary: method test_llm_summary_calls_provider (line 195) | async def test_llm_summary_calls_provider(self) -> None: method test_llm_summary_includes_output_key_hint (line 208) | async def test_llm_summary_includes_output_key_hint(self) -> None: method test_llm_fallback_on_error (line 222) | async def test_llm_fallback_on_error(self) -> None: class TestFormatAsInput (line 241) | class TestFormatAsInput: method test_format_structure (line 242) | def test_format_structure(self) -> None: method test_format_no_key_outputs (line 257) | def test_format_no_key_outputs(self) -> None: method test_format_content_values (line 270) | def test_format_content_values(self) -> None: method test_format_empty_summary (line 287) | def test_format_empty_summary(self) -> None: method test_format_as_input_usable_as_message (line 300) | async def test_format_as_input_usable_as_message(self) -> None: FILE: core/tests/test_continuous_conversation.py class MockStreamingLLM (line 39) | class MockStreamingLLM(LLMProvider): method __init__ (line 42) | def __init__(self, scenarios: list[list] | None = None): method stream (line 47) | async def stream( method complete (line 62) | def complete(self, messages, system="", **kwargs) -> LLMResponse: function _set_output_scenario (line 71) | def _set_output_scenario(key: str, value: str) -> list: function _text_then_set_output (line 83) | def _text_then_set_output(text: str, key: str, value: str) -> list: function _text_finish (line 96) | def _text_finish(text: str) -> list: function _make_runtime (line 104) | def _make_runtime(): function _make_goal (line 115) | def _make_goal(): function _make_tool (line 119) | def _make_tool(name: str) -> Tool: class TestComposeSystemPrompt (line 132) | class TestComposeSystemPrompt: method test_all_layers (line 133) | def test_all_layers(self): method test_identity_only (line 145) | def test_identity_only(self): method test_focus_only (line 150) | def test_focus_only(self): method test_empty (line 156) | def test_empty(self): class TestBuildNarrative (line 161) | class TestBuildNarrative: method test_with_execution_path (line 162) | def test_with_execution_path(self): method test_empty_state (line 182) | def test_empty_state(self): class TestBuildTransitionMarker (line 189) | class TestBuildTransitionMarker: method test_basic_marker (line 190) | def test_basic_marker(self): class TestUpdateSystemPrompt (line 220) | class TestUpdateSystemPrompt: method test_update (line 221) | def test_update(self): class TestContinuousConversation (line 233) | class TestContinuousConversation: method test_isolated_mode_no_conversation_in_result (line 237) | async def test_isolated_mode_no_conversation_in_result(self): method test_continuous_threads_conversation (line 268) | async def test_continuous_threads_conversation(self): method test_continuous_transition_marker_present (line 323) | async def test_continuous_transition_marker_present(self): class TestCumulativeTools (line 381) | class TestCumulativeTools: method test_isolated_mode_tools_scoped (line 385) | async def test_isolated_mode_tools_scoped(self): method test_continuous_mode_tools_accumulate (line 446) | async def test_continuous_mode_tools_accumulate(self): class TestSchemaDefaults (line 511) | class TestSchemaDefaults: method test_graphspec_defaults (line 512) | def test_graphspec_defaults(self): method test_nodespec_defaults (line 524) | def test_nodespec_defaults(self): method test_noderesult_defaults (line 534) | def test_noderesult_defaults(self): FILE: core/tests/test_conversation_judge.py class MockStreamingLLM (line 38) | class MockStreamingLLM(LLMProvider): method __init__ (line 41) | def __init__(self, scenarios: list[list] | None = None, complete_respo... method stream (line 48) | async def stream( method complete (line 63) | def complete(self, messages, system="", **kwargs) -> LLMResponse: function _set_output_scenario (line 73) | def _set_output_scenario(key: str, value: str) -> list: function _text_then_set_output (line 84) | def _text_then_set_output(text: str, key: str, value: str) -> list: function _text_finish (line 96) | def _text_finish(text: str) -> list: function _make_runtime (line 103) | def _make_runtime(): function _make_goal (line 114) | def _make_goal(): class TestParseVerdict (line 123) | class TestParseVerdict: method test_accept (line 124) | def test_accept(self): method test_retry_with_feedback (line 130) | def test_retry_with_feedback(self): method test_defaults_on_garbage (line 136) | def test_defaults_on_garbage(self): method test_invalid_action_defaults_to_accept (line 141) | def test_invalid_action_defaults_to_accept(self): class TestEvaluatePhaseCompletion (line 151) | class TestEvaluatePhaseCompletion: method test_accept_on_good_response (line 153) | async def test_accept_on_good_response(self): method test_retry_on_poor_response (line 172) | async def test_retry_on_poor_response(self): method test_llm_failure_defaults_to_accept (line 195) | async def test_llm_failure_defaults_to_accept(self): class TestLevel2InImplicitJudge (line 221) | class TestLevel2InImplicitJudge: method test_no_success_criteria_level0_only (line 223) | async def test_no_success_criteria_level0_only(self): method test_success_criteria_accept (line 256) | async def test_success_criteria_accept(self): method test_success_criteria_retry_then_accept (line 290) | async def test_success_criteria_retry_then_accept(self): method test_level2_only_fires_when_level0_passes (line 342) | async def test_level2_only_fires_when_level0_passes(self): FILE: core/tests/test_credential_bootstrap.py function _install_fake_aden_modules (line 9) | def _install_fake_aden_modules(monkeypatch, check_fn, credential_specs): function test_bootstrap_loads_configured_llm_env_var_from_shell_config (line 20) | def test_bootstrap_loads_configured_llm_env_var_from_shell_config(monkey... function test_bootstrap_does_not_override_existing_configured_llm_env_var (line 50) | def test_bootstrap_does_not_override_existing_configured_llm_env_var(mon... FILE: core/tests/test_default_skills.py class TestDefaultSkillFiles (line 20) | class TestDefaultSkillFiles: method test_all_six_skills_exist (line 23) | def test_all_six_skills_exist(self): method test_skill_parses (line 27) | def test_skill_parses(self, skill_name, dir_name): method test_combined_token_budget (line 38) | def test_combined_token_budget(self): method test_shared_memory_keys_all_prefixed (line 53) | def test_shared_memory_keys_all_prefixed(self): class TestDefaultSkillManager (line 59) | class TestDefaultSkillManager: method test_load_all_defaults (line 60) | def test_load_all_defaults(self): method test_load_idempotent (line 68) | def test_load_idempotent(self): method test_build_protocols_prompt (line 75) | def test_build_protocols_prompt(self): method test_protocols_prompt_empty_when_all_disabled (line 87) | def test_protocols_prompt_empty_when_all_disabled(self): method test_disable_single_skill (line 95) | def test_disable_single_skill(self): method test_disable_all_via_convention (line 105) | def test_disable_all_via_convention(self): method test_log_active_skills (line 112) | def test_log_active_skills(self, caplog): method test_log_all_disabled (line 122) | def test_log_all_disabled(self, caplog): class TestSkillsConfig (line 134) | class TestSkillsConfig: method test_default_is_enabled (line 135) | def test_default_is_enabled(self): method test_explicit_disable (line 139) | def test_explicit_disable(self): method test_all_disabled_flag (line 146) | def test_all_disabled_flag(self): method test_from_agent_vars_basic (line 151) | def test_from_agent_vars_basic(self): method test_from_agent_vars_bool_shorthand (line 163) | def test_from_agent_vars_bool_shorthand(self): method test_from_agent_vars_all_disabled (line 167) | def test_from_agent_vars_all_disabled(self): method test_get_default_overrides (line 171) | def test_get_default_overrides(self): method test_get_default_overrides_empty (line 180) | def test_get_default_overrides_empty(self): method test_from_agent_vars_none_inputs (line 184) | def test_from_agent_vars_none_inputs(self): FILE: core/tests/test_event_loop_integration.py class StreamScript (line 58) | class StreamScript: class ScriptableMockLLMProvider (line 69) | class ScriptableMockLLMProvider(LLMProvider): method __init__ (line 76) | def __init__(self, scripts: list[StreamScript] | None = None): method complete (line 81) | def complete( method stream (line 98) | async def stream( class MockConversationStore (line 137) | class MockConversationStore: method __init__ (line 140) | def __init__(self) -> None: method write_part (line 145) | async def write_part(self, seq: int, data: dict[str, Any]) -> None: method read_parts (line 148) | async def read_parts(self) -> list[dict[str, Any]]: method write_meta (line 151) | async def write_meta(self, data: dict[str, Any]) -> None: method read_meta (line 154) | async def read_meta(self) -> dict[str, Any] | None: method write_cursor (line 157) | async def write_cursor(self, data: dict[str, Any]) -> None: method read_cursor (line 160) | async def read_cursor(self) -> dict[str, Any] | None: method delete_parts_before (line 163) | async def delete_parts_before(self, seq: int) -> None: method close (line 168) | async def close(self) -> None: method destroy (line 171) | async def destroy(self) -> None: class AlwaysAcceptJudge (line 182) | class AlwaysAcceptJudge: method evaluate (line 185) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: class AlwaysRetryJudge (line 189) | class AlwaysRetryJudge: method evaluate (line 192) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: class CountingJudge (line 196) | class CountingJudge: method __init__ (line 199) | def __init__(self, retry_count: int = 1): method evaluate (line 203) | async def evaluate(self, context: dict[str, Any]) -> JudgeVerdict: function make_llm (line 215) | def make_llm(scripts: list[StreamScript] | None = None) -> LLMProvider: function make_tool_executor (line 225) | def make_tool_executor(results_map: dict[str, str]) -> Callable: function make_ctx (line 239) | def make_ctx( function runtime (line 288) | def runtime(): function event_bus (line 301) | def event_bus(): function fast_sleep (line 307) | def fast_sleep(monkeypatch): function test_event_loop_node_in_graph (line 318) | async def test_event_loop_node_in_graph(runtime): function test_event_loop_with_event_bus (line 364) | async def test_event_loop_with_event_bus(): function test_event_loop_tool_execution (line 406) | async def test_event_loop_tool_execution(): function test_event_loop_set_output (line 470) | async def test_event_loop_set_output(): function test_event_loop_missing_output_keys_retried (line 509) | async def test_event_loop_missing_output_keys_retried(): function test_event_loop_conversation_compaction (line 551) | async def test_event_loop_conversation_compaction(): function test_event_loop_checkpoint_and_restore (line 589) | async def test_event_loop_checkpoint_and_restore(): function test_event_loop_external_injection (line 672) | async def test_event_loop_external_injection(): function test_event_loop_pause_and_resume (line 711) | async def test_event_loop_pause_and_resume(): class AlwaysFailsNode (line 778) | class AlwaysFailsNode(NodeProtocol): method __init__ (line 781) | def __init__(self): method execute (line 784) | async def execute(self, ctx: NodeContext) -> NodeResult: function test_event_loop_no_executor_retry (line 790) | async def test_event_loop_no_executor_retry(runtime): function test_context_handoff_between_nodes (line 827) | async def test_context_handoff_between_nodes(runtime): function test_client_facing_node_streams_output (line 923) | async def test_client_facing_node_streams_output(): function test_internal_node_no_client_output (line 962) | async def test_internal_node_no_client_output(): function test_mixed_node_graph (line 998) | async def test_mixed_node_graph(runtime): function test_fan_out_rejects_overlapping_output_keys (line 1088) | async def test_fan_out_rejects_overlapping_output_keys(runtime): function test_max_iterations_exceeded (line 1185) | async def test_max_iterations_exceeded(): function test_stall_detection (line 1206) | async def test_stall_detection(): FILE: core/tests/test_event_loop_node.py class MockStreamingLLM (line 42) | class MockStreamingLLM(LLMProvider): method __init__ (line 49) | def __init__(self, scenarios: list[list] | None = None): method stream (line 54) | async def stream( method complete (line 69) | def complete(self, messages, system="", **kwargs) -> LLMResponse: function text_scenario (line 78) | def text_scenario(text: str, input_tokens: int = 10, output_tokens: int ... function tool_call_scenario (line 88) | def tool_call_scenario( function runtime (line 113) | def runtime(): function node_spec (line 125) | def node_spec(): function memory (line 137) | def memory(): function build_ctx (line 141) | def build_ctx( class TestNodeProtocolConformance (line 170) | class TestNodeProtocolConformance: method test_subclasses_node_protocol (line 171) | def test_subclasses_node_protocol(self): method test_has_execute_method (line 175) | def test_has_execute_method(self): method test_has_validate_input (line 180) | def test_has_validate_input(self): class TestBasicLoop (line 190) | class TestBasicLoop: method test_basic_text_only_implicit_accept (line 192) | async def test_basic_text_only_implicit_accept(self, runtime, node_spe... method test_no_llm_returns_failure (line 206) | async def test_no_llm_returns_failure(self, runtime, node_spec, memory): method test_max_iterations_failure (line 217) | async def test_max_iterations_failure(self, runtime, node_spec, memory): class TestJudgeIntegration (line 236) | class TestJudgeIntegration: method test_judge_accept (line 238) | async def test_judge_accept(self, runtime, node_spec, memory): method test_judge_escalate (line 254) | async def test_judge_escalate(self, runtime, node_spec, memory): method test_judge_retry_then_accept (line 273) | async def test_judge_retry_then_accept(self, runtime, node_spec, memory): class TestSetOutput (line 309) | class TestSetOutput: method test_set_output_accumulates (line 311) | async def test_set_output_accumulates(self, runtime, node_spec, memory): method test_set_output_rejects_invalid_key (line 330) | async def test_set_output_rejects_invalid_key(self, runtime, node_spec... method test_missing_keys_triggers_retry (line 352) | async def test_missing_keys_triggers_retry(self, runtime, node_spec, m... class TestStallDetection (line 381) | class TestStallDetection: method test_stall_detection (line 383) | async def test_stall_detection(self, runtime, node_spec, memory): class TestEventBusLifecycle (line 408) | class TestEventBusLifecycle: method test_lifecycle_events_published (line 410) | async def test_lifecycle_events_published(self, runtime, node_spec, me... method test_client_facing_uses_client_output_delta (line 437) | async def test_client_facing_uses_client_output_delta(self, runtime, m... class TestClientFacingBlocking (line 472) | class TestClientFacingBlocking: method client_spec (line 476) | def client_spec(self): method test_text_only_no_blocking (line 488) | async def test_text_only_no_blocking(self, runtime, memory, client_spec): method test_ask_user_triggers_blocking (line 506) | async def test_ask_user_triggers_blocking(self, runtime, memory, clien... method test_client_facing_does_not_block_on_tools (line 541) | async def test_client_facing_does_not_block_on_tools(self, runtime, me... method test_non_client_facing_unchanged (line 570) | async def test_non_client_facing_unchanged(self, runtime, memory): method test_signal_shutdown_unblocks (line 588) | async def test_signal_shutdown_unblocks(self, runtime, memory, client_... method test_client_input_requested_event_published (line 614) | async def test_client_input_requested_event_published(self, runtime, m... method test_ask_user_with_real_tools (line 652) | async def test_ask_user_with_real_tools(self, runtime, memory): method test_ask_user_not_available_non_client_facing (line 701) | async def test_ask_user_not_available_non_client_facing(self, runtime,... method test_escalate_available_for_worker_stream (line 723) | async def test_escalate_available_for_worker_stream(self, runtime, mem... method test_escalate_not_available_for_queen_stream (line 743) | async def test_escalate_not_available_for_queen_stream(self, runtime, ... class TestEscalate (line 763) | class TestEscalate: method test_escalate_emits_event (line 765) | async def test_escalate_emits_event(self, runtime, node_spec, memory): method test_escalate_handoff_reaches_queen (line 813) | async def test_escalate_handoff_reaches_queen(self, runtime, node_spec... method test_escalate_waits_for_queen_input_and_skips_judge (line 862) | async def test_escalate_waits_for_queen_input_and_skips_judge(self, ru... class TestClientFacingExpectingWork (line 921) | class TestClientFacingExpectingWork: method test_text_after_user_input_goes_to_judge (line 925) | async def test_text_after_user_input_goes_to_judge(self, runtime, memo... method test_auto_block_without_missing_outputs (line 975) | async def test_auto_block_without_missing_outputs(self, runtime, memory): method test_tool_calls_reset_expecting_work (line 1023) | async def test_tool_calls_reset_expecting_work(self, runtime, memory): method test_judge_retry_enables_expecting_work (line 1095) | async def test_judge_retry_enables_expecting_work(self, runtime, memory): class TestToolExecution (line 1170) | class TestToolExecution: method test_tool_execution_feedback (line 1172) | async def test_tool_execution_feedback(self, runtime, node_spec, memory): class TestWriteThroughPersistence (line 1215) | class TestWriteThroughPersistence: method test_messages_written_to_store (line 1217) | async def test_messages_written_to_store(self, tmp_path, runtime, node... method test_output_accumulator_write_through (line 1237) | async def test_output_accumulator_write_through(self, tmp_path, runtim... class TestCrashRecovery (line 1268) | class TestCrashRecovery: method test_restore_from_checkpoint (line 1270) | async def test_restore_from_checkpoint(self, tmp_path, runtime, node_s... class TestEventInjection (line 1313) | class TestEventInjection: method test_inject_event (line 1315) | async def test_inject_event(self, runtime, node_spec, memory): class TestPauseResume (line 1362) | class TestPauseResume: method test_pause_returns_early (line 1364) | async def test_pause_returns_early(self, runtime, node_spec, memory): class TestStreamErrors (line 1390) | class TestStreamErrors: method test_non_recoverable_stream_error_raises (line 1392) | async def test_non_recoverable_stream_error_raises(self, runtime, node... class TestOutputAccumulator (line 1413) | class TestOutputAccumulator: method test_set_and_get (line 1415) | async def test_set_and_get(self): method test_to_dict (line 1422) | async def test_to_dict(self): method test_has_all_keys (line 1429) | async def test_has_all_keys(self): method test_write_through_to_real_store (line 1437) | async def test_write_through_to_real_store(self, tmp_path): method test_restore_from_real_store (line 1448) | async def test_restore_from_real_store(self, tmp_path): class ErrorThenSuccessLLM (line 1464) | class ErrorThenSuccessLLM(LLMProvider): method __init__ (line 1470) | def __init__(self, error: Exception, fail_count: int, success_scenario... method stream (line 1476) | async def stream(self, messages, system="", tools=None, max_tokens=4096): method complete (line 1484) | def complete(self, messages, system="", **kwargs) -> LLMResponse: class TestTransientErrorRetry (line 1488) | class TestTransientErrorRetry: method test_transient_error_retries_then_succeeds (line 1492) | async def test_transient_error_retries_then_succeeds(self, runtime, no... method test_permanent_error_no_retry (line 1513) | async def test_permanent_error_no_retry(self, runtime, node_spec, memo... method test_client_facing_non_transient_error_does_not_crash (line 1534) | async def test_client_facing_non_transient_error_does_not_crash( method test_transient_error_exhausts_retries (line 1562) | async def test_transient_error_exhausts_retries(self, runtime, node_sp... method test_stream_error_event_retried_as_runtime_error (line 1583) | async def test_stream_error_event_retried_as_runtime_error(self, runti... method test_retry_emits_event_bus_event (line 1631) | async def test_retry_emits_event_bus_event(self, runtime, node_spec, m... method test_recoverable_stream_error_retried_not_silent (line 1661) | async def test_recoverable_stream_error_retried_not_silent(self, runti... class TestIsTransientError (line 1717) | class TestIsTransientError: method test_timeout_error (line 1720) | def test_timeout_error(self): method test_connection_error (line 1723) | def test_connection_error(self): method test_os_error (line 1726) | def test_os_error(self): method test_value_error_not_transient (line 1729) | def test_value_error_not_transient(self): method test_type_error_not_transient (line 1732) | def test_type_error_not_transient(self): method test_runtime_error_with_transient_keywords (line 1735) | def test_runtime_error_with_transient_keywords(self): method test_runtime_error_without_transient_keywords (line 1742) | def test_runtime_error_without_transient_keywords(self): class TestFingerprintToolCalls (line 1752) | class TestFingerprintToolCalls: method test_basic_fingerprint (line 1755) | def test_basic_fingerprint(self): method test_order_sensitive (line 1765) | def test_order_sensitive(self): method test_sort_keys_deterministic (line 1778) | def test_sort_keys_deterministic(self): class TestIsToolDoomLoop (line 1786) | class TestIsToolDoomLoop: method test_below_threshold (line 1789) | def test_below_threshold(self): method test_at_threshold_identical (line 1795) | def test_at_threshold_identical(self): method test_different_args_no_doom (line 1802) | def test_different_args_no_doom(self): method test_disabled_via_config (line 1810) | def test_disabled_via_config(self): method test_empty_fingerprints_no_doom (line 1818) | def test_empty_fingerprints_no_doom(self): class ToolRepeatLLM (line 1824) | class ToolRepeatLLM(LLMProvider): method __init__ (line 1832) | def __init__( method stream (line 1845) | async def stream(self, messages, system="", tools=None, max_tokens=4096): method complete (line 1874) | def complete(self, messages, system="", **kwargs) -> LLMResponse: class TestToolDoomLoopIntegration (line 1882) | class TestToolDoomLoopIntegration: method test_doom_loop_injects_warning (line 1891) | async def test_doom_loop_injects_warning( method test_doom_loop_emits_event (line 1941) | async def test_doom_loop_emits_event( method test_client_facing_worker_doom_loop_escalates_to_queen (line 1999) | async def test_client_facing_worker_doom_loop_escalates_to_queen( method test_doom_loop_disabled (line 2065) | async def test_doom_loop_disabled( method test_different_args_no_doom_loop (line 2114) | async def test_different_args_no_doom_loop( method test_doom_loop_detects_repeated_failing_tool (line 2203) | async def test_doom_loop_detects_repeated_failing_tool( class TestExecutionId (line 2274) | class TestExecutionId: method test_node_context_accepts_execution_id (line 2277) | def test_node_context_accepts_execution_id(self, runtime, node_spec, m... method test_node_context_execution_id_defaults_to_empty (line 2288) | def test_node_context_execution_id_defaults_to_empty(self, runtime, no... method test_stream_runtime_adapter_exposes_execution_id (line 2294) | def test_stream_runtime_adapter_exposes_execution_id(self): method test_build_context_passes_execution_id_from_adapter (line 2302) | def test_build_context_passes_execution_id_from_adapter(self): method test_build_context_defaults_execution_id_for_plain_runtime (line 2320) | def test_build_context_defaults_execution_id_for_plain_runtime(self): class TestSubagentAccumulatorMemory (line 2344) | class TestSubagentAccumulatorMemory: method test_accumulator_values_merged_into_parent_data (line 2348) | def test_accumulator_values_merged_into_parent_data(self): method test_input_keys_allowed_even_if_not_in_data (line 2377) | def test_input_keys_allowed_even_if_not_in_data(self): FILE: core/tests/test_event_loop_wiring.py class AlwaysFailsNode (line 22) | class AlwaysFailsNode(NodeProtocol): method __init__ (line 25) | def __init__(self): method execute (line 28) | async def execute(self, ctx: NodeContext) -> NodeResult: class SucceedsOnceNode (line 33) | class SucceedsOnceNode(NodeProtocol): method execute (line 36) | async def execute(self, ctx: NodeContext) -> NodeResult: function fast_sleep (line 41) | def fast_sleep(monkeypatch): function runtime (line 47) | def runtime(): function test_client_facing_defaults_false (line 62) | def test_client_facing_defaults_false(): function test_client_facing_explicit_true (line 73) | def test_client_facing_explicit_true(): function test_event_loop_in_valid_node_types (line 88) | def test_event_loop_in_valid_node_types(): function test_event_loop_node_spec_accepted (line 93) | def test_event_loop_node_spec_accepted(): function test_unregistered_event_loop_auto_creates (line 107) | def test_unregistered_event_loop_auto_creates(runtime): function test_registered_event_loop_returns_impl (line 125) | def test_registered_event_loop_returns_impl(runtime): function test_event_loop_max_retries_forced_zero (line 145) | async def test_event_loop_max_retries_forced_zero(runtime): function test_event_loop_max_retries_zero_no_warning (line 180) | async def test_event_loop_max_retries_zero_no_warning(runtime, caplog): function test_event_loop_max_retries_positive_logs_warning (line 217) | async def test_event_loop_max_retries_positive_logs_warning(runtime, cap... FILE: core/tests/test_event_type_extension.py function dispatch_event (line 38) | def dispatch_event(event) -> str: function collect_text (line 56) | def collect_text(events: list) -> str: function extract_tool_calls (line 66) | def extract_tool_calls(events: list) -> list[dict[str, Any]]: class TestTypeDispatch (line 78) | class TestTypeDispatch: method test_dispatch_text_delta (line 81) | def test_dispatch_text_delta(self): method test_dispatch_text_end (line 85) | def test_dispatch_text_end(self): method test_dispatch_tool_call (line 89) | def test_dispatch_tool_call(self): method test_dispatch_tool_result (line 93) | def test_dispatch_tool_result(self): method test_dispatch_reasoning_start (line 97) | def test_dispatch_reasoning_start(self): method test_dispatch_reasoning_delta (line 101) | def test_dispatch_reasoning_delta(self): method test_dispatch_finish (line 105) | def test_dispatch_finish(self): method test_dispatch_error (line 109) | def test_dispatch_error(self): class TestInstanceFiltering (line 117) | class TestInstanceFiltering: method text_stream (line 121) | def text_stream(self) -> list: method tool_stream (line 132) | def tool_stream(self) -> list: method reasoning_stream (line 149) | def reasoning_stream(self) -> list: method test_collect_text (line 160) | def test_collect_text(self, text_stream): method test_collect_text_from_tool_stream (line 163) | def test_collect_text_from_tool_stream(self, tool_stream): method test_extract_tool_calls (line 166) | def test_extract_tool_calls(self, tool_stream): method test_extract_tool_calls_from_text_stream (line 172) | def test_extract_tool_calls_from_text_stream(self, text_stream): method test_filter_text_deltas (line 175) | def test_filter_text_deltas(self, text_stream): method test_filter_finish (line 179) | def test_filter_finish(self, text_stream): method test_reasoning_then_text (line 184) | def test_reasoning_then_text(self, reasoning_stream): method test_mixed_stream_type_counts (line 190) | def test_mixed_stream_type_counts(self, reasoning_stream): class CustomMetricsEvent (line 207) | class CustomMetricsEvent: class CustomCitationEvent (line 217) | class CustomCitationEvent: class TestCustomEventExtension (line 226) | class TestCustomEventExtension: method test_custom_event_construction (line 229) | def test_custom_event_construction(self): method test_custom_event_frozen (line 234) | def test_custom_event_frozen(self): method test_custom_event_serialization (line 239) | def test_custom_event_serialization(self): method test_custom_event_dispatch (line 249) | def test_custom_event_dispatch(self): method test_custom_event_in_mixed_stream (line 255) | def test_custom_event_in_mixed_stream(self): class TestSequenceSerialization (line 302) | class TestSequenceSerialization: method test_serialize_text_sequence (line 305) | def test_serialize_text_sequence(self): method test_serialize_tool_sequence (line 319) | def test_serialize_tool_sequence(self): method test_serialize_error_sequence (line 332) | def test_serialize_error_sequence(self): method test_roundtrip_snapshot_accumulation (line 342) | def test_roundtrip_snapshot_accumulation(self): class TestWP2EventTypeEnumMembers (line 403) | class TestWP2EventTypeEnumMembers: method test_new_member_value (line 411) | def test_new_member_value(self, member, expected_value): method test_all_12_new_members_exist (line 414) | def test_all_12_new_members_exist(self): method test_new_member_string_values_are_unique (line 417) | def test_new_member_string_values_are_unique(self): method test_no_collision_with_original_members (line 421) | def test_no_collision_with_original_members(self): method test_original_members_unchanged (line 432) | def test_original_members_unchanged(self, member, expected_value): method test_event_type_is_str_enum (line 435) | def test_event_type_is_str_enum(self): method test_event_type_accessible_by_name (line 441) | def test_event_type_accessible_by_name(self): method test_event_type_accessible_by_value (line 445) | def test_event_type_accessible_by_value(self): class TestWP2AgentEventNodeId (line 453) | class TestWP2AgentEventNodeId: method test_node_id_defaults_to_none (line 456) | def test_node_id_defaults_to_none(self): method test_node_id_can_be_set (line 463) | def test_node_id_can_be_set(self): method test_node_id_in_to_dict (line 471) | def test_node_id_in_to_dict(self): method test_node_id_none_in_to_dict (line 480) | def test_node_id_none_in_to_dict(self): class TestWP2SubscriptionFilterNode (line 490) | class TestWP2SubscriptionFilterNode: method _noop_handler (line 494) | async def _noop_handler(event: AgentEvent) -> None: method test_filter_node_defaults_to_none (line 497) | def test_filter_node_defaults_to_none(self): method test_filter_node_can_be_set (line 505) | def test_filter_node_can_be_set(self): class TestWP2NodeLevelRouting (line 518) | class TestWP2NodeLevelRouting: method bus (line 522) | def bus(self): method test_filter_node_receives_matching_events (line 526) | async def test_filter_node_receives_matching_events(self, bus): method test_filter_node_rejects_non_matching_events (line 553) | async def test_filter_node_rejects_non_matching_events(self, bus): method test_no_filter_node_receives_all_events (line 578) | async def test_no_filter_node_receives_all_events(self, bus): method test_interleaved_nodes_separated_by_filter (line 615) | async def test_interleaved_nodes_separated_by_filter(self, bus): method test_filter_node_combined_with_filter_stream (line 679) | async def test_filter_node_combined_with_filter_stream(self, bus): method test_wait_for_with_node_id (line 723) | async def test_wait_for_with_node_id(self, bus): method test_wait_for_ignores_wrong_node (line 750) | async def test_wait_for_ignores_wrong_node(self, bus): class TestWP2ConveniencePublishers (line 790) | class TestWP2ConveniencePublishers: method bus (line 794) | def bus(self): method test_emit_node_loop_started (line 798) | async def test_emit_node_loop_started(self, bus): method test_emit_node_loop_iteration (line 816) | async def test_emit_node_loop_iteration(self, bus): method test_emit_node_loop_completed (line 833) | async def test_emit_node_loop_completed(self, bus): method test_emit_llm_text_delta (line 850) | async def test_emit_llm_text_delta(self, bus): method test_emit_tool_call_started (line 869) | async def test_emit_tool_call_started(self, bus): method test_emit_tool_call_completed (line 889) | async def test_emit_tool_call_completed(self, bus): method test_emit_client_output_delta (line 909) | async def test_emit_client_output_delta(self, bus): method test_emit_node_stalled (line 927) | async def test_emit_node_stalled(self, bus): method test_convenience_publishers_set_node_id (line 944) | async def test_convenience_publishers_set_node_id(self, bus): FILE: core/tests/test_execution_quality.py class FlakyNode (line 17) | class FlakyNode(NodeProtocol): method __init__ (line 20) | def __init__(self, fail_count: int = 2): method execute (line 24) | async def execute(self, ctx: NodeContext) -> NodeResult: method validate_input (line 43) | def validate_input(self, ctx: NodeContext) -> list[str]: class AlwaysSucceedsNode (line 47) | class AlwaysSucceedsNode(NodeProtocol): method execute (line 50) | async def execute(self, ctx: NodeContext) -> NodeResult: method validate_input (line 61) | def validate_input(self, ctx: NodeContext) -> list[str]: class AlwaysFailsNode (line 65) | class AlwaysFailsNode(NodeProtocol): method execute (line 68) | async def execute(self, ctx: NodeContext) -> NodeResult: method validate_input (line 74) | def validate_input(self, ctx: NodeContext) -> list[str]: class TestExecutionQuality (line 79) | class TestExecutionQuality: method test_clean_success_no_retries (line 82) | async def test_clean_success_no_retries(self, tmp_path): method test_degraded_success_with_retries (line 135) | async def test_degraded_success_with_retries(self, tmp_path): method test_failed_execution_max_retries_exceeded (line 191) | async def test_failed_execution_max_retries_exceeded(self, tmp_path): method test_multi_node_partial_failures (line 247) | async def test_multi_node_partial_failures(self, tmp_path): method test_execution_result_properties (line 338) | async def test_execution_result_properties(self, tmp_path): FILE: core/tests/test_execution_stream.py class DummyLLMProvider (line 20) | class DummyLLMProvider(LLMProvider): method __init__ (line 26) | def __init__(self): method complete (line 29) | def complete( method stream (line 41) | async def stream( function test_execution_stream_retention (line 68) | async def test_execution_stream_retention(tmp_path): function test_shared_session_reuses_directory_and_memory (line 150) | async def test_shared_session_reuses_directory_and_memory(tmp_path): FILE: core/tests/test_executor_feedback_edges.py class SuccessNode (line 28) | class SuccessNode(NodeProtocol): method __init__ (line 31) | def __init__(self, output: dict | None = None): method execute (line 35) | async def execute(self, ctx: NodeContext) -> NodeResult: class StatefulNode (line 40) | class StatefulNode(NodeProtocol): method __init__ (line 43) | def __init__(self, outputs: list[dict]): method execute (line 47) | async def execute(self, ctx: NodeContext) -> NodeResult: function runtime (line 59) | def runtime(): function goal (line 73) | def goal(): function test_max_node_visits_default (line 82) | def test_max_node_visits_default(): function test_visit_limit_skips_node (line 96) | async def test_visit_limit_skips_node(runtime, goal): function test_visit_limit_allows_multiple (line 158) | async def test_visit_limit_allows_multiple(runtime, goal): function test_visit_limit_zero_unlimited (line 214) | async def test_visit_limit_zero_unlimited(runtime, goal): function test_conditional_feedback_edge (line 268) | async def test_conditional_feedback_edge(runtime, goal): function test_conditional_feedback_false (line 369) | async def test_conditional_feedback_false(runtime, goal): function test_visit_counts_in_result (line 457) | async def test_visit_counts_in_result(runtime, goal): function test_conditional_priority_prevents_fanout (line 503) | async def test_conditional_priority_prevents_fanout(runtime, goal): FILE: core/tests/test_executor_max_retries.py class FlakyTestNode (line 19) | class FlakyTestNode(NodeProtocol): method __init__ (line 22) | def __init__(self, fail_times: int = 2): method execute (line 26) | async def execute(self, ctx: NodeContext) -> NodeResult: class AlwaysFailsNode (line 39) | class AlwaysFailsNode(NodeProtocol): method __init__ (line 42) | def __init__(self): method execute (line 45) | async def execute(self, ctx: NodeContext) -> NodeResult: function fast_sleep (line 51) | def fast_sleep(monkeypatch): function runtime (line 57) | def runtime(): function test_executor_respects_custom_max_retries_high (line 70) | async def test_executor_respects_custom_max_retries_high(runtime): function test_executor_respects_custom_max_retries_low (line 114) | async def test_executor_respects_custom_max_retries_low(runtime): function test_executor_respects_default_max_retries (line 159) | async def test_executor_respects_default_max_retries(runtime): function test_executor_max_retries_two_succeeds_on_second (line 202) | async def test_executor_max_retries_two_succeeds_on_second(runtime): function test_executor_different_nodes_different_max_retries (line 246) | async def test_executor_different_nodes_different_max_retries(runtime): FILE: core/tests/test_fanout.py class SuccessNode (line 29) | class SuccessNode(NodeProtocol): method __init__ (line 32) | def __init__(self, output: dict | None = None): method execute (line 36) | async def execute(self, ctx: NodeContext) -> NodeResult: class FailNode (line 41) | class FailNode(NodeProtocol): method __init__ (line 44) | def __init__(self): method execute (line 47) | async def execute(self, ctx: NodeContext) -> NodeResult: class FlakyNode (line 52) | class FlakyNode(NodeProtocol): method __init__ (line 55) | def __init__(self, fail_times: int = 1, output: dict | None = None): method execute (line 60) | async def execute(self, ctx: NodeContext) -> NodeResult: class TimingNode (line 67) | class TimingNode(NodeProtocol): method __init__ (line 70) | def __init__(self, label: str, order_tracker: list): method execute (line 74) | async def execute(self, ctx: NodeContext) -> NodeResult: class SlowNode (line 81) | class SlowNode(NodeProtocol): method __init__ (line 84) | def __init__(self, delay: float = 10.0): method execute (line 88) | async def execute(self, ctx: NodeContext) -> NodeResult: function runtime (line 98) | def runtime(): function goal (line 110) | def goal(): function _make_fanout_graph (line 114) | def _make_fanout_graph( function test_fanout_triggers_on_multiple_success_edges (line 178) | async def test_fanout_triggers_on_multiple_success_edges(runtime, goal): function test_branches_execute_concurrently (line 208) | async def test_branches_execute_concurrently(runtime, goal): function test_convergence_at_fan_in_node (line 237) | async def test_convergence_at_fan_in_node(runtime, goal): function test_fail_all_strategy_raises_on_branch_failure (line 273) | async def test_fail_all_strategy_raises_on_branch_failure(runtime, goal): function test_continue_others_strategy_allows_partial_success (line 308) | async def test_continue_others_strategy_allows_partial_success(runtime, ... function test_wait_all_strategy_collects_all_results (line 343) | async def test_wait_all_strategy_collects_all_results(runtime, goal): function test_per_branch_retry (line 380) | async def test_per_branch_retry(runtime, goal): function test_single_edge_no_parallel_overhead (line 412) | async def test_single_edge_no_parallel_overhead(runtime, goal): function test_detect_fan_out_nodes (line 451) | def test_detect_fan_out_nodes(): function test_detect_fan_in_nodes (line 466) | def test_detect_fan_in_nodes(): function test_parallel_disabled_uses_sequential (line 485) | async def test_parallel_disabled_uses_sequential(runtime, goal): function test_branch_timeout_cancels_slow_branch (line 515) | async def test_branch_timeout_cancels_slow_branch(runtime, goal): function test_branch_timeout_with_continue_others (line 545) | async def test_branch_timeout_with_continue_others(runtime, goal): function test_branch_timeout_with_fail_all (line 577) | async def test_branch_timeout_with_fail_all(runtime, goal): function test_memory_conflict_last_wins (line 605) | async def test_memory_conflict_last_wins(runtime, goal): function test_memory_conflict_first_wins (line 639) | async def test_memory_conflict_first_wins(runtime, goal): function test_memory_conflict_error_raises (line 667) | async def test_memory_conflict_error_raises(runtime, goal): FILE: core/tests/test_find_json_hardened.py function _make_json (line 34) | def _make_json(size_bytes: int) -> str: function _make_nested_json (line 41) | def _make_nested_json(depth: int) -> str: class TestBasicCorrectness (line 54) | class TestBasicCorrectness: method test_simple_json_only (line 57) | def test_simple_json_only(self): method test_json_with_surrounding_text (line 60) | def test_json_with_surrounding_text(self): method test_json_in_markdown_fence (line 65) | def test_json_in_markdown_fence(self): method test_multiple_json_first_wins (line 70) | def test_multiple_json_first_wins(self): method test_missing_closing_brace (line 75) | def test_missing_closing_brace(self): method test_trailing_comma_returns_balanced_candidate (line 78) | def test_trailing_comma_returns_balanced_candidate(self): method test_truncated_payload (line 84) | def test_truncated_payload(self): method test_empty_string (line 88) | def test_empty_string(self): method test_whitespace_only (line 91) | def test_whitespace_only(self): method test_no_braces (line 94) | def test_no_braces(self): method test_braces_inside_string_value (line 97) | def test_braces_inside_string_value(self): method test_escaped_quotes (line 102) | def test_escaped_quotes(self): method test_escaped_backslash_at_end_of_value (line 107) | def test_escaped_backslash_at_end_of_value(self): method test_nested_arrays (line 112) | def test_nested_arrays(self): method test_unicode_emoji (line 117) | def test_unicode_emoji(self): method test_boolean_and_null (line 122) | def test_boolean_and_null(self): method test_numeric_values (line 127) | def test_numeric_values(self): method test_empty_object (line 134) | def test_empty_object(self): method test_deeply_nested_objects (line 137) | def test_deeply_nested_objects(self): class TestLargeOutputRegression (line 148) | class TestLargeOutputRegression: method test_100kb_json_correctness_and_perf (line 151) | def test_100kb_json_correctness_and_perf(self): method test_1mb_json_correctness_and_perf (line 161) | def test_1mb_json_correctness_and_perf(self): method test_2mb_json_exceeds_old_threshold (line 171) | def test_2mb_json_exceeds_old_threshold(self): method test_1mb_no_json_early_exit (line 183) | def test_1mb_no_json_early_exit(self): method test_json_at_end_of_1mb_text (line 192) | def test_json_at_end_of_1mb_text(self): method test_100kb_template_braces_performance (line 204) | def test_100kb_template_braces_performance(self): method test_deeply_nested_valid_json_500_levels (line 218) | def test_deeply_nested_valid_json_500_levels(self): method test_deep_nesting_does_not_hang (line 233) | def test_deep_nesting_does_not_hang(self): class TestAdversarial (line 259) | class TestAdversarial: method test_only_opening_braces (line 262) | def test_only_opening_braces(self): method test_only_closing_braces (line 265) | def test_only_closing_braces(self): method test_alternating_open_close (line 268) | def test_alternating_open_close(self): method test_mismatched_brackets (line 273) | def test_mismatched_brackets(self): method test_mismatched_then_valid (line 276) | def test_mismatched_then_valid(self): method test_invalid_json_then_valid (line 284) | def test_invalid_json_then_valid(self): method test_jinja_template_braces (line 292) | def test_jinja_template_braces(self): method test_cjk_content (line 301) | def test_cjk_content(self): method test_enormous_string_value (line 306) | def test_enormous_string_value(self): method test_null_byte_in_text (line 312) | def test_null_byte_in_text(self): method test_negative_depth_then_valid (line 318) | def test_negative_depth_then_valid(self): method test_json_array_ignored (line 325) | def test_json_array_ignored(self): method test_parametrized_edge_cases (line 358) | def test_parametrized_edge_cases(self, input_text, expected): class TestBehaviourParity (line 371) | class TestBehaviourParity: method test_returns_string_not_dict (line 374) | def test_returns_string_not_dict(self): method test_returns_none_not_raises (line 379) | def test_returns_none_not_raises(self): method test_first_valid_object_wins (line 385) | def test_first_valid_object_wins(self): method test_string_containing_json_not_parsed (line 391) | def test_string_containing_json_not_parsed(self): FILE: core/tests/test_flowchart_utils.py function _make_node (line 17) | def _make_node( function _make_edge (line 42) | def _make_edge(source, target, condition="on_success", description=""): function _make_goal (line 52) | def _make_goal( function _make_graph (line 64) | def _make_graph(nodes, edges, entry_node=None, terminal_nodes=None): class TestClassifyFlowchartNode (line 74) | class TestClassifyFlowchartNode: method test_first_node_is_start (line 77) | def test_first_node_is_start(self): method test_terminal_node (line 82) | def test_terminal_node(self): method test_gcu_node_is_browser (line 88) | def test_gcu_node_is_browser(self): method test_subprocess_node (line 94) | def test_subprocess_node(self): method test_default_is_process (line 100) | def test_default_is_process(self): method test_explicit_override (line 106) | def test_explicit_override(self): method test_decision_node_with_branching (line 112) | def test_decision_node_with_branching(self): class TestSynthesizeDraftFromRuntime (line 123) | class TestSynthesizeDraftFromRuntime: method test_basic_linear_graph (line 126) | def test_basic_linear_graph(self): method test_graph_with_sub_agents (line 167) | def test_graph_with_sub_agents(self): class TestFlowchartFilePersistence (line 183) | class TestFlowchartFilePersistence: method test_save_and_load (line 186) | def test_save_and_load(self, tmp_path): method test_load_missing_file (line 196) | def test_load_missing_file(self, tmp_path): method test_load_none_path (line 201) | def test_load_none_path(self): method test_save_none_path (line 206) | def test_save_none_path(self): class TestGenerateFallbackFlowchart (line 211) | class TestGenerateFallbackFlowchart: method test_generates_file_when_missing (line 214) | def test_generates_file_when_missing(self, tmp_path): method test_skips_when_file_exists (line 236) | def test_skips_when_file_exists(self, tmp_path): method test_handles_errors_gracefully (line 251) | def test_handles_errors_gracefully(self, tmp_path): method test_enriches_with_goal_metadata (line 262) | def test_enriches_with_goal_metadata(self, tmp_path): FILE: core/tests/test_graph_executor.py class DummyRuntime (line 19) | class DummyRuntime: method start_run (line 22) | def start_run(self, **kwargs): method end_run (line 25) | def end_run(self, **kwargs): method report_problem (line 28) | def report_problem(self, **kwargs): class DummyMemory (line 32) | class DummyMemory: method __init__ (line 33) | def __init__(self, data): method read_all (line 36) | def read_all(self): class SuccessNode (line 41) | class SuccessNode: method validate_input (line 42) | def validate_input(self, ctx): method execute (line 45) | async def execute(self, ctx): function test_executor_single_node_success (line 55) | async def test_executor_single_node_success(): class FailingNode (line 96) | class FailingNode: method validate_input (line 97) | def validate_input(self, ctx): method execute (line 100) | async def execute(self, ctx): function test_executor_single_node_failure (line 111) | async def test_executor_single_node_failure(): class FakeEventBus (line 152) | class FakeEventBus: method __init__ (line 153) | def __init__(self): method emit_node_loop_started (line 156) | async def emit_node_loop_started(self, **kwargs): method emit_node_loop_completed (line 159) | async def emit_node_loop_completed(self, **kwargs): method emit_edge_traversed (line 162) | async def emit_edge_traversed(self, **kwargs): method emit_execution_paused (line 165) | async def emit_execution_paused(self, **kwargs): method emit_execution_resumed (line 168) | async def emit_execution_resumed(self, **kwargs): method emit_node_retry (line 171) | async def emit_node_retry(self, **kwargs): class FakeEventLoopNode (line 178) | class FakeEventLoopNode: method validate_input (line 179) | def validate_input(self, ctx): method execute (line 182) | async def execute(self, ctx): function test_executor_skips_events_for_event_loop_nodes (line 187) | async def test_executor_skips_events_for_event_loop_nodes(): function test_executor_no_events_without_event_bus (line 227) | async def test_executor_no_events_without_event_bus(): function test_write_progress_uses_atomic_write_and_updates_state (line 262) | def test_write_progress_uses_atomic_write_and_updates_state(tmp_path, mo... function test_write_progress_logs_warning_on_atomic_write_failure (line 296) | def test_write_progress_logs_warning_on_atomic_write_failure(tmp_path, m... FILE: core/tests/test_hallucination_detection.py class TestSharedMemoryHallucinationDetection (line 14) | class TestSharedMemoryHallucinationDetection: method test_detects_code_at_start (line 17) | def test_detects_code_at_start(self): method test_detects_code_in_middle (line 27) | def test_detects_code_in_middle(self): method test_detects_code_at_end (line 41) | def test_detects_code_at_end(self): method test_detects_javascript_code (line 53) | def test_detects_javascript_code(self): method test_detects_sql_injection (line 66) | def test_detects_sql_injection(self): method test_detects_script_injection (line 79) | def test_detects_script_injection(self): method test_allows_short_strings_without_validation (line 92) | def test_allows_short_strings_without_validation(self): method test_allows_long_strings_without_code (line 101) | def test_allows_long_strings_without_code(self): method test_validate_false_bypasses_check (line 109) | def test_validate_false_bypasses_check(self): method test_sampling_for_very_long_strings (line 118) | def test_sampling_for_very_long_strings(self): class TestOutputValidatorHallucinationDetection (line 134) | class TestOutputValidatorHallucinationDetection: method test_detects_code_anywhere_in_output (line 137) | def test_detects_code_anywhere_in_output(self): method test_contains_code_indicators_full_check (line 149) | def test_contains_code_indicators_full_check(self): method test_contains_code_indicators_sampling (line 160) | def test_contains_code_indicators_sampling(self): method test_no_false_positive_for_clean_text (line 171) | def test_no_false_positive_for_clean_text(self): method test_detects_multiple_languages (line 180) | def test_detects_multiple_languages(self): class TestEdgeCases (line 197) | class TestEdgeCases: method test_empty_string (line 200) | def test_empty_string(self): method test_non_string_values (line 206) | def test_non_string_values(self): method test_exactly_5000_chars (line 219) | def test_exactly_5000_chars(self): method test_5001_chars_triggers_validation (line 228) | def test_5001_chars_triggers_validation(self): FILE: core/tests/test_litellm_provider.py class TestLiteLLMProviderInit (line 30) | class TestLiteLLMProviderInit: method test_init_with_defaults (line 33) | def test_init_with_defaults(self): method test_init_with_custom_model (line 41) | def test_init_with_custom_model(self): method test_init_deepseek_model (line 47) | def test_init_deepseek_model(self): method test_init_with_api_key (line 53) | def test_init_with_api_key(self): method test_init_with_api_base (line 58) | def test_init_with_api_base(self): method test_init_minimax_defaults_api_base (line 65) | def test_init_minimax_defaults_api_base(self): method test_init_minimax_keeps_custom_api_base (line 70) | def test_init_minimax_keeps_custom_api_base(self): method test_init_openrouter_defaults_api_base (line 79) | def test_init_openrouter_defaults_api_base(self): method test_init_openrouter_keeps_custom_api_base (line 84) | def test_init_openrouter_keeps_custom_api_base(self): method test_init_ollama_no_key_needed (line 93) | def test_init_ollama_no_key_needed(self): class TestLiteLLMProviderComplete (line 101) | class TestLiteLLMProviderComplete: method test_complete_basic (line 105) | def test_complete_basic(self, mock_completion): method test_complete_with_system_prompt (line 133) | def test_complete_with_system_prompt(self, mock_completion): method test_complete_with_tools (line 155) | def test_complete_with_tools(self, mock_completion): class TestToolConversion (line 189) | class TestToolConversion: method test_tool_to_openai_format (line 192) | def test_tool_to_openai_format(self): method test_parse_tool_call_arguments_repairs_truncated_json (line 213) | def test_parse_tool_call_arguments_repairs_truncated_json(self): method test_parse_tool_call_arguments_raises_when_unrepairable (line 234) | def test_parse_tool_call_arguments_raises_when_unrepairable(self): class TestAnthropicProviderBackwardCompatibility (line 242) | class TestAnthropicProviderBackwardCompatibility: method test_anthropic_provider_is_llm_provider (line 245) | def test_anthropic_provider_is_llm_provider(self): method test_anthropic_provider_init_defaults (line 250) | def test_anthropic_provider_init_defaults(self): method test_anthropic_provider_init_custom_model (line 256) | def test_anthropic_provider_init_custom_model(self): method test_anthropic_provider_uses_litellm_internally (line 261) | def test_anthropic_provider_uses_litellm_internally(self): method test_anthropic_provider_complete (line 269) | def test_anthropic_provider_complete(self, mock_completion): method test_anthropic_provider_passes_response_format (line 298) | def test_anthropic_provider_passes_response_format(self, mock_completi... class TestJsonMode (line 320) | class TestJsonMode: method test_json_mode_adds_instruction_to_system_prompt (line 324) | def test_json_mode_adds_instruction_to_system_prompt(self, mock_comple... method test_json_mode_creates_system_prompt_if_none (line 352) | def test_json_mode_creates_system_prompt_if_none(self, mock_completion): method test_json_mode_false_no_instruction (line 373) | def test_json_mode_false_no_instruction(self, mock_completion): method test_json_mode_default_is_false (line 398) | def test_json_mode_default_is_false(self, mock_completion): method test_anthropic_provider_passes_json_mode (line 421) | def test_anthropic_provider_passes_json_mode(self, mock_completion): class TestComputeRetryDelay (line 448) | class TestComputeRetryDelay: method test_fallback_exponential_backoff (line 451) | def test_fallback_exponential_backoff(self): method test_max_delay_cap (line 458) | def test_max_delay_cap(self): method test_custom_max_delay (line 463) | def test_custom_max_delay(self): method test_retry_after_ms_header (line 467) | def test_retry_after_ms_header(self): method test_retry_after_ms_fractional (line 472) | def test_retry_after_ms_fractional(self): method test_retry_after_seconds_header (line 477) | def test_retry_after_seconds_header(self): method test_retry_after_seconds_fractional (line 482) | def test_retry_after_seconds_fractional(self): method test_retry_after_ms_takes_priority (line 487) | def test_retry_after_ms_takes_priority(self): method test_retry_after_http_date (line 497) | def test_retry_after_http_date(self): method test_exception_without_response (line 507) | def test_exception_without_response(self): method test_exception_without_response_attr (line 513) | def test_exception_without_response_attr(self): method test_negative_retry_after_clamped_to_zero (line 518) | def test_negative_retry_after_clamped_to_zero(self): method test_negative_retry_after_ms_clamped_to_zero (line 523) | def test_negative_retry_after_ms_clamped_to_zero(self): method test_invalid_retry_after_falls_back (line 528) | def test_invalid_retry_after_falls_back(self): method test_invalid_retry_after_ms_falls_back_to_retry_after (line 533) | def test_invalid_retry_after_ms_falls_back_to_retry_after(self): method test_retry_after_capped_at_max_delay (line 543) | def test_retry_after_capped_at_max_delay(self): method test_retry_after_ms_capped_at_max_delay (line 548) | def test_retry_after_ms_capped_at_max_delay(self): function _make_exception_with_headers (line 554) | def _make_exception_with_headers(headers: dict[str, str]) -> BaseException: class TestAsyncComplete (line 568) | class TestAsyncComplete: method test_acomplete_uses_acompletion (line 573) | async def test_acomplete_uses_acompletion(self, mock_acompletion): method test_acomplete_does_not_block_event_loop (line 604) | async def test_acomplete_does_not_block_event_loop(self, mock_acomplet... method test_mock_provider_acomplete (line 647) | async def test_mock_provider_acomplete(self): method test_base_provider_acomplete_offloads_to_executor (line 661) | async def test_base_provider_acomplete_offloads_to_executor(self): class TestMiniMaxStreamFallback (line 694) | class TestMiniMaxStreamFallback: method test_stream_uses_nonstream_fallback_for_minimax (line 698) | async def test_stream_uses_nonstream_fallback_for_minimax(self): method test_is_minimax_model_variants (line 724) | def test_is_minimax_model_variants(self): class TestOpenRouterToolCompatFallback (line 731) | class TestOpenRouterToolCompatFallback: method teardown_method (line 734) | def teardown_method(self): method test_stream_falls_back_to_json_tool_emulation (line 739) | async def test_stream_falls_back_to_json_tool_emulation(self, mock_aco... method test_stream_tool_compat_parses_textual_tool_calls_and_uses_cache (line 822) | async def test_stream_tool_compat_parses_textual_tool_calls_and_uses_c... method test_stream_tool_compat_parses_plain_text_tool_call_lines (line 910) | async def test_stream_tool_compat_parses_plain_text_tool_call_lines( method test_stream_tool_compat_treats_non_json_as_plain_text (line 987) | async def test_stream_tool_compat_treats_non_json_as_plain_text(self, ... class TestIsLocalModel (line 1045) | class TestIsLocalModel: method test_local_models_return_true (line 1061) | def test_local_models_return_true(self, model): method test_cloud_models_return_false (line 1082) | def test_cloud_models_return_false(self, model): FILE: core/tests/test_litellm_streaming.py function _serialize_event (line 37) | def _serialize_event(index: int, event: StreamEvent) -> dict: function _dump_events (line 45) | def _dump_events(events: list[StreamEvent], filename: str) -> Path: function _collect_stream (line 55) | async def _collect_stream(provider: LiteLLMProvider, **kwargs) -> list[S... function _has_api_key (line 128) | def _has_api_key(env_var: str) -> bool: class TestRealAPITextStreaming (line 147) | class TestRealAPITextStreaming: method test_text_stream (line 152) | async def test_text_stream(self, model: str, prefix: str, env_var: str): class TestRealAPIToolCallStreaming (line 209) | class TestRealAPIToolCallStreaming: method test_tool_call_stream (line 214) | async def test_tool_call_stream(self, model: str, prefix: str, env_var... method test_multi_tool_call_stream (line 255) | async def test_multi_tool_call_stream(self, model: str, prefix: str, e... function _run_all (line 314) | async def _run_all(): FILE: core/tests/test_llm_judge.py class MockLLMProvider (line 23) | class MockLLMProvider(LLMProvider): method __init__ (line 26) | def __init__(self, response_content: str = '{"passes": true, "explanat... method complete (line 30) | def complete( class TestLLMJudgeWithProvider (line 61) | class TestLLMJudgeWithProvider: method test_init_with_provider (line 64) | def test_init_with_provider(self): method test_evaluate_uses_provider (line 72) | def test_evaluate_uses_provider(self): method test_evaluate_passes_correct_arguments (line 90) | def test_evaluate_passes_correct_arguments(self): method test_evaluate_failing_result (line 116) | def test_evaluate_failing_result(self): class TestLLMJudgeResponseParsing (line 134) | class TestLLMJudgeResponseParsing: method test_parse_plain_json (line 137) | def test_parse_plain_json(self): method test_parse_json_in_markdown_code_block (line 149) | def test_parse_json_in_markdown_code_block(self): method test_parse_json_in_plain_code_block (line 163) | def test_parse_json_in_plain_code_block(self): method test_parse_response_with_whitespace (line 177) | def test_parse_response_with_whitespace(self): method test_default_explanation_when_missing (line 190) | def test_default_explanation_when_missing(self): method test_passes_coerced_to_bool (line 202) | def test_passes_coerced_to_bool(self): method test_passes_false_when_missing (line 214) | def test_passes_false_when_missing(self): class TestLLMJudgeErrorHandling (line 226) | class TestLLMJudgeErrorHandling: method test_invalid_json_response (line 229) | def test_invalid_json_response(self): method test_provider_raises_exception (line 241) | def test_provider_raises_exception(self): class TestLLMJudgeBackwardCompatibility (line 263) | class TestLLMJudgeBackwardCompatibility: method test_init_without_provider (line 266) | def test_init_without_provider(self): method test_evaluate_without_provider_uses_anthropic (line 273) | def test_evaluate_without_provider_uses_anthropic(self): method test_anthropic_client_lazy_loaded (line 298) | def test_anthropic_client_lazy_loaded(self): method test_anthropic_import_error_handling (line 307) | def test_anthropic_import_error_handling(self): method test_anthropic_client_uses_correct_model (line 318) | def test_anthropic_client_uses_correct_model(self): method test_openai_fallback_uses_litellm_provider (line 341) | def test_openai_fallback_uses_litellm_provider(self, monkeypatch): class TestLLMJudgeIntegrationPatterns (line 410) | class TestLLMJudgeIntegrationPatterns: method test_with_anthropic_provider (line 413) | def test_with_anthropic_provider(self): method test_with_multiple_evaluations (line 432) | def test_with_multiple_evaluations(self): method test_provider_reuse_across_judges (line 449) | def test_provider_reuse_across_judges(self): FILE: core/tests/test_mcp_client.py class _FakeResponse (line 12) | class _FakeResponse: method __init__ (line 13) | def __init__(self, payload=None): method raise_for_status (line 16) | def raise_for_status(self) -> None: method json (line 19) | def json(self): class _FakeHttpClient (line 23) | class _FakeHttpClient: method __init__ (line 24) | def __init__(self, **kwargs): method get (line 29) | def get(self, path: str) -> _FakeResponse: method close (line 33) | def close(self) -> None: function test_connect_unix_transport_uses_socket_path (line 37) | def test_connect_unix_transport_uses_socket_path(monkeypatch): function test_connect_sse_and_list_tools (line 74) | def test_connect_sse_and_list_tools(monkeypatch): function test_call_tool_retries_once_on_connect_error_for_unix (line 150) | def test_call_tool_retries_once_on_connect_error_for_unix(monkeypatch): function test_call_tool_retry_exhausted_raises_original_error_for_unix (line 177) | def test_call_tool_retry_exhausted_raises_original_error_for_unix(monkey... function test_call_tool_http_preserves_runtime_error_wrapping (line 206) | def test_call_tool_http_preserves_runtime_error_wrapping(monkeypatch): FILE: core/tests/test_mcp_connection_manager.py class FakeMCPClient (line 12) | class FakeMCPClient: method __init__ (line 17) | def __init__(self, config: MCPServerConfig): method connect (line 26) | def connect(self) -> None: method disconnect (line 30) | def disconnect(self) -> None: method list_tools (line 34) | def list_tools(self) -> list[MCPTool]: function manager (line 42) | def manager(monkeypatch): function test_acquire_returns_same_client_for_same_server_name (line 53) | def test_acquire_returns_same_client_for_same_server_name(manager): function test_release_with_refcount_above_one_keeps_connection_open (line 64) | def test_release_with_refcount_above_one_keeps_connection_open(manager): function test_release_last_reference_disconnects_and_removes_from_pool (line 76) | def test_release_last_reference_disconnects_and_removes_from_pool(manager): function test_concurrent_acquire_and_release_keeps_state_consistent (line 87) | def test_concurrent_acquire_and_release_keeps_state_consistent(manager): function test_cleanup_all_disconnects_every_pooled_client (line 119) | def test_cleanup_all_disconnects_every_pooled_client(manager): function test_reconnect_replaces_client_even_with_existing_refcount (line 132) | def test_reconnect_replaces_client_even_with_existing_refcount(manager): function test_health_check_returns_false_when_server_is_unreachable (line 145) | def test_health_check_returns_false_when_server_is_unreachable(manager, ... function test_health_check_for_stdio_returns_false_on_tools_list_error (line 167) | def test_health_check_for_stdio_returns_false_on_tools_list_error(manager): FILE: core/tests/test_mcp_server.py function _mcp_available (line 8) | def _mcp_available() -> bool: class TestMCPDependencies (line 23) | class TestMCPDependencies: method test_mcp_package_available (line 26) | def test_mcp_package_available(self): method test_fastmcp_available (line 35) | def test_fastmcp_available(self): FILE: core/tests/test_node_conversation.py class MockConversationStore (line 18) | class MockConversationStore: method __init__ (line 21) | def __init__(self) -> None: method write_part (line 26) | async def write_part(self, seq: int, data: dict[str, Any]) -> None: method read_parts (line 29) | async def read_parts(self) -> list[dict[str, Any]]: method write_meta (line 32) | async def write_meta(self, data: dict[str, Any]) -> None: method read_meta (line 35) | async def read_meta(self) -> dict[str, Any] | None: method write_cursor (line 38) | async def write_cursor(self, data: dict[str, Any]) -> None: method read_cursor (line 41) | async def read_cursor(self) -> dict[str, Any] | None: method delete_parts_before (line 44) | async def delete_parts_before(self, seq: int) -> None: method close (line 47) | async def close(self) -> None: method destroy (line 50) | async def destroy(self) -> None: class TestMessage (line 68) | class TestMessage: method test_user_and_assistant_to_llm_dict (line 69) | def test_user_and_assistant_to_llm_dict(self): method test_assistant_to_llm_dict_with_tools (line 80) | def test_assistant_to_llm_dict_with_tools(self): method test_tool_to_llm_dict (line 86) | def test_tool_to_llm_dict(self): method test_tool_error_to_llm_dict (line 91) | def test_tool_error_to_llm_dict(self): method test_storage_roundtrip (line 97) | def test_storage_roundtrip(self): method test_storage_dict_edge_cases (line 105) | def test_storage_dict_edge_cases(self): class TestNodeConversation (line 123) | class TestNodeConversation: method test_multi_turn_build_and_export (line 125) | async def test_multi_turn_build_and_export(self): method test_system_prompt_excluded_from_messages (line 146) | async def test_system_prompt_excluded_from_messages(self): method test_turn_and_seq_counting (line 154) | async def test_turn_and_seq_counting(self): method test_token_estimation (line 167) | async def test_token_estimation(self): method test_update_token_count_overrides_estimate (line 173) | async def test_update_token_count_overrides_estimate(self): method test_compact_resets_token_count (line 183) | async def test_compact_resets_token_count(self): method test_clear_resets_token_count (line 195) | async def test_clear_resets_token_count(self): method test_usage_ratio (line 206) | async def test_usage_ratio(self): method test_usage_ratio_zero_budget (line 216) | async def test_usage_ratio_zero_budget(self): method test_needs_compaction_with_actual_tokens (line 223) | async def test_needs_compaction_with_actual_tokens(self): method test_needs_compaction (line 235) | async def test_needs_compaction(self): method test_compact_replaces_with_summary (line 241) | async def test_compact_replaces_with_summary(self): method test_compact_keep_recent_default (line 262) | async def test_compact_keep_recent_default(self): method test_compact_keep_recent_clamped (line 281) | async def test_compact_keep_recent_clamped(self): method test_compact_preserves_output_keys (line 294) | async def test_compact_preserves_output_keys(self): method test_compact_seq_arithmetic_with_keep_recent (line 312) | async def test_compact_seq_arithmetic_with_keep_recent(self): method test_clear (line 328) | async def test_clear(self): method test_export_summary (line 340) | async def test_export_summary(self): method test_export_summary_output_keys (line 355) | async def test_export_summary_output_keys(self): class TestExtractProtectedValues (line 374) | class TestExtractProtectedValues: method test_extract_colon_format (line 376) | async def test_extract_colon_format(self): method test_extract_json_format (line 382) | async def test_extract_json_format(self): method test_extract_equals_format (line 388) | async def test_extract_equals_format(self): method test_extract_most_recent_wins (line 394) | async def test_extract_most_recent_wins(self): method test_extract_embedded_json (line 401) | async def test_extract_embedded_json(self): method test_extract_no_match_cases (line 409) | async def test_extract_no_match_cases(self): class TestPersistence (line 429) | class TestPersistence: method test_write_through_each_add (line 431) | async def test_write_through_each_add(self): method test_meta_and_cursor_persistence (line 442) | async def test_meta_and_cursor_persistence(self): method test_restore_from_store (line 455) | async def test_restore_from_store(self): method test_restore_preserves_tool_messages (line 473) | async def test_restore_preserves_tool_messages(self): method test_compact_deletes_old_parts (line 487) | async def test_compact_deletes_old_parts(self): method test_compact_then_restore (line 500) | async def test_compact_then_restore(self): method test_clear_deletes_store_parts (line 519) | async def test_clear_deletes_store_parts(self): class TestFileConversationStore (line 533) | class TestFileConversationStore: method test_meta_and_cursor_crud (line 535) | async def test_meta_and_cursor_crud(self, tmp_path): method test_write_and_read_parts_in_order (line 546) | async def test_write_and_read_parts_in_order(self, tmp_path): method test_delete_parts_before (line 555) | async def test_delete_parts_before(self, tmp_path): method test_idempotent_write_part (line 564) | async def test_idempotent_write_part(self, tmp_path): method test_integration_with_node_conversation (line 573) | async def test_integration_with_node_conversation(self, tmp_path): method test_corrupt_part_skipped_on_read (line 596) | async def test_corrupt_part_skipped_on_read(self, tmp_path): method test_directory_structure (line 611) | async def test_directory_structure(self, tmp_path): class TestConversationIntegration (line 631) | class TestConversationIntegration: method test_multi_turn_agent_conversation (line 639) | async def test_multi_turn_agent_conversation(self, tmp_path): method test_compaction_and_restore_preserves_continuity (line 730) | async def test_compaction_and_restore_preserves_continuity(self, tmp_p... method test_output_key_preservation_through_compact_and_restore (line 784) | async def test_output_key_preservation_through_compact_and_restore(sel... method test_tool_error_roundtrip (line 817) | async def test_tool_error_roundtrip(self, tmp_path): method test_concurrent_conversations_isolated (line 855) | async def test_concurrent_conversations_isolated(self, tmp_path): method test_destroy_removes_all_files (line 881) | async def test_destroy_removes_all_files(self, tmp_path): method test_restore_empty_store_returns_none (line 898) | async def test_restore_empty_store_returns_none(self, tmp_path): method test_clear_then_continue_then_restore (line 905) | async def test_clear_then_continue_then_restore(self, tmp_path): function _make_tool_call (line 941) | def _make_tool_call(call_id: str, name: str, args: dict) -> dict: function _build_tool_heavy_conversation (line 949) | async def _build_tool_heavy_conversation( class TestAggressiveStructuralCompaction (line 1017) | class TestAggressiveStructuralCompaction: method test_aggressive_collapses_tool_pairs (line 1019) | async def test_aggressive_collapses_tool_pairs(self, tmp_path): method test_aggressive_preserves_set_output (line 1048) | async def test_aggressive_preserves_set_output(self, tmp_path): method test_aggressive_preserves_errors (line 1071) | async def test_aggressive_preserves_errors(self, tmp_path): method test_standard_mode_keeps_all_tool_pairs (line 1120) | async def test_standard_mode_keeps_all_tool_pairs(self, tmp_path): method test_two_pass_sequence (line 1136) | async def test_two_pass_sequence(self, tmp_path): method test_aggressive_persists_correctly (line 1161) | async def test_aggressive_persists_correctly(self, tmp_path): class TestExtractToolCallHistory (line 1178) | class TestExtractToolCallHistory: method test_basic_extraction (line 1179) | def test_basic_extraction(self): method test_errors_included (line 1207) | def test_errors_included(self): method test_empty_messages (line 1221) | def test_empty_messages(self): class TestIsContextTooLargeError (line 1230) | class TestIsContextTooLargeError: method test_context_window_class_name (line 1231) | def test_context_window_class_name(self): method test_openai_context_length (line 1239) | def test_openai_context_length(self): method test_anthropic_too_long (line 1245) | def test_anthropic_too_long(self): method test_generic_exceeds_limit (line 1251) | def test_generic_exceeds_limit(self): method test_unrelated_error (line 1257) | def test_unrelated_error(self): class TestFormatMessagesForSummary (line 1269) | class TestFormatMessagesForSummary: method test_user_assistant_messages (line 1270) | def test_user_assistant_messages(self): method test_tool_result_truncated (line 1281) | def test_tool_result_truncated(self): method test_assistant_with_tool_calls (line 1293) | def test_assistant_with_tool_calls(self): class TestLlmCompact (line 1310) | class TestLlmCompact: method _make_node (line 1313) | def _make_node(self): method _make_ctx (line 1328) | def _make_ctx(self, llm_responses=None, llm_error=None): method test_single_call_success (line 1369) | async def test_single_call_success(self): method test_context_too_large_triggers_split (line 1381) | async def test_context_too_large_triggers_split(self): method test_non_context_error_propagates (line 1410) | async def test_non_context_error_propagates(self): method test_proactive_split_for_large_input (line 1422) | async def test_proactive_split_for_large_input(self): method test_tool_history_appended_at_top_level (line 1442) | async def test_tool_history_appended_at_top_level(self): class TestRepairOrphanedToolCalls (line 1462) | class TestRepairOrphanedToolCalls: method test_orphaned_tool_result_dropped (line 1465) | def test_orphaned_tool_result_dropped(self): method test_valid_tool_pair_preserved (line 1478) | def test_valid_tool_pair_preserved(self): method test_orphaned_tool_use_gets_stub (line 1493) | def test_orphaned_tool_use_gets_stub(self): method test_mixed_orphans (line 1512) | def test_mixed_orphans(self): FILE: core/tests/test_node_json_performance.py function generate_large_json (line 19) | def generate_large_json(size_bytes: int) -> str: function generate_large_text (line 25) | def generate_large_text(size_bytes: int) -> str: class TestJsonPerformance (line 30) | class TestJsonPerformance: method test_large_valid_json_performance (line 33) | def test_large_valid_json_performance(self): method test_large_non_json_performance (line 46) | def test_large_non_json_performance(self): method test_worst_case_performance (line 58) | def test_worst_case_performance(self): FILE: core/tests/test_on_failure_edges.py class AlwaysFailsNode (line 20) | class AlwaysFailsNode(NodeProtocol): method __init__ (line 23) | def __init__(self): method execute (line 26) | async def execute(self, ctx: NodeContext) -> NodeResult: class FailureHandlerNode (line 31) | class FailureHandlerNode(NodeProtocol): method __init__ (line 34) | def __init__(self): method execute (line 38) | async def execute(self, ctx: NodeContext) -> NodeResult: class SuccessNode (line 47) | class SuccessNode(NodeProtocol): method __init__ (line 50) | def __init__(self, output: dict | None = None): method execute (line 54) | async def execute(self, ctx: NodeContext) -> NodeResult: function fast_sleep (line 60) | def fast_sleep(monkeypatch): function runtime (line 66) | def runtime(): function goal (line 79) | def goal(): function test_on_failure_edge_followed_after_max_retries (line 88) | async def test_on_failure_edge_followed_after_max_retries(runtime, goal): function test_no_on_failure_edge_still_terminates (line 149) | async def test_no_on_failure_edge_still_terminates(runtime, goal): function test_on_failure_edge_not_followed_on_success (line 186) | async def test_on_failure_edge_not_followed_on_success(runtime, goal): function test_on_failure_edge_with_zero_retries (line 254) | async def test_on_failure_edge_with_zero_retries(runtime, goal): function test_on_failure_handler_appears_in_path (line 311) | async def test_on_failure_handler_appears_in_path(runtime, goal): FILE: core/tests/test_orchestrator.py function _patched (line 22) | def _patched(fn): class TestOrchestratorLLMInitialization (line 29) | class TestOrchestratorLLMInitialization: method test_auto_creates_litellm_provider_when_no_llm_passed (line 33) | def test_auto_creates_litellm_provider_when_no_llm_passed(self): method test_uses_custom_model_parameter (line 44) | def test_uses_custom_model_parameter(self): method test_supports_openai_model_names (line 52) | def test_supports_openai_model_names(self): method test_supports_anthropic_model_names (line 61) | def test_supports_anthropic_model_names(self): method test_skips_auto_creation_when_llm_passed (line 71) | def test_skips_auto_creation_when_llm_passed(self): method test_model_attribute_stored_correctly (line 82) | def test_model_attribute_stored_correctly(self): class TestOrchestratorLLMProviderType (line 90) | class TestOrchestratorLLMProviderType: method test_llm_is_litellm_provider_instance (line 93) | def test_llm_is_litellm_provider_instance(self): method test_llm_implements_llm_provider_interface (line 99) | def test_llm_implements_llm_provider_interface(self): FILE: core/tests/test_path_traversal_fix.py class TestPathTraversalProtection (line 15) | class TestPathTraversalProtection: method storage (line 19) | def storage(self): method test_valid_alphanumeric_key (line 26) | def test_valid_alphanumeric_key(self, storage): method test_valid_key_with_hyphens_underscores (line 33) | def test_valid_key_with_hyphens_underscores(self, storage): method test_blocks_parent_directory_traversal (line 41) | def test_blocks_parent_directory_traversal(self, storage): method test_blocks_leading_dot (line 53) | def test_blocks_leading_dot(self, storage): method test_blocks_absolute_paths_unix (line 62) | def test_blocks_absolute_paths_unix(self, storage): method test_blocks_absolute_paths_windows (line 71) | def test_blocks_absolute_paths_windows(self, storage): method test_blocks_path_separators (line 80) | def test_blocks_path_separators(self, storage): method test_blocks_null_bytes (line 91) | def test_blocks_null_bytes(self, storage): method test_blocks_dangerous_shell_chars (line 96) | def test_blocks_dangerous_shell_chars(self, storage): method test_blocks_empty_key (line 110) | def test_blocks_empty_key(self, storage): method test_get_runs_by_goal_blocks_traversal (line 120) | def test_get_runs_by_goal_blocks_traversal(self, storage): method test_get_runs_by_node_blocks_traversal (line 125) | def test_get_runs_by_node_blocks_traversal(self, storage): method test_get_runs_by_status_blocks_traversal (line 130) | def test_get_runs_by_status_blocks_traversal(self, storage): method test_valid_queries_still_work (line 135) | def test_valid_queries_still_work(self, storage): method test_blocks_env_file_escape (line 149) | def test_blocks_env_file_escape(self, storage): method test_blocks_config_file_escape (line 154) | def test_blocks_config_file_escape(self, storage): method test_blocks_web_shell_creation (line 159) | def test_blocks_web_shell_creation(self, storage): method test_blocks_cron_injection (line 164) | def test_blocks_cron_injection(self, storage): method test_blocks_sudoers_modification (line 169) | def test_blocks_sudoers_modification(self, storage): class TestPathTraversalWithActualFiles (line 175) | class TestPathTraversalWithActualFiles: method test_cannot_escape_storage_directory (line 178) | def test_cannot_escape_storage_directory(self): method test_cannot_write_outside_storage (line 198) | def test_cannot_write_outside_storage(self): FILE: core/tests/test_phase_compaction.py class TestPhaseMetadata (line 18) | class TestPhaseMetadata: method test_defaults (line 21) | def test_defaults(self): method test_set_phase (line 26) | def test_set_phase(self): method test_transition_marker (line 30) | def test_transition_marker(self): method test_storage_roundtrip (line 41) | def test_storage_roundtrip(self): method test_storage_roundtrip_no_phase (line 58) | def test_storage_roundtrip_no_phase(self): method test_to_llm_dict_no_metadata (line 69) | def test_to_llm_dict_no_metadata(self): class TestPhaseStamping (line 84) | class TestPhaseStamping: method test_messages_stamped_with_phase (line 88) | async def test_messages_stamped_with_phase(self): method test_phase_changes_stamp (line 99) | async def test_phase_changes_stamp(self): method test_no_phase_no_stamp (line 112) | async def test_no_phase_no_stamp(self): method test_transition_marker_flag (line 118) | async def test_transition_marker_flag(self): method test_tool_result_stamped (line 130) | async def test_tool_result_stamped(self): class TestPhaseAwareCompaction (line 138) | class TestPhaseAwareCompaction: method test_transition_marker_survives_compaction (line 142) | async def test_transition_marker_survives_compaction(self): method test_current_phase_protected (line 189) | async def test_current_phase_protected(self): method test_no_phase_metadata_works_normally (line 227) | async def test_no_phase_metadata_works_normally(self): method test_pruned_message_preserves_phase_metadata (line 254) | async def test_pruned_message_preserves_phase_metadata(self): FILE: core/tests/test_pydantic_validation.py class SimpleOutput (line 15) | class SimpleOutput(BaseModel): class ComplexOutput (line 22) | class ComplexOutput(BaseModel): class TicketAnalysis (line 31) | class TicketAnalysis(BaseModel): class TestNodeSpecOutputModel (line 40) | class TestNodeSpecOutputModel: method test_nodespec_accepts_output_model (line 43) | def test_nodespec_accepts_output_model(self): method test_nodespec_output_model_optional (line 56) | def test_nodespec_output_model_optional(self): method test_nodespec_custom_validation_retries (line 66) | def test_nodespec_custom_validation_retries(self): class TestOutputValidatorPydantic (line 79) | class TestOutputValidatorPydantic: method test_validate_valid_output (line 82) | def test_validate_valid_output(self): method test_validate_missing_required_field (line 95) | def test_validate_missing_required_field(self): method test_validate_wrong_type (line 107) | def test_validate_wrong_type(self): method test_validate_complex_model (line 118) | def test_validate_complex_model(self): method test_validate_field_constraints (line 136) | def test_validate_field_constraints(self): method test_validate_range_constraints (line 152) | def test_validate_range_constraints(self): method test_validate_realistic_model (line 168) | def test_validate_realistic_model(self): class TestValidationFeedback (line 187) | class TestValidationFeedback: method test_format_feedback_includes_errors (line 190) | def test_format_feedback_includes_errors(self): method test_format_feedback_includes_schema (line 202) | def test_format_feedback_includes_schema(self): class TestNodeResultValidationErrors (line 214) | class TestNodeResultValidationErrors: method test_noderesult_includes_validation_errors (line 217) | def test_noderesult_includes_validation_errors(self): method test_noderesult_empty_validation_errors_by_default (line 228) | def test_noderesult_empty_validation_errors_by_default(self): class TestPydanticValidationIntegration (line 236) | class TestPydanticValidationIntegration: method test_nodespec_serialization_with_output_model (line 239) | def test_nodespec_serialization_with_output_model(self): class TestJSONSchemaGeneration (line 256) | class TestJSONSchemaGeneration: method test_simple_model_schema_generation (line 259) | def test_simple_model_schema_generation(self): method test_complex_model_schema_generation (line 269) | def test_complex_model_schema_generation(self): method test_schema_includes_required_fields (line 281) | def test_schema_includes_required_fields(self): method test_schema_can_be_used_in_response_format (line 289) | def test_schema_can_be_used_in_response_format(self): class TestRetryWithFeedback (line 309) | class TestRetryWithFeedback: method test_validation_feedback_format (line 312) | def test_validation_feedback_format(self): method test_feedback_mentions_fix_instruction (line 327) | def test_feedback_mentions_fix_instruction(self): method test_max_validation_retries_default (line 336) | def test_max_validation_retries_default(self): method test_max_validation_retries_customizable (line 347) | def test_max_validation_retries_customizable(self): method test_zero_retries_allowed (line 359) | def test_zero_retries_allowed(self): method test_feedback_includes_all_error_types (line 371) | def test_feedback_includes_all_error_types(self): class TestPydanticValidationIntegrationExtended (line 394) | class TestPydanticValidationIntegrationExtended: method test_nodespec_with_all_validation_options (line 397) | def test_nodespec_with_all_validation_options(self): method test_validator_preserves_model_defaults (line 413) | def test_validator_preserves_model_defaults(self): method test_validation_result_error_property (line 430) | def test_validation_result_error_property(self): FILE: core/tests/test_run.py class TestRuntimeMetrics (line 11) | class TestRuntimeMetrics: method test_success_rate (line 14) | def test_success_rate(self): method test_success_rate_zero_decisions (line 22) | def test_success_rate_zero_decisions(self): class TestRun (line 31) | class TestRun: method test_duration_ms (line 34) | def test_duration_ms(self): method test_add_decision (line 43) | def test_add_decision(self): method test_record_outcome (line 64) | def test_record_outcome(self): method test_add_problem (line 97) | def test_add_problem(self): method test_complete (line 122) | def test_complete(self): class TestRunSummary (line 134) | class TestRunSummary: method test_from_run_basic (line 137) | def test_from_run_basic(self): method test_from_run_with_decisions (line 156) | def test_from_run_with_decisions(self): method test_from_run_with_problems (line 220) | def test_from_run_with_problems(self): FILE: core/tests/test_runner_api_key_env_var.py class _NoopRegistry (line 4) | class _NoopRegistry: method cleanup (line 5) | def cleanup(self) -> None: function _runner_for_unit_test (line 9) | def _runner_for_unit_test() -> AgentRunner: function test_minimax_provider_prefix_maps_to_minimax_api_key (line 16) | def test_minimax_provider_prefix_maps_to_minimax_api_key(): function test_minimax_model_name_prefix_maps_to_minimax_api_key (line 21) | def test_minimax_model_name_prefix_maps_to_minimax_api_key(): function test_openrouter_provider_prefix_maps_to_openrouter_api_key (line 26) | def test_openrouter_provider_prefix_maps_to_openrouter_api_key(): FILE: core/tests/test_runtime.py class TestRuntimeBasics (line 11) | class TestRuntimeBasics: method test_start_and_end_run (line 14) | def test_start_and_end_run(self, tmp_path: Path): method test_end_without_start_is_graceful (line 32) | def test_end_without_start_is_graceful(self, tmp_path: Path): method test_run_saved_on_end (line 44) | def test_run_saved_on_end(self, tmp_path: Path): class TestDecisionRecording (line 56) | class TestDecisionRecording: method test_basic_decision (line 59) | def test_basic_decision(self, tmp_path: Path): method test_decision_without_run_is_graceful (line 84) | def test_decision_without_run_is_graceful(self, tmp_path: Path): method test_decision_with_node_context (line 97) | def test_decision_with_node_context(self, tmp_path: Path): method test_decision_type (line 117) | def test_decision_type(self, tmp_path: Path): class TestOutcomeRecording (line 139) | class TestOutcomeRecording: method test_record_successful_outcome (line 142) | def test_record_successful_outcome(self, tmp_path: Path): method test_record_failed_outcome (line 171) | def test_record_failed_outcome(self, tmp_path: Path): method test_metrics_updated_on_outcome (line 197) | def test_metrics_updated_on_outcome(self, tmp_path: Path): class TestProblemReporting (line 229) | class TestProblemReporting: method test_report_problem (line 232) | def test_report_problem(self, tmp_path: Path): method test_problem_linked_to_decision (line 253) | def test_problem_linked_to_decision(self, tmp_path: Path): class TestConvenienceMethods (line 277) | class TestConvenienceMethods: method test_quick_decision (line 280) | def test_quick_decision(self, tmp_path: Path): method test_decide_and_execute_success (line 298) | def test_decide_and_execute_success(self, tmp_path: Path): method test_decide_and_execute_failure (line 321) | def test_decide_and_execute_failure(self, tmp_path: Path): class TestNarrativeGeneration (line 345) | class TestNarrativeGeneration: method test_default_narrative_success (line 352) | def test_default_narrative_success(self, tmp_path: Path): method test_default_narrative_failure (line 375) | def test_default_narrative_failure(self, tmp_path: Path): FILE: core/tests/test_runtime_logger.py function _sid (line 31) | def _sid(suffix: str) -> str: function _force_session_run_ids (line 42) | def _force_session_run_ids(monkeypatch): class TestRuntimeLogStore (line 58) | class TestRuntimeLogStore: method test_ensure_run_dir_creates_directory (line 60) | async def test_ensure_run_dir_creates_directory(self, tmp_path: Path): method test_append_and_load_details (line 66) | async def test_append_and_load_details(self, tmp_path: Path): method test_append_and_load_tool_logs (line 99) | async def test_append_and_load_tool_logs(self, tmp_path: Path): method test_save_and_load_summary (line 133) | async def test_save_and_load_summary(self, tmp_path: Path): method test_load_missing_run_returns_none (line 158) | async def test_load_missing_run_returns_none(self, tmp_path: Path): method test_list_runs_empty (line 165) | async def test_list_runs_empty(self, tmp_path: Path): method test_list_runs_with_filter (line 171) | async def test_list_runs_with_filter(self, tmp_path: Path): method test_list_runs_sorted_by_timestamp_desc (line 211) | async def test_list_runs_sorted_by_timestamp_desc(self, tmp_path: Path): method test_list_runs_limit (line 232) | async def test_list_runs_limit(self, tmp_path: Path): method test_list_runs_includes_in_progress (line 251) | async def test_list_runs_includes_in_progress(self, tmp_path: Path): method test_read_node_details_sync (line 279) | async def test_read_node_details_sync(self, tmp_path: Path): method test_corrupt_jsonl_line_skipped (line 300) | async def test_corrupt_jsonl_line_skipped(self, tmp_path: Path): class TestRuntimeLogger (line 322) | class TestRuntimeLogger: method test_start_run_returns_run_id (line 324) | async def test_start_run_returns_run_id(self, tmp_path: Path): method test_start_run_creates_directory (line 332) | async def test_start_run_creates_directory(self, tmp_path: Path): method test_log_step_writes_to_disk_immediately (line 339) | async def test_log_step_writes_to_disk_immediately(self, tmp_path: Path): method test_log_node_complete_writes_to_disk_immediately (line 366) | async def test_log_node_complete_writes_to_disk_immediately(self, tmp_... method test_full_lifecycle (line 390) | async def test_full_lifecycle(self, tmp_path: Path): method test_trace_context_populated_in_l1_l2_l3 (line 501) | async def test_trace_context_populated_in_l1_l2_l3(self, tmp_path: Path): method test_trace_context_empty_when_not_set (line 561) | async def test_trace_context_empty_when_not_set(self, tmp_path: Path): method test_multi_node_lifecycle (line 609) | async def test_multi_node_lifecycle(self, tmp_path: Path): method test_failed_node_needs_attention (line 671) | async def test_failed_node_needs_attention(self, tmp_path: Path): method test_ensure_node_logged_no_op_if_already_logged (line 717) | async def test_ensure_node_logged_no_op_if_already_logged(self, tmp_pa... method test_ensure_node_logged_creates_entry_if_missing (line 744) | async def test_ensure_node_logged_creates_entry_if_missing(self, tmp_p... method test_large_data_preserved (line 764) | async def test_large_data_preserved(self, tmp_path: Path): method test_end_run_does_not_propagate_exceptions (line 815) | async def test_end_run_does_not_propagate_exceptions(self, tmp_path: P... method test_crash_resilience_l2_l3_survive (line 841) | async def test_crash_resilience_l2_l3_survive(self, tmp_path: Path): method test_in_progress_run_visible_in_list (line 891) | async def test_in_progress_run_visible_in_list(self, tmp_path: Path): method test_log_step_with_error_and_stacktrace (line 911) | async def test_log_step_with_error_and_stacktrace(self, tmp_path: Path): method test_log_node_complete_with_stacktrace (line 941) | async def test_log_node_complete_with_stacktrace(self, tmp_path: Path): method test_attention_flags_excessive_retries (line 970) | async def test_attention_flags_excessive_retries(self, tmp_path: Path): method test_attention_flags_high_latency (line 993) | async def test_attention_flags_high_latency(self, tmp_path: Path): method test_attention_flags_high_token_usage (line 1016) | async def test_attention_flags_high_token_usage(self, tmp_path: Path): method test_attention_flags_many_iterations (line 1039) | async def test_attention_flags_many_iterations(self, tmp_path: Path): method test_guard_failure_exit_status (line 1062) | async def test_guard_failure_exit_status(self, tmp_path: Path): FILE: core/tests/test_safe_eval.py class TestLiterals (line 19) | class TestLiterals: method test_integer (line 20) | def test_integer(self): method test_negative_integer (line 23) | def test_negative_integer(self): method test_float (line 26) | def test_float(self): method test_string (line 29) | def test_string(self): method test_double_quoted_string (line 32) | def test_double_quoted_string(self): method test_boolean_true (line 35) | def test_boolean_true(self): method test_boolean_false (line 38) | def test_boolean_false(self): method test_none (line 41) | def test_none(self): class TestDataStructures (line 50) | class TestDataStructures: method test_list (line 51) | def test_list(self): method test_empty_list (line 54) | def test_empty_list(self): method test_nested_list (line 57) | def test_nested_list(self): method test_tuple (line 60) | def test_tuple(self): method test_dict (line 63) | def test_dict(self): method test_empty_dict (line 66) | def test_empty_dict(self): class TestArithmetic (line 75) | class TestArithmetic: method test_addition (line 76) | def test_addition(self): method test_subtraction (line 79) | def test_subtraction(self): method test_multiplication (line 82) | def test_multiplication(self): method test_division (line 85) | def test_division(self): method test_floor_division (line 88) | def test_floor_division(self): method test_modulo (line 91) | def test_modulo(self): method test_power (line 94) | def test_power(self): method test_complex_expression (line 97) | def test_complex_expression(self): class TestUnaryOps (line 106) | class TestUnaryOps: method test_negation (line 107) | def test_negation(self): method test_positive (line 110) | def test_positive(self): method test_not_true (line 113) | def test_not_true(self): method test_not_false (line 116) | def test_not_false(self): method test_bitwise_invert (line 119) | def test_bitwise_invert(self): class TestComparisons (line 128) | class TestComparisons: method test_equal (line 129) | def test_equal(self): method test_not_equal (line 132) | def test_not_equal(self): method test_less_than (line 135) | def test_less_than(self): method test_greater_than (line 138) | def test_greater_than(self): method test_less_equal (line 141) | def test_less_equal(self): method test_greater_equal (line 144) | def test_greater_equal(self): method test_is_none (line 147) | def test_is_none(self): method test_is_not_none (line 150) | def test_is_not_none(self): method test_in_list (line 153) | def test_in_list(self): method test_not_in_list (line 156) | def test_not_in_list(self): method test_chained_comparison (line 159) | def test_chained_comparison(self): method test_chained_comparison_false (line 163) | def test_chained_comparison_false(self): method test_chained_three_way (line 166) | def test_chained_three_way(self): class TestBooleanOps (line 175) | class TestBooleanOps: method test_and_true (line 176) | def test_and_true(self): method test_and_false (line 179) | def test_and_false(self): method test_or_true (line 182) | def test_or_true(self): method test_or_false (line 185) | def test_or_false(self): method test_and_returns_last_truthy (line 188) | def test_and_returns_last_truthy(self): method test_and_returns_first_falsy (line 192) | def test_and_returns_first_falsy(self): method test_or_returns_first_truthy (line 196) | def test_or_returns_first_truthy(self): method test_or_returns_last_falsy (line 200) | def test_or_returns_last_falsy(self): method test_and_short_circuits (line 204) | def test_and_short_circuits(self): method test_or_short_circuits (line 213) | def test_or_short_circuits(self): method test_and_guard_pattern_truthy (line 218) | def test_and_guard_pattern_truthy(self): method test_multi_and (line 223) | def test_multi_and(self): method test_multi_or (line 226) | def test_multi_or(self): method test_mixed_and_or (line 229) | def test_mixed_and_or(self): class TestTernary (line 238) | class TestTernary: method test_ternary_true_branch (line 239) | def test_ternary_true_branch(self): method test_ternary_false_branch (line 242) | def test_ternary_false_branch(self): method test_ternary_with_context (line 245) | def test_ternary_with_context(self): method test_ternary_false_with_context (line 248) | def test_ternary_false_with_context(self): class TestVariables (line 257) | class TestVariables: method test_simple_variable (line 258) | def test_simple_variable(self): method test_string_variable (line 261) | def test_string_variable(self): method test_dict_variable (line 264) | def test_dict_variable(self): method test_undefined_variable_raises (line 268) | def test_undefined_variable_raises(self): method test_multiple_variables (line 272) | def test_multiple_variables(self): class TestSubscript (line 281) | class TestSubscript: method test_dict_subscript (line 282) | def test_dict_subscript(self): method test_list_subscript (line 285) | def test_list_subscript(self): method test_nested_subscript (line 288) | def test_nested_subscript(self): method test_missing_key_raises (line 292) | def test_missing_key_raises(self): class TestAttributeAccess (line 302) | class TestAttributeAccess: method test_private_attr_blocked (line 303) | def test_private_attr_blocked(self): method test_dunder_blocked (line 308) | def test_dunder_blocked(self): method test_single_underscore_blocked (line 312) | def test_single_underscore_blocked(self): class TestFunctionCalls (line 322) | class TestFunctionCalls: method test_len (line 323) | def test_len(self): method test_int_conversion (line 326) | def test_int_conversion(self): method test_float_conversion (line 329) | def test_float_conversion(self): method test_str_conversion (line 332) | def test_str_conversion(self): method test_bool_conversion (line 335) | def test_bool_conversion(self): method test_abs (line 338) | def test_abs(self): method test_min (line 341) | def test_min(self): method test_max (line 344) | def test_max(self): method test_sum (line 347) | def test_sum(self): method test_round (line 350) | def test_round(self): method test_all (line 353) | def test_all(self): method test_any (line 356) | def test_any(self): method test_list_constructor (line 359) | def test_list_constructor(self): method test_dict_constructor (line 362) | def test_dict_constructor(self): method test_tuple_constructor (line 365) | def test_tuple_constructor(self): method test_set_constructor (line 368) | def test_set_constructor(self): class TestMethodCalls (line 377) | class TestMethodCalls: method test_dict_get (line 378) | def test_dict_get(self): method test_dict_get_missing (line 381) | def test_dict_get_missing(self): method test_dict_keys (line 384) | def test_dict_keys(self): method test_dict_values (line 388) | def test_dict_values(self): method test_string_lower (line 392) | def test_string_lower(self): method test_string_upper (line 395) | def test_string_upper(self): method test_string_strip (line 398) | def test_string_strip(self): method test_string_split (line 401) | def test_string_split(self): class TestSecurity (line 410) | class TestSecurity: method test_import_blocked (line 411) | def test_import_blocked(self): method test_lambda_blocked (line 416) | def test_lambda_blocked(self): method test_comprehension_blocked (line 420) | def test_comprehension_blocked(self): method test_assignment_blocked (line 424) | def test_assignment_blocked(self): method test_disallowed_function_blocked (line 429) | def test_disallowed_function_blocked(self): method test_exec_blocked (line 434) | def test_exec_blocked(self): method test_type_call_blocked (line 439) | def test_type_call_blocked(self): method test_getattr_builtin_blocked (line 444) | def test_getattr_builtin_blocked(self): method test_empty_expression_raises (line 449) | def test_empty_expression_raises(self): class TestEdgeConditionPatterns (line 459) | class TestEdgeConditionPatterns: method test_output_key_exists_and_not_none (line 462) | def test_output_key_exists_and_not_none(self): method test_output_key_missing (line 466) | def test_output_key_missing(self): method test_output_key_check_with_fallback (line 470) | def test_output_key_check_with_fallback(self): method test_guard_then_length_check (line 474) | def test_guard_then_length_check(self): method test_guard_short_circuits_on_none (line 485) | def test_guard_short_circuits_on_none(self): method test_success_flag_check (line 496) | def test_success_flag_check(self): method test_memory_threshold (line 500) | def test_memory_threshold(self): method test_string_contains_check (line 504) | def test_string_contains_check(self): method test_fallback_chain (line 508) | def test_fallback_chain(self): method test_no_context_needed (line 517) | def test_no_context_needed(self): FILE: core/tests/test_session_manager_worker_handoff.py function _make_session (line 12) | def _make_session(event_bus: EventBus, session_id: str = "session_handof... function _make_executor (line 16) | def _make_executor(queen_node) -> SimpleNamespace: function test_worker_handoff_injects_formatted_request_into_queen (line 24) | async def test_worker_handoff_injects_formatted_request_into_queen() -> ... function test_worker_handoff_ignores_queen_stream (line 53) | async def test_worker_handoff_ignores_queen_stream() -> None: function test_worker_handoff_resubscribe_replaces_previous_subscription (line 71) | async def test_worker_handoff_resubscribe_replaces_previous_subscription... function test_stop_session_unsubscribes_worker_handoff (line 100) | async def test_stop_session_unsubscribes_worker_handoff() -> None: FILE: core/tests/test_skill_allowlist.py function _make_tool_call_event (line 10) | def _make_tool_call_event(tool_name: str, path: str): function _make_node (line 19) | def _make_node(skill_dirs: list[str]): class TestSkillFileReadInterception (line 29) | class TestSkillFileReadInterception: method test_reads_file_in_skill_dir (line 31) | async def test_reads_file_in_skill_dir(self, tmp_path): method test_skill_md_read_marked_as_skill_content (line 49) | async def test_skill_md_read_marked_as_skill_content(self, tmp_path): method test_non_skill_md_resource_not_marked (line 65) | async def test_non_skill_md_resource_not_marked(self, tmp_path): method test_path_outside_skill_dir_goes_to_executor (line 82) | async def test_path_outside_skill_dir_goes_to_executor(self, tmp_path): method test_no_skill_dirs_goes_to_executor (line 99) | async def test_no_skill_dirs_goes_to_executor(self, tmp_path): method test_missing_file_returns_error (line 116) | async def test_missing_file_returns_error(self, tmp_path): method test_non_file_read_tool_goes_to_executor (line 131) | async def test_non_file_read_tool_goes_to_executor(self, tmp_path): FILE: core/tests/test_skill_catalog.py function _make_skill (line 7) | def _make_skill( class TestSkillCatalog (line 25) | class TestSkillCatalog: method test_add_and_get (line 26) | def test_add_and_get(self): method test_init_with_skills_list (line 35) | def test_init_with_skills_list(self): method test_activation_tracking (line 43) | def test_activation_tracking(self): method test_allowlisted_dirs (line 50) | def test_allowlisted_dirs(self): method test_to_prompt_empty_catalog (line 61) | def test_to_prompt_empty_catalog(self): method test_to_prompt_framework_only (line 65) | def test_to_prompt_framework_only(self): method test_to_prompt_xml_generation (line 70) | def test_to_prompt_xml_generation(self): method test_to_prompt_sorted_by_name (line 92) | def test_to_prompt_sorted_by_name(self): method test_to_prompt_xml_escaping (line 104) | def test_to_prompt_xml_escaping(self): method test_to_prompt_excludes_framework_includes_others (line 112) | def test_to_prompt_excludes_framework_includes_others(self): method test_to_prompt_contains_behavioral_instruction (line 126) | def test_to_prompt_contains_behavioral_instruction(self): method test_build_pre_activated_prompt (line 133) | def test_build_pre_activated_prompt(self): method test_build_pre_activated_skips_already_activated (line 142) | def test_build_pre_activated_skips_already_activated(self): method test_build_pre_activated_missing_skill (line 150) | def test_build_pre_activated_missing_skill(self): method test_build_pre_activated_multiple (line 155) | def test_build_pre_activated_multiple(self): method test_duplicate_add_overwrites (line 170) | def test_duplicate_add_overwrites(self): FILE: core/tests/test_skill_context_protection.py function _make_conversation (line 8) | def _make_conversation() -> NodeConversation: function _add_tool_msg (line 17) | async def _add_tool_msg(conv: NodeConversation, content: str, **kwargs) ... class TestSkillContentProtection (line 25) | class TestSkillContentProtection: method test_is_skill_content_flag_persists (line 27) | async def test_is_skill_content_flag_persists(self): method test_regular_message_not_marked (line 34) | async def test_regular_message_not_marked(self): method test_skill_content_survives_prune (line 41) | async def test_skill_content_survives_prune(self): method test_regular_content_can_be_pruned (line 65) | async def test_regular_content_can_be_pruned(self): method test_error_messages_also_protected (line 77) | async def test_error_messages_also_protected(self): FILE: core/tests/test_skill_discovery.py function _write_skill (line 8) | def _write_skill(base: Path, name: str, description: str = "A test skill... class TestSkillDiscovery (line 19) | class TestSkillDiscovery: method test_discover_project_skills (line 20) | def test_discover_project_skills(self, tmp_path): method test_hive_skills_path (line 40) | def test_hive_skills_path(self, tmp_path): method test_collision_project_overrides_user (line 56) | def test_collision_project_overrides_user(self, tmp_path, monkeypatch): method test_collision_hive_overrides_agents (line 79) | def test_collision_hive_overrides_agents(self, tmp_path): method test_skips_git_and_node_modules (line 101) | def test_skips_git_and_node_modules(self, tmp_path): method test_empty_scan (line 121) | def test_empty_scan(self, tmp_path): method test_framework_scope_loads_defaults (line 132) | def test_framework_scope_loads_defaults(self): method test_max_depth_limit (line 146) | def test_max_depth_limit(self, tmp_path): FILE: core/tests/test_skill_errors.py class TestSkillErrorCode (line 14) | class TestSkillErrorCode: method test_all_codes_defined (line 15) | def test_all_codes_defined(self): class TestSkillError (line 26) | class TestSkillError: method test_code_stored (line 27) | def test_code_stored(self): method test_message_format (line 36) | def test_message_format(self): method test_is_exception (line 51) | def test_is_exception(self): method test_what_why_fix_attributes (line 60) | def test_what_why_fix_attributes(self): class TestLogSkillError (line 72) | class TestLogSkillError: method test_emits_log (line 73) | def test_emits_log(self, caplog): method test_warning_level (line 86) | def test_warning_level(self, caplog): method test_message_contains_all_parts (line 99) | def test_message_contains_all_parts(self, caplog): class TestSkillErrorInParser (line 115) | class TestSkillErrorInParser: method test_missing_description_returns_none (line 116) | def test_missing_description_returns_none(self, tmp_path): method test_empty_file_returns_none (line 125) | def test_empty_file_returns_none(self, tmp_path): method test_nonexistent_returns_none (line 134) | def test_nonexistent_returns_none(self, tmp_path): method test_yaml_fixup_still_parses (line 140) | def test_yaml_fixup_still_parses(self, tmp_path): FILE: core/tests/test_skill_integration.py function _make_skill (line 11) | def _make_skill( class TestPromptComposition (line 29) | class TestPromptComposition: method test_backward_compat_no_skill_params (line 32) | def test_backward_compat_no_skill_params(self): method test_skills_catalog_in_prompt (line 42) | def test_skills_catalog_in_prompt(self): method test_protocols_in_prompt (line 54) | def test_protocols_in_prompt(self): method test_full_prompt_ordering (line 66) | def test_full_prompt_ordering(self): method test_none_skill_prompts_excluded (line 93) | def test_none_skill_prompts_excluded(self): method test_empty_skill_prompts_excluded (line 104) | def test_empty_skill_prompts_excluded(self): class TestEndToEndPipeline (line 116) | class TestEndToEndPipeline: method test_discovery_to_catalog_to_prompt (line 119) | def test_discovery_to_catalog_to_prompt(self, tmp_path): method test_defaults_plus_community_skills (line 154) | def test_defaults_plus_community_skills(self, tmp_path): method test_config_disables_defaults_keeps_community (line 194) | def test_config_disables_defaults_keeps_community(self, tmp_path): FILE: core/tests/test_skill_parser.py function tmp_skill (line 11) | def tmp_skill(tmp_path): class TestParseSkillMd (line 24) | class TestParseSkillMd: method test_happy_path (line 25) | def test_happy_path(self, tmp_skill): method test_missing_description_returns_none (line 44) | def test_missing_description_returns_none(self, tmp_skill): method test_missing_name_uses_directory (line 54) | def test_missing_name_uses_directory(self, tmp_skill): method test_empty_file_returns_none (line 65) | def test_empty_file_returns_none(self, tmp_skill): method test_no_frontmatter_delimiters_returns_none (line 69) | def test_no_frontmatter_delimiters_returns_none(self, tmp_skill): method test_unparseable_yaml_returns_none (line 74) | def test_unparseable_yaml_returns_none(self, tmp_skill): method test_unquoted_colon_fixup (line 85) | def test_unquoted_colon_fixup(self, tmp_skill): method test_long_name_warns_but_loads (line 97) | def test_long_name_warns_but_loads(self, tmp_skill): method test_name_mismatch_warns_but_loads (line 110) | def test_name_mismatch_warns_but_loads(self, tmp_skill): method test_optional_fields (line 122) | def test_optional_fields(self, tmp_skill): method test_body_extraction (line 147) | def test_body_extraction(self, tmp_skill): method test_location_is_absolute (line 167) | def test_location_is_absolute(self, tmp_skill): method test_nonexistent_file_returns_none (line 181) | def test_nonexistent_file_returns_none(self, tmp_path): FILE: core/tests/test_skill_resources.py function _make_skill (line 13) | def _make_skill( class TestSkillResourceBaseDir (line 28) | class TestSkillResourceBaseDir: method test_base_dir_in_xml (line 29) | def test_base_dir_in_xml(self): method test_base_dir_xml_escaped (line 37) | def test_base_dir_xml_escaped(self): method test_base_dir_absent_for_framework_skills (line 45) | def test_base_dir_absent_for_framework_skills(self): method test_allowlisted_dirs_matches_skills (line 51) | def test_allowlisted_dirs_matches_skills(self): method test_allowlisted_dirs_empty_catalog (line 65) | def test_allowlisted_dirs_empty_catalog(self): class TestSkillDirsPropagation (line 69) | class TestSkillDirsPropagation: method _make_ctx (line 70) | def _make_ctx(self, **kwargs): method test_node_context_skill_dirs_default (line 83) | def test_node_context_skill_dirs_default(self): method test_node_context_skill_dirs_set (line 88) | def test_node_context_skill_dirs_set(self): FILE: core/tests/test_skill_trust.py function make_skill (line 23) | def make_skill(name: str = "test-skill", scope: str = "project") -> Pars... class TestNormalizeRemoteUrl (line 39) | class TestNormalizeRemoteUrl: method test_ssh_scp_format (line 40) | def test_ssh_scp_format(self): method test_https_format (line 43) | def test_https_format(self): method test_https_no_dot_git (line 46) | def test_https_no_dot_git(self): method test_ssh_url_format (line 49) | def test_ssh_url_format(self): method test_lowercased (line 52) | def test_lowercased(self): method test_trailing_slash_stripped (line 55) | def test_trailing_slash_stripped(self): method test_gitlab (line 58) | def test_gitlab(self): class TestIsLocalhostRemote (line 67) | class TestIsLocalhostRemote: method test_localhost_https (line 68) | def test_localhost_https(self): method test_127_0_0_1 (line 71) | def test_127_0_0_1(self): method test_github_not_local (line 74) | def test_github_not_local(self): method test_scp_localhost (line 77) | def test_scp_localhost(self): class TestTrustedRepoStore (line 86) | class TestTrustedRepoStore: method test_empty_store_is_not_trusted (line 87) | def test_empty_store_is_not_trusted(self, tmp_path): method test_trust_and_lookup (line 91) | def test_trust_and_lookup(self, tmp_path): method test_revoke (line 96) | def test_revoke(self, tmp_path): method test_revoke_nonexistent_returns_false (line 102) | def test_revoke_nonexistent_returns_false(self, tmp_path): method test_persists_across_instances (line 106) | def test_persists_across_instances(self, tmp_path): method test_atomic_write (line 114) | def test_atomic_write(self, tmp_path): method test_corrupted_json_recovers_gracefully (line 122) | def test_corrupted_json_recovers_gracefully(self, tmp_path): method test_json_schema (line 128) | def test_json_schema(self, tmp_path): method test_list_entries (line 137) | def test_list_entries(self, tmp_path): class TestProjectTrustDetector (line 150) | class TestProjectTrustDetector: method test_none_project_dir_always_trusted (line 151) | def test_none_project_dir_always_trusted(self, tmp_path): method test_nonexistent_dir_always_trusted (line 157) | def test_nonexistent_dir_always_trusted(self, tmp_path): method test_no_git_dir_always_trusted (line 163) | def test_no_git_dir_always_trusted(self, tmp_path): method test_no_remote_always_trusted (line 169) | def test_no_remote_always_trusted(self, tmp_path): method test_localhost_remote_always_trusted (line 179) | def test_localhost_remote_always_trusted(self, tmp_path): method test_trusted_by_store (line 190) | def test_trusted_by_store(self, tmp_path): method test_unknown_remote_untrusted (line 203) | def test_unknown_remote_untrusted(self, tmp_path): method test_own_remotes_env_var (line 215) | def test_own_remotes_env_var(self, tmp_path, monkeypatch): method test_git_timeout_treated_as_trusted (line 227) | def test_git_timeout_treated_as_trusted(self, tmp_path): method test_git_not_found_treated_as_trusted (line 237) | def test_git_not_found_treated_as_trusted(self, tmp_path): class TestTrustGate (line 251) | class TestTrustGate: method test_framework_scope_always_passes (line 252) | def test_framework_scope_always_passes(self, tmp_path): method test_user_scope_always_passes (line 258) | def test_user_scope_always_passes(self, tmp_path): method test_no_project_skills_returns_early (line 264) | def test_no_project_skills_returns_early(self, tmp_path): method test_trusted_project_skills_pass (line 271) | def test_trusted_project_skills_pass(self, tmp_path): method test_untrusted_headless_skips_and_logs (line 283) | def test_untrusted_headless_skips_and_logs(self, tmp_path, caplog): method test_interactive_consent_session_only (line 300) | def test_interactive_consent_session_only(self, tmp_path): method test_interactive_consent_permanent (line 325) | def test_interactive_consent_permanent(self, tmp_path): method test_interactive_consent_deny (line 348) | def test_interactive_consent_deny(self, tmp_path): method test_env_var_override_trusts_all (line 370) | def test_env_var_override_trusts_all(self, tmp_path, monkeypatch): method test_keyboard_interrupt_treated_as_deny (line 379) | def test_keyboard_interrupt_treated_as_deny(self, tmp_path): method test_security_notice_shown_once (line 401) | def test_security_notice_shown_once(self, tmp_path, monkeypatch): method test_mixed_scopes_only_project_gated (line 446) | def test_mixed_scopes_only_project_gated(self, tmp_path, monkeypatch): FILE: core/tests/test_storage.py function create_test_run (line 21) | def create_test_run( class TestFileStorageBasics (line 47) | class TestFileStorageBasics: method test_init_creates_directories (line 50) | def test_init_creates_directories(self, tmp_path: Path): method test_init_with_string_path (line 60) | def test_init_with_string_path(self, tmp_path: Path): class TestFileStorageRunOperations (line 67) | class TestFileStorageRunOperations: method test_save_and_load_run (line 70) | def test_save_and_load_run(self, tmp_path: Path): method test_load_nonexistent_run_returns_none (line 83) | def test_load_nonexistent_run_returns_none(self, tmp_path: Path): method test_save_creates_json_file (line 90) | def test_save_creates_json_file(self, tmp_path: Path): method test_save_creates_summary (line 105) | def test_save_creates_summary(self, tmp_path: Path): method test_load_summary (line 115) | def test_load_summary(self, tmp_path: Path): method test_load_summary_fallback_to_run (line 128) | def test_load_summary_fallback_to_run(self, tmp_path: Path): method test_delete_run (line 144) | def test_delete_run(self, tmp_path: Path): method test_delete_nonexistent_run_returns_false (line 157) | def test_delete_nonexistent_run_returns_false(self, tmp_path: Path): class TestFileStorageIndexing (line 166) | class TestFileStorageIndexing: method test_index_by_goal (line 169) | def test_index_by_goal(self, tmp_path: Path): method test_index_by_status (line 190) | def test_index_by_status(self, tmp_path: Path): method test_index_by_status_string (line 208) | def test_index_by_status_string(self, tmp_path: Path): method test_index_by_node (line 218) | def test_index_by_node(self, tmp_path: Path): method test_delete_removes_from_indexes (line 236) | def test_delete_removes_from_indexes(self, tmp_path: Path): method test_empty_index_returns_empty_list (line 261) | def test_empty_index_returns_empty_list(self, tmp_path: Path): class TestFileStorageListOperations (line 271) | class TestFileStorageListOperations: method test_list_all_runs (line 274) | def test_list_all_runs(self, tmp_path: Path): method test_list_all_goals (line 287) | def test_list_all_goals(self, tmp_path: Path): method test_get_stats (line 300) | def test_get_stats(self, tmp_path: Path): class TestCacheEntry (line 317) | class TestCacheEntry: method test_is_expired_false_when_fresh (line 320) | def test_is_expired_false_when_fresh(self): method test_is_expired_true_when_old (line 325) | def test_is_expired_true_when_old(self): class TestConcurrentStorageBasics (line 336) | class TestConcurrentStorageBasics: method test_init (line 339) | def test_init(self, tmp_path: Path): method test_start_and_stop (line 347) | async def test_start_and_stop(self, tmp_path: Path): method test_double_start_is_idempotent (line 359) | async def test_double_start_is_idempotent(self, tmp_path: Path): method test_double_stop_is_idempotent (line 370) | async def test_double_stop_is_idempotent(self, tmp_path: Path): class TestConcurrentStorageRunOperations (line 381) | class TestConcurrentStorageRunOperations: method test_save_and_load_run (line 385) | async def test_save_and_load_run(self, tmp_path: Path): method test_load_run_uses_cache (line 403) | async def test_load_run_uses_cache(self, tmp_path: Path): method test_load_run_bypass_cache (line 425) | async def test_load_run_bypass_cache(self, tmp_path: Path): method test_delete_run (line 445) | async def test_delete_run(self, tmp_path: Path): method test_delete_clears_cache (line 463) | async def test_delete_clears_cache(self, tmp_path: Path): class TestConcurrentStorageQueryOperations (line 486) | class TestConcurrentStorageQueryOperations: method test_get_runs_by_goal (line 490) | async def test_get_runs_by_goal(self, tmp_path: Path): method test_get_runs_by_status (line 509) | async def test_get_runs_by_status(self, tmp_path: Path): method test_list_all_runs (line 525) | async def test_list_all_runs(self, tmp_path: Path): class TestConcurrentStorageCacheManagement (line 542) | class TestConcurrentStorageCacheManagement: method test_clear_cache (line 545) | def test_clear_cache(self, tmp_path: Path): method test_invalidate_cache (line 554) | def test_invalidate_cache(self, tmp_path: Path): method test_get_cache_stats (line 565) | def test_get_cache_stats(self, tmp_path: Path): class TestConcurrentStorageSyncAPI (line 582) | class TestConcurrentStorageSyncAPI: method test_save_run_sync (line 585) | def test_save_run_sync(self, tmp_path: Path): method test_load_run_sync (line 597) | def test_load_run_sync(self, tmp_path: Path): method test_load_run_sync_nonexistent (line 607) | def test_load_run_sync_nonexistent(self, tmp_path: Path): class TestConcurrentStorageStats (line 616) | class TestConcurrentStorageStats: method test_get_stats (line 620) | async def test_get_stats(self, tmp_path: Path): FILE: core/tests/test_stream_events.py class TestEventDefaults (line 39) | class TestEventDefaults: method test_default_construction (line 43) | def test_default_construction(self, cls): method test_text_delta_defaults (line 47) | def test_text_delta_defaults(self): method test_text_end_defaults (line 53) | def test_text_end_defaults(self): method test_tool_call_defaults (line 58) | def test_tool_call_defaults(self): method test_tool_result_defaults (line 65) | def test_tool_result_defaults(self): method test_reasoning_start_defaults (line 72) | def test_reasoning_start_defaults(self): method test_reasoning_delta_defaults (line 76) | def test_reasoning_delta_defaults(self): method test_finish_defaults (line 81) | def test_finish_defaults(self): method test_stream_error_defaults (line 89) | def test_stream_error_defaults(self): class TestEventConstruction (line 99) | class TestEventConstruction: method test_text_delta_with_values (line 102) | def test_text_delta_with_values(self): method test_text_end_with_values (line 107) | def test_text_end_with_values(self): method test_tool_call_with_values (line 111) | def test_tool_call_with_values(self): method test_tool_result_with_values (line 121) | def test_tool_result_with_values(self): method test_tool_result_error (line 131) | def test_tool_result_error(self): method test_reasoning_delta_with_content (line 139) | def test_reasoning_delta_with_content(self): method test_finish_with_values (line 143) | def test_finish_with_values(self): method test_stream_error_with_values (line 155) | def test_stream_error_with_values(self): class TestEventImmutability (line 164) | class TestEventImmutability: method test_frozen (line 168) | def test_frozen(self, cls): method test_text_delta_frozen_content (line 173) | def test_text_delta_frozen_content(self): method test_tool_call_frozen_input (line 178) | def test_tool_call_frozen_input(self): class TestTypeLiterals (line 187) | class TestTypeLiterals: method test_type_value (line 206) | def test_type_value(self, cls, expected_type): method test_all_types_unique (line 209) | def test_all_types_unique(self): class TestEventSerialization (line 217) | class TestEventSerialization: method test_text_delta_asdict (line 220) | def test_text_delta_asdict(self): method test_tool_call_asdict (line 225) | def test_tool_call_asdict(self): method test_finish_asdict (line 235) | def test_finish_asdict(self): method test_asdict_contains_type (line 248) | def test_asdict_contains_type(self, cls): method test_asdict_keys_match_fields (line 253) | def test_asdict_keys_match_fields(self, cls): class TestStreamEventUnion (line 263) | class TestStreamEventUnion: method test_union_contains_all_classes (line 266) | def test_union_contains_all_classes(self): method test_union_has_exactly_expected_members (line 272) | def test_union_has_exactly_expected_members(self): method test_isinstance_check (line 278) | def test_isinstance_check(self, cls): class TestEventEquality (line 287) | class TestEventEquality: method test_equal_events (line 290) | def test_equal_events(self): method test_unequal_events (line 295) | def test_unequal_events(self): method test_different_types_not_equal (line 300) | def test_different_types_not_equal(self): method test_hashable (line 305) | def test_hashable(self): method test_equal_events_same_hash (line 310) | def test_equal_events_same_hash(self): method test_events_with_dict_not_hashable (line 315) | def test_events_with_dict_not_hashable(self): FILE: core/tests/test_subagent.py class MockStreamingLLM (line 37) | class MockStreamingLLM(LLMProvider): method __init__ (line 40) | def __init__(self, scenarios: list[list] | None = None): method stream (line 45) | async def stream( method complete (line 60) | def complete(self, messages, system="", **kwargs) -> LLMResponse: method complete_with_tools (line 63) | def complete_with_tools(self, messages, system, tools, tool_executor, ... function set_output_scenario (line 72) | def set_output_scenario(key: str, value: str) -> list: function delegate_scenario (line 84) | def delegate_scenario(agent_id: str, task: str) -> list: function text_finish_scenario (line 96) | def text_finish_scenario(text: str = "Done") -> list: function runtime (line 110) | def runtime() -> MagicMock: function parent_node_spec (line 121) | def parent_node_spec() -> NodeSpec: function subagent_node_spec (line 136) | def subagent_node_spec() -> NodeSpec: class TestBuildDelegateTool (line 154) | class TestBuildDelegateTool: method test_returns_none_when_no_subagents (line 157) | def test_returns_none_when_no_subagents(self): method test_creates_tool_with_enum_of_agent_ids (line 163) | def test_creates_tool_with_enum_of_agent_ids(self, subagent_node_spec): method test_handles_missing_node_in_registry (line 174) | def test_handles_missing_node_in_registry(self): class TestSubagentExecution (line 188) | class TestSubagentExecution: method test_subagent_not_found_returns_error (line 192) | async def test_subagent_not_found_returns_error(self, runtime, parent_... method test_subagent_receives_readonly_memory (line 219) | async def test_subagent_receives_readonly_memory( method test_subagent_returns_structured_output (line 265) | async def test_subagent_returns_structured_output( method test_gcu_subagent_auto_populates_tools_from_catalog (line 303) | async def test_gcu_subagent_auto_populates_tools_from_catalog(self, ru... class TestNestedSubagentPrevention (line 368) | class TestNestedSubagentPrevention: method test_delegate_tool_not_added_in_subagent_mode (line 371) | def test_delegate_tool_not_added_in_subagent_mode( class TestDelegationIntegration (line 419) | class TestDelegationIntegration: method test_parent_delegates_and_uses_result (line 423) | async def test_parent_delegates_and_uses_result( function report_scenario (line 501) | def report_scenario(message: str, data: dict | None = None) -> list: class TestBuildReportToParentTool (line 521) | class TestBuildReportToParentTool: method test_creates_tool_with_correct_schema (line 524) | def test_creates_tool_with_correct_schema(self): method test_tool_only_visible_in_subagent_mode (line 534) | def test_tool_only_visible_in_subagent_mode( method test_tool_not_visible_without_callback (line 587) | def test_tool_not_visible_without_callback(self, runtime, subagent_nod... class TestReportToParentExecution (line 614) | class TestReportToParentExecution: method test_reports_appear_in_result_json (line 618) | async def test_reports_appear_in_result_json( method test_subagent_tool_events_visible_on_shared_bus (line 665) | async def test_subagent_tool_events_visible_on_shared_bus( method test_event_bus_receives_subagent_report (line 722) | async def test_event_bus_receives_subagent_report( method test_callback_failure_does_not_block_subagent (line 775) | async def test_callback_failure_does_not_block_subagent( method test_no_reports_gives_null (line 823) | async def test_no_reports_gives_null(self, runtime, parent_node_spec, ... function report_wait_scenario (line 863) | def report_wait_scenario(message: str, data: dict | None = None) -> list: class TestEscalationReceiver (line 883) | class TestEscalationReceiver: method test_inject_then_wait_returns_response (line 887) | async def test_inject_then_wait_returns_response(self): method test_wait_blocks_until_inject (line 897) | async def test_wait_blocks_until_inject(self): method test_has_inject_event_attribute (line 924) | async def test_has_inject_event_attribute(self): class TestEscalationFlow (line 938) | class TestEscalationFlow: method test_wait_for_response_registers_receiver_in_registry (line 942) | async def test_wait_for_response_registers_receiver_in_registry( method test_wait_for_response_returns_user_reply_to_subagent (line 1021) | async def test_wait_for_response_returns_user_reply_to_subagent( method test_wait_for_response_emits_escalation_event (line 1090) | async def test_wait_for_response_emits_escalation_event( method test_non_blocking_report_still_works (line 1162) | async def test_non_blocking_report_still_works( method test_wait_for_response_without_event_bus_returns_none (line 1212) | async def test_wait_for_response_without_event_bus_returns_none( method test_report_to_parent_tool_includes_wait_param (line 1257) | async def test_report_to_parent_tool_includes_wait_param(self): function browser_and_set_output_scenario (line 1271) | def browser_and_set_output_scenario(output_key: str, output_value: str) ... class TestSubagentJudge (line 1293) | class TestSubagentJudge: method test_subagent_judge_accepts_when_output_keys_filled (line 1297) | async def test_subagent_judge_accepts_when_output_keys_filled(self): method test_subagent_judge_retries_with_task_in_feedback (line 1313) | async def test_subagent_judge_retries_with_task_in_feedback(self): method test_subagent_terminates_immediately_with_judge (line 1333) | async def test_subagent_terminates_immediately_with_judge( function report_mark_complete_scenario (line 1416) | def report_mark_complete_scenario( class TestMarkCompleteViaReport (line 1440) | class TestMarkCompleteViaReport: method test_mark_complete_terminates_without_output_keys (line 1444) | async def test_mark_complete_terminates_without_output_keys( method test_mark_complete_false_preserves_existing_behavior (line 1504) | async def test_mark_complete_false_preserves_existing_behavior( method test_mark_complete_tool_schema_includes_param (line 1557) | async def test_mark_complete_tool_schema_includes_param(self): method test_mark_complete_with_report_callback (line 1566) | async def test_mark_complete_with_report_callback( FILE: core/tests/test_subagent_escalation_e2e.py class SequencedLLM (line 40) | class SequencedLLM(LLMProvider): method __init__ (line 47) | def __init__(self, scenarios: list[list[StreamEvent]]): method stream (line 52) | async def stream( method complete (line 78) | def complete(self, messages, system="", **kwargs) -> LLMResponse: method complete_with_tools (line 81) | def complete_with_tools(self, messages, system, tools, tool_executor, ... function test_escalation_e2e_through_execution_stream (line 91) | async def test_escalation_e2e_through_execution_stream(tmp_path): function test_escalation_cleanup_after_completion (line 327) | async def test_escalation_cleanup_after_completion(tmp_path): function test_mark_complete_e2e_through_execution_stream (line 516) | async def test_mark_complete_e2e_through_execution_stream(tmp_path): FILE: core/tests/test_testing_framework.py class TestTestCaseSchema (line 31) | class TestTestCaseSchema: method test_create_test (line 34) | def test_create_test(self): method test_approve_test (line 54) | def test_approve_test(self): method test_modify_test (line 73) | def test_modify_test(self): method test_reject_test (line 92) | def test_reject_test(self): method test_record_result (line 110) | def test_record_result(self): class TestTestResultSchema (line 136) | class TestTestResultSchema: method test_create_passed_result (line 139) | def test_create_passed_result(self): method test_create_failed_result (line 153) | def test_create_failed_result(self): method test_summary_dict (line 167) | def test_summary_dict(self): class TestTestSuiteResult (line 184) | class TestTestSuiteResult: method test_suite_result_properties (line 187) | def test_suite_result_properties(self): method test_get_results_by_category (line 213) | def test_get_results_by_category(self): class TestTestStorage (line 253) | class TestTestStorage: method storage (line 257) | def storage(self, tmp_path): method test_save_and_load_test (line 261) | def test_save_and_load_test(self, storage): method test_delete_test (line 280) | def test_delete_test(self, storage): method test_get_tests_by_goal (line 298) | def test_get_tests_by_goal(self, storage): method test_get_approved_tests (line 315) | def test_get_approved_tests(self, storage): method test_save_and_load_result (line 357) | def test_save_and_load_result(self, storage): method test_result_history (line 372) | def test_result_history(self, storage): method test_get_stats (line 386) | def test_get_stats(self, storage): class TestErrorCategorizer (line 410) | class TestErrorCategorizer: method categorizer (line 414) | def categorizer(self): method test_categorize_passed (line 417) | def test_categorize_passed(self, categorizer): method test_categorize_logic_error (line 422) | def test_categorize_logic_error(self, categorizer): method test_categorize_implementation_error (line 432) | def test_categorize_implementation_error(self, categorizer): method test_categorize_edge_case (line 442) | def test_categorize_edge_case(self, categorizer): method test_categorize_from_stack_trace (line 452) | def test_categorize_from_stack_trace(self, categorizer): method test_get_fix_suggestion (line 463) | def test_get_fix_suggestion(self, categorizer): method test_get_iteration_guidance (line 469) | def test_get_iteration_guidance(self, categorizer): class TestDebugTool (line 485) | class TestDebugTool: method debug_tool (line 489) | def debug_tool(self, tmp_path): method test_analyze_missing_test (line 494) | def test_analyze_missing_test(self, debug_tool): method test_analyze_with_result (line 501) | def test_analyze_with_result(self, debug_tool, tmp_path): FILE: core/tests/test_tool_registry.py function _write_tool_module (line 16) | def _write_tool_module(tmp_path: Path, content: str) -> Path: function test_discover_from_module_handles_invalid_json (line 23) | def test_discover_from_module_handles_invalid_json(tmp_path): function test_discover_from_module_handles_empty_content (line 62) | def test_discover_from_module_handles_empty_content(tmp_path): class _RegistryFakeClient (line 97) | class _RegistryFakeClient: method __init__ (line 98) | def __init__(self, config): method connect (line 103) | def connect(self) -> None: method disconnect (line 106) | def disconnect(self) -> None: method list_tools (line 109) | def list_tools(self): method call_tool (line 118) | def call_tool(self, tool_name, arguments): function test_register_mcp_server_uses_connection_manager_when_enabled (line 122) | def test_register_mcp_server_uses_connection_manager_when_enabled(monkey... function test_register_mcp_server_defaults_to_connection_manager (line 155) | def test_register_mcp_server_defaults_to_connection_manager(monkeypatch): function test_register_mcp_server_direct_client_when_manager_disabled (line 185) | def test_register_mcp_server_direct_client_when_manager_disabled(monkeyp... FILE: core/tests/test_trigger_fires_into_queen.py function _make_session (line 26) | def _make_session(event_bus: EventBus, session_id: str = "session_trigge... function _make_executor (line 30) | def _make_executor(queen_node) -> SimpleNamespace: function test_interval_timer_fires_inject_trigger_on_queen_node (line 35) | async def test_interval_timer_fires_inject_trigger_on_queen_node() -> None: function test_timer_skipped_when_queen_node_unavailable (line 79) | async def test_timer_skipped_when_queen_node_unavailable() -> None: function test_webhook_trigger_fires_inject_trigger (line 110) | async def test_webhook_trigger_fires_inject_trigger() -> None: function test_webhook_trigger_discarded_when_no_worker (line 159) | async def test_webhook_trigger_discarded_when_no_worker() -> None: function test_remove_trigger_cleans_up_webhook_subscription (line 198) | async def test_remove_trigger_cleans_up_webhook_subscription() -> None: function test_run_agent_with_input_in_running_tools (line 243) | def test_run_agent_with_input_in_running_tools() -> None: function test_system_prompt_uses_correct_tool_name (line 250) | def test_system_prompt_uses_correct_tool_name() -> None: FILE: core/tests/test_two_llm_calls.py function _make_codex_provider (line 325) | def _make_codex_provider(): function _stream_and_collect (line 341) | async def _stream_and_collect(provider, messages, system, tools): function _validate_tool_args (line 362) | def _validate_tool_args(tool_calls: list[ToolCallEvent]) -> bool: FILE: core/tests/test_validate_agent_path.py function _reset_allowed_roots (line 24) | def _reset_allowed_roots(): class TestGetAllowedAgentRoots (line 36) | class TestGetAllowedAgentRoots: method setup_method (line 37) | def setup_method(self): method teardown_method (line 40) | def teardown_method(self): method test_returns_tuple (line 43) | def test_returns_tuple(self): method test_contains_three_roots (line 47) | def test_contains_three_roots(self): method test_cached_on_repeated_calls (line 51) | def test_cached_on_repeated_calls(self): method test_roots_are_resolved_paths (line 56) | def test_roots_are_resolved_paths(self): method test_roots_anchored_to_repo_not_cwd (line 62) | def test_roots_anchored_to_repo_not_cwd(self): class TestValidateAgentPathPositive (line 78) | class TestValidateAgentPathPositive: method setup_method (line 79) | def setup_method(self): method teardown_method (line 82) | def teardown_method(self): method test_path_inside_exports (line 85) | def test_path_inside_exports(self, tmp_path): method test_path_inside_examples (line 95) | def test_path_inside_examples(self, tmp_path): method test_path_inside_hive_agents (line 106) | def test_path_inside_hive_agents(self, tmp_path): method test_returns_path_object (line 117) | def test_returns_path_object(self, tmp_path): class TestValidateAgentPathNegative (line 132) | class TestValidateAgentPathNegative: method setup_method (line 133) | def setup_method(self): method teardown_method (line 136) | def teardown_method(self): method _set_roots (line 139) | def _set_roots(self, tmp_path): method test_absolute_path_outside_roots (line 146) | def test_absolute_path_outside_roots(self, tmp_path): method test_traversal_escape (line 151) | def test_traversal_escape(self, tmp_path): method test_sibling_directory_name (line 158) | def test_sibling_directory_name(self, tmp_path): method test_empty_string (line 166) | def test_empty_string(self, tmp_path): method test_home_directory (line 172) | def test_home_directory(self, tmp_path): method test_root (line 177) | def test_root(self, tmp_path): method test_null_byte (line 182) | def test_null_byte(self, tmp_path): method test_symlink_escape (line 188) | def test_symlink_escape(self, tmp_path): method test_root_itself_rejected (line 203) | def test_root_itself_rejected(self, tmp_path): method test_tilde_expansion (line 213) | def test_tilde_expansion(self, tmp_path, monkeypatch): class TestAllowedRootsImmutability (line 237) | class TestAllowedRootsImmutability: method setup_method (line 238) | def setup_method(self): method teardown_method (line 241) | def teardown_method(self): method test_is_tuple_not_list (line 244) | def test_is_tuple_not_list(self): class TestHTTPEndpointsRejectMaliciousPaths (line 255) | class TestHTTPEndpointsRejectMaliciousPaths: method test_create_session_rejects_outside_path (line 259) | async def test_create_session_rejects_outside_path(self, tmp_path): method test_create_session_rejects_traversal (line 279) | async def test_create_session_rejects_traversal(self, tmp_path): method test_load_worker_rejects_outside_path (line 299) | async def test_load_worker_rejects_outside_path(self, tmp_path): method test_check_agent_credentials_rejects_traversal (line 325) | async def test_check_agent_credentials_rejects_traversal(self, tmp_path): method test_error_message_does_not_leak_resolved_path (line 345) | async def test_error_message_does_not_leak_resolved_path(self, tmp_path): FILE: examples/templates/competitive_intel_agent/__main__.py function setup_logging (line 19) | def setup_logging(verbose: bool = False, debug: bool = False) -> None: function cli (line 33) | def cli() -> None: function run (line 62) | def run( function tui (line 113) | def tui(verbose: bool, debug: bool) -> None: function info (line 186) | def info(output_json: bool) -> None: function validate (line 205) | def validate() -> None: function shell (line 222) | def shell(verbose: bool) -> None: function _interactive_shell (line 227) | async def _interactive_shell(verbose: bool = False) -> None: FILE: examples/templates/competitive_intel_agent/agent.py class CompetitiveIntelAgent (line 167) | class CompetitiveIntelAgent: method __init__ (line 176) | def __init__(self, config: RuntimeConfig | None = None) -> None: method _build_graph (line 196) | def _build_graph(self) -> GraphSpec: method _setup (line 222) | def _setup(self) -> GraphExecutor: method start (line 265) | async def start(self) -> None: method stop (line 270) | async def stop(self) -> None: method trigger_and_wait (line 275) | async def trigger_and_wait( method run (line 306) | async def run( method info (line 328) | def info(self) -> dict[str, Any]: method validate (line 347) | def validate(self) -> dict[str, Any]: FILE: examples/templates/competitive_intel_agent/config.py class AgentMetadata (line 10) | class AgentMetadata: FILE: examples/templates/deep_research_agent/__main__.py function setup_logging (line 16) | def setup_logging(verbose=False, debug=False): function cli (line 30) | def cli(): function run (line 40) | def run(topic, quiet, verbose, debug): function tui (line 64) | def tui(verbose, debug): function info (line 139) | def info(output_json): function validate (line 155) | def validate(): function shell (line 172) | def shell(verbose): function _interactive_shell (line 177) | async def _interactive_shell(verbose=False): FILE: examples/templates/deep_research_agent/agent.py class DeepResearchAgent (line 153) | class DeepResearchAgent: method __init__ (line 168) | def __init__(self, config=None): method _build_graph (line 182) | def _build_graph(self) -> GraphSpec: method _setup (line 203) | def _setup(self, mock_mode: bool = False) -> None: method start (line 258) | async def start(self, mock_mode=False) -> None: method stop (line 265) | async def stop(self) -> None: method trigger_and_wait (line 271) | async def trigger_and_wait( method run (line 288) | async def run( method info (line 301) | def info(self): method validate (line 320) | def validate(self): FILE: examples/templates/deep_research_agent/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/email_inbox_management/__main__.py function setup_logging (line 16) | def setup_logging(verbose=False, debug=False): function cli (line 30) | def cli(): function run (line 48) | def run(rules, max_emails, mock, quiet, verbose, debug): function tui (line 73) | def tui(mock, verbose, debug): function info (line 154) | def info(output_json): function validate (line 170) | def validate(): function shell (line 187) | def shell(verbose): function _interactive_shell (line 192) | async def _interactive_shell(verbose=False): FILE: examples/templates/email_inbox_management/agent.py class EmailInboxManagementAgent (line 172) | class EmailInboxManagementAgent: method __init__ (line 185) | def __init__(self, config=None): method _build_graph (line 199) | def _build_graph(self) -> GraphSpec: method _setup (line 218) | def _setup(self, mock_mode=False) -> None: method start (line 281) | async def start(self, mock_mode=False) -> None: method stop (line 286) | async def stop(self) -> None: method trigger_and_wait (line 291) | async def trigger_and_wait( method run (line 311) | async def run( method info (line 324) | def info(self): method validate (line 343) | def validate(self): FILE: examples/templates/email_inbox_management/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/email_inbox_management/tools.py function _get_data_dir (line 100) | def _get_data_dir() -> str: function _get_access_token (line 111) | def _get_access_token(account: str = "") -> str: function _parse_headers (line 147) | def _parse_headers(headers: list[dict]) -> dict[str, str]: function _bulk_fetch_emails (line 162) | def _bulk_fetch_emails( function _get_current_timestamp (line 320) | def _get_current_timestamp() -> dict: function tool_executor (line 325) | def tool_executor(tool_use: ToolUse) -> ToolResult: FILE: examples/templates/email_reply_agent/__main__.py function setup_logging (line 13) | def setup_logging(verbose=False, debug=False): function cli (line 25) | def cli(): function run (line 33) | def run(filter_text, verbose): function tui (line 48) | def tui(): function info (line 99) | def info(): function validate (line 110) | def validate(): FILE: examples/templates/email_reply_agent/agent.py class EmailReplyAgent (line 114) | class EmailReplyAgent: method __init__ (line 115) | def __init__(self, config=None): method _build_graph (line 129) | def _build_graph(self): method _setup (line 147) | def _setup(self): method start (line 186) | async def start(self): method stop (line 192) | async def stop(self): method trigger_and_wait (line 197) | async def trigger_and_wait( method run (line 212) | async def run(self, context, session_state=None): method info (line 222) | def info(self): method validate (line 239) | def validate(self): FILE: examples/templates/email_reply_agent/config.py function _load_preferred_model (line 8) | def _load_preferred_model() -> str: class RuntimeConfig (line 24) | class RuntimeConfig: class AgentMetadata (line 36) | class AgentMetadata: FILE: examples/templates/email_reply_agent/tests/conftest.py function agent_module (line 18) | def agent_module(): function runner_loaded (line 26) | def runner_loaded(): FILE: examples/templates/email_reply_agent/tests/test_structure.py class TestAgentStructure (line 4) | class TestAgentStructure: method test_goal_defined (line 7) | def test_goal_defined(self, agent_module): method test_nodes_defined (line 13) | def test_nodes_defined(self, agent_module): method test_edges_defined (line 19) | def test_edges_defined(self, agent_module): method test_entry_points (line 36) | def test_entry_points(self, agent_module): method test_forever_alive (line 42) | def test_forever_alive(self, agent_module): method test_conversation_mode (line 47) | def test_conversation_mode(self, agent_module): method test_client_facing_nodes (line 52) | def test_client_facing_nodes(self, agent_module): method test_search_node_has_gmail_tools (line 58) | def test_search_node_has_gmail_tools(self, agent_module): method test_confirm_draft_node_has_reply_tool (line 64) | def test_confirm_draft_node_has_reply_tool(self, agent_module): method test_confirm_draft_node_has_restart_output (line 69) | def test_confirm_draft_node_has_restart_output(self, agent_module): class TestRunnerLoad (line 76) | class TestRunnerLoad: method test_runner_load_succeeds (line 79) | def test_runner_load_succeeds(self, runner_loaded): method test_runner_has_goal (line 83) | def test_runner_has_goal(self, runner_loaded): method test_runner_has_nodes (line 88) | def test_runner_has_nodes(self, runner_loaded): FILE: examples/templates/job_hunter/__main__.py function setup_logging (line 16) | def setup_logging(verbose=False, debug=False): function cli (line 30) | def cli(): function run (line 40) | def run(mock, quiet, verbose, debug): function tui (line 65) | def tui(mock, verbose, debug): function info (line 142) | def info(output_json): function validate (line 158) | def validate(): function shell (line 175) | def shell(verbose): function _interactive_shell (line 180) | async def _interactive_shell(verbose=False): FILE: examples/templates/job_hunter/agent.py class JobHunterAgent (line 139) | class JobHunterAgent: method __init__ (line 144) | def __init__(self, config=None): method _build_graph (line 158) | def _build_graph(self) -> GraphSpec: method _setup (line 185) | def _setup(self, mock_mode=False) -> None: method start (line 238) | async def start(self, mock_mode=False) -> None: method stop (line 245) | async def stop(self) -> None: method trigger_and_wait (line 251) | async def trigger_and_wait( method run (line 268) | async def run( method validate (line 281) | def validate(self): FILE: examples/templates/job_hunter/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/local_business_extractor/__main__.py function setup_logging (line 14) | def setup_logging(verbose=False, debug=False): function cli (line 28) | def cli(): function run (line 44) | def run(query, quiet, verbose, debug): function info (line 67) | def info(output_json): function validate (line 82) | def validate(): function shell (line 99) | def shell(verbose): function _interactive_shell (line 104) | async def _interactive_shell(verbose=False): FILE: examples/templates/local_business_extractor/agent.py class LocalBusinessExtractor (line 80) | class LocalBusinessExtractor: method __init__ (line 81) | def __init__(self, config=None): method _build_graph (line 95) | def _build_graph(self): method _setup (line 113) | def _setup(self): method start (line 151) | async def start(self): method stop (line 157) | async def stop(self): method run (line 162) | async def run(self, context, session_state=None): method info (line 172) | def info(self): method validate (line 190) | def validate(self): FILE: examples/templates/local_business_extractor/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/meeting_scheduler/__main__.py function setup_logging (line 11) | def setup_logging(verbose=False, debug=False): function cli (line 23) | def cli(): function run (line 35) | def run(attendee, duration, title, verbose): function tui (line 56) | def tui(): function info (line 106) | def info(): function validate (line 118) | def validate(): FILE: examples/templates/meeting_scheduler/agent.py class MeetingScheduler (line 120) | class MeetingScheduler: method __init__ (line 121) | def __init__(self, config=None): method _build_graph (line 135) | def _build_graph(self): method _setup (line 153) | def _setup(self): method start (line 192) | async def start(self): method stop (line 198) | async def stop(self): method trigger_and_wait (line 203) | async def trigger_and_wait( method run (line 214) | async def run(self, context, session_state=None): method info (line 224) | def info(self): method validate (line 238) | def validate(self): FILE: examples/templates/meeting_scheduler/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/meeting_scheduler/tests/conftest.py function agent_module (line 18) | def agent_module(): function runner_loaded (line 26) | def runner_loaded(): FILE: examples/templates/meeting_scheduler/tests/test_structure.py class TestGoalDefinition (line 16) | class TestGoalDefinition: method test_goal_exists (line 17) | def test_goal_exists(self): method test_success_criteria_weights_sum_to_one (line 23) | def test_success_criteria_weights_sum_to_one(self): class TestNodeStructure (line 28) | class TestNodeStructure: method test_three_nodes (line 29) | def test_three_nodes(self): method test_intake_is_client_facing (line 35) | def test_intake_is_client_facing(self): method test_schedule_has_required_tools (line 38) | def test_schedule_has_required_tools(self): method test_confirm_is_client_facing (line 48) | def test_confirm_is_client_facing(self): class TestEdgeStructure (line 52) | class TestEdgeStructure: method test_three_edges (line 53) | def test_three_edges(self): method test_linear_path (line 56) | def test_linear_path(self): method test_loop_back (line 62) | def test_loop_back(self): class TestGraphConfiguration (line 67) | class TestGraphConfiguration: method test_entry_node (line 68) | def test_entry_node(self): method test_entry_points (line 71) | def test_entry_points(self): method test_forever_alive (line 74) | def test_forever_alive(self): method test_conversation_mode (line 77) | def test_conversation_mode(self): method test_loop_config_valid (line 80) | def test_loop_config_valid(self): class TestAgentClass (line 86) | class TestAgentClass: method test_default_agent_created (line 87) | def test_default_agent_created(self): method test_validate_passes (line 90) | def test_validate_passes(self): method test_agent_info (line 95) | def test_agent_info(self): class TestRunnerLoad (line 101) | class TestRunnerLoad: method test_agent_runner_load_succeeds (line 102) | def test_agent_runner_load_succeeds(self, runner_loaded): FILE: examples/templates/sdr_agent/__main__.py function setup_logging (line 17) | def setup_logging(verbose=False, debug=False): function cli (line 31) | def cli(): function run (line 71) | def run(contacts, goal, background, max_contacts, mock, quiet, verbose, ... function tui (line 101) | def tui(mock, verbose, debug): function info (line 128) | def info(output_json): function validate (line 144) | def validate(): function shell (line 161) | def shell(verbose): function _interactive_shell (line 166) | async def _interactive_shell(verbose=False): FILE: examples/templates/sdr_agent/agent.py class SDRAgent (line 171) | class SDRAgent: method __init__ (line 187) | def __init__(self, config=None): method _build_graph (line 200) | def _build_graph(self) -> GraphSpec: method _setup (line 219) | def _setup(self, mock_mode=False) -> None: method start (line 279) | async def start(self, mock_mode=False) -> None: method stop (line 286) | async def stop(self) -> None: method trigger_and_wait (line 292) | async def trigger_and_wait( method run (line 310) | async def run( method info (line 323) | def info(self): method validate (line 342) | def validate(self): FILE: examples/templates/sdr_agent/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/sdr_agent/tools.py function _get_data_dir (line 54) | def _get_data_dir() -> str: function _load_contacts_from_file (line 70) | def _load_contacts_from_file(file_path: str) -> dict: function tool_executor (line 110) | def tool_executor(tool_use: ToolUse) -> ToolResult: FILE: examples/templates/tech_news_reporter/__main__.py function setup_logging (line 16) | def setup_logging(verbose=False, debug=False): function cli (line 30) | def cli(): function run (line 39) | def run(quiet, verbose, debug): function tui (line 63) | def tui(verbose, debug): function info (line 137) | def info(output_json): function validate (line 153) | def validate(): function shell (line 170) | def shell(verbose): function _interactive_shell (line 175) | async def _interactive_shell(verbose=False): FILE: examples/templates/tech_news_reporter/agent.py class TechNewsReporterAgent (line 118) | class TechNewsReporterAgent: method __init__ (line 125) | def __init__(self, config=None): method _build_graph (line 139) | def _build_graph(self) -> GraphSpec: method _setup (line 160) | def _setup(self) -> GraphExecutor: method start (line 198) | async def start(self) -> None: method stop (line 203) | async def stop(self) -> None: method trigger_and_wait (line 208) | async def trigger_and_wait( method run (line 228) | async def run(self, context: dict, session_state=None) -> ExecutionRes... method info (line 239) | def info(self): method validate (line 258) | def validate(self): FILE: examples/templates/tech_news_reporter/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/twitter_news_agent/__main__.py function setup_logging (line 14) | def setup_logging(verbose=False, debug=False): function cli (line 28) | def cli(): function run (line 44) | def run(handles, quiet, verbose, debug): function info (line 69) | def info(output_json): function validate (line 84) | def validate(): function shell (line 101) | def shell(verbose): function _interactive_shell (line 106) | async def _interactive_shell(verbose=False): FILE: examples/templates/twitter_news_agent/agent.py class TwitterNewsAgent (line 104) | class TwitterNewsAgent: method __init__ (line 105) | def __init__(self, config=None): method _build_graph (line 119) | def _build_graph(self): method _setup (line 137) | def _setup(self): method start (line 176) | async def start(self): method stop (line 182) | async def stop(self): method trigger_and_wait (line 187) | async def trigger_and_wait( method run (line 198) | async def run(self, context, session_state=None): method info (line 208) | def info(self): method validate (line 222) | def validate(self): FILE: examples/templates/twitter_news_agent/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: examples/templates/vulnerability_assessment/__main__.py function setup_logging (line 16) | def setup_logging(verbose=False, debug=False): function cli (line 30) | def cli(): function run (line 41) | def run(target, mock, quiet, verbose, debug): function tui (line 66) | def tui(mock, verbose, debug): function info (line 143) | def info(output_json): function validate (line 161) | def validate(): function shell (line 178) | def shell(verbose): function _interactive_shell (line 183) | async def _interactive_shell(verbose=False): FILE: examples/templates/vulnerability_assessment/agent.py class VulnerabilityResearcherAgent (line 172) | class VulnerabilityResearcherAgent: method __init__ (line 183) | def __init__(self, config=None): method _build_graph (line 197) | def _build_graph(self) -> GraphSpec: method _setup (line 225) | def _setup(self, mock_mode=False) -> GraphExecutor: method start (line 265) | async def start(self, mock_mode=False) -> None: method stop (line 270) | async def stop(self) -> None: method trigger_and_wait (line 275) | async def trigger_and_wait( method run (line 295) | async def run( method info (line 308) | def info(self): method validate (line 327) | def validate(self): FILE: examples/templates/vulnerability_assessment/config.py class AgentMetadata (line 11) | class AgentMetadata: FILE: scripts/auto-close-duplicates.test.ts function issue (line 177) | function issue(num: number, state = "open"): GitHubIssue { function comment (line 187) | function comment(body: string): GitHubComment { FILE: scripts/auto-close-duplicates.ts type GitHubIssue (line 9) | interface GitHubIssue { type GitHubComment (line 17) | interface GitHubComment { type GitHubReaction (line 24) | interface GitHubReaction { function githubRequest (line 29) | async function githubRequest( function isDupeComment (line 62) | function isDupeComment(comment: GitHubComment): boolean { function isDupeCommentOldEnough (line 70) | function isDupeCommentOldEnough( function authorDisagreedWithDupe (line 78) | function authorDisagreedWithDupe( function getLastDupeComment (line 88) | function getLastDupeComment( function extractDuplicateIssueNumber (line 95) | function extractDuplicateIssueNumber(commentBody: string): number | null { function decideAutoClose (line 116) | async function decideAutoClose( function closeIssueAsDuplicate (line 135) | async function closeIssueAsDuplicate( function autoCloseDuplicates (line 165) | async function autoCloseDuplicates(): Promise { FILE: scripts/bounty-tracker.ts type Contributor (line 26) | interface Contributor { type GitHubLabel (line 32) | interface GitHubLabel { type GitHubUser (line 36) | interface GitHubUser { type GitHubPR (line 40) | interface GitHubPR { type BountyResult (line 49) | interface BountyResult { type LeaderboardEntry (line 58) | interface LeaderboardEntry { constant POINTS (line 69) | const POINTS: Record = { function githubRequest (line 86) | async function githubRequest( function getPR (line 118) | async function getPR( function getMergedBountyPRs (line 130) | async function getMergedBountyPRs( function loadContributors (line 156) | async function loadContributors(): Promise> { function resolveDiscord (line 190) | function resolveDiscord( function extractBounty (line 202) | function extractBounty( function postToDiscord (line 232) | async function postToDiscord( function formatBountyNotification (line 253) | function formatBountyNotification(bounty: BountyResult): string { function formatLeaderboard (line 282) | function formatLeaderboard(entries: LeaderboardEntry[]): string { constant LURKR_BASE_URL (line 312) | const LURKR_BASE_URL = "https://api.lurkr.gg/v2"; type LurkrLevelResponse (line 314) | interface LurkrLevelResponse { function lurkrAddXP (line 322) | async function lurkrAddXP( function lurkrGetUser (line 348) | async function lurkrGetUser( function awardLurkrXP (line 371) | async function awardLurkrXP(bounty: BountyResult): Promise { function buildLeaderboard (line 401) | function buildLeaderboard( function main (line 430) | async function main() { FILE: scripts/check_llm_key.py function _extract_error_message (line 42) | def _extract_error_message(response: httpx.Response) -> str: function _sanitize_openrouter_model_id (line 65) | def _sanitize_openrouter_model_id(value: str) -> str: function _normalize_openrouter_model_id (line 78) | def _normalize_openrouter_model_id(value: str) -> str: function _extract_openrouter_model_lookup (line 83) | def _extract_openrouter_model_lookup(payload: object) -> dict[str, str]: function _format_openrouter_model_unavailable_message (line 114) | def _format_openrouter_model_unavailable_message( function check_anthropic (line 134) | def check_anthropic(api_key: str, **_: str) -> dict: function check_openai_compatible (line 155) | def check_openai_compatible(api_key: str, endpoint: str, name: str) -> d... function check_openrouter (line 171) | def check_openrouter( function check_openrouter_model (line 190) | def check_openrouter_model( function check_minimax (line 247) | def check_minimax( function check_anthropic_compatible (line 273) | def check_anthropic_compatible(api_key: str, endpoint: str, name: str) -... function check_gemini (line 294) | def check_gemini(api_key: str, **_: str) -> dict: function main (line 334) | def main() -> None: FILE: scripts/check_requirements.py function check_imports (line 21) | def check_imports(modules: list[str]) -> Dict[str, str]: function main (line 51) | def main(): FILE: scripts/debug_queen_prompt.py function print_planning_prompt (line 21) | def print_planning_prompt(worker_identity: str | None = None) -> None: function print_building_prompt (line 50) | def print_building_prompt(worker_identity: str | None = None) -> None: function print_staging_prompt (line 84) | def print_staging_prompt(worker_identity: str | None = None) -> None: function print_running_prompt (line 111) | def print_running_prompt(worker_identity: str | None = None) -> None: FILE: scripts/llm_debug_log_visualizer.py class SessionSummary (line 28) | class SessionSummary: function _parse_args (line 39) | def _parse_args() -> argparse.Namespace: function _safe_read_jsonl (line 81) | def _safe_read_jsonl(path: Path) -> list[dict[str, Any]]: function _discover_records (line 106) | def _discover_records(logs_dir: Path, limit_files: int) -> list[dict[str... function _format_timestamp (line 126) | def _format_timestamp(raw: str) -> str: function _is_test_session (line 135) | def _is_test_session(execution_id: str, records: list[dict[str, Any]]) -... function _group_sessions (line 154) | def _group_sessions( function _render_html (line 218) | def _render_html( function _sort_records (line 859) | def _sort_records(records: list[dict[str, Any]]) -> list[dict[str, Any]]: function _run_server (line 866) | def _run_server( function main (line 917) | def main() -> int: FILE: scripts/test_check_requirements.py function test_check_requirements (line 11) | def test_check_requirements(): FILE: tools/coder_tools_server.py function setup_logger (line 35) | def setup_logger(): function _patched_console_init (line 52) | def _patched_console_init(self, *args, **kwargs): function _find_project_root (line 76) | def _find_project_root() -> str: function _resolve_path (line 85) | def _resolve_path(path: str) -> str: function _snapshot_git (line 144) | def _snapshot_git(*args: str) -> str: function _ensure_snapshot_repo (line 153) | def _ensure_snapshot_repo(): function _take_snapshot (line 169) | def _take_snapshot() -> str: function _translate_command_for_windows (line 186) | def _translate_command_for_windows(command: str) -> str: function run_command (line 218) | def run_command(command: str, cwd: str = "", timeout: int = 120) -> str: function undo_changes (line 297) | def undo_changes(path: str = "") -> str: function list_agent_tools (line 354) | def list_agent_tools( function _validate_agent_tools_impl (line 754) | def _validate_agent_tools_impl(agent_path: str) -> dict: function validate_agent_tools (line 886) | def validate_agent_tools(agent_path: str) -> str: function list_agents (line 906) | def list_agents() -> str: function _resolve_hive_agent_path (line 995) | def _resolve_hive_agent_path(agent_name: str) -> Path: function _read_session_json (line 1000) | def _read_session_json(path: Path) -> dict | None: function _scan_agent_sessions (line 1010) | def _scan_agent_sessions(agent_dir: Path) -> list[tuple[str, Path]]: function _truncate_value (line 1025) | def _truncate_value(value: object, max_len: int = _MAX_TRUNCATE_LEN) -> ... function list_agent_sessions (line 1034) | def list_agent_sessions( function list_agent_checkpoints (line 1112) | def list_agent_checkpoints( function get_agent_checkpoint (line 1184) | def get_agent_checkpoint( function _run_agent_tests_impl (line 1229) | def _run_agent_tests_impl( function run_agent_tests (line 1403) | def run_agent_tests( function validate_agent_package (line 1429) | def validate_agent_package(agent_name: str) -> str: function _snake_to_camel (line 1683) | def _snake_to_camel(name: str) -> str: function _node_var_name (line 1688) | def _node_var_name(node_id: str) -> str: function initialize_and_build_agent (line 1694) | def initialize_and_build_agent( function main (line 2383) | def main() -> None: FILE: tools/create_aden_testdb.py function execute_sql_file (line 25) | def execute_sql_file(): FILE: tools/files_server.py function setup_logger (line 26) | def setup_logger() -> None: function _patched_console_init (line 45) | def _patched_console_init(self, *args, **kwargs): function main (line 62) | def main() -> None: FILE: tools/grant_permissions.py function grant_permissions (line 14) | def grant_permissions(): FILE: tools/init_aden_testdb.sql type Departments (line 37) | CREATE TABLE Departments ( type Employees (line 62) | CREATE TABLE Employees ( type IX_Employees_LastName (line 83) | CREATE INDEX IX_Employees_LastName ON Employees(last_name) type IX_Employees_Email (line 84) | CREATE INDEX IX_Employees_Email ON Employees(email) FILE: tools/mcp_server.py function setup_logger (line 39) | def setup_logger(): function _patched_console_init (line 60) | def _patched_console_init(self, *args, **kwargs): function health_check (line 94) | async def health_check(request: Request) -> PlainTextResponse: function index (line 100) | async def index(request: Request) -> PlainTextResponse: function main (line 105) | def main() -> None: FILE: tools/payroll_analysis.py function main (line 26) | def main(): FILE: tools/query_avg_salary.py function main (line 25) | def main(): FILE: tools/src/aden_tools/__init__.py function __getattr__ (line 31) | def __getattr__(name: str): FILE: tools/src/aden_tools/_win32_atomic.py function snapshot_dacl (line 53) | def snapshot_dacl(path: str) -> ctypes.Array | None: function atomic_replace (line 80) | def atomic_replace(target: str, replacement: str) -> None: FILE: tools/src/aden_tools/credentials/base.py class CredentialSpec (line 22) | class CredentialSpec: class CredentialError (line 77) | class CredentialError(Exception): class CredentialManager (line 83) | class CredentialManager: method __init__ (line 103) | def __init__( method for_testing (line 137) | def for_testing( method _get_raw (line 161) | def _get_raw(self, name: str) -> str | None: method _read_from_dotenv (line 185) | def _read_from_dotenv(self, env_var: str) -> str | None: method get (line 199) | def get(self, name: str) -> str | None: method get_spec (line 222) | def get_spec(self, name: str) -> CredentialSpec: method is_available (line 228) | def is_available(self, name: str) -> bool: method get_credential_for_tool (line 233) | def get_credential_for_tool(self, tool_name: str) -> str | None: method get_missing_for_tools (line 245) | def get_missing_for_tools(self, tool_names: list[str]) -> list[tuple[s... method validate_for_tools (line 274) | def validate_for_tools(self, tool_names: list[str]) -> None: method _format_missing_error (line 294) | def _format_missing_error( method get_missing_for_node_types (line 319) | def get_missing_for_node_types(self, node_types: list[str]) -> list[tu... method validate_for_node_types (line 348) | def validate_for_node_types(self, node_types: list[str]) -> None: method _format_missing_node_type_error (line 368) | def _format_missing_node_type_error( method validate_startup (line 393) | def validate_startup(self) -> None: method _format_startup_error (line 416) | def _format_startup_error( method get_auth_options (line 435) | def get_auth_options(self, credential_name: str) -> list[str]: method get_setup_instructions (line 463) | def get_setup_instructions(self, credential_name: str) -> dict: FILE: tools/src/aden_tools/credentials/browser.py function open_browser (line 15) | def open_browser(url: str) -> tuple[bool, str]: function get_aden_auth_url (line 80) | def get_aden_auth_url(provider_name: str, base_url: str = "https://hive.... function get_aden_setup_url (line 94) | def get_aden_setup_url(base_url: str = "https://hive.adenhq.com") -> str: FILE: tools/src/aden_tools/credentials/health_check.py class HealthCheckResult (line 19) | class HealthCheckResult: class CredentialHealthChecker (line 32) | class CredentialHealthChecker(Protocol): method check (line 35) | def check(self, credential_value: str) -> HealthCheckResult: class HubSpotHealthChecker (line 48) | class HubSpotHealthChecker: method check (line 54) | def check(self, access_token: str) -> HealthCheckResult: class ZohoCRMHealthChecker (line 108) | class ZohoCRMHealthChecker: method check (line 113) | def check(self, access_token: str) -> HealthCheckResult: class BraveSearchHealthChecker (line 174) | class BraveSearchHealthChecker: method check (line 180) | def check(self, api_key: str) -> HealthCheckResult: class OAuthBearerHealthChecker (line 232) | class OAuthBearerHealthChecker: method __init__ (line 243) | def __init__(self, endpoint: str, service_name: str = "Service"): method _extract_identity (line 247) | def _extract_identity(self, data: dict) -> dict[str, str]: method check (line 251) | def check(self, access_token: str) -> HealthCheckResult: class BaseHttpHealthChecker (line 309) | class BaseHttpHealthChecker: method _build_url (line 357) | def _build_url(self, credential_value: str) -> str: method _build_headers (line 361) | def _build_headers(self, credential_value: str) -> dict[str, str]: method _build_params (line 372) | def _build_params(self, credential_value: str) -> dict[str, str]: method _build_auth (line 378) | def _build_auth(self, credential_value: str) -> tuple[str, str] | None: method _build_json_body (line 384) | def _build_json_body(self, credential_value: str) -> dict | None: method _extract_identity (line 388) | def _extract_identity(self, data: dict) -> dict[str, str]: method _interpret_response (line 392) | def _interpret_response(self, response: httpx.Response) -> HealthCheck... method check (line 439) | def check(self, credential_value: str) -> HealthCheckResult: class GoogleHealthChecker (line 481) | class GoogleHealthChecker: method check (line 491) | def check(self, access_token: str) -> HealthCheckResult: class GoogleSearchHealthChecker (line 560) | class GoogleSearchHealthChecker: method check (line 566) | def check(self, api_key: str, cse_id: str | None = None) -> HealthChec... class SlackHealthChecker (line 629) | class SlackHealthChecker: method check (line 635) | def check(self, bot_token: str) -> HealthCheckResult: class CalendlyHealthChecker (line 689) | class CalendlyHealthChecker: method check (line 695) | def check(self, pat: str) -> HealthCheckResult: class GitHubHealthChecker (line 750) | class GitHubHealthChecker: method check (line 756) | def check(self, token: str) -> HealthCheckResult: class DiscordHealthChecker (line 811) | class DiscordHealthChecker: method check (line 817) | def check(self, bot_token: str) -> HealthCheckResult: class ResendHealthChecker (line 871) | class ResendHealthChecker: method check (line 877) | def check(self, api_key: str) -> HealthCheckResult: class GoogleMapsHealthChecker (line 928) | class GoogleMapsHealthChecker: method check (line 934) | def check(self, api_key: str) -> HealthCheckResult: class LushaHealthChecker (line 995) | class LushaHealthChecker: method check (line 1001) | def check(self, api_key: str) -> HealthCheckResult: class StripeHealthChecker (line 1053) | class StripeHealthChecker(BaseHttpHealthChecker): class ExaSearchHealthChecker (line 1060) | class ExaSearchHealthChecker(BaseHttpHealthChecker): method _build_json_body (line 1067) | def _build_json_body(self, credential_value: str) -> dict: class CalcomHealthChecker (line 1071) | class CalcomHealthChecker(BaseHttpHealthChecker): class SerpApiHealthChecker (line 1080) | class SerpApiHealthChecker(BaseHttpHealthChecker): class ApolloHealthChecker (line 1089) | class ApolloHealthChecker(BaseHttpHealthChecker): class TelegramHealthChecker (line 1098) | class TelegramHealthChecker(BaseHttpHealthChecker): method _build_url (line 1104) | def _build_url(self, credential_value: str) -> str: method _build_headers (line 1107) | def _build_headers(self, credential_value: str) -> dict[str, str]: method _interpret_response (line 1110) | def _interpret_response(self, response: httpx.Response) -> HealthCheck... class NewsdataHealthChecker (line 1147) | class NewsdataHealthChecker(BaseHttpHealthChecker): method _build_params (line 1155) | def _build_params(self, credential_value: str) -> dict[str, str]: class FinlightHealthChecker (line 1161) | class FinlightHealthChecker(BaseHttpHealthChecker): class BrevoHealthChecker (line 1168) | class BrevoHealthChecker(BaseHttpHealthChecker): method _extract_identity (line 1177) | def _extract_identity(self, data: dict) -> dict[str, str]: class IntercomHealthChecker (line 1186) | class IntercomHealthChecker(OAuthBearerHealthChecker): method __init__ (line 1189) | def __init__(self): class ApifyHealthChecker (line 1199) | class ApifyHealthChecker(BaseHttpHealthChecker): class AsanaHealthChecker (line 1204) | class AsanaHealthChecker(BaseHttpHealthChecker): class AttioHealthChecker (line 1209) | class AttioHealthChecker(BaseHttpHealthChecker): class DockerHubHealthChecker (line 1214) | class DockerHubHealthChecker(BaseHttpHealthChecker): class GoogleSearchConsoleHealthChecker (line 1219) | class GoogleSearchConsoleHealthChecker(BaseHttpHealthChecker): class HuggingFaceHealthChecker (line 1224) | class HuggingFaceHealthChecker(BaseHttpHealthChecker): class LinearHealthChecker (line 1229) | class LinearHealthChecker(BaseHttpHealthChecker): class MicrosoftGraphHealthChecker (line 1234) | class MicrosoftGraphHealthChecker(BaseHttpHealthChecker): class PineconeHealthChecker (line 1239) | class PineconeHealthChecker(BaseHttpHealthChecker): class VercelHealthChecker (line 1244) | class VercelHealthChecker(BaseHttpHealthChecker): class GitLabHealthChecker (line 1252) | class GitLabHealthChecker(BaseHttpHealthChecker): class NotionHealthChecker (line 1260) | class NotionHealthChecker(BaseHttpHealthChecker): method _build_headers (line 1264) | def _build_headers(self, credential_value: str) -> dict[str, str]: class GreenhouseHealthChecker (line 1273) | class GreenhouseHealthChecker(BaseHttpHealthChecker): class PipedriveHealthChecker (line 1282) | class PipedriveHealthChecker(BaseHttpHealthChecker): class TrelloKeyHealthChecker (line 1289) | class TrelloKeyHealthChecker(BaseHttpHealthChecker): class TrelloTokenHealthChecker (line 1296) | class TrelloTokenHealthChecker(BaseHttpHealthChecker): class YouTubeHealthChecker (line 1303) | class YouTubeHealthChecker(BaseHttpHealthChecker): function check_credential_health (line 1354) | def check_credential_health( function validate_integration_wiring (line 1407) | def validate_integration_wiring(credential_name: str) -> list[str]: FILE: tools/src/aden_tools/credentials/shell_config.py function detect_shell (line 18) | def detect_shell() -> ShellType: function get_shell_config_path (line 44) | def get_shell_config_path(shell_type: ShellType | None = None) -> Path: function check_env_var_in_shell_config (line 68) | def check_env_var_in_shell_config( function add_env_var_to_shell_config (line 105) | def add_env_var_to_shell_config( function remove_env_var_from_shell_config (line 161) | def remove_env_var_from_shell_config( function get_shell_source_command (line 218) | def get_shell_source_command(shell_type: ShellType | None = None) -> str: FILE: tools/src/aden_tools/credentials/store_adapter.py class CredentialStoreAdapter (line 37) | class CredentialStoreAdapter: method __init__ (line 56) | def __init__( method get (line 88) | def get(self, name: str, account: str | None = None) -> str | None: method get_spec (line 123) | def get_spec(self, name: str) -> CredentialSpec: method is_available (line 129) | def is_available(self, name: str) -> bool: method get_credential_for_tool (line 134) | def get_credential_for_tool(self, tool_name: str) -> str | None: method get_missing_for_tools (line 146) | def get_missing_for_tools(self, tool_names: list[str]) -> list[tuple[s... method validate_for_tools (line 173) | def validate_for_tools(self, tool_names: list[str]) -> None: method get_missing_for_node_types (line 187) | def get_missing_for_node_types(self, node_types: list[str]) -> list[tu... method validate_for_node_types (line 206) | def validate_for_node_types(self, node_types: list[str]) -> None: method validate_startup (line 220) | def validate_startup(self) -> None: method get_key (line 238) | def get_key(self, credential_id: str, key_name: str) -> str | None: method resolve (line 251) | def resolve(self, template: str) -> str: method resolve_headers (line 267) | def resolve_headers(self, headers: dict[str, str]) -> dict[str, str]: method resolve_params (line 285) | def resolve_params(self, params: dict[str, str]) -> dict[str, str]: method list_accounts (line 289) | def list_accounts(self, provider_name: str) -> list[dict]: method get_all_account_info (line 293) | def get_all_account_info(self) -> list[dict]: method get_tool_provider_map (line 324) | def get_tool_provider_map(self) -> dict[str, str]: method get_by_alias (line 333) | def get_by_alias(self, provider_name: str, alias: str) -> str | None: method get_by_identity (line 338) | def get_by_identity(self, provider_name: str, label: str) -> str | None: method list_local_accounts (line 344) | def list_local_accounts(self, credential_id: str | None = None) -> lis... method activate_local_account (line 362) | def activate_local_account(self, credential_id: str, alias: str) -> bool: method store (line 395) | def store(self) -> CredentialStore: method _format_missing_error (line 401) | def _format_missing_error( method _format_missing_node_type_error (line 425) | def _format_missing_node_type_error( method _format_startup_error (line 449) | def _format_startup_error( method default (line 471) | def default( method for_testing (line 571) | def for_testing( method with_env_storage (line 600) | def with_env_storage( FILE: tools/src/aden_tools/file_ops.py function _default_resolve_path (line 112) | def _default_resolve_path(p: str) -> str: function _is_binary (line 117) | def _is_binary(filepath: str) -> bool: function _levenshtein (line 133) | def _levenshtein(a: str, b: str) -> int: function _similarity (line 154) | def _similarity(a: str, b: str) -> float: function _fuzzy_find_candidates (line 161) | def _fuzzy_find_candidates(content: str, old_text: str): function _compute_diff (line 232) | def _compute_diff(old: str, new: str, path: str) -> str: function register_file_tools (line 246) | def register_file_tools( FILE: tools/src/aden_tools/hashline.py function compute_line_hash (line 22) | def compute_line_hash(line: str) -> str: function format_hashlines (line 39) | def format_hashlines(lines: list[str], offset: int = 1, limit: int = 0) ... function parse_anchor (line 68) | def parse_anchor(anchor: str) -> tuple[int, str]: function validate_anchor (line 92) | def validate_anchor(anchor: str, lines: list[str]) -> str | None: function strip_content_prefixes (line 127) | def strip_content_prefixes(lines: list[str]) -> list[str]: function whitespace_equal (line 146) | def whitespace_equal(a: str, b: str) -> bool: function strip_insert_echo (line 151) | def strip_insert_echo( function strip_boundary_echo (line 178) | def strip_boundary_echo( function maybe_strip (line 221) | def maybe_strip(new_lines, strip_fn, action_name, auto_cleanup, cleanup_... FILE: tools/src/aden_tools/tools/__init__.py function _register_verified (line 144) | def _register_verified( function _register_unverified (line 226) | def _register_unverified( function register_all_tools (line 300) | def register_all_tools( FILE: tools/src/aden_tools/tools/account_info_tool/account_info_tool.py function register_tools (line 13) | def register_tools( FILE: tools/src/aden_tools/tools/airtable_tool/airtable_tool.py function _get_headers (line 18) | def _get_headers() -> dict | None: function _get (line 29) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _post (line 37) | def _post(url: str, headers: dict, body: dict) -> dict: function _patch (line 45) | def _patch(url: str, headers: dict, body: dict) -> dict: function _delete (line 53) | def _delete(url: str, headers: dict, params: dict | None = None) -> dict: function register_tools (line 63) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/apify_tool/apify_tool.py function _get_token (line 26) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 32) | def _headers(token: str) -> dict[str, str]: function _get (line 36) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _post (line 54) | def _post(endpoint: str, token: str, body: dict | None = None) -> dict[s... function _auth_error (line 70) | def _auth_error() -> dict[str, Any]: function register_tools (line 77) | def register_tools( FILE: tools/src/aden_tools/tools/apollo_tool/apollo_tool.py class _ApolloClient (line 30) | class _ApolloClient: method __init__ (line 33) | def __init__(self, api_key: str): method _headers (line 37) | def _headers(self) -> dict[str, str]: method _handle_response (line 45) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method enrich_person (line 72) | def enrich_person( method enrich_company (line 146) | def enrich_company(self, domain: str) -> dict[str, Any]: method search_people (line 198) | def search_people( method get_person_activities (line 272) | def get_person_activities( method list_email_accounts (line 305) | def list_email_accounts(self) -> dict[str, Any]: method bulk_enrich_people (line 333) | def bulk_enrich_people( method search_companies (line 368) | def search_companies( function register_tools (line 427) | def register_tools( FILE: tools/src/aden_tools/tools/arxiv_tool/arxiv_tool.py function register_tools (line 22) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/asana_tool/asana_tool.py function _get_token (line 25) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 31) | def _headers(token: str) -> dict[str, str]: function _get (line 35) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _post (line 55) | def _post(endpoint: str, token: str, body: dict | None = None) -> dict[s... function _put (line 74) | def _put(endpoint: str, token: str, body: dict | None = None) -> dict[st... function _auth_error (line 93) | def _auth_error() -> dict[str, Any]: function register_tools (line 100) | def register_tools( FILE: tools/src/aden_tools/tools/attio_tool/attio_tool.py class _AttioClient (line 26) | class _AttioClient: method __init__ (line 29) | def __init__(self, api_key: str): method _headers (line 33) | def _headers(self) -> dict[str, str]: method _request (line 40) | def _request( method _handle_response (line 58) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method list_records (line 79) | def list_records( method get_record (line 102) | def get_record(self, object_handle: str, record_id: str) -> dict[str, ... method create_record (line 109) | def create_record( method update_record (line 121) | def update_record( method assert_record (line 136) | def assert_record( method list_lists (line 156) | def list_lists(self) -> dict[str, Any]: method get_entries (line 166) | def get_entries( method create_entry (line 189) | def create_entry( method delete_entry (line 211) | def delete_entry(self, list_id: str, entry_id: str) -> dict[str, Any]: method create_task (line 217) | def create_task( method list_tasks (line 243) | def list_tasks(self, limit: int = 50, offset: int = 0) -> dict[str, Any]: method get_task (line 254) | def get_task(self, task_id: str) -> dict[str, Any]: method delete_task (line 261) | def delete_task(self, task_id: str) -> dict[str, Any]: method list_members (line 267) | def list_members(self) -> dict[str, Any]: method get_member (line 277) | def get_member(self, member_id: str) -> dict[str, Any]: function register_tools (line 285) | def register_tools( FILE: tools/src/aden_tools/tools/attio_tool/tests/test_attio_tool.py class TestAttioClient (line 28) | class TestAttioClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 38) | def test_handle_response_success(self): method test_handle_response_204_no_content (line 45) | def test_handle_response_204_no_content(self): method test_handle_response_errors (line 59) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 66) | def test_handle_response_generic_error(self): method test_handle_response_generic_error_no_json (line 74) | def test_handle_response_generic_error_no_json(self): method test_request_get (line 84) | def test_request_get(self, mock_request): method test_request_post_with_body (line 103) | def test_request_post_with_body(self, mock_request): method test_request_with_params (line 117) | def test_request_with_params(self, mock_request): method test_list_records (line 132) | def test_list_records(self, mock_request): method test_list_records_with_filter (line 149) | def test_list_records_with_filter(self, mock_request): method test_list_records_error (line 163) | def test_list_records_error(self, mock_request): method test_get_record (line 172) | def test_get_record(self, mock_request): method test_create_record (line 188) | def test_create_record(self, mock_request): method test_update_record (line 207) | def test_update_record(self, mock_request): method test_assert_record (line 224) | def test_assert_record(self, mock_request): method test_list_lists (line 240) | def test_list_lists(self, mock_request): method test_get_entries (line 252) | def test_get_entries(self, mock_request): method test_create_entry (line 264) | def test_create_entry(self, mock_request): method test_create_entry_with_values (line 279) | def test_create_entry_with_values(self, mock_request): method test_delete_entry (line 293) | def test_delete_entry(self, mock_request): method test_create_task (line 305) | def test_create_task(self, mock_request): method test_list_tasks (line 327) | def test_list_tasks(self, mock_request): method test_get_task (line 339) | def test_get_task(self, mock_request): method test_delete_task (line 350) | def test_delete_task(self, mock_request): method test_list_members (line 362) | def test_list_members(self, mock_request): method test_get_member (line 379) | def test_get_member(self, mock_request): class TestToolRegistration (line 395) | class TestToolRegistration: method setup_method (line 396) | def setup_method(self): method test_tool_count (line 402) | def test_tool_count(self): method test_all_tool_names_registered (line 408) | def test_all_tool_names_registered(self): class TestCredentialRetrieval (line 432) | class TestCredentialRetrieval: method test_credential_from_env (line 433) | def test_credential_from_env(self, monkeypatch): method test_no_credentials_returns_error (line 450) | def test_no_credentials_returns_error(self, monkeypatch): method test_credential_from_store (line 463) | def test_credential_from_store(self, monkeypatch): class TestToolErrorHandling (line 487) | class TestToolErrorHandling: method setup_method (line 488) | def setup_method(self): method test_timeout_error (line 495) | def test_timeout_error(self, mock_request, monkeypatch): method test_network_error (line 510) | def test_network_error(self, mock_request, monkeypatch): class TestRecordTools (line 528) | class TestRecordTools: method test_record_list (line 530) | def test_record_list(self, mock_request, monkeypatch): method test_record_list_with_filter_json (line 547) | def test_record_list_with_filter_json(self, mock_request, monkeypatch): method test_record_list_invalid_filter_json (line 566) | def test_record_list_invalid_filter_json(self, monkeypatch): method test_record_get (line 579) | def test_record_get(self, mock_request, monkeypatch): method test_record_create (line 596) | def test_record_create(self, mock_request, monkeypatch): method test_record_update (line 616) | def test_record_update(self, mock_request, monkeypatch): method test_record_assert (line 637) | def test_record_assert(self, mock_request, monkeypatch): class TestListTools (line 661) | class TestListTools: method test_list_lists (line 663) | def test_list_lists(self, mock_request, monkeypatch): method test_list_entries_get (line 680) | def test_list_entries_get(self, mock_request, monkeypatch): method test_list_entry_create (line 697) | def test_list_entry_create(self, mock_request, monkeypatch): method test_list_entry_delete (line 714) | def test_list_entry_delete(self, mock_request, monkeypatch): class TestTaskTools (line 733) | class TestTaskTools: method test_task_create (line 735) | def test_task_create(self, mock_request, monkeypatch): method test_task_list (line 752) | def test_task_list(self, mock_request, monkeypatch): method test_task_get (line 769) | def test_task_get(self, mock_request, monkeypatch): method test_task_delete (line 786) | def test_task_delete(self, mock_request, monkeypatch): class TestMemberTools (line 805) | class TestMemberTools: method test_members_list (line 807) | def test_members_list(self, mock_request, monkeypatch): method test_member_get (line 824) | def test_member_get(self, mock_request, monkeypatch): FILE: tools/src/aden_tools/tools/aws_s3_tool/aws_s3_tool.py function _get_config (line 23) | def _get_config() -> tuple[str, str, str] | dict: function _sign (line 36) | def _sign(key: bytes, msg: str) -> bytes: function _get_signing_key (line 40) | def _get_signing_key(secret_key: str, datestamp: str, region: str) -> by... function _sign_request (line 47) | def _sign_request( function _s3_request (line 101) | def _s3_request( function _parse_xml (line 129) | def _parse_xml(text: str, ns: str = "") -> ET.Element: function register_tools (line 142) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/azure_sql_tool/azure_sql_tool.py function _get_config (line 19) | def _get_config() -> tuple[dict, str] | dict: function _get (line 32) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _extract_server (line 43) | def _extract_server(s: dict) -> dict: function _extract_database (line 57) | def _extract_database(d: dict) -> dict: function register_tools (line 76) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/bigquery_tool/bigquery_tool.py function _is_read_only_query (line 43) | def _is_read_only_query(sql: str) -> bool: function _format_schema (line 61) | def _format_schema(schema: list) -> list[dict[str, str]]: function _create_bigquery_client (line 73) | def _create_bigquery_client(project_id: str | None = None) -> Any: function register_tools (line 103) | def register_tools( FILE: tools/src/aden_tools/tools/brevo_tool/brevo_tool.py class _BrevoClient (line 24) | class _BrevoClient: method __init__ (line 27) | def __init__(self, api_key: str): method _headers (line 31) | def _headers(self) -> dict[str, str]: method _handle_response (line 38) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method send_email (line 54) | def send_email( method send_sms (line 82) | def send_sms( method create_contact (line 102) | def create_contact( method get_contact (line 134) | def get_contact(self, email: str) -> dict[str, Any]: method update_contact (line 143) | def update_contact( method get_email_stats (line 172) | def get_email_stats(self, message_id: str) -> dict[str, Any]: method list_contacts (line 181) | def list_contacts( method delete_contact (line 199) | def delete_contact(self, email: str) -> dict[str, Any]: method list_email_campaigns (line 208) | def list_email_campaigns( function register_tools (line 227) | def register_tools( FILE: tools/src/aden_tools/tools/calcom_tool/calcom_tool.py class _CalcomClient (line 27) | class _CalcomClient: method __init__ (line 30) | def __init__(self, api_key: str): method _headers (line 34) | def _headers(self) -> dict[str, str]: method _get_params (line 40) | def _get_params(self, params: dict[str, Any] | None = None) -> dict[st... method _handle_response (line 47) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method list_bookings (line 65) | def list_bookings( method get_booking (line 92) | def get_booking(self, booking_id: int) -> dict[str, Any]: method create_booking (line 102) | def create_booking( method cancel_booking (line 140) | def cancel_booking( method get_availability (line 160) | def get_availability( method list_schedules (line 183) | def list_schedules(self) -> dict[str, Any]: method update_schedule (line 193) | def update_schedule( method list_event_types (line 218) | def list_event_types(self) -> dict[str, Any]: method get_event_type (line 228) | def get_event_type(self, event_type_id: int) -> dict[str, Any]: function register_tools (line 239) | def register_tools( FILE: tools/src/aden_tools/tools/calendar_tool/calendar_tool.py function _create_lifecycle_manager (line 39) | def _create_lifecycle_manager( function register_tools (line 55) | def register_tools( FILE: tools/src/aden_tools/tools/calendly_tool/calendly_tool.py function _get_headers (line 18) | def _get_headers() -> dict | None: function _get (line 29) | def _get(path: str, headers: dict, params: dict | None = None) -> dict: function _post (line 37) | def _post(path: str, headers: dict, body: dict) -> dict: function register_tools (line 47) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/cloudinary_tool/cloudinary_tool.py function _get_credentials (line 25) | def _get_credentials( function _base_url (line 41) | def _base_url(cloud_name: str) -> str: function _auth_header (line 45) | def _auth_header(api_key: str, api_secret: str) -> str: function _request (line 50) | def _request(method: str, url: str, api_key: str, api_secret: str, **kwa... function _auth_error (line 72) | def _auth_error() -> dict[str, Any]: function register_tools (line 79) | def register_tools( FILE: tools/src/aden_tools/tools/confluence_tool/confluence_tool.py function _get_credentials (line 25) | def _get_credentials( function _base_url (line 41) | def _base_url(domain: str) -> str: function _auth_header (line 47) | def _auth_header(email: str, token: str) -> str: function _request (line 52) | def _request(method: str, url: str, email: str, token: str, **kwargs: An... function _auth_error (line 81) | def _auth_error() -> dict[str, Any]: function register_tools (line 88) | def register_tools( FILE: tools/src/aden_tools/tools/csv_tool/csv_tool.py function register_tools (line 11) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/databricks_tool/databricks_mcp_tool.py function _get_mcp_client (line 29) | def _get_mcp_client(server_url: str, host: str | None, token: str | None... function register_mcp_tools (line 63) | def register_mcp_tools( FILE: tools/src/aden_tools/tools/databricks_tool/databricks_tool.py function _get_config (line 25) | def _get_config(credentials: CredentialStoreAdapter | None) -> tuple[str... function _headers (line 35) | def _headers(token: str) -> dict[str, str]: function _get (line 39) | def _get(host: str, endpoint: str, token: str, params: dict | None = Non... function _post (line 57) | def _post(host: str, endpoint: str, token: str, body: dict | None = None... function _auth_error (line 75) | def _auth_error() -> dict[str, Any]: function register_tools (line 85) | def register_tools( FILE: tools/src/aden_tools/tools/discord_tool/discord_tool.py class _DiscordClient (line 30) | class _DiscordClient: method __init__ (line 33) | def __init__(self, bot_token: str): method _headers (line 37) | def _headers(self) -> dict[str, str]: method _request_with_retry (line 43) | def _request_with_retry( method _handle_response (line 64) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method list_guilds (line 93) | def list_guilds(self) -> dict[str, Any]: method list_channels (line 97) | def list_channels(self, guild_id: str, text_only: bool = True) -> dict... method send_message (line 106) | def send_message( method get_messages (line 121) | def get_messages( method get_channel (line 140) | def get_channel(self, channel_id: str) -> dict[str, Any]: method create_reaction (line 147) | def create_reaction( method delete_message (line 166) | def delete_message( function register_tools (line 181) | def register_tools( FILE: tools/src/aden_tools/tools/dns_security_scanner/dns_security_scanner.py function register_tools (line 29) | def register_tools(mcp: FastMCP) -> None: function _check_spf (line 94) | def _check_spf(resolver: dns.resolver.Resolver, domain: str) -> dict: function _check_dmarc (line 140) | def _check_dmarc(resolver: dns.resolver.Resolver, domain: str) -> dict: function _check_dkim (line 181) | def _check_dkim(resolver: dns.resolver.Resolver, domain: str) -> dict: function _check_dnssec (line 200) | def _check_dnssec(resolver: dns.resolver.Resolver, domain: str) -> dict: function _check_mx (line 219) | def _check_mx(resolver: dns.resolver.Resolver, domain: str) -> list[str]: function _check_caa (line 228) | def _check_caa(resolver: dns.resolver.Resolver, domain: str) -> list[str]: function _check_zone_transfer (line 237) | def _check_zone_transfer(resolver: dns.resolver.Resolver, domain: str) -... FILE: tools/src/aden_tools/tools/docker_hub_tool/docker_hub_tool.py function _get_token (line 26) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 32) | def _headers(token: str) -> dict[str, str]: function _get (line 36) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _delete (line 54) | def _delete(endpoint: str, token: str) -> dict[str, Any]: function _auth_error (line 72) | def _auth_error() -> dict[str, Any]: function register_tools (line 79) | def register_tools( FILE: tools/src/aden_tools/tools/duckduckgo_tool/duckduckgo_tool.py function register_tools (line 20) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/email_tool/email_tool.py function register_tools (line 22) | def register_tools( FILE: tools/src/aden_tools/tools/exa_search_tool/exa_search_tool.py function register_tools (line 30) | def register_tools( FILE: tools/src/aden_tools/tools/example_tool/example_tool.py function register_tools (line 12) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/excel_tool/excel_tool.py function register_tools (line 12) | def register_tools(mcp: FastMCP) -> None: function _convert_cell_value (line 792) | def _convert_cell_value(value: Any) -> Any: FILE: tools/src/aden_tools/tools/file_system_toolkits/apply_diff/apply_diff.py function register_tools (line 9) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/apply_patch/apply_patch.py function register_tools (line 9) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/command_sanitizer.py class CommandBlockedError (line 20) | class CommandBlockedError(Exception): function _normalize_executable_name (line 140) | def _normalize_executable_name(token: str) -> str: function _extract_executable (line 149) | def _extract_executable(segment: str) -> str: function validate_command (line 165) | def validate_command(command: str) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/data_tools/data_tools.py function register_tools (line 20) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/execute_command_tool/execute_command_tool.py function register_tools (line 10) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/grep_search/grep_search.py function register_tools (line 11) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/hashline_edit/hashline_edit.py function register_tools (line 24) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/list_dir/list_dir.py function register_tools (line 8) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/replace_file_content/replace_file_content.py function register_tools (line 8) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/file_system_toolkits/security.py function get_secure_path (line 7) | def get_secure_path(path: str, workspace_id: str, agent_id: str, session... FILE: tools/src/aden_tools/tools/github_tool/github_tool.py function _sanitize_path_param (line 25) | def _sanitize_path_param(param: str, param_name: str = "parameter") -> str: function _sanitize_error_message (line 44) | def _sanitize_error_message(error: Exception) -> str: class _GitHubClient (line 64) | class _GitHubClient: method __init__ (line 67) | def __init__(self, token: str): method _headers (line 71) | def _headers(self) -> dict[str, str]: method _handle_response (line 78) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method list_repos (line 106) | def list_repos( method get_repo (line 134) | def get_repo( method search_repos (line 149) | def search_repos( method list_issues (line 173) | def list_issues( method get_issue (line 198) | def get_issue( method create_issue (line 214) | def create_issue( method update_issue (line 242) | def update_issue( method list_pull_requests (line 275) | def list_pull_requests( method get_pull_request (line 300) | def get_pull_request( method create_pull_request (line 316) | def create_pull_request( method search_code (line 348) | def search_code( method list_branches (line 369) | def list_branches( method get_branch (line 390) | def get_branch( method list_stargazers (line 409) | def list_stargazers( method get_user_profile (line 434) | def get_user_profile( method get_user_emails (line 447) | def get_user_emails( method list_commits (line 492) | def list_commits( method create_release (line 528) | def create_release( method list_workflow_runs (line 567) | def list_workflow_runs( function register_tools (line 602) | def register_tools( FILE: tools/src/aden_tools/tools/gitlab_tool/gitlab_tool.py function _get_credentials (line 26) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> tupl... function _get (line 37) | def _get( function _post (line 65) | def _post( function _put (line 89) | def _put( function _auth_error (line 115) | def _auth_error() -> dict[str, Any]: function register_tools (line 122) | def register_tools( FILE: tools/src/aden_tools/tools/gmail_tool/gmail_tool.py function _sanitize_path_param (line 30) | def _sanitize_path_param(param: str, param_name: str = "parameter") -> str: function _ensure_list (line 37) | def _ensure_list(value: str | list[str] | None) -> list[str] | None: function register_tools (line 49) | def register_tools( FILE: tools/src/aden_tools/tools/google_analytics_tool/google_analytics_tool.py class _GAClient (line 37) | class _GAClient: method __init__ (line 40) | def __init__(self, credentials_path: str): method run_report (line 45) | def run_report( method run_realtime_report (line 66) | def run_realtime_report( method _format_report_response (line 81) | def _format_report_response( method _format_realtime_response (line 105) | def _format_realtime_response( function register_tools (line 126) | def register_tools( FILE: tools/src/aden_tools/tools/google_docs_tool/google_docs_tool.py function _validate_image_uri (line 46) | def _validate_image_uri(uri: str) -> dict[str, str] | None: function _get_document_end_index (line 81) | def _get_document_end_index(doc: dict[str, Any]) -> int: class _GoogleDocsClient (line 99) | class _GoogleDocsClient: method __init__ (line 102) | def __init__(self, access_token: str): method _headers (line 106) | def _headers(self) -> dict[str, str]: method _handle_response (line 113) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method create_document (line 135) | def create_document(self, title: str) -> dict[str, Any]: method get_document (line 145) | def get_document(self, document_id: str) -> dict[str, Any]: method batch_update (line 154) | def batch_update(self, document_id: str, requests: list[dict[str, Any]... method insert_text (line 164) | def insert_text( method replace_all_text (line 192) | def replace_all_text( method insert_image (line 214) | def insert_image( method format_text (line 244) | def format_text( method create_list (line 290) | def create_list( method add_comment (line 309) | def add_comment( method list_comments (line 329) | def list_comments( method export_document (line 353) | def export_document( function register_tools (line 376) | def register_tools( FILE: tools/src/aden_tools/tools/google_docs_tool/tests/test_google_docs_tool.py function mcp (line 18) | def mcp(): function mcp_with_credentials (line 26) | def mcp_with_credentials(): function get_tool_fn (line 35) | def get_tool_fn(mcp, tool_name: str): class TestGoogleDocsCreateDocument (line 40) | class TestGoogleDocsCreateDocument: method test_no_credentials_returns_error (line 43) | def test_no_credentials_returns_error(self, mcp): method test_create_document_success (line 53) | def test_create_document_success(self, mock_post, mcp_with_credentials): method test_create_document_unauthorized (line 72) | def test_create_document_unauthorized(self, mock_post, mcp_with_creden... class TestGoogleDocsGetDocument (line 85) | class TestGoogleDocsGetDocument: method test_get_document_success (line 89) | def test_get_document_success(self, mock_get, mcp_with_credentials): method test_get_document_not_found (line 107) | def test_get_document_not_found(self, mock_get, mcp_with_credentials): class TestGoogleDocsReplaceAllText (line 120) | class TestGoogleDocsReplaceAllText: method test_replace_all_text_success (line 124) | def test_replace_all_text_success(self, mock_post, mcp_with_credentials): class TestGoogleDocsInsertText (line 145) | class TestGoogleDocsInsertText: method test_insert_text_at_end (line 150) | def test_insert_text_at_end(self, mock_get, mock_post, mcp_with_creden... method test_insert_text_at_index (line 170) | def test_insert_text_at_index(self, mock_post, mcp_with_credentials): class TestGoogleDocsFormatText (line 183) | class TestGoogleDocsFormatText: method test_format_text_bold (line 187) | def test_format_text_bold(self, mock_post, mcp_with_credentials): method test_format_text_no_options (line 204) | def test_format_text_no_options(self, mcp_with_credentials): class TestGoogleDocsBatchUpdate (line 217) | class TestGoogleDocsBatchUpdate: method test_batch_update_success (line 221) | def test_batch_update_success(self, mock_post, mcp_with_credentials): method test_batch_update_invalid_json (line 239) | def test_batch_update_invalid_json(self, mcp_with_credentials): method test_batch_update_not_array (line 247) | def test_batch_update_not_array(self, mcp_with_credentials): class TestGoogleDocsExport (line 256) | class TestGoogleDocsExport: method test_export_to_pdf (line 260) | def test_export_to_pdf(self, mock_get, mcp_with_credentials): method test_export_to_docx (line 276) | def test_export_to_docx(self, mock_get, mcp_with_credentials): class TestGoogleDocsCreateList (line 289) | class TestGoogleDocsCreateList: method test_create_bullet_list (line 293) | def test_create_bullet_list(self, mock_post, mcp_with_credentials): method test_create_numbered_list (line 311) | def test_create_numbered_list(self, mock_post, mcp_with_credentials): class TestGoogleDocsAddComment (line 329) | class TestGoogleDocsAddComment: method test_add_comment_success (line 333) | def test_add_comment_success(self, mock_post, mcp_with_credentials): class TestImageUriValidation (line 353) | class TestImageUriValidation: method test_insert_image_valid_https_uri (line 357) | def test_insert_image_valid_https_uri(self, mock_post, mcp_with_creden... method test_insert_image_empty_uri (line 373) | def test_insert_image_empty_uri(self, mcp_with_credentials): method test_insert_image_invalid_scheme (line 385) | def test_insert_image_invalid_scheme(self, mcp_with_credentials): method test_insert_image_missing_scheme (line 397) | def test_insert_image_missing_scheme(self, mcp_with_credentials): method test_insert_image_javascript_uri_rejected (line 409) | def test_insert_image_javascript_uri_rejected(self, mcp_with_credentia... class TestReplaceAllTextValidation (line 421) | class TestReplaceAllTextValidation: method test_replace_all_text_empty_find_text (line 424) | def test_replace_all_text_empty_find_text(self, mcp_with_credentials): class TestGoogleDocsListComments (line 437) | class TestGoogleDocsListComments: method test_list_comments_success (line 441) | def test_list_comments_success(self, mock_get, mcp_with_credentials): method test_list_comments_not_found (line 460) | def test_list_comments_not_found(self, mock_get, mcp_with_credentials): FILE: tools/src/aden_tools/tools/google_maps_tool/google_maps_tool.py class _GoogleMapsClient (line 45) | class _GoogleMapsClient: method __init__ (line 48) | def __init__(self, api_key: str): method get (line 51) | def get(self, url: str, params: dict) -> httpx.Response: method handle_status (line 56) | def handle_status(self, api_status: str, error_message: str = "") -> d... function register_tools (line 84) | def register_tools( FILE: tools/src/aden_tools/tools/google_search_console_tool/google_search_console_tool.py function _get_token (line 28) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 34) | def _headers(token: str) -> dict[str, str]: function _get (line 38) | def _get(endpoint: str, token: str, base: str = GSC_API) -> dict[str, Any]: function _post (line 54) | def _post( function _auth_error (line 74) | def _auth_error() -> dict[str, Any]: function _encode_site (line 81) | def _encode_site(site_url: str) -> str: function register_tools (line 88) | def register_tools( FILE: tools/src/aden_tools/tools/google_sheets_tool/google_sheets_tool.py class _GoogleSheetsClient (line 25) | class _GoogleSheetsClient: method __init__ (line 28) | def __init__(self, access_token: str): method _headers (line 32) | def _headers(self) -> dict[str, str]: method _handle_response (line 39) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method get_spreadsheet (line 57) | def get_spreadsheet( method create_spreadsheet (line 75) | def create_spreadsheet( method get_values (line 96) | def get_values( method update_values (line 113) | def update_values( method append_values (line 133) | def append_values( method clear_values (line 153) | def clear_values( method batch_update_values (line 166) | def batch_update_values( method batch_clear_values (line 186) | def batch_clear_values( method add_sheet (line 202) | def add_sheet( method delete_sheet (line 234) | def delete_sheet( function register_tools (line 251) | def register_tools( FILE: tools/src/aden_tools/tools/google_sheets_tool/tests/test_google_sheets_integration.py function _get_google_token (line 30) | def _get_google_token() -> str | None: function _delete_spreadsheet (line 54) | def _delete_spreadsheet(token: str, spreadsheet_id: str) -> None: function client (line 64) | def client() -> _GoogleSheetsClient: function spreadsheet (line 71) | def spreadsheet(client: _GoogleSheetsClient): class TestCreateAndGetSpreadsheet (line 89) | class TestCreateAndGetSpreadsheet: method test_create_spreadsheet (line 90) | def test_create_spreadsheet(self, spreadsheet): method test_get_spreadsheet_metadata (line 99) | def test_get_spreadsheet_metadata(self, client, spreadsheet): class TestReadWriteValues (line 108) | class TestReadWriteValues: method test_write_and_read_values (line 109) | def test_write_and_read_values(self, client, spreadsheet): method test_append_values (line 123) | def test_append_values(self, client, spreadsheet): method test_clear_values (line 139) | def test_clear_values(self, client, spreadsheet): class TestBatchOperations (line 157) | class TestBatchOperations: method test_batch_update_values (line 158) | def test_batch_update_values(self, client, spreadsheet): method test_batch_clear_values (line 175) | def test_batch_clear_values(self, client, spreadsheet): class TestSheetManagement (line 198) | class TestSheetManagement: method test_add_and_delete_sheet (line 199) | def test_add_and_delete_sheet(self, client, spreadsheet): class TestMCPToolRegistration (line 221) | class TestMCPToolRegistration: method test_tools_via_register (line 224) | def test_tools_via_register(self): FILE: tools/src/aden_tools/tools/google_sheets_tool/tests/test_google_sheets_tool.py class TestGoogleSheetsClient (line 29) | class TestGoogleSheetsClient: method setup_method (line 30) | def setup_method(self): method test_headers (line 33) | def test_headers(self): method test_handle_response_success (line 38) | def test_handle_response_success(self): method test_handle_response_errors (line 53) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 60) | def test_handle_response_generic_error(self): method test_handle_response_generic_error_fallback (line 68) | def test_handle_response_generic_error_fallback(self): method test_get_spreadsheet (line 78) | def test_get_spreadsheet(self, mock_get): method test_get_spreadsheet_with_grid_data (line 98) | def test_get_spreadsheet_with_grid_data(self, mock_get): method test_create_spreadsheet (line 109) | def test_create_spreadsheet(self, mock_post): method test_create_spreadsheet_with_sheets (line 129) | def test_create_spreadsheet_with_sheets(self, mock_post): method test_get_values (line 143) | def test_get_values(self, mock_get): method test_get_values_unformatted (line 163) | def test_get_values_unformatted(self, mock_get): method test_update_values (line 174) | def test_update_values(self, mock_put): method test_update_values_raw (line 196) | def test_update_values_raw(self, mock_put): method test_append_values (line 207) | def test_append_values(self, mock_post): method test_clear_values (line 228) | def test_clear_values(self, mock_post): method test_batch_update_values (line 244) | def test_batch_update_values(self, mock_post): method test_batch_clear_values (line 267) | def test_batch_clear_values(self, mock_post): method test_add_sheet (line 287) | def test_add_sheet(self, mock_post): method test_add_sheet_custom_dimensions (line 320) | def test_add_sheet_custom_dimensions(self, mock_post): method test_delete_sheet (line 334) | def test_delete_sheet(self, mock_post): class TestToolRegistration (line 354) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 355) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 361) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 375) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 398) | def test_credentials_from_env_var(self): method test_credentials_wrong_type_raises_error (line 423) | def test_credentials_wrong_type_raises_error(self): class TestSpreadsheetTools (line 442) | class TestSpreadsheetTools: method setup_method (line 443) | def setup_method(self): method _fn (line 451) | def _fn(self, name): method test_get_spreadsheet (line 455) | def test_get_spreadsheet(self, mock_get): method test_create_spreadsheet (line 463) | def test_create_spreadsheet(self, mock_post): method test_get_spreadsheet_timeout (line 471) | def test_get_spreadsheet_timeout(self, mock_get): method test_create_spreadsheet_network_error (line 478) | def test_create_spreadsheet_network_error(self, mock_post): class TestReadDataTools (line 485) | class TestReadDataTools: method setup_method (line 486) | def setup_method(self): method _fn (line 494) | def _fn(self, name): method test_get_values (line 498) | def test_get_values(self, mock_get): method test_get_values_timeout (line 508) | def test_get_values_timeout(self, mock_get): class TestWriteDataTools (line 515) | class TestWriteDataTools: method setup_method (line 516) | def setup_method(self): method _fn (line 524) | def _fn(self, name): method test_update_values (line 528) | def test_update_values(self, mock_put): method test_append_values (line 538) | def test_append_values(self, mock_post): method test_clear_values (line 548) | def test_clear_values(self, mock_post): method test_update_values_network_error (line 558) | def test_update_values_network_error(self, mock_put): class TestBatchOperationsTools (line 567) | class TestBatchOperationsTools: method setup_method (line 568) | def setup_method(self): method _fn (line 576) | def _fn(self, name): method test_batch_update_values (line 580) | def test_batch_update_values(self, mock_post): method test_batch_clear_values (line 592) | def test_batch_clear_values(self, mock_post): method test_batch_update_values_timeout (line 602) | def test_batch_update_values_timeout(self, mock_post): class TestSheetManagementTools (line 611) | class TestSheetManagementTools: method setup_method (line 612) | def setup_method(self): method _fn (line 620) | def _fn(self, name): method test_add_sheet (line 624) | def test_add_sheet(self, mock_post): method test_delete_sheet (line 635) | def test_delete_sheet(self, mock_post): method test_add_sheet_network_error (line 643) | def test_add_sheet_network_error(self, mock_post): method test_delete_sheet_timeout (line 650) | def test_delete_sheet_timeout(self, mock_post): class TestErrorSanitization (line 660) | class TestErrorSanitization: method setup_method (line 661) | def setup_method(self): method _fn (line 669) | def _fn(self, name): method test_bearer_token_redacted_from_error (line 673) | def test_bearer_token_redacted_from_error(self, mock_get): method test_authorization_header_redacted_from_error (line 685) | def test_authorization_header_redacted_from_error(self, mock_get): method test_long_error_message_truncated (line 693) | def test_long_error_message_truncated(self, mock_get): method test_safe_error_message_passes_through (line 701) | def test_safe_error_message_passes_through(self, mock_get): class TestTrackingParameters (line 711) | class TestTrackingParameters: method setup_method (line 712) | def setup_method(self): method _fn (line 720) | def _fn(self, name): method test_tracking_params_accepted_by_get_spreadsheet (line 724) | def test_tracking_params_accepted_by_get_spreadsheet(self, mock_get): method test_tracking_params_accepted_by_create_spreadsheet (line 737) | def test_tracking_params_accepted_by_create_spreadsheet(self, mock_post): method test_tracking_params_accepted_by_clear_values (line 750) | def test_tracking_params_accepted_by_clear_values(self, mock_post): FILE: tools/src/aden_tools/tools/greenhouse_tool/greenhouse_tool.py function _get_credentials (line 26) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> str ... function _auth_header (line 33) | def _auth_header(token: str) -> str: function _get (line 38) | def _get(path: str, token: str, params: dict[str, Any] | None = None) ->... function _post (line 64) | def _post(path: str, token: str, body: dict[str, Any]) -> dict[str, Any]: function _auth_error (line 90) | def _auth_error() -> dict[str, Any]: function register_tools (line 99) | def register_tools( FILE: tools/src/aden_tools/tools/http_headers_scanner/http_headers_scanner.py function register_tools (line 94) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/hubspot_tool/hubspot_tool.py class _HubSpotClient (line 25) | class _HubSpotClient: method __init__ (line 28) | def __init__(self, access_token: str): method _headers (line 32) | def _headers(self) -> dict[str, str]: method _handle_response (line 39) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method search_objects (line 57) | def search_objects( method get_object (line 79) | def get_object( method create_object (line 98) | def create_object( method update_object (line 112) | def update_object( method delete_object (line 127) | def delete_object( method list_associations (line 145) | def list_associations( method create_association (line 165) | def create_association( function register_tools (line 194) | def register_tools( FILE: tools/src/aden_tools/tools/hubspot_tool/tests/test_hubspot_tool.py class TestHubSpotClient (line 28) | class TestHubSpotClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 37) | def test_handle_response_success(self): method test_handle_response_errors (line 52) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 59) | def test_handle_response_generic_error(self): method test_search_objects (line 68) | def test_search_objects(self, mock_post): method test_search_objects_no_query (line 88) | def test_search_objects_no_query(self, mock_post): method test_search_objects_limit_capped (line 101) | def test_search_objects_limit_capped(self, mock_post): method test_get_object (line 113) | def test_get_object(self, mock_get): method test_get_object_no_properties (line 130) | def test_get_object_no_properties(self, mock_get): method test_create_object (line 141) | def test_create_object(self, mock_post): method test_update_object (line 163) | def test_update_object(self, mock_patch): class TestToolRegistration (line 183) | class TestToolRegistration: method _get_tool_fn (line 184) | def _get_tool_fn(self, mcp_mock, tool_name): method test_register_tools_registers_all_tools (line 192) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 198) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 212) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 235) | def test_credentials_from_env_var(self): class TestContactTools (line 264) | class TestContactTools: method setup_method (line 265) | def setup_method(self): method _fn (line 273) | def _fn(self, name): method test_search_contacts (line 277) | def test_search_contacts(self, mock_post): method test_get_contact (line 285) | def test_get_contact(self, mock_get): method test_create_contact (line 291) | def test_create_contact(self, mock_post): method test_update_contact (line 299) | def test_update_contact(self, mock_patch): method test_search_contacts_timeout (line 307) | def test_search_contacts_timeout(self, mock_post): method test_get_contact_network_error (line 314) | def test_get_contact_network_error(self, mock_get): class TestCompanyTools (line 321) | class TestCompanyTools: method setup_method (line 322) | def setup_method(self): method _fn (line 330) | def _fn(self, name): method test_search_companies (line 334) | def test_search_companies(self, mock_post): method test_get_company (line 342) | def test_get_company(self, mock_get): method test_create_company (line 350) | def test_create_company(self, mock_post): method test_update_company (line 358) | def test_update_company(self, mock_patch): class TestDealTools (line 368) | class TestDealTools: method setup_method (line 369) | def setup_method(self): method _fn (line 377) | def _fn(self, name): method test_search_deals (line 381) | def test_search_deals(self, mock_post): method test_get_deal (line 389) | def test_get_deal(self, mock_get): method test_create_deal (line 397) | def test_create_deal(self, mock_post): method test_update_deal (line 405) | def test_update_deal(self, mock_patch): class TestHubSpotOAuth2Provider (line 416) | class TestHubSpotOAuth2Provider: method test_provider_id (line 417) | def test_provider_id(self): method test_default_scopes (line 423) | def test_default_scopes(self): method test_custom_scopes (line 432) | def test_custom_scopes(self): method test_endpoints (line 442) | def test_endpoints(self): method test_supported_types (line 453) | def test_supported_types(self): method test_validate_no_access_token (line 460) | def test_validate_no_access_token(self): class TestCredentialSpec (line 472) | class TestCredentialSpec: method test_hubspot_credential_spec_exists (line 473) | def test_hubspot_credential_spec_exists(self): method test_hubspot_spec_env_var (line 478) | def test_hubspot_spec_env_var(self): method test_hubspot_spec_tools (line 484) | def test_hubspot_spec_tools(self): FILE: tools/src/aden_tools/tools/huggingface_tool/huggingface_tool.py function _get_token (line 32) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _get (line 38) | def _get( function _post (line 65) | def _post( function _auth_error (line 109) | def _auth_error() -> dict[str, Any]: function register_tools (line 116) | def register_tools( FILE: tools/src/aden_tools/tools/intercom_tool/intercom_tool.py class _IntercomClient (line 25) | class _IntercomClient: method __init__ (line 28) | def __init__(self, access_token: str): method _headers (line 33) | def _headers(self) -> dict[str, str]: method _handle_response (line 41) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method _get_admin_id (line 61) | def _get_admin_id(self) -> str | dict[str, Any]: method search_conversations (line 77) | def search_conversations(self, query: dict[str, Any], limit: int = 20)... method get_conversation (line 91) | def get_conversation(self, conversation_id: str) -> dict[str, Any]: method get_contact (line 101) | def get_contact(self, contact_id: str) -> dict[str, Any]: method search_contacts (line 110) | def search_contacts(self, query: dict[str, Any], limit: int = 50) -> d... method list_teams (line 124) | def list_teams(self) -> dict[str, Any]: method list_tags (line 133) | def list_tags(self) -> dict[str, Any]: method reply_to_conversation (line 144) | def reply_to_conversation( method assign_conversation (line 168) | def assign_conversation( method create_or_get_tag (line 195) | def create_or_get_tag(self, name: str) -> dict[str, Any]: method tag_conversation (line 205) | def tag_conversation( method tag_contact (line 222) | def tag_contact( method close_conversation (line 236) | def close_conversation(self, conversation_id: str, body: str = "") -> ... method create_contact (line 256) | def create_contact( method list_conversations (line 282) | def list_conversations( function register_tools (line 300) | def register_tools( FILE: tools/src/aden_tools/tools/intercom_tool/tests/test_intercom_tool.py class TestIntercomClientHeaders (line 29) | class TestIntercomClientHeaders: method setup_method (line 30) | def setup_method(self): method test_authorization_header (line 33) | def test_authorization_header(self): method test_intercom_version_header (line 36) | def test_intercom_version_header(self): method test_content_type_header (line 39) | def test_content_type_header(self): class TestHandleResponse (line 43) | class TestHandleResponse: method setup_method (line 44) | def setup_method(self): method test_success (line 47) | def test_success(self): method test_error_codes (line 62) | def test_error_codes(self, status_code, expected_substring): method test_generic_error_with_intercom_error_format (line 69) | def test_generic_error_with_intercom_error_format(self): method test_generic_error_fallback_to_text (line 81) | def test_generic_error_fallback_to_text(self): class TestGetAdminId (line 91) | class TestGetAdminId: method setup_method (line 92) | def setup_method(self): method test_fetches_admin_id (line 96) | def test_fetches_admin_id(self, mock_get): method test_caches_admin_id (line 112) | def test_caches_admin_id(self, mock_get): method test_returns_error_on_failure (line 126) | def test_returns_error_on_failure(self, mock_get): class TestListTeams (line 137) | class TestListTeams: method setup_method (line 138) | def setup_method(self): method test_list_teams_success (line 142) | def test_list_teams_success(self, mock_get): class TestListTags (line 162) | class TestListTags: method setup_method (line 163) | def setup_method(self): method test_list_tags_success (line 167) | def test_list_tags_success(self, mock_get): class TestSearchContacts (line 187) | class TestSearchContacts: method setup_method (line 188) | def setup_method(self): method test_search_contacts (line 192) | def test_search_contacts(self, mock_post): class TestGetContact (line 214) | class TestGetContact: method setup_method (line 215) | def setup_method(self): method test_get_contact_success (line 219) | def test_get_contact_success(self, mock_get): class TestGetConversation (line 240) | class TestGetConversation: method setup_method (line 241) | def setup_method(self): method test_get_conversation_success (line 245) | def test_get_conversation_success(self, mock_get): class TestSearchConversations (line 267) | class TestSearchConversations: method setup_method (line 268) | def setup_method(self): method test_search_conversations_success (line 272) | def test_search_conversations_success(self, mock_post): class TestReplyToConversation (line 294) | class TestReplyToConversation: method setup_method (line 295) | def setup_method(self): method test_reply_success (line 300) | def test_reply_success(self, mock_post): method test_reply_returns_error_when_admin_id_fails (line 326) | def test_reply_returns_error_when_admin_id_fails(self, mock_get): class TestAssignConversation (line 337) | class TestAssignConversation: method setup_method (line 338) | def setup_method(self): method test_assign_success (line 343) | def test_assign_success(self, mock_post): method test_assign_with_team_type (line 367) | def test_assign_with_team_type(self, mock_post): class TestCreateOrGetTag (line 393) | class TestCreateOrGetTag: method setup_method (line 394) | def setup_method(self): method test_create_tag_success (line 398) | def test_create_tag_success(self, mock_post): class TestTagConversation (line 416) | class TestTagConversation: method setup_method (line 417) | def setup_method(self): method test_tag_conversation_success (line 422) | def test_tag_conversation_success(self, mock_post): class TestTagContact (line 439) | class TestTagContact: method setup_method (line 440) | def setup_method(self): method test_tag_contact_success (line 444) | def test_tag_contact_success(self, mock_post): class TestToolRegistration (line 464) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 465) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 471) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 485) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 508) | def test_credentials_from_env_var(self): class TestConversationTools (line 536) | class TestConversationTools: method setup_method (line 537) | def setup_method(self): method _fn (line 545) | def _fn(self, name): method test_search_conversations (line 549) | def test_search_conversations(self, mock_post): method test_get_conversation (line 560) | def test_get_conversation(self, mock_get): method test_search_conversations_invalid_status (line 567) | def test_search_conversations_invalid_status(self): method test_search_conversations_invalid_limit (line 571) | def test_search_conversations_invalid_limit(self): method test_search_conversations_timeout (line 576) | def test_search_conversations_timeout(self, mock_post): method test_get_conversation_network_error (line 583) | def test_get_conversation_network_error(self, mock_get): class TestContactTools (line 590) | class TestContactTools: method setup_method (line 591) | def setup_method(self): method _fn (line 599) | def _fn(self, name): method test_get_contact_by_id (line 603) | def test_get_contact_by_id(self, mock_get): method test_get_contact_by_email (line 611) | def test_get_contact_by_email(self, mock_post): method test_get_contact_missing_params (line 624) | def test_get_contact_missing_params(self): method test_search_contacts (line 629) | def test_search_contacts(self, mock_post): method test_search_contacts_invalid_limit (line 637) | def test_search_contacts_invalid_limit(self): class TestNoteTagAssignTools (line 642) | class TestNoteTagAssignTools: method setup_method (line 643) | def setup_method(self): method _fn (line 651) | def _fn(self, name): method test_add_note (line 656) | def test_add_note(self, mock_post, mock_get): method test_add_tag_to_conversation (line 669) | def test_add_tag_to_conversation(self, mock_post, mock_get): method test_add_tag_missing_target (line 685) | def test_add_tag_missing_target(self): method test_add_tag_both_targets (line 689) | def test_add_tag_both_targets(self): method test_assign_conversation (line 696) | def test_assign_conversation(self, mock_post, mock_get): method test_assign_conversation_team_type (line 710) | def test_assign_conversation_team_type(self, mock_post, mock_get): method test_assign_conversation_invalid_type (line 725) | def test_assign_conversation_invalid_type(self): method test_list_teams (line 732) | def test_list_teams(self, mock_get): class TestCredentialSpec (line 744) | class TestCredentialSpec: method test_intercom_credential_spec_exists (line 745) | def test_intercom_credential_spec_exists(self): method test_intercom_spec_env_var (line 750) | def test_intercom_spec_env_var(self): method test_intercom_spec_tools (line 756) | def test_intercom_spec_tools(self): FILE: tools/src/aden_tools/tools/jira_tool/jira_tool.py function _get_credentials (line 24) | def _get_credentials( function _base_url (line 40) | def _base_url(domain: str) -> str: function _auth_header (line 44) | def _auth_header(email: str, token: str) -> str: function _request (line 49) | def _request(method: str, url: str, email: str, token: str, **kwargs: An... function _auth_error (line 81) | def _auth_error() -> dict[str, Any]: function _text_to_adf (line 88) | def _text_to_adf(text: str) -> dict[str, Any]: function _adf_to_text (line 102) | def _adf_to_text(adf: dict | None) -> str: function register_tools (line 115) | def register_tools( FILE: tools/src/aden_tools/tools/kafka_tool/kafka_tool.py function _get_config (line 17) | def _get_config() -> tuple[str, str, dict] | dict: function _get (line 43) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _post (line 51) | def _post(url: str, headers: dict, payload: dict) -> dict: function _delete (line 59) | def _delete(url: str, headers: dict) -> dict: function register_tools (line 69) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/langfuse_tool/langfuse_tool.py function _get_creds (line 25) | def _get_creds( function _auth (line 50) | def _auth(public_key: str, secret_key: str) -> httpx.BasicAuth: function _handle_response (line 54) | def _handle_response(resp: httpx.Response) -> dict[str, Any]: function register_tools (line 73) | def register_tools( FILE: tools/src/aden_tools/tools/linear_tool/linear_tool.py class _LinearClient (line 25) | class _LinearClient: method __init__ (line 28) | def __init__(self, api_key: str): method _headers (line 32) | def _headers(self) -> dict[str, str]: method _execute_query (line 39) | def _execute_query(self, query: str, variables: dict[str, Any] | None ... method _handle_response (line 53) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method create_issue (line 80) | def create_issue( method get_issue (line 131) | def get_issue(self, issue_id: str) -> dict[str, Any]: method update_issue (line 159) | def update_issue( method delete_issue (line 208) | def delete_issue(self, issue_id: str) -> dict[str, Any]: method search_issues (line 222) | def search_issues( method add_comment (line 290) | def add_comment(self, issue_id: str, body: str) -> dict[str, Any]: method create_project (line 312) | def create_project( method get_project (line 356) | def get_project(self, project_id: str) -> dict[str, Any]: method update_project (line 381) | def update_project( method list_projects (line 422) | def list_projects( method list_teams (line 472) | def list_teams(self) -> dict[str, Any]: method get_team (line 497) | def get_team(self, team_id: str) -> dict[str, Any]: method get_workflow_states (line 519) | def get_workflow_states(self, team_id: str) -> dict[str, Any]: method create_label (line 546) | def create_label( method list_labels (line 578) | def list_labels(self, team_id: str | None = None) -> dict[str, Any]: method list_cycles (line 608) | def list_cycles( method list_issue_comments (line 649) | def list_issue_comments( method create_issue_relation (line 680) | def create_issue_relation( method list_users (line 712) | def list_users(self) -> dict[str, Any]: method get_user (line 738) | def get_user(self, user_id: str) -> dict[str, Any]: method get_viewer (line 766) | def get_viewer(self) -> dict[str, Any]: function register_tools (line 796) | def register_tools( FILE: tools/src/aden_tools/tools/linear_tool/tests/test_linear_tool.py class TestLinearClient (line 28) | class TestLinearClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 37) | def test_handle_response_success(self): method test_handle_response_errors (line 52) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_graphql_error (line 59) | def test_handle_response_graphql_error(self): method test_handle_response_generic_error (line 69) | def test_handle_response_generic_error(self): method test_execute_query (line 78) | def test_execute_query(self, mock_post): method test_execute_query_with_variables (line 97) | def test_execute_query_with_variables(self, mock_post): method test_create_issue (line 117) | def test_create_issue(self, mock_post): method test_get_issue (line 146) | def test_get_issue(self, mock_post): method test_update_issue (line 167) | def test_update_issue(self, mock_post): method test_delete_issue (line 189) | def test_delete_issue(self, mock_post): method test_search_issues (line 200) | def test_search_issues(self, mock_post): method test_add_comment (line 222) | def test_add_comment(self, mock_post): method test_create_project (line 242) | def test_create_project(self, mock_post): method test_get_project (line 270) | def test_get_project(self, mock_post): method test_list_projects (line 290) | def test_list_projects(self, mock_post): method test_list_teams (line 313) | def test_list_teams(self, mock_post): method test_get_workflow_states (line 334) | def test_get_workflow_states(self, mock_post): method test_list_users (line 357) | def test_list_users(self, mock_post): method test_get_viewer (line 377) | def test_get_viewer(self, mock_post): method test_create_label (line 398) | def test_create_label(self, mock_post): method test_list_labels (line 416) | def test_list_labels(self, mock_post): class TestToolRegistration (line 439) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 440) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 447) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 461) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 484) | def test_credentials_from_env_var(self): class TestIssueTools (line 513) | class TestIssueTools: method setup_method (line 514) | def setup_method(self): method _fn (line 522) | def _fn(self, name): method test_linear_issue_create (line 526) | def test_linear_issue_create(self, mock_post): method test_linear_issue_get (line 544) | def test_linear_issue_get(self, mock_post): method test_linear_issue_update (line 553) | def test_linear_issue_update(self, mock_post): method test_linear_issue_delete (line 564) | def test_linear_issue_delete(self, mock_post): method test_linear_issue_search (line 573) | def test_linear_issue_search(self, mock_post): method test_linear_issue_add_comment (line 591) | def test_linear_issue_add_comment(self, mock_post): method test_linear_issue_create_timeout (line 602) | def test_linear_issue_create_timeout(self, mock_post): method test_linear_issue_get_network_error (line 609) | def test_linear_issue_get_network_error(self, mock_post): class TestProjectTools (line 616) | class TestProjectTools: method setup_method (line 617) | def setup_method(self): method _fn (line 625) | def _fn(self, name): method test_linear_project_create (line 629) | def test_linear_project_create(self, mock_post): method test_linear_project_get (line 647) | def test_linear_project_get(self, mock_post): method test_linear_project_update (line 656) | def test_linear_project_update(self, mock_post): method test_linear_project_list (line 667) | def test_linear_project_list(self, mock_post): class TestTeamTools (line 685) | class TestTeamTools: method setup_method (line 686) | def setup_method(self): method _fn (line 694) | def _fn(self, name): method test_linear_teams_list (line 698) | def test_linear_teams_list(self, mock_post): method test_linear_team_get (line 709) | def test_linear_team_get(self, mock_post): method test_linear_workflow_states_get (line 720) | def test_linear_workflow_states_get(self, mock_post): class TestUserTools (line 731) | class TestUserTools: method setup_method (line 732) | def setup_method(self): method _fn (line 740) | def _fn(self, name): method test_linear_users_list (line 744) | def test_linear_users_list(self, mock_post): method test_linear_user_get (line 755) | def test_linear_user_get(self, mock_post): method test_linear_viewer (line 764) | def test_linear_viewer(self, mock_post): class TestLabelTools (line 773) | class TestLabelTools: method setup_method (line 774) | def setup_method(self): method _fn (line 782) | def _fn(self, name): method test_linear_label_create (line 786) | def test_linear_label_create(self, mock_post): method test_linear_labels_list (line 804) | def test_linear_labels_list(self, mock_post): FILE: tools/src/aden_tools/tools/lusha_tool/lusha_tool.py function _get_headers (line 18) | def _get_headers() -> dict | None: function _get (line 26) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _post (line 34) | def _post(url: str, headers: dict, payload: dict) -> dict: function _extract_person (line 42) | def _extract_person(p: dict) -> dict: function _extract_company (line 57) | def _extract_company(c: dict) -> dict: function register_tools (line 72) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/microsoft_graph_tool/microsoft_graph_tool.py function _get_token (line 25) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 31) | def _headers(token: str) -> dict[str, str]: function _get (line 38) | def _get(endpoint: str, token: str, params: dict[str, Any] | None = None... function _post (line 58) | def _post(endpoint: str, token: str, json_body: dict[str, Any]) -> dict[... function _auth_error (line 82) | def _auth_error() -> dict[str, Any]: function register_tools (line 89) | def register_tools( FILE: tools/src/aden_tools/tools/mongodb_tool/mongodb_tool.py function _get_config (line 20) | def _get_config() -> tuple[str, str, str] | dict: function _request (line 33) | def _request(url: str, api_key: str, action: str, body: dict) -> dict: function register_tools (line 50) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/mssql_tool/mssql_tool.py function register_tools (line 32) | def register_tools( FILE: tools/src/aden_tools/tools/n8n_tool/n8n_tool.py function _get_creds (line 23) | def _get_creds( function _headers (line 46) | def _headers(api_key: str) -> dict[str, str]: function _handle_response (line 54) | def _handle_response(resp: httpx.Response) -> dict[str, Any]: function register_tools (line 73) | def register_tools( FILE: tools/src/aden_tools/tools/news_tool/news_tool.py function register_tools (line 29) | def register_tools( FILE: tools/src/aden_tools/tools/notion_tool/notion_tool.py class BlockType (line 27) | class BlockType(StrEnum): function _get_credentials (line 39) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> str ... function _headers (line 46) | def _headers(token: str) -> dict[str, str]: function _request (line 54) | def _request(method: str, path: str, token: str, **kwargs: Any) -> dict[... function _auth_error (line 80) | def _auth_error() -> dict[str, Any]: function _extract_title (line 87) | def _extract_title(properties: dict) -> str: function register_tools (line 96) | def register_tools( FILE: tools/src/aden_tools/tools/obsidian_tool/obsidian_tool.py function _get_creds (line 25) | def _get_creds( function _headers (line 49) | def _headers(api_key: str) -> dict[str, str]: function _handle_response (line 53) | def _handle_response(resp: httpx.Response) -> dict[str, Any] | list | str: function register_tools (line 75) | def register_tools( FILE: tools/src/aden_tools/tools/pagerduty_tool/pagerduty_tool.py function _get_headers (line 18) | def _get_headers(write: bool = False) -> dict | None: function _get (line 35) | def _get(path: str, headers: dict, params: dict | None = None) -> dict: function _post (line 43) | def _post(path: str, headers: dict, body: dict) -> dict: function _put (line 51) | def _put(path: str, headers: dict, body: dict) -> dict: function _extract_incident (line 59) | def _extract_incident(inc: dict) -> dict: function register_tools (line 75) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/pdf_read_tool/pdf_read_tool.py function register_tools (line 19) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/pinecone_tool/pinecone_tool.py function _get_token (line 28) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 34) | def _headers(token: str) -> dict[str, str]: function _control (line 42) | def _control(method: str, path: str, token: str, **kwargs: Any) -> dict[... function _data (line 66) | def _data(method: str, host: str, path: str, token: str, **kwargs: Any) ... function _auth_error (line 89) | def _auth_error() -> dict[str, Any]: function register_tools (line 96) | def register_tools( FILE: tools/src/aden_tools/tools/pipedrive_tool/pipedrive_tool.py function _get_token (line 24) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _base_url (line 30) | def _base_url() -> str: function _get (line 40) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _post (line 59) | def _post(endpoint: str, token: str, body: dict | None = None) -> dict[s... function _put (line 78) | def _put(endpoint: str, token: str, body: dict | None = None) -> dict[st... function _delete (line 97) | def _delete(endpoint: str, token: str) -> dict[str, Any]: function _auth_error (line 111) | def _auth_error() -> dict[str, Any]: function register_tools (line 118) | def register_tools( FILE: tools/src/aden_tools/tools/plaid_tool/plaid_tool.py function _get_credentials (line 31) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> tupl... function _get_env (line 40) | def _get_env() -> str: function _post (line 44) | def _post( function _auth_error (line 69) | def _auth_error() -> dict[str, Any]: function register_tools (line 76) | def register_tools( FILE: tools/src/aden_tools/tools/port_scanner/port_scanner.py function register_tools (line 158) | def register_tools(mcp: FastMCP) -> None: function _check_port (line 271) | async def _check_port(ip: str, port: int, timeout: float) -> dict: FILE: tools/src/aden_tools/tools/postgres_tool/postgres_tool.py function validate_sql (line 55) | def validate_sql(sql: str) -> str: function _get_pool (line 114) | def _get_pool(database_url: str): function _get_connection (line 139) | def _get_connection(database_url: str): function _hash_sql (line 179) | def _hash_sql(sql: str) -> str: function _error_response (line 195) | def _error_response(message: str) -> dict: function _missing_credential_response (line 208) | def _missing_credential_response() -> dict: function _get_database_url (line 226) | def _get_database_url( function register_tools (line 253) | def register_tools( FILE: tools/src/aden_tools/tools/powerbi_tool/powerbi_tool.py function _get_headers (line 18) | def _get_headers() -> dict | None: function _get (line 26) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _post (line 34) | def _post(url: str, headers: dict, payload: dict | None = None) -> dict: function register_tools (line 46) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/pushover_tool/pushover_tool.py function _get_token (line 26) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _auth_error (line 32) | def _auth_error() -> dict[str, Any]: function register_tools (line 39) | def register_tools( FILE: tools/src/aden_tools/tools/pushover_tool/tests/test_pushover_tool.py class TestPushoverClient (line 11) | class TestPushoverClient: method setup_method (line 14) | def setup_method(self): method _mock_response (line 20) | def _mock_response(self, status_code=200, json_data=None): method test_send_notification_success (line 28) | def test_send_notification_success(self, mock_post): method test_send_notification_emergency_priority (line 35) | def test_send_notification_emergency_priority(self, mock_post): method test_send_notification_rate_limited (line 43) | def test_send_notification_rate_limited(self, mock_post): method test_send_notification_api_error (line 50) | def test_send_notification_api_error(self, mock_post): method test_send_notification_with_url (line 59) | def test_send_notification_with_url(self, mock_post): method test_get_sounds (line 69) | def test_get_sounds(self, mock_get): method test_validate_user_success (line 78) | def test_validate_user_success(self, mock_post): method test_validate_user_with_device (line 87) | def test_validate_user_with_device(self, mock_post): class TestRegisterTools (line 94) | class TestRegisterTools: method setup_method (line 97) | def setup_method(self): method test_pushover_send_notification (line 116) | def test_pushover_send_notification(self, mock_post): method test_pushover_send_notification_invalid_priority (line 129) | def test_pushover_send_notification_invalid_priority(self): method test_pushover_send_notification_no_credentials (line 134) | def test_pushover_send_notification_no_credentials(self): method test_pushover_send_notification_with_url (line 144) | def test_pushover_send_notification_with_url(self, mock_post): method test_pushover_get_sounds (line 159) | def test_pushover_get_sounds(self, mock_get): method test_pushover_validate_user (line 173) | def test_pushover_validate_user(self, mock_post): FILE: tools/src/aden_tools/tools/quickbooks_tool/quickbooks_tool.py function _get_config (line 20) | def _get_config() -> tuple[str, str] | dict: function _headers (line 36) | def _headers(token: str, content_type: str = "application/json") -> dict: function _get (line 44) | def _get(url: str, token: str, params: dict | None = None) -> dict: function _post (line 51) | def _post(url: str, token: str, body: dict) -> dict: function register_tools (line 58) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/razorpay_tool/razorpay_tool.py class _RazorpayClient (line 32) | class _RazorpayClient: method __init__ (line 35) | def __init__(self, api_key: str, api_secret: str): method _auth (line 40) | def _auth(self) -> tuple[str, str]: method _handle_response (line 44) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method list_payments (line 69) | def list_payments( method get_payment (line 116) | def get_payment(self, payment_id: str) -> dict[str, Any]: method create_payment_link (line 147) | def create_payment_link( method list_invoices (line 193) | def list_invoices( method get_invoice (line 235) | def get_invoice(self, invoice_id: str) -> dict[str, Any]: method create_refund (line 261) | def create_refund( function register_tools (line 296) | def register_tools( FILE: tools/src/aden_tools/tools/reddit_tool/reddit_tool.py function _get_credentials (line 27) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> tupl... function _get_token (line 36) | def _get_token(client_id: str, client_secret: str) -> str | None: function _get (line 53) | def _get(path: str, token: str, params: dict[str, Any] | None = None) ->... function _auth_error (line 75) | def _auth_error() -> dict[str, Any]: function _extract_posts (line 82) | def _extract_posts(listing: dict) -> list[dict[str, Any]]: function register_tools (line 108) | def register_tools( FILE: tools/src/aden_tools/tools/redis_tool/redis_tool.py function _get_url (line 24) | def _get_url(credentials: CredentialStoreAdapter | None) -> str | None: function _get_client (line 30) | def _get_client(url: str): # noqa: ANN202 function _auth_error (line 37) | def _auth_error() -> dict[str, Any]: function register_tools (line 44) | def register_tools( FILE: tools/src/aden_tools/tools/redshift_tool/redshift_tool.py function _get_config (line 22) | def _get_config() -> tuple[str, str, str] | dict: function _sign (line 35) | def _sign(key: bytes, msg: str) -> bytes: function _get_signing_key (line 39) | def _get_signing_key(secret_key: str, datestamp: str, region: str) -> by... function _api_call (line 46) | def _api_call( function _extract_field (line 97) | def _extract_field(field: dict) -> Any: function register_tools (line 107) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/risk_scorer/risk_scorer.py function _score_to_grade (line 123) | def _score_to_grade(score: int) -> str: function _parse_json (line 136) | def _parse_json(data: str) -> dict | None: function _score_category (line 147) | def _score_category(grade_input: dict, checks: dict) -> tuple[int, list[... function register_tools (line 177) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/runtime_logs_tool/runtime_logs_tool.py function _read_jsonl (line 25) | def _read_jsonl(path: Path) -> list[dict]: function _get_run_dirs (line 49) | def _get_run_dirs(agent_work_dir: Path) -> list[tuple[str, Path]]: function register_tools (line 79) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/salesforce_tool/salesforce_tool.py function _get_creds (line 25) | def _get_creds( function _headers (line 49) | def _headers(token: str) -> dict[str, str]: function _handle_response (line 57) | def _handle_response(resp: httpx.Response) -> dict[str, Any]: function register_tools (line 79) | def register_tools( FILE: tools/src/aden_tools/tools/sap_tool/sap_tool.py function _get_config (line 17) | def _get_config() -> tuple[str, dict] | dict: function _get (line 32) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _odata_list (line 40) | def _odata_list(data: dict) -> tuple[list, int | None]: function register_tools (line 48) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/serpapi_tool/serpapi_tool.py class _SerpAPIClient (line 33) | class _SerpAPIClient: method __init__ (line 36) | def __init__(self, api_key: str): method _request (line 39) | def _request(self, params: dict[str, Any]) -> dict[str, Any]: method scholar_search (line 63) | def scholar_search( method scholar_cite (line 87) | def scholar_cite(self, result_id: str) -> dict[str, Any]: method scholar_author (line 91) | def scholar_author( method patents_search (line 109) | def patents_search( method patents_details (line 134) | def patents_details(self, patent_id: str) -> dict[str, Any]: method scholar_cited_by (line 138) | def scholar_cited_by(self, cites_id: str, num: int = 10, start: int = ... method scholar_profiles (line 149) | def scholar_profiles(self, query: str, num: int = 10) -> dict[str, Any]: method google_search (line 159) | def google_search(self, query: str, num: int = 10, gl: str | None = No... function register_tools (line 171) | def register_tools( FILE: tools/src/aden_tools/tools/shopify_tool/shopify_tool.py function _get_creds (line 25) | def _get_creds( function _base_url (line 47) | def _base_url(store: str) -> str: function _headers (line 51) | def _headers(token: str) -> dict[str, str]: function _handle_response (line 59) | def _handle_response(resp: httpx.Response) -> dict[str, Any]: function register_tools (line 79) | def register_tools( FILE: tools/src/aden_tools/tools/slack_tool/slack_tool.py class _SlackClient (line 25) | class _SlackClient: method __init__ (line 28) | def __init__(self, bot_token: str, user_token: str | None = None): method _headers (line 33) | def _headers(self) -> dict[str, str]: method _user_headers (line 39) | def _user_headers(self) -> dict[str, str]: method _handle_response (line 47) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method post_message (line 73) | def post_message( method list_conversations (line 98) | def list_conversations( method get_history (line 121) | def get_history( method add_reaction (line 146) | def add_reaction( method get_user_info (line 166) | def get_user_info(self, user_id: str) -> dict[str, Any]: method auth_test (line 176) | def auth_test(self) -> dict[str, Any]: method update_message (line 185) | def update_message( method delete_message (line 209) | def delete_message(self, channel: str, ts: str) -> dict[str, Any]: method schedule_message (line 219) | def schedule_message( method create_channel (line 243) | def create_channel( method archive_channel (line 257) | def archive_channel(self, channel: str) -> dict[str, Any]: method invite_to_channel (line 267) | def invite_to_channel(self, channel: str, users: str) -> dict[str, Any]: method remove_reaction (line 277) | def remove_reaction( method list_users (line 297) | def list_users(self, limit: int = 100) -> dict[str, Any]: method upload_file (line 307) | def upload_file( method set_channel_topic (line 378) | def set_channel_topic(self, channel: str, topic: str) -> dict[str, Any]: method search_messages (line 390) | def search_messages( method get_thread_replies (line 421) | def get_thread_replies( method pin_message (line 440) | def pin_message(self, channel: str, timestamp: str) -> dict[str, Any]: method unpin_message (line 450) | def unpin_message(self, channel: str, timestamp: str) -> dict[str, Any]: method list_pins (line 460) | def list_pins(self, channel: str) -> dict[str, Any]: method add_bookmark (line 470) | def add_bookmark( method list_scheduled_messages (line 495) | def list_scheduled_messages(self, channel: str | None = None) -> dict[... method delete_scheduled_message (line 509) | def delete_scheduled_message( method open_dm (line 526) | def open_dm(self, users: str) -> dict[str, Any]: method get_permalink (line 536) | def get_permalink(self, channel: str, message_ts: str) -> dict[str, Any]: method post_ephemeral (line 546) | def post_ephemeral( method open_modal (line 574) | def open_modal( method update_modal (line 596) | def update_modal( method push_modal (line 613) | def push_modal( method publish_home_tab (line 630) | def publish_home_tab( method set_user_status (line 656) | def set_user_status( method set_presence (line 683) | def set_presence(self, presence: str) -> dict[str, Any]: method get_presence (line 697) | def get_presence(self, user_id: str) -> dict[str, Any]: method create_reminder (line 711) | def create_reminder( method list_reminders (line 736) | def list_reminders(self) -> dict[str, Any]: method delete_reminder (line 745) | def delete_reminder(self, reminder_id: str) -> dict[str, Any]: method create_usergroup (line 759) | def create_usergroup( method update_usergroup_members (line 790) | def update_usergroup_members( method list_usergroups (line 812) | def list_usergroups(self) -> dict[str, Any]: method list_emoji (line 826) | def list_emoji(self) -> dict[str, Any]: method create_canvas (line 839) | def create_canvas( method edit_canvas (line 862) | def edit_canvas( method get_messages_for_analysis (line 893) | def get_messages_for_analysis( method trigger_workflow (line 966) | def trigger_workflow( method get_conversation_context (line 994) | def get_conversation_context( method find_user_by_email (line 1051) | def find_user_by_email( method kick_user_from_channel (line 1071) | def kick_user_from_channel( method delete_file (line 1090) | def delete_file( method get_team_stats (line 1107) | def get_team_stats(self) -> dict[str, Any]: method get_channel_info (line 1144) | def get_channel_info(self, channel: str) -> dict[str, Any]: method list_files (line 1171) | def list_files( method get_file_info (line 1226) | def get_file_info(self, file_id: str) -> dict[str, Any]: function register_tools (line 1256) | def register_tools( FILE: tools/src/aden_tools/tools/snowflake_tool/snowflake_tool.py function _get_config (line 17) | def _get_config() -> tuple[str, dict] | dict: function _format_results (line 37) | def _format_results(data: dict) -> dict: function register_tools (line 52) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/ssl_tls_scanner/ssl_tls_scanner.py function register_tools (line 33) | def register_tools(mcp: FastMCP) -> None: function _format_dn (line 237) | def _format_dn(dn_tuple: tuple) -> str: function _parse_cert_date (line 246) | def _parse_cert_date(date_str: str) -> datetime | None: FILE: tools/src/aden_tools/tools/stripe_tool/stripe_tool.py class _StripeClient (line 35) | class _StripeClient: method __init__ (line 38) | def __init__(self, api_key: str): method _stripe (line 41) | def _stripe(self) -> stripe.StripeClient: method create_customer (line 46) | def create_customer( method get_customer (line 68) | def get_customer(self, customer_id: str) -> dict[str, Any]: method get_customer_by_email (line 72) | def get_customer_by_email(self, email: str) -> dict[str, Any]: method update_customer (line 79) | def update_customer( method list_customers (line 102) | def list_customers( method _format_customer (line 119) | def _format_customer(self, c: Any) -> dict[str, Any]: method get_subscription (line 134) | def get_subscription(self, subscription_id: str) -> dict[str, Any]: method get_subscription_status (line 138) | def get_subscription_status(self, customer_id: str) -> dict[str, Any]: method list_subscriptions (line 149) | def list_subscriptions( method create_subscription (line 169) | def create_subscription( method update_subscription (line 188) | def update_subscription( method cancel_subscription (line 215) | def cancel_subscription( method _format_subscription (line 228) | def _format_subscription(self, s: Any) -> dict[str, Any]: method create_payment_intent (line 252) | def create_payment_intent( method get_payment_intent (line 278) | def get_payment_intent(self, payment_intent_id: str) -> dict[str, Any]: method confirm_payment_intent (line 282) | def confirm_payment_intent( method cancel_payment_intent (line 293) | def cancel_payment_intent(self, payment_intent_id: str) -> dict[str, A... method list_payment_intents (line 297) | def list_payment_intents( method _format_payment_intent (line 314) | def _format_payment_intent(self, pi: Any) -> dict[str, Any]: method list_charges (line 331) | def list_charges( method get_charge (line 351) | def get_charge(self, charge_id: str) -> dict[str, Any]: method capture_charge (line 355) | def capture_charge(self, charge_id: str, amount: int | None = None) ->... method _format_charge (line 362) | def _format_charge(self, c: Any) -> dict[str, Any]: method create_refund (line 383) | def create_refund( method get_refund (line 405) | def get_refund(self, refund_id: str) -> dict[str, Any]: method list_refunds (line 409) | def list_refunds( method _format_refund (line 429) | def _format_refund(self, r: Any) -> dict[str, Any]: method list_invoices (line 444) | def list_invoices( method get_invoice (line 467) | def get_invoice(self, invoice_id: str) -> dict[str, Any]: method create_invoice (line 471) | def create_invoice( method finalize_invoice (line 494) | def finalize_invoice(self, invoice_id: str) -> dict[str, Any]: method pay_invoice (line 498) | def pay_invoice(self, invoice_id: str) -> dict[str, Any]: method void_invoice (line 502) | def void_invoice(self, invoice_id: str) -> dict[str, Any]: method _format_invoice (line 506) | def _format_invoice(self, inv: Any) -> dict[str, Any]: method create_invoice_item (line 528) | def create_invoice_item( method list_invoice_items (line 551) | def list_invoice_items( method delete_invoice_item (line 571) | def delete_invoice_item(self, invoice_item_id: str) -> dict[str, Any]: method _format_invoice_item (line 575) | def _format_invoice_item(self, item: Any) -> dict[str, Any]: method create_product (line 590) | def create_product( method get_product (line 605) | def get_product(self, product_id: str) -> dict[str, Any]: method list_products (line 609) | def list_products( method update_product (line 626) | def update_product( method _format_product (line 646) | def _format_product(self, p: Any) -> dict[str, Any]: method create_price (line 659) | def create_price( method get_price (line 685) | def get_price(self, price_id: str) -> dict[str, Any]: method list_prices (line 689) | def list_prices( method update_price (line 709) | def update_price( method _format_price (line 726) | def _format_price(self, p: Any) -> dict[str, Any]: method create_payment_link (line 748) | def create_payment_link( method get_payment_link (line 762) | def get_payment_link(self, payment_link_id: str) -> dict[str, Any]: method list_payment_links (line 766) | def list_payment_links( method _format_payment_link (line 783) | def _format_payment_link(self, link: Any) -> dict[str, Any]: method create_coupon (line 802) | def create_coupon( method list_coupons (line 831) | def list_coupons( method delete_coupon (line 845) | def delete_coupon(self, coupon_id: str) -> dict[str, Any]: method _format_coupon (line 849) | def _format_coupon(self, c: Any) -> dict[str, Any]: method get_balance (line 867) | def get_balance(self) -> dict[str, Any]: method list_balance_transactions (line 874) | def list_balance_transactions( method list_webhook_endpoints (line 906) | def list_webhook_endpoints( method list_payment_methods (line 931) | def list_payment_methods( method get_payment_method (line 951) | def get_payment_method(self, payment_method_id: str) -> dict[str, Any]: method detach_payment_method (line 955) | def detach_payment_method(self, payment_method_id: str) -> dict[str, A... method list_disputes (line 961) | def list_disputes( method _format_dispute (line 975) | def _format_dispute(self, d: Any) -> dict[str, Any]: method list_events (line 994) | def list_events( method create_checkout_session (line 1025) | def create_checkout_session( method _format_payment_method (line 1059) | def _format_payment_method(self, pm: Any) -> dict[str, Any]: function register_tools (line 1079) | def register_tools( FILE: tools/src/aden_tools/tools/subdomain_enumerator/subdomain_enumerator.py function register_tools (line 75) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/supabase_tool/supabase_tool.py function _get_config (line 25) | def _get_config(credentials: CredentialStoreAdapter | None) -> tuple[str... function _rest_headers (line 35) | def _rest_headers(key: str) -> dict[str, str]: function _auth_error (line 44) | def _auth_error() -> dict[str, Any]: function register_tools (line 51) | def register_tools( FILE: tools/src/aden_tools/tools/tech_stack_detector/tech_stack_detector.py function register_tools (line 111) | def register_tools(mcp: FastMCP) -> None: function _detect_server (line 246) | def _detect_server(headers: httpx.Headers) -> dict | None: function _detect_cdn (line 259) | def _detect_cdn(headers: httpx.Headers) -> str | None: function _detect_framework_from_headers (line 281) | def _detect_framework_from_headers(headers: httpx.Headers) -> str | None: function _detect_framework_from_html (line 289) | def _detect_framework_from_html(html: str) -> str | None: function _detect_language (line 303) | def _detect_language(headers: httpx.Headers, cookies: httpx.Cookies) -> ... function _detect_js_libraries (line 322) | def _detect_js_libraries(html: str) -> list[str]: function _detect_analytics (line 343) | def _detect_analytics(html: str) -> list[str]: function _detect_cms_from_html (line 354) | def _detect_cms_from_html(html: str) -> str | None: function _analyze_cookies (line 396) | def _analyze_cookies(headers: httpx.Headers) -> list[dict]: function _extract_samesite (line 413) | def _extract_samesite(raw_lower: str) -> str | None: function _has_version (line 422) | def _has_version(value: str) -> bool: FILE: tools/src/aden_tools/tools/telegram_tool/telegram_tool.py class _TelegramClient (line 28) | class _TelegramClient: method __init__ (line 31) | def __init__(self, bot_token: str): method _base_url (line 35) | def _base_url(self) -> str: method _handle_response (line 38) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method send_message (line 62) | def send_message( method send_document (line 85) | def send_document( method edit_message_text (line 109) | def edit_message_text( method delete_message (line 132) | def delete_message( method forward_message (line 149) | def forward_message( method send_photo (line 170) | def send_photo( method send_chat_action (line 194) | def send_chat_action( method pin_chat_message (line 211) | def pin_chat_message( method unpin_chat_message (line 230) | def unpin_chat_message( method get_chat (line 249) | def get_chat( method get_me (line 261) | def get_me(self) -> dict[str, Any]: method get_chat_member_count (line 269) | def get_chat_member_count(self, chat_id: str) -> dict[str, Any]: method send_video (line 281) | def send_video( method set_chat_description (line 311) | def set_chat_description( function register_tools (line 328) | def register_tools( FILE: tools/src/aden_tools/tools/terraform_tool/terraform_tool.py function _get_config (line 18) | def _get_config() -> tuple[str, dict] | dict: function _get (line 32) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function _post (line 40) | def _post(url: str, headers: dict, payload: dict) -> dict: function _extract_workspace (line 48) | def _extract_workspace(ws: dict) -> dict: function _extract_run (line 64) | def _extract_run(run: dict) -> dict: function register_tools (line 81) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/time_tool/time_tool.py function register_tools (line 16) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/tines_tool/tines_tool.py function _get_config (line 16) | def _get_config() -> tuple[str, dict] | dict: function _get (line 33) | def _get(url: str, headers: dict, params: dict | None = None) -> dict: function register_tools (line 41) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/trello_tool/trello_client.py class TrelloClient (line 12) | class TrelloClient: method __init__ (line 15) | def __init__(self, api_key: str, api_token: str, timeout: float = 30.0): method _handle_response (line 20) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method _request (line 45) | def _request( method list_boards (line 62) | def list_boards( method get_member (line 75) | def get_member( method list_lists (line 85) | def list_lists( method list_cards (line 95) | def list_cards( method create_card (line 108) | def create_card( method move_card (line 129) | def move_card( method update_card (line 141) | def update_card( method add_comment (line 161) | def add_comment(self, card_id: str, text: str) -> dict[str, Any]: method add_attachment (line 165) | def add_attachment( method get_card (line 174) | def get_card( method create_list (line 194) | def create_list( method search (line 211) | def search( FILE: tools/src/aden_tools/tools/trello_tool/trello_tool.py function register_tools (line 16) | def register_tools( FILE: tools/src/aden_tools/tools/twilio_tool/twilio_tool.py function _get_credentials (line 24) | def _get_credentials(credentials: CredentialStoreAdapter | None) -> tupl... function _base_url (line 33) | def _base_url(account_sid: str) -> str: function _auth_header (line 37) | def _auth_header(account_sid: str, auth_token: str) -> str: function _request (line 42) | def _request( function _auth_error (line 70) | def _auth_error() -> dict[str, Any]: function _extract_message (line 77) | def _extract_message(msg: dict) -> dict[str, Any]: function register_tools (line 92) | def register_tools( FILE: tools/src/aden_tools/tools/twitter_tool/twitter_tool.py function _get_headers (line 21) | def _get_headers() -> dict | None: function _get (line 29) | def _get(path: str, headers: dict, params: dict | None = None) -> dict: function _extract_tweet (line 37) | def _extract_tweet(t: dict) -> dict: function register_tools (line 53) | def register_tools(mcp: FastMCP, credentials: Any = None) -> None: FILE: tools/src/aden_tools/tools/vercel_tool/vercel_tool.py function _get_token (line 28) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _headers (line 34) | def _headers(token: str) -> dict[str, str]: function _get (line 38) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _post (line 56) | def _post(endpoint: str, token: str, body: dict | None = None) -> dict[s... function _delete (line 72) | def _delete(endpoint: str, token: str) -> dict[str, Any]: function _auth_error (line 82) | def _auth_error() -> dict[str, Any]: function register_tools (line 89) | def register_tools( FILE: tools/src/aden_tools/tools/vision_tool/vision_tool.py class _VisionClient (line 35) | class _VisionClient: method __init__ (line 38) | def __init__(self, api_key: str): method _load_image (line 41) | def _load_image(self, image_source: str) -> dict[str, Any] | dict[str,... method _call_api (line 74) | def _call_api( method _handle_response (line 91) | def _handle_response(self, response: httpx.Response) -> dict[str, Any]: method detect_labels (line 115) | def detect_labels(self, image_source: str, max_results: int = 10) -> d... method detect_text (line 133) | def detect_text(self, image_source: str) -> dict[str, Any]: method detect_faces (line 158) | def detect_faces(self, image_source: str, max_results: int = 10) -> di... method localize_objects (line 182) | def localize_objects(self, image_source: str, max_results: int = 10) -... method detect_logos (line 204) | def detect_logos(self, image_source: str, max_results: int = 5) -> dic... method detect_landmarks (line 223) | def detect_landmarks(self, image_source: str, max_results: int = 5) ->... method get_image_properties (line 254) | def get_image_properties(self, image_source: str) -> dict[str, Any]: method web_detection (line 296) | def web_detection(self, image_source: str) -> dict[str, Any]: method safe_search (line 329) | def safe_search(self, image_source: str) -> dict[str, Any]: function register_tools (line 349) | def register_tools( FILE: tools/src/aden_tools/tools/web_scrape_tool/web_scrape_tool.py function register_tools (line 32) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/web_search_tool/web_search_tool.py function register_tools (line 24) | def register_tools( FILE: tools/src/aden_tools/tools/wikipedia_tool/wikipedia_tool.py function register_tools (line 16) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/yahoo_finance_tool/yahoo_finance_tool.py function _get_ticker (line 21) | def _get_ticker(symbol: str) -> Any: function register_tools (line 28) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/aden_tools/tools/youtube_tool/youtube_tool.py function _get_api_key (line 25) | def _get_api_key(credentials: CredentialStoreAdapter | None) -> str | None: function _request (line 31) | def _request( function _parse_duration (line 65) | def _parse_duration(duration: str) -> str: function register_tools (line 90) | def register_tools( FILE: tools/src/aden_tools/tools/youtube_transcript_tool/youtube_transcript_tool.py function register_tools (line 19) | def register_tools( FILE: tools/src/aden_tools/tools/zendesk_tool/zendesk_tool.py function _get_credentials (line 24) | def _get_credentials( function _base_url (line 40) | def _base_url(subdomain: str) -> str: function _auth_header (line 44) | def _auth_header(email: str, token: str) -> str: function _request (line 49) | def _request(method: str, url: str, email: str, token: str, **kwargs: An... function _auth_error (line 78) | def _auth_error() -> dict[str, Any]: function _extract_ticket (line 85) | def _extract_ticket(t: dict) -> dict[str, Any]: function register_tools (line 101) | def register_tools( FILE: tools/src/aden_tools/tools/zoho_crm_tool/tests/test_zoho_crm_tool.py class TestZohoCRMClient (line 29) | class TestZohoCRMClient: method setup_method (line 30) | def setup_method(self): method test_headers (line 33) | def test_headers(self): method test_handle_response_success (line 38) | def test_handle_response_success(self): method test_handle_response_errors (line 53) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_429_retriable (line 60) | def test_handle_response_429_retriable(self): method test_handle_response_generic_error (line 66) | def test_handle_response_generic_error(self): method test_search_records (line 75) | def test_search_records(self, mock_get): method test_get_record (line 93) | def test_get_record(self, mock_get): method test_create_record (line 109) | def test_create_record(self, mock_post): method test_update_record (line 129) | def test_update_record(self, mock_put): method test_add_note_parent_id_structure (line 148) | def test_add_note_parent_id_structure(self, mock_post): class TestToolRegistration (line 169) | class TestToolRegistration: method test_register_tools_registers_all_five_tools (line 170) | def test_register_tools_registers_all_five_tools(self): method test_no_credentials_returns_error (line 176) | def test_no_credentials_returns_error(self): method test_credentials_from_adapter (line 189) | def test_credentials_from_adapter(self): method test_credentials_from_env_ZOHO_ACCESS_TOKEN (line 212) | def test_credentials_from_env_ZOHO_ACCESS_TOKEN(self): class TestZohoCRMTools (line 239) | class TestZohoCRMTools: method setup_method (line 240) | def setup_method(self): method _fn (line 248) | def _fn(self, name): method test_zoho_crm_search_success (line 252) | def test_zoho_crm_search_success(self, mock_get): method test_zoho_crm_search_next_page (line 271) | def test_zoho_crm_search_next_page(self, mock_get): method test_zoho_crm_search_invalid_module (line 284) | def test_zoho_crm_search_invalid_module(self): method test_zoho_crm_search_no_word_or_criteria (line 289) | def test_zoho_crm_search_no_word_or_criteria(self): method test_zoho_crm_get_record_success (line 295) | def test_zoho_crm_get_record_success(self, mock_get): method test_zoho_crm_create_record_success (line 305) | def test_zoho_crm_create_record_success(self, mock_post): method test_zoho_crm_update_record_success (line 320) | def test_zoho_crm_update_record_success(self, mock_put): method test_zoho_crm_add_note_success (line 332) | def test_zoho_crm_add_note_success(self, mock_post): method test_zoho_crm_search_timeout (line 348) | def test_zoho_crm_search_timeout(self, mock_get): method test_zoho_crm_get_record_network_error (line 355) | def test_zoho_crm_get_record_network_error(self, mock_get): class TestZohoOAuth2Provider (line 365) | class TestZohoOAuth2Provider: method test_provider_id (line 366) | def test_provider_id(self): method test_default_scopes (line 372) | def test_default_scopes(self): method test_custom_scopes (line 381) | def test_custom_scopes(self): method test_endpoints_region_aware (line 391) | def test_endpoints_region_aware(self): method test_supported_types (line 402) | def test_supported_types(self): method test_validate_no_access_token (line 409) | def test_validate_no_access_token(self): method test_validate_success_200 (line 417) | def test_validate_success_200(self): method test_validate_invalid_401 (line 430) | def test_validate_invalid_401(self): method test_validate_rate_limited_429_still_valid (line 443) | def test_validate_rate_limited_429_still_valid(self): method test_refresh_persists_dc_metadata (line 456) | def test_refresh_persists_dc_metadata(self): method test_format_for_request_custom_header (line 480) | def test_format_for_request_custom_header(self): method test_tool_uses_stored_api_domain (line 490) | def test_tool_uses_stored_api_domain(self): class TestCredentialSpec (line 517) | class TestCredentialSpec: method test_zoho_crm_credential_spec_exists (line 518) | def test_zoho_crm_credential_spec_exists(self): method test_zoho_crm_spec_env_var (line 523) | def test_zoho_crm_spec_env_var(self): method test_zoho_crm_spec_tools (line 529) | def test_zoho_crm_spec_tools(self): FILE: tools/src/aden_tools/tools/zoho_crm_tool/zoho_crm_tool.py function _get_token (line 24) | def _get_token(credentials: CredentialStoreAdapter | None) -> str | None: function _base_url (line 30) | def _base_url() -> str: function _headers (line 35) | def _headers(token: str) -> dict[str, str]: function _get (line 39) | def _get(endpoint: str, token: str, params: dict | None = None) -> dict[... function _post (line 57) | def _post(endpoint: str, token: str, body: dict | None = None) -> dict[s... function _auth_error (line 73) | def _auth_error() -> dict[str, Any]: function register_tools (line 80) | def register_tools( FILE: tools/src/aden_tools/tools/zoom_tool/zoom_tool.py function _get_token (line 24) | def _get_token( function _headers (line 43) | def _headers(token: str) -> dict[str, str]: function _handle_response (line 51) | def _handle_response(resp: httpx.Response) -> dict[str, Any]: function register_tools (line 72) | def register_tools( FILE: tools/src/aden_tools/utils/env_helpers.py function get_env_var (line 10) | def get_env_var( FILE: tools/src/gcu/__init__.py function register_gcu_tools (line 37) | def register_gcu_tools( FILE: tools/src/gcu/browser/__init__.py function register_tools (line 45) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/chrome_finder.py function find_chrome (line 38) | def find_chrome() -> str | None: function require_chrome (line 59) | def require_chrome() -> str: function _is_executable (line 73) | def _is_executable(path: str) -> bool: function _find_macos (line 79) | def _find_macos() -> str | None: function _find_linux (line 86) | def _find_linux() -> str | None: function _find_windows (line 94) | def _find_windows() -> str | None: FILE: tools/src/gcu/browser/chrome_launcher.py function _clear_session_restore (line 49) | def _clear_session_restore(user_data_dir: Path) -> None: function _resolve_app_bundle (line 65) | def _resolve_app_bundle(executable_path: str) -> str | None: function _find_pid_on_port (line 78) | def _find_pid_on_port(port: int) -> int | None: function _kill_chrome_by_data_dir (line 92) | def _kill_chrome_by_data_dir(user_data_dir: Path) -> None: class ChromeProcess (line 119) | class ChromeProcess: method is_alive (line 129) | def is_alive(self) -> bool: method kill (line 140) | async def kill(self) -> None: function launch_chrome (line 179) | async def launch_chrome( function _launch_chrome_macos (line 248) | async def _launch_chrome_macos( function _launch_chrome_subprocess (line 310) | async def _launch_chrome_subprocess( function _wait_for_cdp (line 347) | async def _wait_for_cdp( FILE: tools/src/gcu/browser/highlight.py function highlight_element (line 173) | async def highlight_element(page: Page, selector: str) -> None: function highlight_coordinate (line 191) | async def highlight_coordinate(page: Page, x: float, y: float) -> None: FILE: tools/src/gcu/browser/port_manager.py function _is_port_available (line 25) | def _is_port_available(port: int) -> bool: function _get_port_file (line 36) | def _get_port_file(profile: str, storage_path: Path | None) -> Path | None: function allocate_port (line 51) | def allocate_port(profile: str, storage_path: Path | None = None) -> int: function release_port (line 98) | def release_port(port: int) -> None: FILE: tools/src/gcu/browser/session.py function _detect_screen_resolution (line 189) | def _detect_screen_resolution() -> tuple[int, int] | None: function _get_viewport (line 238) | def _get_viewport(scale: float | None = None) -> dict[str, int]: function get_shared_browser (line 271) | async def get_shared_browser(headless: bool = True) -> Browser: function close_shared_browser (line 296) | async def close_shared_browser() -> None: class TabMeta (line 321) | class TabMeta: class BrowserSession (line 335) | class BrowserSession: method _is_running (line 370) | def _is_running(self) -> bool: method _health_check (line 382) | async def _health_check(self) -> None: method _cleanup_after_failed_start (line 406) | async def _cleanup_after_failed_start(self) -> None: method start (line 451) | async def start(self, headless: bool = True, persistent: bool = True) ... method stop (line 589) | async def stop(self) -> dict: method create_agent_session (line 632) | async def create_agent_session( method status (line 683) | async def status(self) -> dict: method ensure_running (line 697) | async def ensure_running(self) -> None: method open_tab (line 702) | async def open_tab(self, url: str, background: bool = False, wait_unti... method _open_tab_background (line 739) | async def _open_tab_background(self, url: str, wait_until: str = "load... method _handle_page_close (line 799) | def _handle_page_close(self, target_id: str) -> None: method _handle_popup_page (line 812) | def _handle_popup_page(self, page: Page) -> None: method _register_page (line 838) | def _register_page( method _capture_console (line 864) | def _capture_console(self, target_id: str, msg: Any) -> None: method close_tab (line 874) | async def close_tab(self, target_id: str | None = None) -> dict: method focus_tab (line 890) | async def focus_tab(self, target_id: str) -> dict: method list_tabs (line 899) | async def list_tabs(self) -> list[dict]: method get_active_page (line 920) | def get_active_page(self) -> Page | None: method get_page (line 926) | def get_page(self, target_id: str | None = None) -> Page | None: function set_active_profile (line 948) | def set_active_profile(profile: str) -> contextvars.Token: function get_session (line 957) | def get_session(profile: str | None = None) -> BrowserSession: function get_all_sessions (line 971) | def get_all_sessions() -> dict[str, BrowserSession]: function shutdown_all_browsers (line 976) | async def shutdown_all_browsers() -> None: FILE: tools/src/gcu/browser/tools/advanced.py function register_advanced_tools (line 22) | def register_advanced_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/tools/inspection.py function _format_ax_tree (line 19) | def _format_ax_tree(nodes: list[dict[str, Any]]) -> str: function register_inspection_tools (line 95) | def register_inspection_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/tools/interactions.py function _auto_snapshot (line 27) | async def _auto_snapshot( function register_interaction_tools (line 62) | def register_interaction_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/tools/lifecycle.py function register_lifecycle_tools (line 10) | def register_lifecycle_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/tools/navigation.py function register_navigation_tools (line 14) | def register_navigation_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/browser/tools/tabs.py function register_tab_tools (line 14) | def register_tab_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/files/__init__.py function register_tools (line 18) | def register_tools(mcp: FastMCP) -> None: FILE: tools/src/gcu/server.py function setup_logger (line 35) | def setup_logger() -> None: function _patched_console_init (line 54) | def _patched_console_init(self, *args, **kwargs): function _lifespan (line 70) | async def _lifespan(server: FastMCP) -> AsyncIterator[dict]: function _sync_shutdown (line 79) | def _sync_shutdown() -> None: function main (line 97) | def main() -> None: FILE: tools/test_highlights.py function step (line 21) | async def step(label: str) -> None: function main (line 25) | async def main() -> None: FILE: tools/test_schema_discovery.py function get_connection (line 26) | def get_connection(): function list_all_tables (line 47) | def list_all_tables(cursor): function get_table_schema (line 59) | def get_table_schema(cursor, table_name): function print_table_schema (line 140) | def print_table_schema(schema, is_last=False): function main (line 174) | def main(): FILE: tools/tests/conftest.py function mcp (line 19) | def mcp() -> FastMCP: function mock_credentials (line 25) | def mock_credentials() -> CredentialStoreAdapter: function sample_text_file (line 37) | def sample_text_file(tmp_path: Path) -> Path: function sample_csv (line 45) | def sample_csv(tmp_path: Path) -> Path: function sample_json (line 53) | def sample_json(tmp_path: Path) -> Path: function large_text_file (line 61) | def large_text_file(tmp_path: Path) -> Path: function live_credential_resolver (line 69) | def live_credential_resolver() -> Callable[[str], str | None]: FILE: tools/tests/credentials/test_google_analytics_credentials.py class TestGoogleAnalyticsCredentials (line 7) | class TestGoogleAnalyticsCredentials: method test_credential_spec_exists (line 10) | def test_credential_spec_exists(self): method test_credential_registered_in_global_specs (line 14) | def test_credential_registered_in_global_specs(self): method test_env_var (line 18) | def test_env_var(self): method test_tools_list (line 23) | def test_tools_list(self): method test_required_flag (line 37) | def test_required_flag(self): method test_not_startup_required (line 42) | def test_not_startup_required(self): method test_help_url_set (line 47) | def test_help_url_set(self): method test_description_set (line 52) | def test_description_set(self): FILE: tools/tests/integrations/conftest.py function _discover_tool_modules (line 39) | def _discover_tool_modules() -> list[tuple[str, str]]: function _get_credential_tool_modules (line 84) | def _get_credential_tool_modules() -> list[tuple[str, str]]: function _get_module_to_tools_mapping (line 102) | def _get_module_to_tools_mapping() -> dict[str, list[str]]: function get_all_credential_tool_names (line 132) | def get_all_credential_tool_names() -> list[str]: function get_minimal_args (line 147) | def get_minimal_args(fn: Any) -> dict[str, Any]: FILE: tools/tests/integrations/test_input_validation.py function _find_module_for_tool (line 39) | def _find_module_for_tool(tool_name: str) -> str | None: function _register_and_get_fn (line 50) | def _register_and_get_fn(tool_name: str): class TestMissingCredentialsError (line 90) | class TestMissingCredentialsError: method test_missing_credentials_returns_error_and_help (line 98) | def test_missing_credentials_returns_error_and_help( class TestMissingRequiredParams (line 133) | class TestMissingRequiredParams: method test_missing_required_params_returns_error (line 141) | def test_missing_required_params_returns_error( FILE: tools/tests/integrations/test_registration.py class TestRegisterWithoutCredentials (line 32) | class TestRegisterWithoutCredentials: method test_register_tools_no_raise (line 40) | def test_register_tools_no_raise(self, import_path: str, short_name: s... class TestRegisterWithMockCredentials (line 59) | class TestRegisterWithMockCredentials: method mock_credentials (line 63) | def mock_credentials(self) -> CredentialStoreAdapter: method test_register_tools_with_credentials_no_raise (line 82) | def test_register_tools_with_credentials_no_raise( class TestExpectedToolsRegistered (line 101) | class TestExpectedToolsRegistered: method test_tools_registered_in_mcp (line 109) | def test_tools_registered_in_mcp(self, import_path: str, short_name: s... method test_register_all_tools_returns_complete_list (line 131) | def test_register_all_tools_returns_complete_list(self): FILE: tools/tests/integrations/test_spec_conformance.py class TestModuleStructure (line 47) | class TestModuleStructure: method test_module_exports_register_tools (line 55) | def test_module_exports_register_tools(self, import_path: str, short_n... method test_register_tools_in_all (line 68) | def test_register_tools_in_all(self, import_path: str, short_name: str): class TestRegisterToolsSignature (line 83) | class TestRegisterToolsSignature: method test_accepts_mcp_param (line 91) | def test_accepts_mcp_param(self, import_path: str, short_name: str): method test_credential_tools_accept_credentials_param (line 106) | def test_credential_tools_accept_credentials_param(self, import_path: ... class TestCredentialSpecFields (line 125) | class TestCredentialSpecFields: method test_env_var_non_empty (line 129) | def test_env_var_non_empty(self, spec_name: str): method test_tools_or_node_types_non_empty (line 135) | def test_tools_or_node_types_non_empty(self, spec_name: str): method test_help_url_non_empty (line 143) | def test_help_url_non_empty(self, spec_name: str): method test_description_non_empty (line 149) | def test_description_non_empty(self, spec_name: str): method test_credential_id_non_empty (line 155) | def test_credential_id_non_empty(self, spec_name: str): method test_credential_key_non_empty (line 161) | def test_credential_key_non_empty(self, spec_name: str): class TestSpecToolsMatchRegistered (line 172) | class TestSpecToolsMatchRegistered: method registered_tools (line 176) | def registered_tools(self) -> set[str]: method test_spec_tools_are_registered (line 183) | def test_spec_tools_are_registered(self, spec_name: str, registered_to... class TestSpecsMergedIntoCredentialSpecs (line 204) | class TestSpecsMergedIntoCredentialSpecs: method test_category_merged (line 217) | def test_category_merged(self, category_name: str): class TestToolNamesInReturnList (line 234) | class TestToolNamesInReturnList: method all_tools_return (line 238) | def all_tools_return(self) -> list[str]: method test_spec_tools_in_return_list (line 244) | def test_spec_tools_in_return_list(self, spec_name: str, all_tools_ret... class TestCredentialCoverage (line 264) | class TestCredentialCoverage: method all_spec_tools (line 275) | def all_spec_tools(self) -> set[str]: method test_credential_tools_have_specs (line 288) | def test_credential_tools_have_specs( FILE: tools/tests/test_browser_advanced_tools.py function mcp (line 12) | def mcp() -> FastMCP: function browser_wait_fn (line 18) | def browser_wait_fn(mcp): function test_browser_wait_passes_text_as_function_argument (line 25) | async def test_browser_wait_passes_text_as_function_argument(browser_wai... FILE: tools/tests/test_coder_tools_server.py function _load_coder_tools_server (line 10) | def _load_coder_tools_server(): function _install_fake_framework (line 19) | def _install_fake_framework(monkeypatch, tools_by_server: dict[str, list... function _call_list_agent_tools (line 75) | def _call_list_agent_tools(mod, **kwargs) -> str: function test_list_agent_tools_groups_by_provider_and_keeps_uncredentialed (line 80) | def test_list_agent_tools_groups_by_provider_and_keeps_uncredentialed(mo... function test_list_agent_tools_provider_filter_and_legacy_prefix_filter (line 129) | def test_list_agent_tools_provider_filter_and_legacy_prefix_filter(monke... FILE: tools/tests/test_command_sanitizer.py class TestSafeCommands (line 16) | class TestSafeCommands: method test_safe_command_passes (line 71) | def test_safe_command_passes(self, cmd): method test_empty_command (line 75) | def test_empty_command(self): class TestBlockedExecutables (line 87) | class TestBlockedExecutables: method test_blocked_executable (line 131) | def test_blocked_executable(self, cmd): class TestBlockedPatterns (line 137) | class TestBlockedPatterns: method test_blocked_pattern (line 170) | def test_blocked_pattern(self, cmd): class TestChainedCommands (line 176) | class TestChainedCommands: method test_chained_dangerous_command (line 190) | def test_chained_dangerous_command(self, cmd): class TestEdgeCases (line 196) | class TestEdgeCases: method test_env_var_prefix_does_not_bypass (line 199) | def test_env_var_prefix_does_not_bypass(self): method test_directory_prefix_does_not_bypass (line 211) | def test_directory_prefix_does_not_bypass(self, cmd): method test_case_insensitive_blocking (line 216) | def test_case_insensitive_blocking(self): method test_exe_suffix_stripped (line 223) | def test_exe_suffix_stripped(self): method test_safe_rm_without_dangerous_target (line 228) | def test_safe_rm_without_dangerous_target(self): method test_python_without_c_flag_is_safe (line 233) | def test_python_without_c_flag_is_safe(self): method test_python_c_with_quoted_inline_code_is_blocked (line 245) | def test_python_c_with_quoted_inline_code_is_blocked(self, cmd): method test_error_message_is_descriptive (line 250) | def test_error_message_is_descriptive(self): FILE: tools/tests/test_credential_registry.py class TestRegistryCompleteness (line 16) | class TestRegistryCompleteness: method test_specs_with_endpoint_have_checkers (line 33) | def test_specs_with_endpoint_have_checkers(self): method test_checkers_have_corresponding_specs (line 49) | def test_checkers_have_corresponding_specs(self): class TestSpecRequiredFields (line 55) | class TestSpecRequiredFields: method test_has_env_var (line 63) | def test_has_env_var(self, cred_name, spec): method test_has_description (line 71) | def test_has_description(self, cred_name, spec): method test_has_tools_or_node_types (line 79) | def test_has_tools_or_node_types(self, cred_name, spec): class TestNoDuplicateEnvVars (line 85) | class TestNoDuplicateEnvVars: method test_no_accidental_env_var_collisions (line 88) | def test_no_accidental_env_var_collisions(self): FILE: tools/tests/test_credentials.py function _no_dotenv (line 16) | def _no_dotenv(tmp_path, monkeypatch): class TestCredentialStoreAdapter (line 26) | class TestCredentialStoreAdapter: method test_get_returns_env_value (line 29) | def test_get_returns_env_value(self, monkeypatch): method test_get_returns_none_when_not_set (line 37) | def test_get_returns_none_when_not_set(self, monkeypatch): method test_get_raises_for_unknown_credential (line 45) | def test_get_raises_for_unknown_credential(self): method test_is_available_true_when_set (line 55) | def test_is_available_true_when_set(self, monkeypatch): method test_is_available_false_when_not_set (line 63) | def test_is_available_false_when_not_set(self, monkeypatch): method test_is_available_false_for_empty_string (line 71) | def test_is_available_false_for_empty_string(self, monkeypatch): method test_get_spec_returns_spec (line 79) | def test_get_spec_returns_spec(self): method test_get_spec_raises_for_unknown (line 88) | def test_get_spec_raises_for_unknown(self): class TestCredentialStoreAdapterToolMapping (line 96) | class TestCredentialStoreAdapterToolMapping: method test_get_credential_for_tool (line 99) | def test_get_credential_for_tool(self): method test_get_credential_for_tool_returns_none_for_unknown (line 105) | def test_get_credential_for_tool_returns_none_for_unknown(self): method test_get_missing_for_tools_returns_missing (line 112) | def test_get_missing_for_tools_returns_missing(self, monkeypatch): method test_get_missing_for_tools_returns_empty_when_all_present (line 124) | def test_get_missing_for_tools_returns_empty_when_all_present(self, mo... method test_get_missing_for_tools_no_duplicates (line 133) | def test_get_missing_for_tools_no_duplicates(self, monkeypatch): class TestCredentialStoreAdapterValidation (line 153) | class TestCredentialStoreAdapterValidation: method test_validate_for_tools_raises_for_missing (line 156) | def test_validate_for_tools_raises_for_missing(self, monkeypatch): method test_validate_for_tools_passes_when_present (line 170) | def test_validate_for_tools_passes_when_present(self, monkeypatch): method test_validate_for_tools_passes_for_tools_without_credentials (line 179) | def test_validate_for_tools_passes_for_tools_without_credentials(self): method test_validate_for_tools_passes_for_empty_list (line 186) | def test_validate_for_tools_passes_for_empty_list(self): method test_validate_for_tools_skips_optional_credentials (line 193) | def test_validate_for_tools_skips_optional_credentials(self, monkeypat... class TestCredentialStoreAdapterForTesting (line 210) | class TestCredentialStoreAdapterForTesting: method test_for_testing_uses_overrides (line 213) | def test_for_testing_uses_overrides(self): method test_for_testing_ignores_env (line 219) | def test_for_testing_ignores_env(self, monkeypatch): method test_for_testing_validation_passes_with_overrides (line 227) | def test_for_testing_validation_passes_with_overrides(self): method test_for_testing_validation_fails_without_override (line 234) | def test_for_testing_validation_fails_without_override(self, monkeypat... method test_for_testing_with_custom_specs (line 243) | def test_for_testing_with_custom_specs(self): class TestCredentialSpec (line 261) | class TestCredentialSpec: method test_default_values (line 264) | def test_default_values(self): method test_all_values (line 276) | def test_all_values(self): class TestCredentialSpecs (line 297) | class TestCredentialSpecs: method test_brave_search_spec_exists (line 300) | def test_brave_search_spec_exists(self): class TestNodeTypeValidation (line 312) | class TestNodeTypeValidation: method test_get_missing_for_node_types_returns_missing (line 315) | def test_get_missing_for_node_types_returns_missing(self, monkeypatch): method test_get_missing_for_node_types_returns_empty_when_present (line 335) | def test_get_missing_for_node_types_returns_empty_when_present(self, m... method test_get_missing_for_node_types_ignores_unknown_types (line 352) | def test_get_missing_for_node_types_ignores_unknown_types(self, monkey... method test_validate_for_node_types_raises_for_missing (line 361) | def test_validate_for_node_types_raises_for_missing(self, monkeypatch): method test_validate_for_node_types_passes_when_present (line 382) | def test_validate_for_node_types_passes_when_present(self, monkeypatch): class TestStartupValidation (line 392) | class TestStartupValidation: method test_validate_startup_raises_for_missing (line 395) | def test_validate_startup_raises_for_missing(self, monkeypatch): method test_validate_startup_passes_when_present (line 416) | def test_validate_startup_passes_when_present(self, monkeypatch): method test_validate_startup_ignores_non_startup_creds (line 425) | def test_validate_startup_ignores_non_startup_creds(self, monkeypatch): method test_validate_startup_with_test_overrides (line 435) | def test_validate_startup_with_test_overrides(self): class TestSpecCompleteness (line 443) | class TestSpecCompleteness: method test_direct_api_key_specs_have_instructions (line 446) | def test_direct_api_key_specs_have_instructions(self): method test_all_specs_have_credential_id (line 455) | def test_all_specs_have_credential_id(self): method test_google_search_and_cse_share_credential_group (line 460) | def test_google_search_and_cse_share_credential_group(self): method test_credential_group_default_empty (line 469) | def test_credential_group_default_empty(self): class TestCredentialStoreAdapterAdenSync (line 489) | class TestCredentialStoreAdapterAdenSync: method _patch_encrypted_storage (line 492) | def _patch_encrypted_storage(self, tmp_path): method test_default_with_aden_key_creates_aden_store (line 503) | def test_default_with_aden_key_creates_aden_store(self, monkeypatch, t... method test_default_without_aden_key_uses_env_fallback (line 527) | def test_default_without_aden_key_uses_env_fallback(self, monkeypatch,... method test_default_aden_non_aden_cred_falls_through_to_env (line 540) | def test_default_aden_non_aden_cred_falls_through_to_env(self, monkeyp... method test_default_aden_sync_failure_falls_back_gracefully (line 565) | def test_default_aden_sync_failure_falls_back_gracefully(self, monkeyp... method test_default_aden_import_error_falls_back (line 591) | def test_default_aden_import_error_falls_back(self, monkeypatch, tmp_p... FILE: tools/tests/test_env_helpers.py class TestGetEnvVar (line 8) | class TestGetEnvVar: method test_returns_value_when_set (line 11) | def test_returns_value_when_set(self, monkeypatch): method test_returns_default_when_not_set (line 19) | def test_returns_default_when_not_set(self, monkeypatch): method test_returns_none_when_not_set_and_no_default (line 27) | def test_returns_none_when_not_set_and_no_default(self, monkeypatch): method test_raises_when_required_and_missing (line 35) | def test_raises_when_required_and_missing(self, monkeypatch): method test_returns_value_when_required_and_set (line 45) | def test_returns_value_when_required_and_set(self, monkeypatch): FILE: tools/tests/test_health_checks.py class TestHealthCheckerRegistry (line 20) | class TestHealthCheckerRegistry: method test_google_search_registered (line 23) | def test_google_search_registered(self): method test_github_registered (line 28) | def test_github_registered(self): method test_resend_registered (line 33) | def test_resend_registered(self): method test_google_maps_registered (line 38) | def test_google_maps_registered(self): method test_google_registered (line 43) | def test_google_registered(self): method test_lusha_registered (line 48) | def test_lusha_registered(self): method test_discord_registered (line 53) | def test_discord_registered(self): method test_all_expected_checkers_registered (line 58) | def test_all_expected_checkers_registered(self): class TestGitHubHealthChecker (line 104) | class TestGitHubHealthChecker: method _mock_response (line 107) | def _mock_response(self, status_code, json_data=None): method test_valid_token_200 (line 115) | def test_valid_token_200(self, mock_client_cls): method test_invalid_token_401 (line 129) | def test_invalid_token_401(self, mock_client_cls): method test_forbidden_403 (line 142) | def test_forbidden_403(self, mock_client_cls): method test_timeout (line 155) | def test_timeout(self, mock_client_cls): method test_request_error (line 168) | def test_request_error(self, mock_client_cls): class TestResendHealthChecker (line 181) | class TestResendHealthChecker: method _mock_response (line 184) | def _mock_response(self, status_code, json_data=None): method test_valid_key_200 (line 192) | def test_valid_key_200(self, mock_client_cls): method test_invalid_key_401 (line 205) | def test_invalid_key_401(self, mock_client_cls): method test_forbidden_403 (line 218) | def test_forbidden_403(self, mock_client_cls): method test_timeout (line 231) | def test_timeout(self, mock_client_cls): class TestGoogleMapsHealthChecker (line 244) | class TestGoogleMapsHealthChecker: method _mock_response (line 247) | def _mock_response(self, status_code, json_data=None): method test_valid_key_ok_status (line 255) | def test_valid_key_ok_status(self, mock_client_cls): method test_invalid_key_request_denied (line 268) | def test_invalid_key_request_denied(self, mock_client_cls): method test_quota_exceeded_still_valid (line 283) | def test_quota_exceeded_still_valid(self, mock_client_cls): method test_http_error (line 298) | def test_http_error(self, mock_client_cls): method test_timeout (line 311) | def test_timeout(self, mock_client_cls): method test_request_error (line 324) | def test_request_error(self, mock_client_cls): class TestLushaHealthChecker (line 337) | class TestLushaHealthChecker: method _mock_response (line 340) | def _mock_response(self, status_code, json_data=None): method test_valid_key_200 (line 348) | def test_valid_key_200(self, mock_client_cls): method test_invalid_key_401 (line 361) | def test_invalid_key_401(self, mock_client_cls): method test_rate_limited_429_still_valid (line 374) | def test_rate_limited_429_still_valid(self, mock_client_cls): method test_timeout (line 387) | def test_timeout(self, mock_client_cls): class TestCheckCredentialHealthDispatcher (line 400) | class TestCheckCredentialHealthDispatcher: method test_unknown_credential_returns_valid (line 403) | def test_unknown_credential_returns_valid(self): method test_dispatches_to_registered_checker (line 411) | def test_dispatches_to_registered_checker(self, mock_client_cls): method test_google_search_with_cse_id (line 426) | def test_google_search_with_cse_id(self, mock_client_cls): method test_google_search_without_cse_id (line 442) | def test_google_search_without_cse_id(self): class TestGoogleHealthChecker (line 450) | class TestGoogleHealthChecker: method _setup_mock_client (line 453) | def _setup_mock_client(self, mock_client_cls): method _mock_response (line 459) | def _mock_response(self, status_code): method test_all_scopes_valid (line 465) | def test_all_scopes_valid(self, mock_client_cls): method test_invalid_token_401_fails_fast (line 484) | def test_invalid_token_401_fails_fast(self, mock_client_cls): method test_missing_calendar_scope (line 498) | def test_missing_calendar_scope(self, mock_client_cls): method test_missing_gmail_and_sheets_scopes (line 515) | def test_missing_gmail_and_sheets_scopes(self, mock_client_cls): method test_sheets_404_is_success (line 533) | def test_sheets_404_is_success(self, mock_client_cls): method test_unexpected_status_code (line 548) | def test_unexpected_status_code(self, mock_client_cls): method test_timeout (line 564) | def test_timeout(self, mock_client_cls): method test_request_error_with_bearer_token_sanitized (line 574) | def test_request_error_with_bearer_token_sanitized(self): method test_request_error_without_sensitive_data_passes_through (line 591) | def test_request_error_without_sensitive_data_passes_through(self): FILE: tools/tests/test_live_health_checks.py function _redact (line 36) | def _redact(value: str) -> str: class TestLiveHealthCheckers (line 49) | class TestLiveHealthCheckers: method test_checker_returns_valid (line 53) | def test_checker_returns_valid(self, credential_name, live_credential_... method test_checker_extracts_identity (line 78) | def test_checker_extracts_identity(self, credential_name, live_credent... class TestLiveDispatcher (line 109) | class TestLiveDispatcher: method test_dispatcher_returns_valid (line 113) | def test_dispatcher_returns_valid(self, credential_name, live_credenti... class TestLiveIntegrationWiring (line 140) | class TestLiveIntegrationWiring: method test_wiring_valid (line 144) | def test_wiring_valid(self, credential_name): class TestLiveCredentialSummary (line 158) | class TestLiveCredentialSummary: method test_credential_availability_summary (line 161) | def test_credential_availability_summary(self, live_credential_resolver): FILE: tools/tests/test_x_page_load_repro.py function ts (line 39) | def ts(): function log (line 44) | def log(turn: int | str, action: str, result_summary: str, elapsed: float): function reproduce_agent_session (line 49) | async def reproduce_agent_session(session: BrowserSession): function demonstrate_correct_approach (line 224) | async def demonstrate_correct_approach(session: BrowserSession): function main (line 332) | async def main(): FILE: tools/tests/tools/test_airtable_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestAirtableListRecords (line 35) | class TestAirtableListRecords: method test_missing_credentials (line 36) | def test_missing_credentials(self, tool_fns): method test_missing_params (line 41) | def test_missing_params(self, tool_fns): method test_successful_list (line 46) | def test_successful_list(self, tool_fns): method test_pagination (line 60) | def test_pagination(self, tool_fns): class TestAirtableGetRecord (line 75) | class TestAirtableGetRecord: method test_missing_params (line 76) | def test_missing_params(self, tool_fns): method test_successful_get (line 81) | def test_successful_get(self, tool_fns): class TestAirtableCreateRecords (line 97) | class TestAirtableCreateRecords: method test_missing_records (line 98) | def test_missing_records(self, tool_fns): method test_invalid_json (line 105) | def test_invalid_json(self, tool_fns): method test_too_many_records (line 112) | def test_too_many_records(self, tool_fns): method test_successful_create (line 123) | def test_successful_create(self, tool_fns): class TestAirtableUpdateRecords (line 142) | class TestAirtableUpdateRecords: method test_successful_update (line 143) | def test_successful_update(self, tool_fns): class TestAirtableListBases (line 164) | class TestAirtableListBases: method test_missing_credentials (line 165) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 170) | def test_successful_list(self, tool_fns): class TestAirtableGetBaseSchema (line 189) | class TestAirtableGetBaseSchema: method test_missing_base_id (line 190) | def test_missing_base_id(self, tool_fns): method test_successful_schema (line 195) | def test_successful_schema(self, tool_fns): FILE: tools/tests/tools/test_apify_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestApifyRunActor (line 20) | class TestApifyRunActor: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_missing_actor_id (line 26) | def test_missing_actor_id(self, tool_fns): method test_successful_run (line 31) | def test_successful_run(self, tool_fns): class TestApifyGetRun (line 54) | class TestApifyGetRun: method test_missing_ids (line 55) | def test_missing_ids(self, tool_fns): method test_successful_get (line 60) | def test_successful_get(self, tool_fns): class TestApifyGetDatasetItems (line 84) | class TestApifyGetDatasetItems: method test_missing_dataset_id (line 85) | def test_missing_dataset_id(self, tool_fns): method test_successful_get (line 90) | def test_successful_get(self, tool_fns): class TestApifyListActors (line 107) | class TestApifyListActors: method test_successful_list (line 108) | def test_successful_list(self, tool_fns): class TestApifyListRuns (line 134) | class TestApifyListRuns: method test_successful_list (line 135) | def test_successful_list(self, tool_fns): class TestApifyGetKvStoreRecord (line 162) | class TestApifyGetKvStoreRecord: method test_missing_params (line 163) | def test_missing_params(self, tool_fns): method test_successful_get (line 168) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_apollo_tool.py class TestApolloClient (line 28) | class TestApolloClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 39) | def test_handle_response_success(self): method test_handle_response_errors (line 55) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 64) | def test_handle_response_generic_error(self): method test_enrich_person_by_email (line 73) | def test_enrich_person_by_email(self, mock_post): method test_enrich_person_by_linkedin (line 121) | def test_enrich_person_by_linkedin(self, mock_post): method test_enrich_person_by_name_and_domain (line 146) | def test_enrich_person_by_name_and_domain(self, mock_post): method test_enrich_person_with_reveal_flags (line 159) | def test_enrich_person_with_reveal_flags(self, mock_post): method test_enrich_person_with_optional_params (line 176) | def test_enrich_person_with_optional_params(self, mock_post): method test_enrich_person_not_found (line 196) | def test_enrich_person_not_found(self, mock_post): method test_enrich_company (line 208) | def test_enrich_company(self, mock_post): method test_enrich_company_not_found (line 255) | def test_enrich_company_not_found(self, mock_post): method test_search_people (line 267) | def test_search_people(self, mock_post): method test_search_people_limit_capped (line 333) | def test_search_people_limit_capped(self, mock_post): method test_search_companies (line 345) | def test_search_companies(self, mock_post): class TestToolRegistration (line 392) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 393) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 399) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 412) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 435) | def test_credentials_from_env_var(self): class TestEnrichPersonTool (line 464) | class TestEnrichPersonTool: method setup_method (line 465) | def setup_method(self): method _fn (line 473) | def _fn(self, name): method test_enrich_person_requires_email_or_linkedin (line 476) | def test_enrich_person_requires_email_or_linkedin(self): method test_enrich_person_success (line 482) | def test_enrich_person_success(self, mock_post): method test_enrich_person_timeout (line 502) | def test_enrich_person_timeout(self, mock_post): method test_enrich_person_network_error (line 509) | def test_enrich_person_network_error(self, mock_post): class TestEnrichCompanyTool (line 516) | class TestEnrichCompanyTool: method setup_method (line 517) | def setup_method(self): method _fn (line 525) | def _fn(self, name): method test_enrich_company_success (line 529) | def test_enrich_company_success(self, mock_post): method test_enrich_company_not_found (line 548) | def test_enrich_company_not_found(self, mock_post): class TestSearchPeopleTool (line 556) | class TestSearchPeopleTool: method setup_method (line 557) | def setup_method(self): method _fn (line 565) | def _fn(self, name): method test_search_people_success (line 569) | def test_search_people_success(self, mock_post): method test_search_people_with_all_filters (line 584) | def test_search_people_with_all_filters(self, mock_post): class TestSearchCompaniesTool (line 604) | class TestSearchCompaniesTool: method setup_method (line 605) | def setup_method(self): method _fn (line 613) | def _fn(self, name): method test_search_companies_success (line 617) | def test_search_companies_success(self, mock_post): method test_search_companies_with_all_filters (line 633) | def test_search_companies_with_all_filters(self, mock_post): class TestCredentialSpec (line 655) | class TestCredentialSpec: method test_apollo_credential_spec_exists (line 656) | def test_apollo_credential_spec_exists(self): method test_apollo_spec_env_var (line 661) | def test_apollo_spec_env_var(self): method test_apollo_spec_tools (line 667) | def test_apollo_spec_tools(self): FILE: tools/tests/tools/test_arxiv_tool.py function _make_mcp (line 25) | def _make_mcp() -> FastMCP: function _get_tool (line 31) | def _get_tool(mcp: FastMCP, name: str): function _make_arxiv_result (line 36) | def _make_arxiv_result( class TestToolRegistration (line 62) | class TestToolRegistration: method test_all_tools_registered (line 63) | def test_all_tools_registered(self): class TestSearchPapers (line 75) | class TestSearchPapers: method setup_method (line 76) | def setup_method(self): method test_validation_error_missing_params (line 80) | def test_validation_error_missing_params(self): method test_search_success (line 86) | def test_search_success(self, mock_client): method test_search_success_with_results (line 100) | def test_search_success_with_results(self, mock_client): method test_search_by_id_list (line 109) | def test_search_by_id_list(self, mock_client): method test_max_results_clamped (line 118) | def test_max_results_clamped(self): method test_arxiv_error_handling (line 126) | def test_arxiv_error_handling(self, mock_client): method test_network_error_handling (line 135) | def test_network_error_handling(self, mock_client): class TestDownloadPaper (line 147) | class TestDownloadPaper: method setup_method (line 148) | def setup_method(self): method test_download_success (line 154) | def test_download_success(self, mock_client, mock_get, tmp_path): method test_no_paper_found (line 172) | def test_no_paper_found(self, mock_client): method test_no_pdf_url (line 179) | def test_no_pdf_url(self, mock_client): method test_download_network_error (line 188) | def test_download_network_error(self, mock_client, mock_get): method test_download_invalid_content_type (line 201) | def test_download_invalid_content_type(self, mock_client, mock_get): method test_file_cleanup_on_error (line 216) | def test_file_cleanup_on_error(self, mock_client, mock_get, tmp_path): FILE: tools/tests/tools/test_asana_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestAsanaListWorkspaces (line 20) | class TestAsanaListWorkspaces: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_successful_list (line 26) | def test_successful_list(self, tool_fns): class TestAsanaListProjects (line 40) | class TestAsanaListProjects: method test_missing_workspace (line 41) | def test_missing_workspace(self, tool_fns): method test_successful_list (line 46) | def test_successful_list(self, tool_fns): class TestAsanaListTasks (line 64) | class TestAsanaListTasks: method test_missing_params (line 65) | def test_missing_params(self, tool_fns): method test_successful_list (line 70) | def test_successful_list(self, tool_fns): class TestAsanaGetTask (line 94) | class TestAsanaGetTask: method test_missing_gid (line 95) | def test_missing_gid(self, tool_fns): method test_successful_get (line 100) | def test_successful_get(self, tool_fns): class TestAsanaCreateTask (line 128) | class TestAsanaCreateTask: method test_missing_name (line 129) | def test_missing_name(self, tool_fns): method test_successful_create (line 134) | def test_successful_create(self, tool_fns): class TestAsanaSearchTasks (line 150) | class TestAsanaSearchTasks: method test_missing_params (line 151) | def test_missing_params(self, tool_fns): method test_successful_search (line 156) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_attio_tool.py class TestAttioClient (line 28) | class TestAttioClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 38) | def test_handle_response_success(self): method test_handle_response_204_no_content (line 45) | def test_handle_response_204_no_content(self): method test_handle_response_errors (line 59) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 66) | def test_handle_response_generic_error(self): method test_handle_response_generic_error_no_json (line 74) | def test_handle_response_generic_error_no_json(self): method test_request_get (line 84) | def test_request_get(self, mock_request): method test_request_post_with_body (line 103) | def test_request_post_with_body(self, mock_request): method test_request_with_params (line 117) | def test_request_with_params(self, mock_request): method test_list_records (line 134) | def test_list_records(self, mock_request): method test_list_records_with_filter (line 151) | def test_list_records_with_filter(self, mock_request): method test_list_records_error (line 165) | def test_list_records_error(self, mock_request): method test_get_record (line 174) | def test_get_record(self, mock_request): method test_create_record (line 190) | def test_create_record(self, mock_request): method test_update_record (line 209) | def test_update_record(self, mock_request): method test_assert_record (line 226) | def test_assert_record(self, mock_request): method test_list_lists (line 242) | def test_list_lists(self, mock_request): method test_get_entries (line 254) | def test_get_entries(self, mock_request): method test_create_entry (line 266) | def test_create_entry(self, mock_request): method test_create_entry_with_values (line 281) | def test_create_entry_with_values(self, mock_request): method test_delete_entry (line 295) | def test_delete_entry(self, mock_request): method test_create_task (line 307) | def test_create_task(self, mock_request): method test_list_tasks (line 329) | def test_list_tasks(self, mock_request): method test_get_task (line 341) | def test_get_task(self, mock_request): method test_delete_task (line 352) | def test_delete_task(self, mock_request): method test_list_members (line 364) | def test_list_members(self, mock_request): method test_get_member (line 381) | def test_get_member(self, mock_request): class TestToolRegistration (line 397) | class TestToolRegistration: method setup_method (line 398) | def setup_method(self): method test_tool_count (line 404) | def test_tool_count(self): method test_all_tool_names_registered (line 410) | def test_all_tool_names_registered(self): class TestCredentialRetrieval (line 434) | class TestCredentialRetrieval: method test_credential_from_env (line 435) | def test_credential_from_env(self, monkeypatch): method test_no_credentials_returns_error (line 452) | def test_no_credentials_returns_error(self, monkeypatch): method test_credential_from_store (line 465) | def test_credential_from_store(self, monkeypatch): class TestToolErrorHandling (line 489) | class TestToolErrorHandling: method setup_method (line 490) | def setup_method(self): method test_timeout_error (line 497) | def test_timeout_error(self, mock_request, monkeypatch): method test_network_error (line 512) | def test_network_error(self, mock_request, monkeypatch): class TestRecordTools (line 530) | class TestRecordTools: method test_record_list (line 532) | def test_record_list(self, mock_request, monkeypatch): method test_record_list_with_filter_json (line 549) | def test_record_list_with_filter_json(self, mock_request, monkeypatch): method test_record_list_invalid_filter_json (line 568) | def test_record_list_invalid_filter_json(self, monkeypatch): method test_record_get (line 581) | def test_record_get(self, mock_request, monkeypatch): method test_record_create (line 598) | def test_record_create(self, mock_request, monkeypatch): method test_record_update (line 618) | def test_record_update(self, mock_request, monkeypatch): method test_record_assert (line 639) | def test_record_assert(self, mock_request, monkeypatch): class TestListTools (line 663) | class TestListTools: method test_list_lists (line 665) | def test_list_lists(self, mock_request, monkeypatch): method test_list_entries_get (line 682) | def test_list_entries_get(self, mock_request, monkeypatch): method test_list_entry_create (line 699) | def test_list_entry_create(self, mock_request, monkeypatch): method test_list_entry_delete (line 716) | def test_list_entry_delete(self, mock_request, monkeypatch): class TestTaskTools (line 735) | class TestTaskTools: method test_task_create (line 737) | def test_task_create(self, mock_request, monkeypatch): method test_task_list (line 754) | def test_task_list(self, mock_request, monkeypatch): method test_task_get (line 771) | def test_task_get(self, mock_request, monkeypatch): method test_task_delete (line 788) | def test_task_delete(self, mock_request, monkeypatch): class TestMemberTools (line 807) | class TestMemberTools: method test_members_list (line 809) | def test_members_list(self, mock_request, monkeypatch): method test_member_get (line 826) | def test_member_get(self, mock_request, monkeypatch): FILE: tools/tests/tools/test_aws_s3_tool.py function _mock_resp (line 17) | def _mock_resp(text="", status_code=200, headers=None): function tool_fns (line 27) | def tool_fns(mcp: FastMCP): class TestS3ListBuckets (line 55) | class TestS3ListBuckets: method test_missing_credentials (line 56) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 61) | def test_successful_list(self, tool_fns): class TestS3ListObjects (line 75) | class TestS3ListObjects: method test_missing_bucket (line 76) | def test_missing_bucket(self, tool_fns): method test_successful_list (line 81) | def test_successful_list(self, tool_fns): class TestS3GetObject (line 97) | class TestS3GetObject: method test_missing_params (line 98) | def test_missing_params(self, tool_fns): method test_successful_get_text (line 103) | def test_successful_get_text(self, tool_fns): class TestS3PutObject (line 123) | class TestS3PutObject: method test_missing_content (line 124) | def test_missing_content(self, tool_fns): method test_successful_put (line 129) | def test_successful_put(self, tool_fns): class TestS3DeleteObject (line 144) | class TestS3DeleteObject: method test_missing_params (line 145) | def test_missing_params(self, tool_fns): method test_successful_delete (line 150) | def test_successful_delete(self, tool_fns): FILE: tools/tests/tools/test_azure_sql_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestAzureSQLListServers (line 31) | class TestAzureSQLListServers: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 37) | def test_successful_list(self, tool_fns): class TestAzureSQLGetServer (line 70) | class TestAzureSQLGetServer: method test_missing_params (line 71) | def test_missing_params(self, tool_fns): method test_successful_get (line 76) | def test_successful_get(self, tool_fns): class TestAzureSQLListDatabases (line 103) | class TestAzureSQLListDatabases: method test_missing_params (line 104) | def test_missing_params(self, tool_fns): method test_successful_list (line 109) | def test_successful_list(self, tool_fns): class TestAzureSQLGetDatabase (line 145) | class TestAzureSQLGetDatabase: method test_missing_params (line 146) | def test_missing_params(self, tool_fns): method test_successful_get (line 153) | def test_successful_get(self, tool_fns): class TestAzureSQLListFirewallRules (line 182) | class TestAzureSQLListFirewallRules: method test_missing_params (line 183) | def test_missing_params(self, tool_fns): method test_successful_list (line 188) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_bigquery_tool.py function mcp (line 25) | def mcp(): function mock_credentials (line 31) | def mock_credentials(): function registered_mcp (line 42) | def registered_mcp(mcp, mock_credentials): class TestReadOnlyEnforcement (line 48) | class TestReadOnlyEnforcement: method test_blocks_insert (line 51) | def test_blocks_insert(self, registered_mcp): method test_blocks_update (line 58) | def test_blocks_update(self, registered_mcp): method test_blocks_delete (line 65) | def test_blocks_delete(self, registered_mcp): method test_blocks_drop (line 72) | def test_blocks_drop(self, registered_mcp): method test_blocks_create (line 79) | def test_blocks_create(self, registered_mcp): method test_blocks_alter (line 86) | def test_blocks_alter(self, registered_mcp): method test_blocks_truncate (line 93) | def test_blocks_truncate(self, registered_mcp): method test_blocks_merge (line 100) | def test_blocks_merge(self, registered_mcp): method test_blocks_case_insensitive (line 107) | def test_blocks_case_insensitive(self, registered_mcp): method test_allows_select (line 114) | def test_allows_select(self, registered_mcp): method test_allows_select_with_subquery (line 126) | def test_allows_select_with_subquery(self, registered_mcp): class TestRowLimits (line 144) | class TestRowLimits: method test_rejects_zero_max_rows (line 147) | def test_rejects_zero_max_rows(self, registered_mcp): method test_rejects_negative_max_rows (line 154) | def test_rejects_negative_max_rows(self, registered_mcp): method test_rejects_excessive_max_rows (line 161) | def test_rejects_excessive_max_rows(self, registered_mcp): method test_accepts_valid_max_rows (line 168) | def test_accepts_valid_max_rows(self, registered_mcp): class TestQueryExecution (line 181) | class TestQueryExecution: method test_successful_query (line 184) | def test_successful_query(self, registered_mcp): method test_query_truncation (line 225) | def test_query_truncation(self, registered_mcp): class TestDescribeDataset (line 263) | class TestDescribeDataset: method test_empty_dataset_id (line 266) | def test_empty_dataset_id(self, registered_mcp): method test_whitespace_dataset_id (line 273) | def test_whitespace_dataset_id(self, registered_mcp): method test_successful_describe (line 280) | def test_successful_describe(self, registered_mcp): class TestErrorHandling (line 319) | class TestErrorHandling: method test_authentication_error (line 322) | def test_authentication_error(self, registered_mcp): method test_permission_error (line 339) | def test_permission_error(self, registered_mcp): method test_not_found_error (line 356) | def test_not_found_error(self, registered_mcp): method test_dataset_not_found_error (line 372) | def test_dataset_not_found_error(self, registered_mcp): class TestCredentialResolution (line 388) | class TestCredentialResolution: method test_uses_credential_store (line 391) | def test_uses_credential_store(self, mcp): method test_falls_back_to_env_vars (line 405) | def test_falls_back_to_env_vars(self, mcp): class TestImportError (line 414) | class TestImportError: method test_import_error_message (line 417) | def test_import_error_message(self, registered_mcp): FILE: tools/tests/tools/test_brevo_tool.py function mcp (line 12) | def mcp(): function get_tool_fn (line 18) | def get_tool_fn(mcp: FastMCP): class TestBrevoCredentials (line 33) | class TestBrevoCredentials: method test_no_credentials_returns_error (line 36) | def test_no_credentials_returns_error(self, get_tool_fn, monkeypatch): method test_no_credentials_sms_returns_error (line 54) | def test_no_credentials_sms_returns_error(self, get_tool_fn, monkeypat... class TestBrevoSendEmail (line 70) | class TestBrevoSendEmail: method test_send_email_success (line 73) | def test_send_email_success(self, get_tool_fn, monkeypatch): method test_send_email_with_text_content (line 97) | def test_send_email_with_text_content(self, get_tool_fn, monkeypatch): method test_send_email_invalid_email (line 122) | def test_send_email_invalid_email(self, get_tool_fn, monkeypatch): method test_send_email_empty_subject (line 139) | def test_send_email_empty_subject(self, get_tool_fn, monkeypatch): method test_send_email_empty_content (line 156) | def test_send_email_empty_content(self, get_tool_fn, monkeypatch): method test_send_email_invalid_auth (line 173) | def test_send_email_invalid_auth(self, get_tool_fn, monkeypatch): method test_send_email_timeout (line 197) | def test_send_email_timeout(self, get_tool_fn, monkeypatch): class TestBrevoSendSMS (line 223) | class TestBrevoSendSMS: method test_send_sms_success (line 226) | def test_send_sms_success(self, get_tool_fn, monkeypatch): method test_send_sms_invalid_phone_format (line 251) | def test_send_sms_invalid_phone_format(self, get_tool_fn, monkeypatch): method test_send_sms_empty_content (line 261) | def test_send_sms_empty_content(self, get_tool_fn, monkeypatch): method test_send_sms_content_too_long (line 271) | def test_send_sms_content_too_long(self, get_tool_fn, monkeypatch): method test_send_sms_timeout (line 281) | def test_send_sms_timeout(self, get_tool_fn, monkeypatch): class TestBrevoCreateContact (line 300) | class TestBrevoCreateContact: method test_create_contact_success (line 303) | def test_create_contact_success(self, get_tool_fn, monkeypatch): method test_create_contact_with_list_ids (line 325) | def test_create_contact_with_list_ids(self, get_tool_fn, monkeypatch): method test_create_contact_invalid_email (line 342) | def test_create_contact_invalid_email(self, get_tool_fn, monkeypatch): method test_create_contact_invalid_list_ids (line 352) | def test_create_contact_invalid_list_ids(self, get_tool_fn, monkeypatch): method test_create_contact_timeout (line 362) | def test_create_contact_timeout(self, get_tool_fn, monkeypatch): class TestBrevoGetContact (line 381) | class TestBrevoGetContact: method test_get_contact_success (line 384) | def test_get_contact_success(self, get_tool_fn, monkeypatch): method test_get_contact_not_found (line 419) | def test_get_contact_not_found(self, get_tool_fn, monkeypatch): method test_get_contact_invalid_email (line 436) | def test_get_contact_invalid_email(self, get_tool_fn, monkeypatch): method test_get_contact_timeout (line 446) | def test_get_contact_timeout(self, get_tool_fn, monkeypatch): class TestBrevoUpdateContact (line 465) | class TestBrevoUpdateContact: method test_update_contact_success (line 468) | def test_update_contact_success(self, get_tool_fn, monkeypatch): method test_update_contact_with_list_ids (line 488) | def test_update_contact_with_list_ids(self, get_tool_fn, monkeypatch): method test_update_contact_invalid_email (line 504) | def test_update_contact_invalid_email(self, get_tool_fn, monkeypatch): method test_update_contact_invalid_list_ids (line 514) | def test_update_contact_invalid_list_ids(self, get_tool_fn, monkeypatch): method test_update_contact_timeout (line 524) | def test_update_contact_timeout(self, get_tool_fn, monkeypatch): class TestBrevoGetEmailStats (line 543) | class TestBrevoGetEmailStats: method test_get_email_stats_success (line 546) | def test_get_email_stats_success(self, get_tool_fn, monkeypatch): method test_get_email_stats_empty_message_id (line 572) | def test_get_email_stats_empty_message_id(self, get_tool_fn, monkeypat... method test_get_email_stats_not_found (line 582) | def test_get_email_stats_not_found(self, get_tool_fn, monkeypatch): method test_get_email_stats_timeout (line 598) | def test_get_email_stats_timeout(self, get_tool_fn, monkeypatch): class TestBrevoToolRegistration (line 617) | class TestBrevoToolRegistration: method test_all_tools_registered (line 620) | def test_all_tools_registered(self, mcp: FastMCP): method test_tools_registered_with_credentials (line 636) | def test_tools_registered_with_credentials(self, mcp: FastMCP): FILE: tools/tests/tools/test_calcom_tool.py function mcp (line 13) | def mcp(): function calcom_tools (line 19) | def calcom_tools(mcp: FastMCP, monkeypatch): class TestToolRegistration (line 36) | class TestToolRegistration: method test_all_tools_registered (line 39) | def test_all_tools_registered(self, mcp: FastMCP, monkeypatch): class TestCredentialHandling (line 60) | class TestCredentialHandling: method test_no_credentials_returns_error (line 63) | def test_no_credentials_returns_error(self, mcp: FastMCP, monkeypatch): method test_non_string_credential_returns_error (line 75) | def test_non_string_credential_returns_error(self, mcp: FastMCP, monke... method test_credentials_from_env (line 88) | def test_credentials_from_env(self, mcp: FastMCP, monkeypatch): class TestListBookings (line 111) | class TestListBookings: method test_list_bookings_success (line 114) | def test_list_bookings_success(self, calcom_tools, monkeypatch): method test_list_bookings_with_filters (line 132) | def test_list_bookings_with_filters(self, calcom_tools): class TestGetBooking (line 156) | class TestGetBooking: method test_get_booking_success (line 159) | def test_get_booking_success(self, calcom_tools): method test_get_booking_not_found (line 173) | def test_get_booking_not_found(self, calcom_tools): class TestCreateBooking (line 186) | class TestCreateBooking: method test_create_booking_success (line 189) | def test_create_booking_success(self, calcom_tools): method test_create_booking_missing_required_fields (line 213) | def test_create_booking_missing_required_fields(self, calcom_tools): class TestCancelBooking (line 225) | class TestCancelBooking: method test_cancel_booking_success (line 228) | def test_cancel_booking_success(self, calcom_tools): method test_cancel_booking_with_reason (line 246) | def test_cancel_booking_with_reason(self, calcom_tools): class TestGetAvailability (line 261) | class TestGetAvailability: method test_get_availability_success (line 264) | def test_get_availability_success(self, calcom_tools): method test_get_availability_missing_required (line 284) | def test_get_availability_missing_required(self, calcom_tools): class TestUpdateSchedule (line 295) | class TestUpdateSchedule: method test_update_schedule_with_availability (line 298) | def test_update_schedule_with_availability(self, calcom_tools): class TestListSchedules (line 314) | class TestListSchedules: method test_list_schedules_success (line 317) | def test_list_schedules_success(self, calcom_tools): method test_list_schedules_empty (line 334) | def test_list_schedules_empty(self, calcom_tools): class TestListEventTypes (line 347) | class TestListEventTypes: method test_list_event_types_success (line 350) | def test_list_event_types_success(self, calcom_tools): class TestGetEventType (line 368) | class TestGetEventType: method test_get_event_type_success (line 371) | def test_get_event_type_success(self, calcom_tools): method test_get_event_type_missing_id (line 385) | def test_get_event_type_missing_id(self, calcom_tools): class TestErrorHandling (line 392) | class TestErrorHandling: method test_401_unauthorized (line 395) | def test_401_unauthorized(self, calcom_tools): method test_429_rate_limit (line 407) | def test_429_rate_limit(self, calcom_tools): method test_timeout_error (line 419) | def test_timeout_error(self, calcom_tools): method test_network_error (line 429) | def test_network_error(self, calcom_tools): FILE: tools/tests/tools/test_calendar_tool.py function calendar_tools (line 13) | def calendar_tools(mcp: FastMCP): function _mock_response (line 29) | def _mock_response(status_code: int = 200, json_data: dict | None = None... class TestCredentialErrors (line 37) | class TestCredentialErrors: method test_list_events_no_credentials (line 40) | def test_list_events_no_credentials(self, calendar_tools, monkeypatch): method test_get_event_no_credentials (line 51) | def test_get_event_no_credentials(self, calendar_tools, monkeypatch): method test_create_event_no_credentials (line 60) | def test_create_event_no_credentials(self, calendar_tools, monkeypatch): method test_update_event_no_credentials (line 73) | def test_update_event_no_credentials(self, calendar_tools, monkeypatch): method test_delete_event_no_credentials (line 82) | def test_delete_event_no_credentials(self, calendar_tools, monkeypatch): method test_list_calendars_no_credentials (line 91) | def test_list_calendars_no_credentials(self, calendar_tools, monkeypat... method test_get_calendar_no_credentials (line 100) | def test_get_calendar_no_credentials(self, calendar_tools, monkeypatch): method test_check_availability_no_credentials (line 109) | def test_check_availability_no_credentials(self, calendar_tools, monke... class TestParameterValidation (line 122) | class TestParameterValidation: method test_list_events_max_results_too_low (line 125) | def test_list_events_max_results_too_low(self, calendar_tools, monkeyp... method test_list_events_max_results_too_high (line 134) | def test_list_events_max_results_too_high(self, calendar_tools, monkey... method test_get_event_missing_event_id (line 143) | def test_get_event_missing_event_id(self, calendar_tools, monkeypatch): method test_create_event_missing_summary (line 152) | def test_create_event_missing_summary(self, calendar_tools, monkeypatch): method test_create_event_missing_start_time (line 165) | def test_create_event_missing_start_time(self, calendar_tools, monkeyp... method test_create_event_missing_end_time (line 178) | def test_create_event_missing_end_time(self, calendar_tools, monkeypat... method test_update_event_missing_event_id (line 191) | def test_update_event_missing_event_id(self, calendar_tools, monkeypat... method test_delete_event_missing_event_id (line 200) | def test_delete_event_missing_event_id(self, calendar_tools, monkeypat... method test_list_calendars_max_results_too_high (line 209) | def test_list_calendars_max_results_too_high(self, calendar_tools, mon... method test_get_calendar_missing_calendar_id (line 218) | def test_get_calendar_missing_calendar_id(self, calendar_tools, monkey... method test_check_availability_missing_time_min (line 227) | def test_check_availability_missing_time_min(self, calendar_tools, mon... method test_check_availability_missing_time_max (line 239) | def test_check_availability_missing_time_max(self, calendar_tools, mon... class TestMockedAPIResponses (line 252) | class TestMockedAPIResponses: method test_list_events_success (line 256) | def test_list_events_success(self, mock_get, calendar_tools, monkeypat... method test_list_events_empty (line 287) | def test_list_events_empty(self, mock_get, calendar_tools, monkeypatch): method test_create_event_success (line 300) | def test_create_event_success(self, mock_post, calendar_tools, monkeyp... method test_delete_event_success (line 325) | def test_delete_event_success(self, mock_delete, calendar_tools, monke... method test_list_calendars_success (line 337) | def test_list_calendars_success(self, mock_get, calendar_tools, monkey... method test_check_availability_success (line 369) | def test_check_availability_success(self, mock_get, calendar_tools, mo... method test_check_availability_detects_conflicts (line 402) | def test_check_availability_detects_conflicts(self, mock_get, calendar... method test_check_availability_computes_free_slots (line 443) | def test_check_availability_computes_free_slots(self, mock_get, calend... method test_check_availability_skips_transparent_events (line 478) | def test_check_availability_skips_transparent_events( method test_unauthorized_returns_error (line 511) | def test_unauthorized_returns_error(self, mock_get, calendar_tools, mo... method test_rate_limit_returns_error (line 523) | def test_rate_limit_returns_error(self, mock_get, calendar_tools, monk... method test_not_found_returns_error (line 535) | def test_not_found_returns_error(self, mock_get, calendar_tools, monke... class TestCredentialManager (line 547) | class TestCredentialManager: method test_uses_credential_store_adapter_when_provided (line 551) | def test_uses_credential_store_adapter_when_provided(self, mock_get, m... class TestTokenRefresh (line 574) | class TestTokenRefresh: method test_expired_token_returns_helpful_error (line 578) | def test_expired_token_returns_helpful_error(self, mock_get, calendar_... method test_auto_refresh_uses_lifecycle_manager (line 592) | def test_auto_refresh_uses_lifecycle_manager( method test_no_lifecycle_manager_without_refresh_token (line 640) | def test_no_lifecycle_manager_without_refresh_token(self, mock_get, mc... method test_graceful_degradation_on_refresh_failure (line 671) | def test_graceful_degradation_on_refresh_failure(self, mock_get, calen... class TestUpdateEventPatch (line 687) | class TestUpdateEventPatch: method test_update_event_patch_success (line 691) | def test_update_event_patch_success(self, mock_patch, calendar_tools, ... method test_update_event_partial_fields (line 718) | def test_update_event_partial_fields(self, mock_patch, calendar_tools,... method test_update_event_with_timezone (line 745) | def test_update_event_with_timezone(self, mock_patch, calendar_tools, ... class TestAllDayEvents (line 764) | class TestAllDayEvents: method test_create_all_day_event (line 768) | def test_create_all_day_event(self, mock_post, calendar_tools, monkeyp... method test_create_all_day_event_invalid_start_format (line 797) | def test_create_all_day_event_invalid_start_format(self, calendar_tool... method test_create_all_day_event_invalid_end_format (line 812) | def test_create_all_day_event_invalid_end_format(self, calendar_tools,... method test_update_to_all_day_event (line 828) | def test_update_to_all_day_event(self, mock_patch, calendar_tools, mon... class TestTimezoneValidation (line 854) | class TestTimezoneValidation: method test_invalid_timezone_create_event (line 857) | def test_invalid_timezone_create_event(self, calendar_tools, monkeypat... method test_valid_timezone_passes (line 874) | def test_valid_timezone_passes(self, mock_post, calendar_tools, monkey... method test_invalid_timezone_update_event (line 891) | def test_invalid_timezone_update_event(self, calendar_tools, monkeypat... method test_all_day_event_ignores_timezone (line 905) | def test_all_day_event_ignores_timezone(self, mock_post, calendar_tool... class TestCreateEventWithAttendees (line 923) | class TestCreateEventWithAttendees: method test_create_event_with_attendees (line 927) | def test_create_event_with_attendees(self, mock_post, calendar_tools, ... method test_create_event_with_attendees_includes_conference_data (line 961) | def test_create_event_with_attendees_includes_conference_data( method test_create_event_with_attendees_sets_conference_data_version (line 987) | def test_create_event_with_attendees_sets_conference_data_version( method test_create_event_without_attendees_no_conference_data (line 1006) | def test_create_event_without_attendees_no_conference_data( class TestListEventsOutputFields (line 1026) | class TestListEventsOutputFields: method test_list_events_includes_description_and_hangout_link (line 1030) | def test_list_events_includes_description_and_hangout_link( method test_list_events_includes_attendees (line 1060) | def test_list_events_includes_attendees(self, mock_get, calendar_tools... method test_list_events_no_attendees_omits_field (line 1089) | def test_list_events_no_attendees_omits_field(self, mock_get, calendar... method test_list_events_max_results_2500_accepted (line 1113) | def test_list_events_max_results_2500_accepted(self, mock_get, calenda... class TestIsNotNoneBehavior (line 1125) | class TestIsNotNoneBehavior: method test_create_event_empty_description_included (line 1129) | def test_create_event_empty_description_included(self, mock_post, cale... method test_create_event_empty_location_included (line 1147) | def test_create_event_empty_location_included(self, mock_post, calenda... method test_create_event_none_description_excluded (line 1165) | def test_create_event_none_description_excluded(self, mock_post, calen... class TestEmptyPatchGuard (line 1182) | class TestEmptyPatchGuard: method test_update_event_no_fields_returns_error (line 1185) | def test_update_event_no_fields_returns_error(self, calendar_tools, mo... class TestRemoveAttendees (line 1195) | class TestRemoveAttendees: method test_remove_single_attendee (line 1200) | def test_remove_single_attendee(self, mock_get, mock_patch, calendar_t... method test_remove_attendees_case_insensitive (line 1246) | def test_remove_attendees_case_insensitive( method test_remove_multiple_attendees (line 1276) | def test_remove_multiple_attendees(self, mock_get, mock_patch, calenda... method test_remove_attendees_from_event_with_no_attendees (line 1304) | def test_remove_attendees_from_event_with_no_attendees( method test_remove_attendees_sets_conference_data_version (line 1326) | def test_remove_attendees_sets_conference_data_version( method test_remove_attendees_get_fails_returns_error (line 1350) | def test_remove_attendees_get_fails_returns_error(self, mock_get, cale... class TestUpdateMeetLink (line 1365) | class TestUpdateMeetLink: method test_update_event_add_meet_link (line 1369) | def test_update_event_add_meet_link(self, mock_patch, calendar_tools, ... method test_update_event_without_meet_link_no_conference_data (line 1397) | def test_update_event_without_meet_link_no_conference_data( FILE: tools/tests/tools/test_calendly_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestCalendlyGetCurrentUser (line 32) | class TestCalendlyGetCurrentUser: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 38) | def test_successful_get(self, tool_fns): class TestCalendlyListEventTypes (line 63) | class TestCalendlyListEventTypes: method test_missing_user_uri (line 64) | def test_missing_user_uri(self, tool_fns): method test_successful_list (line 69) | def test_successful_list(self, tool_fns): class TestCalendlyListScheduledEvents (line 99) | class TestCalendlyListScheduledEvents: method test_missing_user_uri (line 100) | def test_missing_user_uri(self, tool_fns): method test_successful_list (line 105) | def test_successful_list(self, tool_fns): class TestCalendlyGetScheduledEvent (line 135) | class TestCalendlyGetScheduledEvent: method test_missing_uri (line 136) | def test_missing_uri(self, tool_fns): method test_successful_get (line 141) | def test_successful_get(self, tool_fns): class TestCalendlyListInvitees (line 169) | class TestCalendlyListInvitees: method test_missing_event_uri (line 170) | def test_missing_event_uri(self, tool_fns): method test_successful_list (line 175) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_cloudinary_tool.py function tool_fns (line 18) | def tool_fns(mcp: FastMCP): class TestCloudinaryUpload (line 24) | class TestCloudinaryUpload: method test_missing_credentials (line 25) | def test_missing_credentials(self, tool_fns): method test_missing_file_url (line 30) | def test_missing_file_url(self, tool_fns): method test_successful_upload (line 35) | def test_successful_upload(self, tool_fns): class TestCloudinaryListResources (line 62) | class TestCloudinaryListResources: method test_missing_credentials (line 63) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 68) | def test_successful_list(self, tool_fns): class TestCloudinaryGetResource (line 96) | class TestCloudinaryGetResource: method test_missing_public_id (line 97) | def test_missing_public_id(self, tool_fns): method test_successful_get (line 102) | def test_successful_get(self, tool_fns): class TestCloudinaryDeleteResource (line 129) | class TestCloudinaryDeleteResource: method test_missing_public_id (line 130) | def test_missing_public_id(self, tool_fns): method test_successful_delete (line 135) | def test_successful_delete(self, tool_fns): class TestCloudinarySearch (line 152) | class TestCloudinarySearch: method test_missing_expression (line 153) | def test_missing_expression(self, tool_fns): method test_successful_search (line 158) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_confluence_tool.py function tool_fns (line 18) | def tool_fns(mcp: FastMCP): class TestConfluenceListSpaces (line 24) | class TestConfluenceListSpaces: method test_missing_credentials (line 25) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 30) | def test_successful_list(self, tool_fns): class TestConfluenceListPages (line 57) | class TestConfluenceListPages: method test_successful_list (line 58) | def test_successful_list(self, tool_fns): class TestConfluenceGetPage (line 86) | class TestConfluenceGetPage: method test_missing_id (line 87) | def test_missing_id(self, tool_fns): method test_successful_get (line 92) | def test_successful_get(self, tool_fns): class TestConfluenceCreatePage (line 117) | class TestConfluenceCreatePage: method test_missing_params (line 118) | def test_missing_params(self, tool_fns): method test_successful_create (line 123) | def test_successful_create(self, tool_fns): class TestConfluenceSearch (line 142) | class TestConfluenceSearch: method test_missing_query (line 143) | def test_missing_query(self, tool_fns): method test_successful_search (line 148) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_csv_tool.py function csv_tools (line 21) | def csv_tools(mcp: FastMCP, tmp_path: Path): function csv_tool_fn (line 35) | def csv_tool_fn(csv_tools): function session_dir (line 41) | def session_dir(tmp_path: Path) -> Path: function basic_csv (line 49) | def basic_csv(session_dir: Path) -> Path: function large_csv (line 60) | def large_csv(session_dir: Path) -> Path: function empty_csv (line 71) | def empty_csv(session_dir: Path) -> Path: function headers_only_csv (line 79) | def headers_only_csv(session_dir: Path) -> Path: class TestCsvRead (line 86) | class TestCsvRead: method test_read_basic_csv (line 89) | def test_read_basic_csv(self, csv_tool_fn, basic_csv, tmp_path): method test_read_with_limit (line 107) | def test_read_with_limit(self, csv_tool_fn, basic_csv, tmp_path): method test_read_with_offset (line 126) | def test_read_with_offset(self, csv_tool_fn, basic_csv, tmp_path): method test_read_with_limit_and_offset (line 143) | def test_read_with_limit_and_offset(self, csv_tool_fn, large_csv, tmp_... method test_negative_limit (line 163) | def test_negative_limit(self, csv_tool_fn, basic_csv, tmp_path): method test_negative_offset (line 177) | def test_negative_offset(self, csv_tool_fn, basic_csv, tmp_path): method test_negative_limit_and_offset (line 191) | def test_negative_limit_and_offset(self, csv_tool_fn, basic_csv, tmp_p... method test_file_not_found (line 206) | def test_file_not_found(self, csv_tool_fn, session_dir, tmp_path): method test_non_csv_extension (line 219) | def test_non_csv_extension(self, csv_tool_fn, session_dir, tmp_path): method test_empty_csv_file (line 236) | def test_empty_csv_file(self, csv_tool_fn, empty_csv, tmp_path): method test_headers_only_csv (line 249) | def test_headers_only_csv(self, csv_tool_fn, headers_only_csv, tmp_path): method test_missing_workspace_id (line 265) | def test_missing_workspace_id(self, csv_tool_fn, basic_csv, tmp_path): method test_missing_agent_id (line 277) | def test_missing_agent_id(self, csv_tool_fn, basic_csv, tmp_path): method test_missing_session_id (line 289) | def test_missing_session_id(self, csv_tool_fn, basic_csv, tmp_path): method test_unicode_content (line 301) | def test_unicode_content(self, csv_tool_fn, session_dir, tmp_path): method test_quoted_fields (line 319) | def test_quoted_fields(self, csv_tool_fn, session_dir, tmp_path): method test_path_traversal_blocked (line 339) | def test_path_traversal_blocked(self, csv_tool_fn, session_dir, tmp_pa... method test_offset_beyond_rows (line 351) | def test_offset_beyond_rows(self, csv_tool_fn, basic_csv, tmp_path): class TestCsvWrite (line 368) | class TestCsvWrite: method test_write_new_csv (line 371) | def test_write_new_csv(self, csv_tools, session_dir, tmp_path): method test_write_creates_parent_directories (line 397) | def test_write_creates_parent_directories(self, csv_tools, session_dir... method test_write_empty_columns_error (line 412) | def test_write_empty_columns_error(self, csv_tools, session_dir, tmp_p... method test_write_non_csv_extension_error (line 427) | def test_write_non_csv_extension_error(self, csv_tools, session_dir, t... method test_write_filters_extra_columns (line 442) | def test_write_filters_extra_columns(self, csv_tools, session_dir, tmp... method test_write_empty_rows (line 460) | def test_write_empty_rows(self, csv_tools, session_dir, tmp_path): method test_write_unicode_content (line 478) | def test_write_unicode_content(self, csv_tools, session_dir, tmp_path): method test_write_no_parent_directory (line 496) | def test_write_no_parent_directory(self, csv_tools, session_dir, tmp_p... class TestCsvAppend (line 524) | class TestCsvAppend: method test_append_to_existing_csv (line 527) | def test_append_to_existing_csv(self, csv_tools, basic_csv, tmp_path): method test_append_file_not_found (line 545) | def test_append_file_not_found(self, csv_tools, session_dir, tmp_path): method test_append_empty_rows_error (line 559) | def test_append_empty_rows_error(self, csv_tools, basic_csv, tmp_path): method test_append_filters_extra_columns (line 573) | def test_append_filters_extra_columns(self, csv_tools, basic_csv, sess... method test_append_non_csv_extension_error (line 591) | def test_append_non_csv_extension_error(self, csv_tools, session_dir, ... class TestCsvInfo (line 609) | class TestCsvInfo: method test_get_info_basic_csv (line 612) | def test_get_info_basic_csv(self, csv_tools, basic_csv, tmp_path): method test_get_info_large_csv (line 629) | def test_get_info_large_csv(self, csv_tools, large_csv, tmp_path): method test_get_info_file_not_found (line 643) | def test_get_info_file_not_found(self, csv_tools, session_dir, tmp_path): method test_get_info_empty_csv (line 656) | def test_get_info_empty_csv(self, csv_tools, empty_csv, tmp_path): method test_get_info_headers_only (line 669) | def test_get_info_headers_only(self, csv_tools, headers_only_csv, tmp_... method test_get_info_non_csv_extension_error (line 683) | def test_get_info_non_csv_extension_error(self, csv_tools, session_dir... class TestCsvSql (line 701) | class TestCsvSql: method products_csv (line 705) | def products_csv(self, session_dir: Path) -> Path: method test_basic_select (line 719) | def test_basic_select(self, csv_tools, products_csv, tmp_path): method test_where_clause (line 735) | def test_where_clause(self, csv_tools, products_csv, tmp_path): method test_aggregate_functions (line 752) | def test_aggregate_functions(self, csv_tools, products_csv, tmp_path): method test_order_by_and_limit (line 769) | def test_order_by_and_limit(self, csv_tools, products_csv, tmp_path): method test_like_search (line 785) | def test_like_search(self, csv_tools, products_csv, tmp_path): method test_file_not_found (line 800) | def test_file_not_found(self, csv_tools, session_dir, tmp_path): method test_empty_query_error (line 814) | def test_empty_query_error(self, csv_tools, products_csv, tmp_path): method test_non_select_blocked (line 828) | def test_non_select_blocked(self, csv_tools, products_csv, tmp_path): method test_drop_blocked (line 842) | def test_drop_blocked(self, csv_tools, products_csv, tmp_path): method test_insert_blocked (line 855) | def test_insert_blocked(self, csv_tools, products_csv, tmp_path): method test_invalid_sql_syntax (line 868) | def test_invalid_sql_syntax(self, csv_tools, products_csv, tmp_path): method test_unicode_data (line 881) | def test_unicode_data(self, csv_tools, session_dir, tmp_path): FILE: tools/tests/tools/test_databricks_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestDatabricksSqlQuery (line 20) | class TestDatabricksSqlQuery: method test_missing_credentials (line 21) | def test_missing_credentials(self, tool_fns): method test_missing_fields (line 26) | def test_missing_fields(self, tool_fns): method test_successful_query (line 31) | def test_successful_query(self, tool_fns): class TestDatabricksListJobs (line 54) | class TestDatabricksListJobs: method test_successful_list (line 55) | def test_successful_list(self, tool_fns): class TestDatabricksRunJob (line 78) | class TestDatabricksRunJob: method test_missing_job_id (line 79) | def test_missing_job_id(self, tool_fns): method test_successful_run (line 84) | def test_successful_run(self, tool_fns): class TestDatabricksGetRun (line 98) | class TestDatabricksGetRun: method test_successful_get (line 99) | def test_successful_get(self, tool_fns): class TestDatabricksListClusters (line 119) | class TestDatabricksListClusters: method test_successful_list (line 120) | def test_successful_list(self, tool_fns): class TestDatabricksStartCluster (line 145) | class TestDatabricksStartCluster: method test_missing_cluster_id (line 146) | def test_missing_cluster_id(self, tool_fns): method test_successful_start (line 151) | def test_successful_start(self, tool_fns): class TestDatabricksListWorkspace (line 164) | class TestDatabricksListWorkspace: method test_successful_list (line 165) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_discord_tool.py class TestDiscordClient (line 27) | class TestDiscordClient: method setup_method (line 28) | def setup_method(self): method test_headers (line 31) | def test_headers(self): method test_handle_response_success (line 36) | def test_handle_response_success(self): method test_handle_response_204 (line 42) | def test_handle_response_204(self): method test_handle_response_rate_limit_429 (line 48) | def test_handle_response_rate_limit_429(self): method test_handle_response_errors (line 62) | def test_handle_response_errors(self, status_code): method test_list_guilds (line 72) | def test_list_guilds(self, mock_request): method test_list_channels_text_only_default (line 90) | def test_list_channels_text_only_default(self, mock_request): method test_list_channels_all_types (line 108) | def test_list_channels_all_types(self, mock_request): method test_send_message (line 124) | def test_send_message(self, mock_request): method test_get_messages (line 143) | def test_get_messages(self, mock_request): method test_retry_on_429_then_success (line 161) | def test_retry_on_429_then_success(self, mock_request, mock_sleep): method test_retry_exhausted_returns_error (line 181) | def test_retry_exhausted_returns_error(self, mock_request, mock_sleep): class TestDiscordListGuildsTool (line 196) | class TestDiscordListGuildsTool: method setup_method (line 197) | def setup_method(self): method _fn (line 205) | def _fn(self, name): method test_list_guilds_success (line 209) | def test_list_guilds_success(self, mock_request): method test_list_guilds_no_credentials (line 219) | def test_list_guilds_no_credentials(self): class TestDiscordListChannelsTool (line 230) | class TestDiscordListChannelsTool: method setup_method (line 231) | def setup_method(self): method _fn (line 239) | def _fn(self, name): method test_list_channels_success (line 243) | def test_list_channels_success(self, mock_request): method test_list_channels_text_only_filter (line 258) | def test_list_channels_text_only_filter(self, mock_request): method test_list_channels_error (line 274) | def test_list_channels_error(self, mock_request): class TestDiscordSendMessageTool (line 285) | class TestDiscordSendMessageTool: method setup_method (line 286) | def setup_method(self): method _fn (line 294) | def _fn(self, name): method test_send_message_success (line 298) | def test_send_message_success(self, mock_request): method test_send_message_length_validation (line 313) | def test_send_message_length_validation(self): method test_send_message_exactly_at_limit (line 321) | def test_send_message_exactly_at_limit(self): method test_send_message_rate_limit_429_exhausted (line 332) | def test_send_message_rate_limit_429_exhausted(self, mock_request): method test_send_message_rate_limit_then_success (line 345) | def test_send_message_rate_limit_then_success(self, mock_request): class TestDiscordGetMessagesTool (line 363) | class TestDiscordGetMessagesTool: method setup_method (line 364) | def setup_method(self): method _fn (line 372) | def _fn(self, name): method test_get_messages_success (line 376) | def test_get_messages_success(self, mock_request): class TestCredentialSpec (line 394) | class TestCredentialSpec: method test_discord_credential_spec_exists (line 395) | def test_discord_credential_spec_exists(self): method test_discord_spec_env_var (line 400) | def test_discord_spec_env_var(self): method test_discord_spec_tools (line 406) | def test_discord_spec_tools(self): FILE: tools/tests/tools/test_dns_security_scanner.py function dns_tools (line 14) | def dns_tools(mcp: FastMCP): function scan_fn (line 22) | def scan_fn(dns_tools): class TestInputValidation (line 31) | class TestInputValidation: method test_strips_https_prefix (line 34) | def test_strips_https_prefix(self, scan_fn): method test_strips_http_prefix (line 52) | def test_strips_http_prefix(self, scan_fn): method test_strips_trailing_slash (line 70) | def test_strips_trailing_slash(self, scan_fn): method test_strips_path (line 88) | def test_strips_path(self, scan_fn): method test_strips_port (line 106) | def test_strips_port(self, scan_fn): class TestDnsAvailability (line 130) | class TestDnsAvailability: method test_dns_not_available (line 133) | def test_dns_not_available(self, scan_fn): class TestSpfChecks (line 147) | class TestSpfChecks: method test_spf_hardfail_detected (line 150) | def test_spf_hardfail_detected(self, scan_fn): method test_spf_softfail_detected (line 170) | def test_spf_softfail_detected(self, scan_fn): method test_spf_pass_all_dangerous (line 190) | def test_spf_pass_all_dangerous(self, scan_fn): class TestDmarcChecks (line 215) | class TestDmarcChecks: method test_dmarc_reject_policy (line 218) | def test_dmarc_reject_policy(self, scan_fn): method test_dmarc_none_policy (line 246) | def test_dmarc_none_policy(self, scan_fn): class TestGradeInput (line 279) | class TestGradeInput: method test_grade_input_keys_present (line 282) | def test_grade_input_keys_present(self, scan_fn): FILE: tools/tests/tools/test_docker_hub_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestDockerHubSearch (line 20) | class TestDockerHubSearch: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_empty_query (line 26) | def test_empty_query(self, tool_fns): method test_successful_search (line 31) | def test_successful_search(self, tool_fns): class TestDockerHubListTags (line 57) | class TestDockerHubListTags: method test_missing_repository (line 58) | def test_missing_repository(self, tool_fns): method test_successful_list (line 63) | def test_successful_list(self, tool_fns): class TestDockerHubGetRepo (line 93) | class TestDockerHubGetRepo: method test_missing_repository (line 94) | def test_missing_repository(self, tool_fns): method test_successful_get (line 99) | def test_successful_get(self, tool_fns): class TestDockerHubListRepos (line 122) | class TestDockerHubListRepos: method test_missing_namespace (line 123) | def test_missing_namespace(self, tool_fns): method test_successful_list (line 128) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_duckduckgo_tool.py function tool_fns (line 13) | def tool_fns(mcp: FastMCP): function _mock_ddgs (line 19) | def _mock_ddgs(): class TestDuckDuckGoSearch (line 26) | class TestDuckDuckGoSearch: method test_empty_query (line 27) | def test_empty_query(self, tool_fns): method test_successful_search (line 31) | def test_successful_search(self, tool_fns): class TestDuckDuckGoNews (line 47) | class TestDuckDuckGoNews: method test_empty_query (line 48) | def test_empty_query(self, tool_fns): method test_successful_search (line 52) | def test_successful_search(self, tool_fns): class TestDuckDuckGoImages (line 73) | class TestDuckDuckGoImages: method test_empty_query (line 74) | def test_empty_query(self, tool_fns): method test_successful_search (line 78) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_email_tool.py function send_email_fn (line 12) | def send_email_fn(mcp: FastMCP): function reply_email_fn (line 19) | def reply_email_fn(mcp: FastMCP): class TestSendEmail (line 25) | class TestSendEmail: method test_no_credentials_returns_error (line 28) | def test_no_credentials_returns_error(self, send_email_fn, monkeypatch): method test_resend_explicit_missing_key (line 42) | def test_resend_explicit_missing_key(self, send_email_fn, monkeypatch): method test_missing_from_email_returns_error (line 56) | def test_missing_from_email_returns_error(self, send_email_fn, monkeyp... method test_from_email_falls_back_to_env_var (line 70) | def test_from_email_falls_back_to_env_var(self, send_email_fn, monkeyp... method test_explicit_from_email_overrides_env_var (line 85) | def test_explicit_from_email_overrides_env_var(self, send_email_fn, mo... method test_empty_recipient_returns_error (line 104) | def test_empty_recipient_returns_error(self, send_email_fn, monkeypatch): method test_empty_subject_returns_error (line 113) | def test_empty_subject_returns_error(self, send_email_fn, monkeypatch): method test_subject_too_long_returns_error (line 124) | def test_subject_too_long_returns_error(self, send_email_fn, monkeypat... method test_empty_html_returns_error (line 135) | def test_empty_html_returns_error(self, send_email_fn, monkeypatch): method test_to_string_normalized_to_list (line 144) | def test_to_string_normalized_to_list(self, send_email_fn, monkeypatch): method test_to_list_accepted (line 158) | def test_to_list_accepted(self, send_email_fn, monkeypatch): method test_cc_string_passed_to_provider (line 175) | def test_cc_string_passed_to_provider(self, send_email_fn, monkeypatch): method test_bcc_string_passed_to_provider (line 194) | def test_bcc_string_passed_to_provider(self, send_email_fn, monkeypatch): method test_cc_and_bcc_lists_passed_to_provider (line 213) | def test_cc_and_bcc_lists_passed_to_provider(self, send_email_fn, monk... method test_none_cc_bcc_not_included_in_payload (line 234) | def test_none_cc_bcc_not_included_in_payload(self, send_email_fn, monk... method test_empty_string_cc_not_included (line 249) | def test_empty_string_cc_not_included(self, send_email_fn, monkeypatch): method test_whitespace_cc_not_included (line 269) | def test_whitespace_cc_not_included(self, send_email_fn, monkeypatch): method test_empty_list_cc_not_included (line 283) | def test_empty_list_cc_not_included(self, send_email_fn, monkeypatch): method test_list_with_empty_strings_filtered (line 303) | def test_list_with_empty_strings_filtered(self, send_email_fn, monkeyp... method test_list_of_only_empty_strings_not_included (line 321) | def test_list_of_only_empty_strings_not_included(self, send_email_fn, ... class TestResendProvider (line 342) | class TestResendProvider: method test_resend_success (line 345) | def test_resend_success(self, send_email_fn, monkeypatch): method test_resend_api_error (line 360) | def test_resend_api_error(self, send_email_fn, monkeypatch): class TestGmailProvider (line 374) | class TestGmailProvider: method test_gmail_success (line 377) | def test_gmail_success(self, send_email_fn, monkeypatch): method test_gmail_missing_credentials (line 409) | def test_gmail_missing_credentials(self, send_email_fn, monkeypatch): method test_gmail_api_error (line 426) | def test_gmail_api_error(self, send_email_fn, monkeypatch): method test_gmail_token_expired (line 447) | def test_gmail_token_expired(self, send_email_fn, monkeypatch): method test_gmail_no_from_email_ok (line 469) | def test_gmail_no_from_email_ok(self, send_email_fn, monkeypatch): class TestProviderRequired (line 491) | class TestProviderRequired: method test_missing_provider_raises_type_error (line 494) | def test_missing_provider_raises_type_error(self, send_email_fn): function _mock_original_message_response (line 504) | def _mock_original_message_response(body_html: str = "

Original messag... class TestGmailReplyEmail (line 529) | class TestGmailReplyEmail: method test_missing_credentials (line 532) | def test_missing_credentials(self, reply_email_fn, monkeypatch): method test_empty_message_id (line 541) | def test_empty_message_id(self, reply_email_fn, monkeypatch): method test_empty_html (line 550) | def test_empty_html(self, reply_email_fn, monkeypatch): method test_original_message_not_found (line 559) | def test_original_message_not_found(self, reply_email_fn, monkeypatch): method test_successful_reply (line 572) | def test_successful_reply(self, reply_email_fn, monkeypatch): method test_reply_preserves_existing_re_prefix (line 597) | def test_reply_preserves_existing_re_prefix(self, reply_email_fn, monk... method test_reply_with_cc (line 625) | def test_reply_with_cc(self, reply_email_fn, monkeypatch): method test_send_401_returns_token_error (line 646) | def test_send_401_returns_token_error(self, reply_email_fn, monkeypatch): method test_send_api_error (line 661) | def test_send_api_error(self, reply_email_fn, monkeypatch): method test_reply_includes_quoted_original (line 677) | def test_reply_includes_quoted_original(self, reply_email_fn, monkeypa... FILE: tools/tests/tools/test_exa_search_tool.py function mcp (line 10) | def mcp(): function exa_search_fn (line 16) | def exa_search_fn(mcp: FastMCP): function exa_find_similar_fn (line 23) | def exa_find_similar_fn(mcp: FastMCP): function exa_get_contents_fn (line 30) | def exa_get_contents_fn(mcp: FastMCP): function exa_answer_fn (line 37) | def exa_answer_fn(mcp: FastMCP): class TestExaSearchCredentials (line 43) | class TestExaSearchCredentials: method test_no_credentials_returns_error (line 46) | def test_no_credentials_returns_error(self, exa_search_fn, monkeypatch): method test_find_similar_no_credentials (line 56) | def test_find_similar_no_credentials(self, exa_find_similar_fn, monkey... method test_get_contents_no_credentials (line 65) | def test_get_contents_no_credentials(self, exa_get_contents_fn, monkey... method test_answer_no_credentials (line 74) | def test_answer_no_credentials(self, exa_answer_fn, monkeypatch): class TestExaSearchValidation (line 84) | class TestExaSearchValidation: method test_empty_query_returns_error (line 87) | def test_empty_query_returns_error(self, exa_search_fn, monkeypatch): method test_long_query_returns_error (line 96) | def test_long_query_returns_error(self, exa_search_fn, monkeypatch): method test_find_similar_empty_url (line 104) | def test_find_similar_empty_url(self, exa_find_similar_fn, monkeypatch): method test_get_contents_empty_urls (line 113) | def test_get_contents_empty_urls(self, exa_get_contents_fn, monkeypatch): method test_get_contents_too_many_urls (line 122) | def test_get_contents_too_many_urls(self, exa_get_contents_fn, monkeyp... method test_answer_empty_query (line 132) | def test_answer_empty_query(self, exa_answer_fn, monkeypatch): method test_answer_long_query (line 141) | def test_answer_long_query(self, exa_answer_fn, monkeypatch): class TestExaSearchWithKey (line 150) | class TestExaSearchWithKey: method test_search_with_key_makes_request (line 153) | def test_search_with_key_makes_request(self, exa_search_fn, monkeypatch): method test_find_similar_with_key (line 161) | def test_find_similar_with_key(self, exa_find_similar_fn, monkeypatch): method test_get_contents_with_key (line 168) | def test_get_contents_with_key(self, exa_get_contents_fn, monkeypatch): method test_answer_with_key (line 175) | def test_answer_with_key(self, exa_answer_fn, monkeypatch): class TestExaSearchParameters (line 183) | class TestExaSearchParameters: method test_search_type_parameter (line 186) | def test_search_type_parameter(self, exa_search_fn, monkeypatch): method test_num_results_clamped (line 193) | def test_num_results_clamped(self, exa_search_fn, monkeypatch): method test_domain_filters (line 200) | def test_domain_filters(self, exa_search_fn, monkeypatch): method test_date_filters (line 211) | def test_date_filters(self, exa_search_fn, monkeypatch): method test_category_parameter (line 222) | def test_category_parameter(self, exa_search_fn, monkeypatch): class TestExaToolRegistration (line 230) | class TestExaToolRegistration: method test_all_tools_registered (line 233) | def test_all_tools_registered(self, mcp: FastMCP): FILE: tools/tests/tools/test_example_tool.py function example_tool_fn (line 10) | def example_tool_fn(mcp: FastMCP): class TestExampleTool (line 16) | class TestExampleTool: method test_valid_message (line 19) | def test_valid_message(self, example_tool_fn): method test_uppercase_true (line 25) | def test_uppercase_true(self, example_tool_fn): method test_uppercase_false (line 31) | def test_uppercase_false(self, example_tool_fn): method test_repeat_multiple (line 37) | def test_repeat_multiple(self, example_tool_fn): method test_repeat_default (line 43) | def test_repeat_default(self, example_tool_fn): method test_uppercase_and_repeat_combined (line 49) | def test_uppercase_and_repeat_combined(self, example_tool_fn): method test_empty_message_error (line 55) | def test_empty_message_error(self, example_tool_fn): method test_message_too_long_error (line 62) | def test_message_too_long_error(self, example_tool_fn): method test_message_at_max_length (line 70) | def test_message_at_max_length(self, example_tool_fn): method test_repeat_zero_error (line 77) | def test_repeat_zero_error(self, example_tool_fn): method test_repeat_eleven_error (line 84) | def test_repeat_eleven_error(self, example_tool_fn): method test_repeat_at_max (line 91) | def test_repeat_at_max(self, example_tool_fn): method test_repeat_negative_error (line 97) | def test_repeat_negative_error(self, example_tool_fn): method test_whitespace_only_message (line 104) | def test_whitespace_only_message(self, example_tool_fn): method test_special_characters_in_message (line 110) | def test_special_characters_in_message(self, example_tool_fn): method test_unicode_message (line 116) | def test_unicode_message(self, example_tool_fn): method test_unicode_uppercase (line 122) | def test_unicode_uppercase(self, example_tool_fn): FILE: tools/tests/tools/test_excel_tool.py function excel_tools (line 28) | def excel_tools(mcp: FastMCP, tmp_path: Path): function excel_read_fn (line 44) | def excel_read_fn(excel_tools): function session_dir (line 50) | def session_dir(tmp_path: Path) -> Path: function basic_xlsx (line 58) | def basic_xlsx(session_dir: Path) -> Path: function multi_sheet_xlsx (line 76) | def multi_sheet_xlsx(session_dir: Path) -> Path: function large_xlsx (line 106) | def large_xlsx(session_dir: Path) -> Path: function empty_xlsx (line 121) | def empty_xlsx(session_dir: Path) -> Path: function headers_only_xlsx (line 131) | def headers_only_xlsx(session_dir: Path) -> Path: function xlsx_with_dates (line 143) | def xlsx_with_dates(session_dir: Path) -> Path: class TestExcelRead (line 156) | class TestExcelRead: method test_read_basic_xlsx (line 159) | def test_read_basic_xlsx(self, excel_read_fn, basic_xlsx, tmp_path): method test_read_specific_sheet (line 178) | def test_read_specific_sheet(self, excel_read_fn, multi_sheet_xlsx, tm... method test_read_nonexistent_sheet_error (line 195) | def test_read_nonexistent_sheet_error(self, excel_read_fn, multi_sheet... method test_read_with_limit (line 210) | def test_read_with_limit(self, excel_read_fn, basic_xlsx, tmp_path): method test_read_with_offset (line 229) | def test_read_with_offset(self, excel_read_fn, basic_xlsx, tmp_path): method test_read_with_limit_and_offset (line 246) | def test_read_with_limit_and_offset(self, excel_read_fn, large_xlsx, t... method test_file_not_found (line 266) | def test_file_not_found(self, excel_read_fn, session_dir, tmp_path): method test_non_xlsx_extension (line 279) | def test_non_xlsx_extension(self, excel_read_fn, session_dir, tmp_path): method test_empty_xlsx_file (line 296) | def test_empty_xlsx_file(self, excel_read_fn, empty_xlsx, tmp_path): method test_headers_only_xlsx (line 310) | def test_headers_only_xlsx(self, excel_read_fn, headers_only_xlsx, tmp... method test_missing_workspace_id (line 326) | def test_missing_workspace_id(self, excel_read_fn, basic_xlsx, tmp_path): method test_missing_agent_id (line 338) | def test_missing_agent_id(self, excel_read_fn, basic_xlsx, tmp_path): method test_missing_session_id (line 350) | def test_missing_session_id(self, excel_read_fn, basic_xlsx, tmp_path): method test_path_traversal_blocked (line 362) | def test_path_traversal_blocked(self, excel_read_fn, session_dir, tmp_... method test_negative_limit (line 374) | def test_negative_limit(self, excel_read_fn, basic_xlsx, tmp_path): method test_negative_offset (line 388) | def test_negative_offset(self, excel_read_fn, basic_xlsx, tmp_path): method test_offset_beyond_rows (line 402) | def test_offset_beyond_rows(self, excel_read_fn, basic_xlsx, tmp_path): method test_read_with_dates (line 418) | def test_read_with_dates(self, excel_read_fn, xlsx_with_dates, tmp_path): class TestExcelWrite (line 433) | class TestExcelWrite: method test_write_new_xlsx (line 436) | def test_write_new_xlsx(self, excel_tools, session_dir, tmp_path): method test_write_with_custom_sheet_name (line 460) | def test_write_with_custom_sheet_name(self, excel_tools, session_dir, ... method test_write_creates_parent_directories (line 476) | def test_write_creates_parent_directories(self, excel_tools, session_d... method test_write_empty_columns_error (line 491) | def test_write_empty_columns_error(self, excel_tools, session_dir, tmp... method test_write_non_xlsx_extension_error (line 506) | def test_write_non_xlsx_extension_error(self, excel_tools, session_dir... method test_write_empty_rows (line 521) | def test_write_empty_rows(self, excel_tools, session_dir, tmp_path): class TestExcelAppend (line 537) | class TestExcelAppend: method test_append_to_existing_xlsx (line 540) | def test_append_to_existing_xlsx(self, excel_tools, basic_xlsx, tmp_pa... method test_append_to_specific_sheet (line 558) | def test_append_to_specific_sheet(self, excel_tools, multi_sheet_xlsx,... method test_append_file_not_found (line 574) | def test_append_file_not_found(self, excel_tools, session_dir, tmp_path): method test_append_empty_rows_error (line 588) | def test_append_empty_rows_error(self, excel_tools, basic_xlsx, tmp_pa... method test_append_non_xlsx_extension_error (line 602) | def test_append_non_xlsx_extension_error(self, excel_tools, session_di... class TestExcelInfo (line 620) | class TestExcelInfo: method test_get_info_basic_xlsx (line 623) | def test_get_info_basic_xlsx(self, excel_tools, basic_xlsx, tmp_path): method test_get_info_multi_sheet_xlsx (line 643) | def test_get_info_multi_sheet_xlsx(self, excel_tools, multi_sheet_xlsx... method test_get_info_file_not_found (line 659) | def test_get_info_file_not_found(self, excel_tools, session_dir, tmp_p... method test_get_info_non_xlsx_extension_error (line 672) | def test_get_info_non_xlsx_extension_error(self, excel_tools, session_... class TestExcelSheetList (line 689) | class TestExcelSheetList: method test_list_sheets_basic (line 692) | def test_list_sheets_basic(self, excel_tools, basic_xlsx, tmp_path): method test_list_sheets_multi_sheet (line 706) | def test_list_sheets_multi_sheet(self, excel_tools, multi_sheet_xlsx, ... method test_list_sheets_file_not_found (line 722) | def test_list_sheets_file_not_found(self, excel_tools, session_dir, tm... method test_list_sheets_non_xlsx_extension_error (line 735) | def test_list_sheets_non_xlsx_extension_error(self, excel_tools, sessi... class TestExcelIntegration (line 752) | class TestExcelIntegration: method test_write_then_read (line 755) | def test_write_then_read(self, excel_tools, session_dir, tmp_path): method test_write_append_read (line 788) | def test_write_append_read(self, excel_tools, session_dir, tmp_path): class TestExcelSql (line 829) | class TestExcelSql: method test_sql_basic_query (line 832) | def test_sql_basic_query(self, excel_tools, basic_xlsx, tmp_path): method test_sql_with_filter (line 847) | def test_sql_with_filter(self, excel_tools, basic_xlsx, tmp_path): method test_sql_with_aggregation (line 861) | def test_sql_with_aggregation(self, excel_tools, basic_xlsx, tmp_path): method test_sql_specific_sheet (line 876) | def test_sql_specific_sheet(self, excel_tools, multi_sheet_xlsx, tmp_p... method test_sql_join_sheets (line 892) | def test_sql_join_sheets(self, excel_tools, multi_sheet_xlsx, tmp_path): method test_sql_empty_query_error (line 907) | def test_sql_empty_query_error(self, excel_tools, basic_xlsx, tmp_path): method test_sql_non_select_rejected (line 921) | def test_sql_non_select_rejected(self, excel_tools, basic_xlsx, tmp_pa... method test_sql_drop_blocked (line 935) | def test_sql_drop_blocked(self, excel_tools, basic_xlsx, tmp_path): method test_sql_insert_blocked (line 948) | def test_sql_insert_blocked(self, excel_tools, basic_xlsx, tmp_path): method test_sql_file_not_found (line 961) | def test_sql_file_not_found(self, excel_tools, session_dir, tmp_path): class TestExcelSearch (line 976) | class TestExcelSearch: method test_search_basic_contains (line 979) | def test_search_basic_contains(self, excel_tools, basic_xlsx, tmp_path): method test_search_case_insensitive (line 994) | def test_search_case_insensitive(self, excel_tools, basic_xlsx, tmp_pa... method test_search_case_sensitive (line 1009) | def test_search_case_sensitive(self, excel_tools, basic_xlsx, tmp_path): method test_search_exact_match (line 1025) | def test_search_exact_match(self, excel_tools, basic_xlsx, tmp_path): method test_search_starts_with (line 1041) | def test_search_starts_with(self, excel_tools, basic_xlsx, tmp_path): method test_search_across_sheets (line 1057) | def test_search_across_sheets(self, excel_tools, multi_sheet_xlsx, tmp... method test_search_specific_sheet (line 1073) | def test_search_specific_sheet(self, excel_tools, multi_sheet_xlsx, tm... method test_search_skips_header_row (line 1089) | def test_search_skips_header_row(self, excel_tools, basic_xlsx, tmp_pa... method test_search_no_matches (line 1104) | def test_search_no_matches(self, excel_tools, basic_xlsx, tmp_path): method test_search_empty_term_error (line 1119) | def test_search_empty_term_error(self, excel_tools, basic_xlsx, tmp_pa... method test_search_invalid_match_type (line 1133) | def test_search_invalid_match_type(self, excel_tools, basic_xlsx, tmp_... method test_search_file_not_found (line 1148) | def test_search_file_not_found(self, excel_tools, session_dir, tmp_path): FILE: tools/tests/tools/test_file_ops.py function file_ops_mcp (line 17) | def file_ops_mcp(tmp_path): function _get_tool_fn (line 34) | def _get_tool_fn(mcp, name): class TestSearchFilesPathRelativization (line 39) | class TestSearchFilesPathRelativization: method test_ripgrep_output_with_backslash_relativized (line 42) | def test_ripgrep_output_with_backslash_relativized(self, file_ops_mcp,... method test_ripgrep_output_with_forward_slash_relativized (line 78) | def test_ripgrep_output_with_forward_slash_relativized(self, file_ops_... method test_python_fallback_relativizes_paths (line 102) | def test_python_fallback_relativizes_paths(self, file_ops_mcp, tmp_path): class TestSearchFilesBasic (line 123) | class TestSearchFilesBasic: method test_search_finds_content (line 126) | def test_search_finds_content(self, file_ops_mcp, tmp_path): method test_search_nonexistent_dir_returns_error (line 138) | def test_search_nonexistent_dir_returns_error(self, file_ops_mcp, tmp_... FILE: tools/tests/tools/test_file_ops_hashline.py function _anchor (line 14) | def _anchor(line_num, line_text): function tools (line 20) | def tools(tmp_path): class TestReadFileHashline (line 46) | class TestReadFileHashline: method test_hashline_format (line 47) | def test_hashline_format(self, tools, tmp_path): method test_hashline_false_unchanged (line 60) | def test_hashline_false_unchanged(self, tools, tmp_path): method test_hashline_offset_limit (line 70) | def test_hashline_offset_limit(self, tools, tmp_path): method test_hashline_no_line_truncation (line 82) | def test_hashline_no_line_truncation(self, tools, tmp_path): class TestSearchFilesHashline (line 96) | class TestSearchFilesHashline: method test_hashline_in_results (line 97) | def test_hashline_in_results(self, tools, tmp_path): method test_hashline_false_unchanged (line 108) | def test_hashline_false_unchanged(self, tools, tmp_path): class TestHashlineEditBasic (line 121) | class TestHashlineEditBasic: method test_returns_string (line 122) | def test_returns_string(self, tools, tmp_path): method test_calls_before_write (line 133) | def test_calls_before_write(self, tools, tmp_path): method test_invalid_json (line 144) | def test_invalid_json(self, tools, tmp_path): method test_empty_edits (line 152) | def test_empty_edits(self, tools, tmp_path): method test_file_not_found (line 160) | def test_file_not_found(self, tools, tmp_path): class TestHashlineEditSetLine (line 169) | class TestHashlineEditSetLine: method test_set_line (line 170) | def test_set_line(self, tools, tmp_path): method test_set_line_hash_mismatch (line 181) | def test_set_line_hash_mismatch(self, tools, tmp_path): method test_set_line_delete (line 192) | def test_set_line_delete(self, tools, tmp_path): class TestHashlineEditReplaceLines (line 204) | class TestHashlineEditReplaceLines: method test_replace_lines (line 205) | def test_replace_lines(self, tools, tmp_path): class TestHashlineEditInsert (line 226) | class TestHashlineEditInsert: method test_insert_after (line 227) | def test_insert_after(self, tools, tmp_path): method test_insert_before (line 246) | def test_insert_before(self, tools, tmp_path): class TestHashlineEditReplace (line 266) | class TestHashlineEditReplace: method test_replace (line 267) | def test_replace(self, tools, tmp_path): method test_replace_not_found (line 286) | def test_replace_not_found(self, tools, tmp_path): class TestHashlineEditAppend (line 306) | class TestHashlineEditAppend: method test_append (line 307) | def test_append(self, tools, tmp_path): class TestHashlineEditOverlap (line 319) | class TestHashlineEditOverlap: method test_overlapping_edits_rejected (line 320) | def test_overlapping_edits_rejected(self, tools, tmp_path): class TestHashlineEditAutoCleanup (line 342) | class TestHashlineEditAutoCleanup: method test_strips_hashline_prefix_multiline (line 343) | def test_strips_hashline_prefix_multiline(self, tools, tmp_path): method test_no_cleanup_when_disabled (line 368) | def test_no_cleanup_when_disabled(self, tools, tmp_path): class TestHashlineEditAtomicWrite (line 390) | class TestHashlineEditAtomicWrite: method test_preserves_permissions (line 394) | def test_preserves_permissions(self, tools, tmp_path): method test_acl_preserved_after_edit_windows (line 406) | def test_acl_preserved_after_edit_windows(self, tools, tmp_path): method test_edit_succeeds_when_dacl_unavailable_windows (line 480) | def test_edit_succeeds_when_dacl_unavailable_windows(self, tools, tmp_... method test_preserves_trailing_newline (line 494) | def test_preserves_trailing_newline(self, tools, tmp_path): method test_unknown_op (line 504) | def test_unknown_op(self, tools, tmp_path): method test_crlf_replace_op_no_double_conversion (line 515) | def test_crlf_replace_op_no_double_conversion(self, tools, tmp_path): class TestHashlineEditResponseFormat (line 530) | class TestHashlineEditResponseFormat: method test_shows_updated_content (line 531) | def test_shows_updated_content(self, tools, tmp_path): method test_pagination_hint_for_large_files (line 543) | def test_pagination_hint_for_large_files(self, tools, tmp_path): FILE: tools/tests/tools/test_file_system_toolkits.py function mcp (line 12) | def mcp(): function mock_workspace (line 18) | def mock_workspace(): function mock_secure_path (line 28) | def mock_secure_path(tmp_path): class TestListDirTool (line 73) | class TestListDirTool: method list_dir_fn (line 77) | def list_dir_fn(self, mcp): method test_list_directory (line 83) | def test_list_directory(self, list_dir_fn, mock_workspace, mock_secure... method test_list_empty_directory (line 102) | def test_list_empty_directory(self, list_dir_fn, mock_workspace, mock_... method test_list_nonexistent_directory (line 113) | def test_list_nonexistent_directory(self, list_dir_fn, mock_workspace,... method test_list_directory_with_file_sizes (line 120) | def test_list_directory_with_file_sizes( class TestReplaceFileContentTool (line 147) | class TestReplaceFileContentTool: method replace_file_content_fn (line 151) | def replace_file_content_fn(self, mcp): method test_replace_content (line 157) | def test_replace_content( method test_replace_target_not_found (line 172) | def test_replace_target_not_found( method test_replace_file_not_found (line 186) | def test_replace_file_not_found( method test_replace_single_occurrence (line 197) | def test_replace_single_occurrence( method test_replace_multiline_content (line 212) | def test_replace_multiline_content( class TestGrepSearchTool (line 229) | class TestGrepSearchTool: method grep_search_fn (line 233) | def grep_search_fn(self, mcp): method test_grep_search_single_file (line 239) | def test_grep_search_single_file( method test_grep_search_no_matches (line 254) | def test_grep_search_no_matches( method test_grep_search_directory_non_recursive (line 267) | def test_grep_search_directory_non_recursive( method test_grep_search_directory_recursive (line 286) | def test_grep_search_directory_recursive( method test_grep_search_regex_pattern (line 304) | def test_grep_search_regex_pattern( method test_grep_search_multiple_matches_per_line (line 318) | def test_grep_search_multiple_matches_per_line( class TestExecuteCommandTool (line 331) | class TestExecuteCommandTool: method execute_command_fn (line 335) | def execute_command_fn(self, mcp): method test_execute_simple_command (line 341) | def test_execute_simple_command(self, execute_command_fn, mock_workspa... method test_execute_failing_command (line 349) | def test_execute_failing_command(self, execute_command_fn, mock_worksp... method test_execute_command_with_stderr (line 356) | def test_execute_command_with_stderr( method test_execute_command_list_files (line 365) | def test_execute_command_list_files( method test_execute_command_with_pipe (line 378) | def test_execute_command_with_pipe(self, execute_command_fn, mock_work... class TestApplyDiffTool (line 387) | class TestApplyDiffTool: method apply_diff_fn (line 391) | def apply_diff_fn(self, mcp): method test_apply_diff_file_not_found (line 397) | def test_apply_diff_file_not_found(self, apply_diff_fn, mock_workspace... method test_apply_diff_successful (line 404) | def test_apply_diff_successful(self, apply_diff_fn, mock_workspace, mo... method test_apply_diff_multiline (line 423) | def test_apply_diff_multiline(self, apply_diff_fn, mock_workspace, moc... method test_apply_diff_invalid_patch (line 442) | def test_apply_diff_invalid_patch( class TestApplyPatchTool (line 460) | class TestApplyPatchTool: method apply_patch_fn (line 464) | def apply_patch_fn(self, mcp): method test_apply_patch_file_not_found (line 470) | def test_apply_patch_file_not_found(self, apply_patch_fn, mock_workspa... method test_apply_patch_successful (line 477) | def test_apply_patch_successful( method test_apply_patch_multiline (line 498) | def test_apply_patch_multiline( method test_apply_patch_invalid_patch (line 519) | def test_apply_patch_invalid_patch( method test_apply_patch_multiple_changes (line 538) | def test_apply_patch_multiple_changes( class TestGrepSearchHashlineMode (line 560) | class TestGrepSearchHashlineMode: method grep_search_fn (line 564) | def grep_search_fn(self, mcp): method test_hashline_anchor_present (line 570) | def test_hashline_anchor_present( method test_hashline_anchor_absent_by_default (line 587) | def test_hashline_anchor_absent_by_default( method test_grep_hashline_preserves_indentation (line 600) | def test_grep_hashline_preserves_indentation( method test_hashline_skips_large_files_with_notice (line 613) | def test_hashline_skips_large_files_with_notice( class TestHashlineCrossToolConsistency (line 638) | class TestHashlineCrossToolConsistency: method grep_search_fn (line 642) | def grep_search_fn(self, mcp): method hashline_edit_fn (line 649) | def hashline_edit_fn(self, mcp): method test_unicode_line_separator_anchor_roundtrip (line 655) | def test_unicode_line_separator_anchor_roundtrip( FILE: tools/tests/tools/test_github_tool.py class TestGitHubClient (line 27) | class TestGitHubClient: method setup_method (line 28) | def setup_method(self): method test_headers (line 31) | def test_headers(self): method test_handle_response_success (line 36) | def test_handle_response_success(self): method test_handle_response_401 (line 44) | def test_handle_response_401(self): method test_handle_response_403 (line 51) | def test_handle_response_403(self): method test_handle_response_404 (line 58) | def test_handle_response_404(self): method test_handle_response_422 (line 65) | def test_handle_response_422(self): method test_list_repos (line 74) | def test_list_repos(self, mock_get): method test_list_repos_authenticated_user (line 90) | def test_list_repos_authenticated_user(self, mock_get): method test_get_repo (line 102) | def test_get_repo(self, mock_get): method test_search_repos (line 119) | def test_search_repos(self, mock_get): method test_list_issues (line 134) | def test_list_issues(self, mock_get): method test_get_issue (line 149) | def test_get_issue(self, mock_get): method test_create_issue (line 165) | def test_create_issue(self, mock_post): method test_update_issue (line 185) | def test_update_issue(self, mock_patch): method test_list_pull_requests (line 201) | def test_list_pull_requests(self, mock_get): method test_get_pull_request (line 215) | def test_get_pull_request(self, mock_get): method test_create_pull_request (line 232) | def test_create_pull_request(self, mock_post): method test_search_code (line 250) | def test_search_code(self, mock_get): method test_list_branches (line 265) | def test_list_branches(self, mock_get): method test_get_branch (line 280) | def test_get_branch(self, mock_get): class TestCredentialRetrieval (line 299) | class TestCredentialRetrieval: method mcp (line 301) | def mcp(self): method test_no_credentials_returns_error (line 304) | def test_no_credentials_returns_error(self, mcp): method test_env_var_token (line 317) | def test_env_var_token(self, mcp): method test_credential_store_token (line 334) | def test_credential_store_token(self, mcp): class TestGitHubListRepos (line 358) | class TestGitHubListRepos: method mcp (line 360) | def mcp(self): method test_list_repos_success (line 364) | def test_list_repos_success(self, mock_get, mcp): method test_list_repos_timeout (line 379) | def test_list_repos_timeout(self, mock_get, mcp): method test_list_repos_network_error (line 392) | def test_list_repos_network_error(self, mock_get, mcp): class TestGitHubGetRepo (line 405) | class TestGitHubGetRepo: method mcp (line 407) | def mcp(self): method test_get_repo_success (line 411) | def test_get_repo_success(self, mock_get, mcp): class TestGitHubSearchRepos (line 426) | class TestGitHubSearchRepos: method mcp (line 428) | def mcp(self): method test_search_repos_success (line 432) | def test_search_repos_success(self, mock_get, mcp): class TestGitHubIssues (line 447) | class TestGitHubIssues: method mcp (line 449) | def mcp(self): method test_list_issues_success (line 453) | def test_list_issues_success(self, mock_get, mcp): method test_get_issue_success (line 468) | def test_get_issue_success(self, mock_get, mcp): method test_create_issue_success (line 483) | def test_create_issue_success(self, mock_post, mcp): method test_update_issue_success (line 498) | def test_update_issue_success(self, mock_patch, mcp): class TestGitHubPullRequests (line 513) | class TestGitHubPullRequests: method mcp (line 515) | def mcp(self): method test_list_pull_requests_success (line 519) | def test_list_pull_requests_success(self, mock_get, mcp): method test_get_pull_request_success (line 534) | def test_get_pull_request_success(self, mock_get, mcp): method test_create_pull_request_success (line 549) | def test_create_pull_request_success(self, mock_post, mcp): class TestGitHubSearch (line 570) | class TestGitHubSearch: method mcp (line 572) | def mcp(self): method test_search_code_success (line 576) | def test_search_code_success(self, mock_get, mcp): class TestGitHubBranches (line 591) | class TestGitHubBranches: method mcp (line 593) | def mcp(self): method test_list_branches_success (line 597) | def test_list_branches_success(self, mock_get, mcp): method test_get_branch_success (line 612) | def test_get_branch_success(self, mock_get, mcp): FILE: tools/tests/tools/test_gitlab_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestGitlabListProjects (line 28) | class TestGitlabListProjects: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 34) | def test_successful_list(self, tool_fns): class TestGitlabGetProject (line 61) | class TestGitlabGetProject: method test_missing_id (line 62) | def test_missing_id(self, tool_fns): method test_successful_get (line 67) | def test_successful_get(self, tool_fns): class TestGitlabListIssues (line 96) | class TestGitlabListIssues: method test_missing_project_id (line 97) | def test_missing_project_id(self, tool_fns): method test_successful_list (line 102) | def test_successful_list(self, tool_fns): class TestGitlabGetIssue (line 129) | class TestGitlabGetIssue: method test_missing_params (line 130) | def test_missing_params(self, tool_fns): method test_successful_get (line 135) | def test_successful_get(self, tool_fns): class TestGitlabCreateIssue (line 163) | class TestGitlabCreateIssue: method test_missing_params (line 164) | def test_missing_params(self, tool_fns): method test_successful_create (line 169) | def test_successful_create(self, tool_fns): class TestGitlabListMergeRequests (line 188) | class TestGitlabListMergeRequests: method test_missing_project_id (line 189) | def test_missing_project_id(self, tool_fns): method test_successful_list (line 194) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_gmail_tool.py function gmail_tools (line 15) | def gmail_tools(mcp: FastMCP): function list_fn (line 23) | def list_fn(gmail_tools): function get_fn (line 28) | def get_fn(gmail_tools): function trash_fn (line 33) | def trash_fn(gmail_tools): function modify_fn (line 38) | def modify_fn(gmail_tools): function batch_fn (line 43) | def batch_fn(gmail_tools): function list_labels_fn (line 48) | def list_labels_fn(gmail_tools): function create_label_fn (line 53) | def create_label_fn(gmail_tools): function _mock_response (line 57) | def _mock_response( class TestCredentials (line 73) | class TestCredentials: method test_list_no_credentials (line 76) | def test_list_no_credentials(self, list_fn, monkeypatch): method test_get_no_credentials (line 83) | def test_get_no_credentials(self, get_fn, monkeypatch): method test_trash_no_credentials (line 89) | def test_trash_no_credentials(self, trash_fn, monkeypatch): method test_modify_no_credentials (line 94) | def test_modify_no_credentials(self, modify_fn, monkeypatch): method test_batch_no_credentials (line 99) | def test_batch_no_credentials(self, batch_fn, monkeypatch): method test_list_labels_no_credentials (line 104) | def test_list_labels_no_credentials(self, list_labels_fn, monkeypatch): method test_create_label_no_credentials (line 110) | def test_create_label_no_credentials(self, create_label_fn, monkeypatch): class TestListMessages (line 122) | class TestListMessages: method test_list_success (line 123) | def test_list_success(self, list_fn, monkeypatch): method test_list_empty_inbox (line 147) | def test_list_empty_inbox(self, list_fn, monkeypatch): method test_list_with_page_token (line 156) | def test_list_with_page_token(self, list_fn, monkeypatch): method test_list_max_results_clamped (line 171) | def test_list_max_results_clamped(self, list_fn, monkeypatch): method test_list_token_expired (line 179) | def test_list_token_expired(self, list_fn, monkeypatch): method test_list_network_error (line 189) | def test_list_network_error(self, list_fn, monkeypatch): class TestGetMessage (line 203) | class TestGetMessage: method test_get_metadata (line 204) | def test_get_metadata(self, get_fn, monkeypatch): method test_get_full_with_body (line 232) | def test_get_full_with_body(self, get_fn, monkeypatch): method test_get_multipart_body (line 255) | def test_get_multipart_body(self, get_fn, monkeypatch): method test_get_empty_message_id (line 281) | def test_get_empty_message_id(self, get_fn, monkeypatch): method test_get_not_found (line 287) | def test_get_not_found(self, get_fn, monkeypatch): class TestTrashMessage (line 302) | class TestTrashMessage: method test_trash_success (line 303) | def test_trash_success(self, trash_fn, monkeypatch): method test_trash_empty_id (line 315) | def test_trash_empty_id(self, trash_fn, monkeypatch): method test_trash_not_found (line 320) | def test_trash_not_found(self, trash_fn, monkeypatch): class TestModifyMessage (line 334) | class TestModifyMessage: method test_star_message (line 335) | def test_star_message(self, modify_fn, monkeypatch): method test_mark_as_read (line 347) | def test_mark_as_read(self, modify_fn, monkeypatch): method test_modify_no_labels_returns_error (line 357) | def test_modify_no_labels_returns_error(self, modify_fn, monkeypatch): method test_modify_empty_id (line 363) | def test_modify_empty_id(self, modify_fn, monkeypatch): method test_modify_api_error (line 368) | def test_modify_api_error(self, modify_fn, monkeypatch): class TestBatchModifyMessages (line 383) | class TestBatchModifyMessages: method test_batch_success (line 384) | def test_batch_success(self, batch_fn, monkeypatch): method test_batch_empty_ids_returns_error (line 399) | def test_batch_empty_ids_returns_error(self, batch_fn, monkeypatch): method test_batch_no_labels_returns_error (line 404) | def test_batch_no_labels_returns_error(self, batch_fn, monkeypatch): method test_batch_api_error (line 409) | def test_batch_api_error(self, batch_fn, monkeypatch): class TestListLabels (line 423) | class TestListLabels: method test_list_labels_success (line 424) | def test_list_labels_success(self, list_labels_fn, monkeypatch): method test_list_labels_empty (line 445) | def test_list_labels_empty(self, list_labels_fn, monkeypatch): method test_list_labels_token_expired (line 453) | def test_list_labels_token_expired(self, list_labels_fn, monkeypatch): method test_list_labels_network_error (line 462) | def test_list_labels_network_error(self, list_labels_fn, monkeypatch): class TestCreateLabel (line 476) | class TestCreateLabel: method test_create_label_success (line 477) | def test_create_label_success(self, create_label_fn, monkeypatch): method test_create_label_custom_visibility (line 499) | def test_create_label_custom_visibility(self, create_label_fn, monkeyp... method test_create_label_empty_name (line 517) | def test_create_label_empty_name(self, create_label_fn, monkeypatch): method test_create_label_whitespace_name (line 523) | def test_create_label_whitespace_name(self, create_label_fn, monkeypat... method test_create_label_api_error (line 529) | def test_create_label_api_error(self, create_label_fn, monkeypatch): method test_create_label_network_error (line 538) | def test_create_label_network_error(self, create_label_fn, monkeypatch): function create_draft_fn (line 553) | def create_draft_fn(gmail_tools): function _orig_message_response (line 557) | def _orig_message_response( class TestGmailCreateDraft (line 587) | class TestGmailCreateDraft: method test_no_credentials (line 592) | def test_no_credentials(self, create_draft_fn, monkeypatch): method test_missing_to (line 598) | def test_missing_to(self, create_draft_fn, monkeypatch): method test_missing_subject (line 604) | def test_missing_subject(self, create_draft_fn, monkeypatch): method test_missing_html (line 610) | def test_missing_html(self, create_draft_fn, monkeypatch): method test_new_draft_happy_path (line 616) | def test_new_draft_happy_path(self, create_draft_fn, monkeypatch): method test_reply_draft_happy_path (line 632) | def test_reply_draft_happy_path(self, create_draft_fn, monkeypatch): method test_reply_draft_subject_already_re (line 678) | def test_reply_draft_subject_already_re(self, create_draft_fn, monkeyp... method test_reply_draft_subject_no_double_re (line 690) | def test_reply_draft_subject_no_double_re(self, create_draft_fn, monke... method test_reply_draft_fetch_401 (line 706) | def test_reply_draft_fetch_401(self, create_draft_fn, monkeypatch): method test_reply_draft_fetch_404 (line 714) | def test_reply_draft_fetch_404(self, create_draft_fn, monkeypatch): method test_reply_draft_network_error_on_fetch (line 721) | def test_reply_draft_network_error_on_fetch(self, create_draft_fn, mon... method test_reply_draft_api_error_on_create (line 728) | def test_reply_draft_api_error_on_create(self, create_draft_fn, monkey... FILE: tools/tests/tools/test_google_analytics_tool.py function _make_header (line 25) | def _make_header(name: str) -> MagicMock: function _make_value (line 31) | def _make_value(value: str) -> MagicMock: function _make_row (line 37) | def _make_row(dim_values: list[str], metric_values: list[str]) -> MagicM... function _make_report_response (line 44) | def _make_report_response( function _make_realtime_response (line 58) | def _make_realtime_response( class TestGAClient (line 76) | class TestGAClient: method test_format_report_response (line 81) | def test_format_report_response(self, mock_client_cls, mock_creds): method test_format_report_response_no_dimensions (line 108) | def test_format_report_response_no_dimensions(self, mock_client_cls, m... method test_format_realtime_response (line 126) | def test_format_realtime_response(self, mock_client_cls, mock_creds): method test_run_report_calls_api (line 143) | def test_run_report_calls_api(self, mock_client_cls, mock_creds): method test_run_realtime_report_calls_api (line 168) | def test_run_realtime_report_calls_api(self, mock_client_cls, mock_cre... class TestCredentialRetrieval (line 192) | class TestCredentialRetrieval: method test_no_credentials_returns_error (line 195) | def test_no_credentials_returns_error(self, monkeypatch): method test_credentials_from_env (line 211) | def test_credentials_from_env(self, monkeypatch): method test_credentials_from_credential_store (line 221) | def test_credentials_from_credential_store(self): class TestGaRunReport (line 239) | class TestGaRunReport: method ga_tools (line 243) | def ga_tools(self, monkeypatch): method ga_tools_with_creds (line 253) | def ga_tools_with_creds(self, monkeypatch): method test_empty_metrics_returns_error (line 268) | def test_empty_metrics_returns_error(self, ga_tools_with_creds): method test_invalid_property_id_returns_error (line 277) | def test_invalid_property_id_returns_error(self, ga_tools_with_creds): method test_empty_property_id_returns_error (line 286) | def test_empty_property_id_returns_error(self, ga_tools_with_creds): method test_limit_too_low_returns_error (line 294) | def test_limit_too_low_returns_error(self, ga_tools_with_creds): method test_limit_too_high_returns_error (line 304) | def test_limit_too_high_returns_error(self, ga_tools_with_creds): method test_no_credentials_returns_error (line 314) | def test_no_credentials_returns_error(self, ga_tools): method test_successful_report (line 326) | def test_successful_report(self, mock_client_cls, mock_creds, monkeypa... method test_api_error_returns_error_dict (line 355) | def test_api_error_returns_error_dict(self, mock_client_cls, mock_cred... class TestGaGetRealtime (line 382) | class TestGaGetRealtime: method ga_tools (line 386) | def ga_tools(self, monkeypatch): method ga_tools_with_creds (line 396) | def ga_tools_with_creds(self, monkeypatch): method test_invalid_property_id_returns_error (line 411) | def test_invalid_property_id_returns_error(self, ga_tools_with_creds): method test_no_credentials_returns_error (line 417) | def test_no_credentials_returns_error(self, ga_tools): method test_default_metrics (line 423) | def test_default_metrics(self, ga_tools): method test_successful_realtime (line 432) | def test_successful_realtime(self, mock_client_cls, mock_creds, monkey... method test_custom_metrics (line 455) | def test_custom_metrics(self, mock_client_cls, mock_creds, monkeypatch): method test_api_error_returns_error_dict (line 481) | def test_api_error_returns_error_dict(self, mock_client_cls, mock_cred... class TestGaGetTopPages (line 505) | class TestGaGetTopPages: method ga_tools (line 509) | def ga_tools(self, monkeypatch): method ga_tools_with_creds (line 519) | def ga_tools_with_creds(self, monkeypatch): method test_invalid_property_id_returns_error (line 534) | def test_invalid_property_id_returns_error(self, ga_tools_with_creds): method test_limit_validation (line 540) | def test_limit_validation(self, ga_tools_with_creds): method test_no_credentials_returns_error (line 546) | def test_no_credentials_returns_error(self, ga_tools): method test_correct_dimensions_and_metrics (line 554) | def test_correct_dimensions_and_metrics(self, mock_client_cls, mock_cr... method test_date_range_and_limit_forwarded (line 583) | def test_date_range_and_limit_forwarded(self, mock_client_cls, mock_cr... class TestGaGetTrafficSources (line 616) | class TestGaGetTrafficSources: method ga_tools (line 620) | def ga_tools(self, monkeypatch): method ga_tools_with_creds (line 630) | def ga_tools_with_creds(self, monkeypatch): method test_invalid_property_id_returns_error (line 645) | def test_invalid_property_id_returns_error(self, ga_tools_with_creds): method test_limit_validation (line 651) | def test_limit_validation(self, ga_tools_with_creds): method test_no_credentials_returns_error (line 659) | def test_no_credentials_returns_error(self, ga_tools): method test_correct_dimensions_and_metrics (line 667) | def test_correct_dimensions_and_metrics(self, mock_client_cls, mock_cr... method test_api_error_returns_error_dict (line 699) | def test_api_error_returns_error_dict(self, mock_client_cls, mock_cred... class TestToolRegistration (line 723) | class TestToolRegistration: method test_register_tools_registers_all_seven_tools (line 726) | def test_register_tools_registers_all_seven_tools(self): method test_register_all_tools_includes_ga_tools (line 745) | def test_register_all_tools_includes_ga_tools(self): method test_credentials_passed_through (line 763) | def test_credentials_passed_through(self): FILE: tools/tests/tools/test_google_docs_tool.py function mcp (line 35) | def mcp(): function client (line 41) | def client(): function _register (line 46) | def _register(mcp, credentials=None): function _tool_fn (line 52) | def _tool_fn(mcp, name, credentials=None): function _mock_response (line 58) | def _mock_response(status_code=200, json_data=None, text="", content=b""): class TestValidateImageUri (line 76) | class TestValidateImageUri: method test_valid_https_url (line 79) | def test_valid_https_url(self): method test_valid_http_url (line 82) | def test_valid_http_url(self): method test_empty_uri (line 85) | def test_empty_uri(self): method test_whitespace_uri (line 90) | def test_whitespace_uri(self): method test_missing_scheme (line 95) | def test_missing_scheme(self): method test_disallowed_scheme_ftp (line 100) | def test_disallowed_scheme_ftp(self): method test_disallowed_scheme_javascript (line 105) | def test_disallowed_scheme_javascript(self): method test_missing_domain (line 110) | def test_missing_domain(self): class TestGetDocumentEndIndex (line 116) | class TestGetDocumentEndIndex: method test_returns_end_index_minus_one (line 119) | def test_returns_end_index_minus_one(self): method test_empty_content_returns_one (line 129) | def test_empty_content_returns_one(self): method test_no_body_returns_one (line 133) | def test_no_body_returns_one(self): class TestGoogleDocsClientHeaders (line 143) | class TestGoogleDocsClientHeaders: method test_headers_contain_bearer_token (line 144) | def test_headers_contain_bearer_token(self, client): class TestGoogleDocsClientHandleResponse (line 150) | class TestGoogleDocsClientHandleResponse: method test_known_error_codes (line 160) | def test_known_error_codes(self, client, status_code, expected_substr): method test_generic_error_with_nested_message (line 166) | def test_generic_error_with_nested_message(self, client): method test_success_returns_json (line 174) | def test_success_returns_json(self, client): class TestGoogleDocsClientCreateDocument (line 179) | class TestGoogleDocsClientCreateDocument: method test_posts_title (line 180) | def test_posts_title(self, client): class TestGoogleDocsClientGetDocument (line 189) | class TestGoogleDocsClientGetDocument: method test_gets_correct_url (line 190) | def test_gets_correct_url(self, client): class TestGoogleDocsClientBatchUpdate (line 198) | class TestGoogleDocsClientBatchUpdate: method test_batch_update_sends_requests (line 199) | def test_batch_update_sends_requests(self, client): class TestGoogleDocsClientInsertText (line 208) | class TestGoogleDocsClientInsertText: method test_insert_at_index (line 209) | def test_insert_at_index(self, client): method test_insert_at_end_fetches_doc (line 218) | def test_insert_at_end_fetches_doc(self, client): class TestGoogleDocsClientReplaceAllText (line 230) | class TestGoogleDocsClientReplaceAllText: method test_replace_sends_correct_request (line 231) | def test_replace_sends_correct_request(self, client): method test_empty_find_text_returns_error (line 240) | def test_empty_find_text_returns_error(self, client): class TestGoogleDocsClientInsertImage (line 245) | class TestGoogleDocsClientInsertImage: method test_valid_image_insertion (line 246) | def test_valid_image_insertion(self, client): method test_invalid_uri_returns_error (line 254) | def test_invalid_uri_returns_error(self, client): method test_image_with_dimensions (line 258) | def test_image_with_dimensions(self, client): class TestGoogleDocsClientFormatText (line 273) | class TestGoogleDocsClientFormatText: method test_bold_formatting (line 274) | def test_bold_formatting(self, client): method test_no_options_returns_error (line 283) | def test_no_options_returns_error(self, client): class TestGoogleDocsClientExportDocument (line 289) | class TestGoogleDocsClientExportDocument: method test_export_pdf (line 290) | def test_export_pdf(self, client): class TestGoogleDocsClientComments (line 299) | class TestGoogleDocsClientComments: method test_add_comment (line 300) | def test_add_comment(self, client): method test_add_comment_with_quoted_text (line 308) | def test_add_comment_with_quoted_text(self, client): method test_list_comments (line 315) | def test_list_comments(self, client): class TestGoogleDocsCredentials (line 329) | class TestGoogleDocsCredentials: method test_no_credentials_returns_error (line 330) | def test_no_credentials_returns_error(self, mcp, monkeypatch): method test_env_var_credential (line 337) | def test_env_var_credential(self, mcp, monkeypatch): method test_credential_store_used (line 346) | def test_credential_store_used(self, mcp): method test_credential_store_non_string_raises (line 355) | def test_credential_store_non_string_raises(self, mcp): method test_credential_store_account_alias (line 362) | def test_credential_store_account_alias(self, mcp): class TestGoogleDocsCreateDocument (line 377) | class TestGoogleDocsCreateDocument: method test_success_returns_url (line 378) | def test_success_returns_url(self, mcp, monkeypatch): method test_timeout (line 390) | def test_timeout(self, mcp, monkeypatch): class TestGoogleDocsGetDocument (line 398) | class TestGoogleDocsGetDocument: method test_success (line 399) | def test_success(self, mcp, monkeypatch): class TestGoogleDocsInsertText (line 408) | class TestGoogleDocsInsertText: method test_success (line 409) | def test_success(self, mcp, monkeypatch): class TestGoogleDocsReplaceAllText (line 418) | class TestGoogleDocsReplaceAllText: method test_success_with_count (line 419) | def test_success_with_count(self, mcp, monkeypatch): class TestGoogleDocsInsertImage (line 435) | class TestGoogleDocsInsertImage: method test_success (line 436) | def test_success(self, mcp, monkeypatch): method test_invalid_uri (line 448) | def test_invalid_uri(self, mcp, monkeypatch): class TestGoogleDocsFormatText (line 462) | class TestGoogleDocsFormatText: method test_success (line 463) | def test_success(self, mcp, monkeypatch): class TestGoogleDocsBatchUpdate (line 477) | class TestGoogleDocsBatchUpdate: method test_success (line 478) | def test_success(self, mcp, monkeypatch): method test_invalid_json (line 490) | def test_invalid_json(self, mcp, monkeypatch): method test_non_array_json (line 497) | def test_non_array_json(self, mcp, monkeypatch): class TestGoogleDocsCreateList (line 505) | class TestGoogleDocsCreateList: method test_bullet_list (line 506) | def test_bullet_list(self, mcp, monkeypatch): method test_numbered_list (line 519) | def test_numbered_list(self, mcp, monkeypatch): class TestGoogleDocsAddComment (line 533) | class TestGoogleDocsAddComment: method test_success (line 534) | def test_success(self, mcp, monkeypatch): class TestGoogleDocsListComments (line 543) | class TestGoogleDocsListComments: method test_success_returns_structured (line 544) | def test_success_returns_structured(self, mcp, monkeypatch): class TestGoogleDocsExportContent (line 558) | class TestGoogleDocsExportContent: method test_export_pdf (line 559) | def test_export_pdf(self, mcp, monkeypatch): class TestToolRegistration (line 574) | class TestToolRegistration: method test_all_tools_registered (line 591) | def test_all_tools_registered(self, mcp): method test_tool_count (line 596) | def test_tool_count(self, mcp): FILE: tools/tests/tools/test_google_maps_tool.py function mcp (line 14) | def mcp(): function maps_geocode_fn (line 20) | def maps_geocode_fn(mcp: FastMCP): function maps_reverse_geocode_fn (line 27) | def maps_reverse_geocode_fn(mcp: FastMCP): function maps_directions_fn (line 34) | def maps_directions_fn(mcp: FastMCP): function maps_distance_matrix_fn (line 41) | def maps_distance_matrix_fn(mcp: FastMCP): function maps_place_details_fn (line 48) | def maps_place_details_fn(mcp: FastMCP): function maps_place_search_fn (line 55) | def maps_place_search_fn(mcp: FastMCP): class TestGoogleMapsCredentials (line 64) | class TestGoogleMapsCredentials: method test_geocode_no_credentials_returns_error (line 67) | def test_geocode_no_credentials_returns_error(self, maps_geocode_fn, m... method test_reverse_geocode_no_credentials_returns_error (line 77) | def test_reverse_geocode_no_credentials_returns_error( method test_directions_no_credentials_returns_error (line 88) | def test_directions_no_credentials_returns_error(self, maps_directions... method test_distance_matrix_no_credentials_returns_error (line 97) | def test_distance_matrix_no_credentials_returns_error( method test_place_details_no_credentials_returns_error (line 108) | def test_place_details_no_credentials_returns_error(self, maps_place_d... method test_place_search_no_credentials_returns_error (line 117) | def test_place_search_no_credentials_returns_error(self, maps_place_se... class TestInputValidation (line 130) | class TestInputValidation: method test_geocode_no_address_or_components (line 133) | def test_geocode_no_address_or_components(self, maps_geocode_fn, monke... method test_reverse_geocode_invalid_latitude (line 142) | def test_reverse_geocode_invalid_latitude(self, maps_reverse_geocode_f... method test_reverse_geocode_invalid_longitude (line 151) | def test_reverse_geocode_invalid_longitude(self, maps_reverse_geocode_... method test_directions_no_origin (line 160) | def test_directions_no_origin(self, maps_directions_fn, monkeypatch): method test_directions_no_destination (line 169) | def test_directions_no_destination(self, maps_directions_fn, monkeypat... method test_distance_matrix_no_origins (line 178) | def test_distance_matrix_no_origins(self, maps_distance_matrix_fn, mon... method test_distance_matrix_no_destinations (line 187) | def test_distance_matrix_no_destinations(self, maps_distance_matrix_fn... method test_place_details_no_place_id (line 196) | def test_place_details_no_place_id(self, maps_place_details_fn, monkey... method test_place_search_no_query_or_page_token (line 205) | def test_place_search_no_query_or_page_token(self, maps_place_search_f... class TestMapsGeocode (line 218) | class TestMapsGeocode: method test_geocode_success (line 221) | def test_geocode_success(self, maps_geocode_fn, monkeypatch): method test_geocode_zero_results (line 258) | def test_geocode_zero_results(self, maps_geocode_fn, monkeypatch): method test_geocode_request_denied (line 276) | def test_geocode_request_denied(self, maps_geocode_fn, monkeypatch): method test_geocode_with_components_filter (line 295) | def test_geocode_with_components_filter(self, maps_geocode_fn, monkeyp... class TestMapsReverseGeocode (line 321) | class TestMapsReverseGeocode: method test_reverse_geocode_success (line 324) | def test_reverse_geocode_success(self, maps_reverse_geocode_fn, monkey... method test_reverse_geocode_passes_latlng_param (line 354) | def test_reverse_geocode_passes_latlng_param(self, maps_reverse_geocod... class TestMapsDirections (line 375) | class TestMapsDirections: method test_directions_success (line 378) | def test_directions_success(self, maps_directions_fn, monkeypatch): method test_directions_with_waypoints (line 421) | def test_directions_with_waypoints(self, maps_directions_fn, monkeypat... method test_directions_not_found (line 447) | def test_directions_not_found(self, maps_directions_fn, monkeypatch): class TestMapsDistanceMatrix (line 470) | class TestMapsDistanceMatrix: method test_distance_matrix_success (line 473) | def test_distance_matrix_success(self, maps_distance_matrix_fn, monkey... method test_distance_matrix_with_traffic (line 517) | def test_distance_matrix_with_traffic(self, maps_distance_matrix_fn, m... method test_distance_matrix_passes_mode (line 552) | def test_distance_matrix_passes_mode(self, maps_distance_matrix_fn, mo... class TestMapsPlaceDetails (line 578) | class TestMapsPlaceDetails: method test_place_details_success (line 581) | def test_place_details_success(self, maps_place_details_fn, monkeypatch): method test_place_details_not_found (line 607) | def test_place_details_not_found(self, maps_place_details_fn, monkeypa... method test_place_details_custom_fields (line 624) | def test_place_details_custom_fields(self, maps_place_details_fn, monk... class TestMapsPlaceSearch (line 652) | class TestMapsPlaceSearch: method test_place_search_success (line 655) | def test_place_search_success(self, maps_place_search_fn, monkeypatch): method test_place_search_with_location_and_type (line 702) | def test_place_search_with_location_and_type(self, maps_place_search_f... method test_place_search_zero_results (line 735) | def test_place_search_zero_results(self, maps_place_search_fn, monkeyp... method test_place_search_radius_capped (line 753) | def test_place_search_radius_capped(self, maps_place_search_fn, monkey... method test_place_search_with_page_token (line 769) | def test_place_search_with_page_token(self, maps_place_search_fn, monk... method test_place_search_page_token_without_query (line 799) | def test_place_search_page_token_without_query(self, maps_place_search... class TestAPIErrorHandling (line 824) | class TestAPIErrorHandling: method test_over_query_limit (line 827) | def test_over_query_limit(self, maps_geocode_fn, monkeypatch): method test_http_error (line 845) | def test_http_error(self, maps_geocode_fn, monkeypatch): method test_timeout_error (line 860) | def test_timeout_error(self, maps_geocode_fn, monkeypatch): method test_network_error (line 874) | def test_network_error(self, maps_geocode_fn, monkeypatch): class TestCredentialAdapter (line 892) | class TestCredentialAdapter: method test_geocode_with_credential_adapter (line 895) | def test_geocode_with_credential_adapter(self, mcp): class TestToolRegistration (line 935) | class TestToolRegistration: method test_all_tools_registered (line 938) | def test_all_tools_registered(self, mcp): FILE: tools/tests/tools/test_google_search_console_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestGscSearchAnalytics (line 20) | class TestGscSearchAnalytics: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_missing_params (line 28) | def test_missing_params(self, tool_fns): method test_successful_query (line 33) | def test_successful_query(self, tool_fns): class TestGscListSites (line 61) | class TestGscListSites: method test_successful_list (line 62) | def test_successful_list(self, tool_fns): class TestGscListSitemaps (line 80) | class TestGscListSitemaps: method test_missing_site (line 81) | def test_missing_site(self, tool_fns): method test_successful_list (line 86) | def test_successful_list(self, tool_fns): class TestGscInspectUrl (line 113) | class TestGscInspectUrl: method test_missing_params (line 114) | def test_missing_params(self, tool_fns): method test_successful_inspect (line 119) | def test_successful_inspect(self, tool_fns): class TestGscSubmitSitemap (line 151) | class TestGscSubmitSitemap: method test_missing_params (line 152) | def test_missing_params(self, tool_fns): method test_successful_submit (line 157) | def test_successful_submit(self, tool_fns): FILE: tools/tests/tools/test_google_sheets_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestSheetsGetSpreadsheet (line 28) | class TestSheetsGetSpreadsheet: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_missing_id (line 34) | def test_missing_id(self, tool_fns): method test_successful_get (line 44) | def test_successful_get(self, tool_fns): class TestSheetsGetValues (line 73) | class TestSheetsGetValues: method test_missing_credentials (line 74) | def test_missing_credentials(self, tool_fns): method test_missing_params (line 81) | def test_missing_params(self, tool_fns): method test_successful_read (line 90) | def test_successful_read(self, tool_fns): FILE: tools/tests/tools/test_greenhouse_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestGreenhouseListJobs (line 28) | class TestGreenhouseListJobs: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 34) | def test_successful_list(self, tool_fns): class TestGreenhouseGetJob (line 60) | class TestGreenhouseGetJob: method test_missing_job_id (line 61) | def test_missing_job_id(self, tool_fns): method test_successful_get (line 66) | def test_successful_get(self, tool_fns): class TestGreenhouseListCandidates (line 92) | class TestGreenhouseListCandidates: method test_missing_credentials (line 93) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 98) | def test_successful_list(self, tool_fns): class TestGreenhouseGetCandidate (line 124) | class TestGreenhouseGetCandidate: method test_missing_id (line 125) | def test_missing_id(self, tool_fns): method test_successful_get (line 130) | def test_successful_get(self, tool_fns): class TestGreenhouseListApplications (line 157) | class TestGreenhouseListApplications: method test_missing_credentials (line 158) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 163) | def test_successful_list(self, tool_fns): class TestGreenhouseGetApplication (line 188) | class TestGreenhouseGetApplication: method test_missing_id (line 189) | def test_missing_id(self, tool_fns): method test_successful_get (line 194) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_hashline.py class TestComputeLineHash (line 13) | class TestComputeLineHash: method test_basic_output_format (line 16) | def test_basic_output_format(self): method test_space_stripping (line 22) | def test_space_stripping(self): method test_tab_stripping (line 27) | def test_tab_stripping(self): method test_empty_line (line 32) | def test_empty_line(self): method test_different_lines_different_hashes (line 38) | def test_different_lines_different_hashes(self): method test_whitespace_only_equals_empty (line 45) | def test_whitespace_only_equals_empty(self): method test_formatter_resilience (line 49) | def test_formatter_resilience(self): method test_leading_whitespace_changes_hash (line 54) | def test_leading_whitespace_changes_hash(self): method test_trailing_whitespace_ignored (line 58) | def test_trailing_whitespace_ignored(self): class TestFormatHashlines (line 63) | class TestFormatHashlines: method test_basic_format (line 66) | def test_basic_format(self): method test_offset (line 78) | def test_offset(self): method test_limit (line 87) | def test_limit(self): method test_offset_and_limit (line 96) | def test_offset_and_limit(self): method test_empty_input (line 107) | def test_empty_input(self): class TestParseAnchor (line 113) | class TestParseAnchor: method test_valid_anchor (line 116) | def test_valid_anchor(self): method test_valid_anchor_with_zeros (line 122) | def test_valid_anchor_with_zeros(self): method test_no_colon (line 128) | def test_no_colon(self): method test_wrong_hash_length (line 134) | def test_wrong_hash_length(self, bad_anchor): method test_uppercase_hash (line 139) | def test_uppercase_hash(self): method test_non_hex_hash (line 144) | def test_non_hex_hash(self): method test_non_integer_line (line 149) | def test_non_integer_line(self): class TestValidateAnchor (line 155) | class TestValidateAnchor: method test_valid_match (line 158) | def test_valid_match(self): method test_hash_mismatch (line 164) | def test_hash_mismatch(self): method test_out_of_range (line 174) | def test_out_of_range(self, anchor): method test_invalid_format (line 181) | def test_invalid_format(self): FILE: tools/tests/tools/test_hashline_edit.py function mcp (line 15) | def mcp(): function mock_workspace (line 21) | def mock_workspace(): function mock_secure_path (line 31) | def mock_secure_path(tmp_path): function hashline_edit_fn (line 45) | def hashline_edit_fn(mcp): function _anchor (line 52) | def _anchor(line_num, line_text): class TestSetLine (line 57) | class TestSetLine: method test_set_line_basic (line 60) | def test_set_line_basic(self, hashline_edit_fn, mock_workspace, mock_s... method test_set_line_rejects_multiline_content (line 72) | def test_set_line_rejects_multiline_content( class TestReplaceLines (line 89) | class TestReplaceLines: method test_replace_lines_basic (line 92) | def test_replace_lines_basic( method test_replace_lines_expand (line 114) | def test_replace_lines_expand( method test_replace_lines_empty_content_deletes (line 136) | def test_replace_lines_empty_content_deletes( class TestInsertAfter (line 159) | class TestInsertAfter: method test_insert_after_basic (line 162) | def test_insert_after_basic(self, hashline_edit_fn, mock_workspace, mo... method test_insert_after_multiline (line 173) | def test_insert_after_multiline( method test_multiple_insert_after_same_anchor_preserves_order (line 188) | def test_multiple_insert_after_same_anchor_preserves_order( method test_insert_after_newline_only_inserts_blank_line (line 206) | def test_insert_after_newline_only_inserts_blank_line( class TestReplace (line 221) | class TestReplace: method test_replace_basic (line 224) | def test_replace_basic(self, hashline_edit_fn, mock_workspace, mock_se... class TestBatchOps (line 238) | class TestBatchOps: method test_batch_multiple_set_lines (line 241) | def test_batch_multiple_set_lines( class TestErrors (line 261) | class TestErrors: method test_invalid_json (line 264) | def test_invalid_json(self, hashline_edit_fn, mock_workspace, mock_sec... method test_hash_mismatch (line 273) | def test_hash_mismatch(self, hashline_edit_fn, mock_workspace, mock_se... method test_line_out_of_range (line 284) | def test_line_out_of_range(self, hashline_edit_fn, mock_workspace, moc... method test_overlapping_ranges (line 295) | def test_overlapping_ranges(self, hashline_edit_fn, mock_workspace, mo... method test_replace_zero_matches (line 321) | def test_replace_zero_matches( method test_replace_multiple_matches (line 334) | def test_replace_multiple_matches( method test_unknown_op (line 348) | def test_unknown_op(self, hashline_edit_fn, mock_workspace, mock_secur... method test_empty_edits_array (line 359) | def test_empty_edits_array(self, hashline_edit_fn, mock_workspace, moc... method test_insert_before_line1_overlaps_replace_at_line1 (line 368) | def test_insert_before_line1_overlaps_replace_at_line1( method test_insert_inside_replace_range (line 392) | def test_insert_inside_replace_range( method test_set_line_missing_content (line 417) | def test_set_line_missing_content( method test_replace_lines_missing_content (line 433) | def test_replace_lines_missing_content( method test_set_line_empty_content_deletes (line 457) | def test_set_line_empty_content_deletes( method test_file_not_found (line 470) | def test_file_not_found(self, hashline_edit_fn, mock_workspace, mock_s... method test_replace_empty_old_content_returns_error (line 478) | def test_replace_empty_old_content_returns_error( class TestAtomicity (line 493) | class TestAtomicity: method test_no_partial_apply_on_hash_mismatch (line 496) | def test_no_partial_apply_on_hash_mismatch( method test_no_partial_apply_on_overlap (line 515) | def test_no_partial_apply_on_overlap( class TestReturnFormat (line 545) | class TestReturnFormat: method test_hashline_content_returned (line 548) | def test_hashline_content_returned( method test_trailing_newline_handling (line 568) | def test_trailing_newline_handling( method test_edits_applied_count (line 580) | def test_edits_applied_count( class TestFix11HashlinePrefixStripping (line 598) | class TestFix11HashlinePrefixStripping: method test_hashline_prefix_stripped_from_replace_lines (line 601) | def test_hashline_prefix_stripped_from_replace_lines( method test_hashline_prefix_not_stripped_when_not_all_match (line 624) | def test_hashline_prefix_not_stripped_when_not_all_match( class TestFix12EchoStripping (line 648) | class TestFix12EchoStripping: method test_insert_after_strips_echoed_anchor_line (line 651) | def test_insert_after_strips_echoed_anchor_line( method test_boundary_echo_not_stripped_when_only_one_side_matches (line 672) | def test_boundary_echo_not_stripped_when_only_one_side_matches( method test_boundary_echo_not_stripped_when_no_content_between (line 696) | def test_boundary_echo_not_stripped_when_no_content_between( method test_insert_before_strips_echoed_trailing_anchor (line 720) | def test_insert_before_strips_echoed_trailing_anchor( method test_boundary_echo_stripped_when_content_equals_range_plus_two (line 742) | def test_boundary_echo_stripped_when_content_equals_range_plus_two( method test_replace_lines_strips_boundary_echo (line 766) | def test_replace_lines_strips_boundary_echo( class TestFix13NoopDetection (line 790) | class TestFix13NoopDetection: method test_unchanged_edit_reports_zero_applied (line 793) | def test_unchanged_edit_reports_zero_applied( function _resolve_anchor_placeholders (line 811) | def _resolve_anchor_placeholders(op, file_content): class TestFix14ContentTypeValidation (line 825) | class TestFix14ContentTypeValidation: method test_non_string_content_returns_error (line 848) | def test_non_string_content_returns_error( class TestFix16AutoCleanup (line 870) | class TestFix16AutoCleanup: method test_auto_cleanup_true_strips_prefix (line 873) | def test_auto_cleanup_true_strips_prefix( method test_set_line_prefix_not_stripped_single_line (line 897) | def test_set_line_prefix_not_stripped_single_line( method test_auto_cleanup_false_preserves_prefix (line 914) | def test_auto_cleanup_false_preserves_prefix( class TestAtomicityWithReplace (line 940) | class TestAtomicityWithReplace: method test_replace_sees_post_splice_content (line 943) | def test_replace_sees_post_splice_content( class TestAtomicWrite (line 963) | class TestAtomicWrite: method test_atomic_write_preserves_original_on_write_failure (line 969) | def test_atomic_write_preserves_original_on_write_failure( class TestGuardRails (line 991) | class TestGuardRails: method test_edit_count_limit (line 995) | def test_edit_count_limit( method test_file_size_limit (line 1014) | def test_file_size_limit( class TestInsertBefore (line 1032) | class TestInsertBefore: method test_insert_before_basic (line 1035) | def test_insert_before_basic( method test_insert_before_first_line (line 1048) | def test_insert_before_first_line( method test_insert_before_multiline (line 1063) | def test_insert_before_multiline( method test_two_insert_before_same_anchor (line 1078) | def test_two_insert_before_same_anchor( class TestAppend (line 1097) | class TestAppend: method test_append_to_empty_file (line 1100) | def test_append_to_empty_file( method test_append_to_nonempty_file (line 1113) | def test_append_to_nonempty_file( method test_append_strips_hashline_prefixes (line 1126) | def test_append_strips_hashline_prefixes( method test_append_empty_content_rejected (line 1141) | def test_append_empty_content_rejected( method test_append_missing_content_rejected (line 1155) | def test_append_missing_content_rejected( class TestEncodingParam (line 1170) | class TestEncodingParam: method test_encoding_latin1 (line 1173) | def test_encoding_latin1(self, hashline_edit_fn, mock_workspace, mock_... method test_encoding_default_utf8 (line 1186) | def test_encoding_default_utf8( method test_preserves_crlf_newlines (line 1199) | def test_preserves_crlf_newlines( method test_crlf_replace_op_no_double_conversion (line 1212) | def test_crlf_replace_op_no_double_conversion( class TestAllowMultiple (line 1229) | class TestAllowMultiple: method test_allow_multiple_replaces_all (line 1232) | def test_allow_multiple_replaces_all( method test_allow_multiple_false_rejects_duplicates (line 1249) | def test_allow_multiple_false_rejects_duplicates( method test_allow_multiple_string_false_rejected (line 1263) | def test_allow_multiple_string_false_rejected( class TestPermissionsPreservation (line 1287) | class TestPermissionsPreservation: method test_permissions_preserved_after_edit (line 1294) | def test_permissions_preserved_after_edit( method test_acl_preserved_after_edit_windows (line 1309) | def test_acl_preserved_after_edit_windows( method test_edit_succeeds_when_dacl_unavailable_windows (line 1385) | def test_edit_succeeds_when_dacl_unavailable_windows( FILE: tools/tests/tools/test_http_headers_scanner.py function headers_tools (line 15) | def headers_tools(mcp: FastMCP): function scan_fn (line 23) | def scan_fn(headers_tools): function _mock_response (line 27) | def _mock_response( class TestInputValidation (line 45) | class TestInputValidation: method test_auto_prefix_https (line 49) | async def test_auto_prefix_https(self, scan_fn): class TestConnectionErrors (line 71) | class TestConnectionErrors: method test_connection_error (line 75) | async def test_connection_error(self, scan_fn): method test_timeout_error (line 88) | async def test_timeout_error(self, scan_fn): class TestSecurityHeaders (line 106) | class TestSecurityHeaders: method test_all_headers_present (line 110) | async def test_all_headers_present(self, scan_fn): method test_missing_hsts (line 134) | async def test_missing_hsts(self, scan_fn): method test_missing_csp (line 153) | async def test_missing_csp(self, scan_fn): class TestLeakyHeaders (line 176) | class TestLeakyHeaders: method test_server_header_leaked (line 180) | async def test_server_header_leaked(self, scan_fn): method test_x_powered_by_leaked (line 197) | async def test_x_powered_by_leaked(self, scan_fn): method test_no_leaky_headers (line 212) | async def test_no_leaky_headers(self, scan_fn): class TestDeprecatedHeaders (line 235) | class TestDeprecatedHeaders: method test_xss_protection_deprecated (line 239) | async def test_xss_protection_deprecated(self, scan_fn): class TestGradeInput (line 258) | class TestGradeInput: method test_grade_input_keys_present (line 262) | async def test_grade_input_keys_present(self, scan_fn): class TestResponseMetadata (line 288) | class TestResponseMetadata: method test_status_code_captured (line 292) | async def test_status_code_captured(self, scan_fn): method test_final_url_captured (line 305) | async def test_final_url_captured(self, scan_fn): FILE: tools/tests/tools/test_hubspot_tool.py function mcp (line 31) | def mcp(): function client (line 37) | def client(): function _register (line 42) | def _register(mcp, credentials=None): function _tool_fn (line 48) | def _tool_fn(mcp, name, credentials=None): function _mock_response (line 54) | def _mock_response(status_code=200, json_data=None, text=""): class TestHubSpotClientHeaders (line 71) | class TestHubSpotClientHeaders: method test_headers_contain_bearer_token (line 74) | def test_headers_contain_bearer_token(self, client): class TestHubSpotClientHandleResponse (line 81) | class TestHubSpotClientHandleResponse: method test_known_error_codes (line 93) | def test_known_error_codes(self, client, status_code, expected_substr): method test_generic_4xx_with_json_message (line 99) | def test_generic_4xx_with_json_message(self, client): method test_generic_5xx_fallback_to_text (line 109) | def test_generic_5xx_fallback_to_text(self, client): method test_success_returns_json (line 116) | def test_success_returns_json(self, client): class TestHubSpotClientSearchObjects (line 122) | class TestHubSpotClientSearchObjects: method test_search_posts_correct_url (line 125) | def test_search_posts_correct_url(self, client): method test_search_sends_query_and_properties (line 133) | def test_search_sends_query_and_properties(self, client): method test_search_clamps_limit_to_100 (line 147) | def test_search_clamps_limit_to_100(self, client): class TestHubSpotClientGetObject (line 155) | class TestHubSpotClientGetObject: method test_get_object_url (line 158) | def test_get_object_url(self, client): method test_get_object_passes_properties (line 165) | def test_get_object_passes_properties(self, client): class TestHubSpotClientCreateObject (line 173) | class TestHubSpotClientCreateObject: method test_create_object_posts_properties (line 176) | def test_create_object_posts_properties(self, client): class TestHubSpotClientUpdateObject (line 187) | class TestHubSpotClientUpdateObject: method test_update_object_uses_patch (line 190) | def test_update_object_uses_patch(self, client): class TestHubSpotClientDeleteObject (line 200) | class TestHubSpotClientDeleteObject: method test_delete_returns_status_on_204 (line 203) | def test_delete_returns_status_on_204(self, client): method test_delete_non_204_delegates_to_handle_response (line 210) | def test_delete_non_204_delegates_to_handle_response(self, client): class TestHubSpotClientAssociations (line 219) | class TestHubSpotClientAssociations: method test_list_associations_url (line 222) | def test_list_associations_url(self, client): method test_list_associations_clamps_limit (line 229) | def test_list_associations_clamps_limit(self, client): method test_create_association_uses_put (line 236) | def test_create_association_uses_put(self, client): class TestHubSpotCredentials (line 250) | class TestHubSpotCredentials: method test_no_credentials_returns_error (line 253) | def test_no_credentials_returns_error(self, mcp, monkeypatch): method test_env_var_credential (line 261) | def test_env_var_credential(self, mcp, monkeypatch): method test_credential_store_used_when_provided (line 270) | def test_credential_store_used_when_provided(self, mcp): method test_credential_store_non_string_raises (line 281) | def test_credential_store_non_string_raises(self, mcp): method test_credential_store_account_alias (line 288) | def test_credential_store_account_alias(self, mcp): class TestHubSpotSearchContacts (line 303) | class TestHubSpotSearchContacts: method test_success (line 306) | def test_success(self, mcp, monkeypatch): method test_timeout (line 314) | def test_timeout(self, mcp, monkeypatch): method test_network_error (line 321) | def test_network_error(self, mcp, monkeypatch): class TestHubSpotGetContact (line 329) | class TestHubSpotGetContact: method test_success (line 332) | def test_success(self, mcp, monkeypatch): method test_404 (line 342) | def test_404(self, mcp, monkeypatch): class TestHubSpotCreateContact (line 352) | class TestHubSpotCreateContact: method test_success (line 355) | def test_success(self, mcp, monkeypatch): class TestHubSpotUpdateContact (line 366) | class TestHubSpotUpdateContact: method test_success (line 369) | def test_success(self, mcp, monkeypatch): class TestHubSpotSearchCompanies (line 383) | class TestHubSpotSearchCompanies: method test_success (line 384) | def test_success(self, mcp, monkeypatch): class TestHubSpotGetCompany (line 393) | class TestHubSpotGetCompany: method test_success (line 394) | def test_success(self, mcp, monkeypatch): class TestHubSpotCreateCompany (line 405) | class TestHubSpotCreateCompany: method test_success (line 406) | def test_success(self, mcp, monkeypatch): class TestHubSpotUpdateCompany (line 417) | class TestHubSpotUpdateCompany: method test_success (line 418) | def test_success(self, mcp, monkeypatch): class TestHubSpotSearchDeals (line 432) | class TestHubSpotSearchDeals: method test_success (line 433) | def test_success(self, mcp, monkeypatch): class TestHubSpotGetDeal (line 442) | class TestHubSpotGetDeal: method test_success (line 443) | def test_success(self, mcp, monkeypatch): class TestHubSpotCreateDeal (line 454) | class TestHubSpotCreateDeal: method test_success (line 455) | def test_success(self, mcp, monkeypatch): class TestHubSpotUpdateDeal (line 466) | class TestHubSpotUpdateDeal: method test_success (line 467) | def test_success(self, mcp, monkeypatch): class TestHubSpotDeleteObject (line 481) | class TestHubSpotDeleteObject: method test_success (line 484) | def test_success(self, mcp, monkeypatch): method test_invalid_object_type (line 492) | def test_invalid_object_type(self, mcp, monkeypatch): method test_all_valid_object_types (line 500) | def test_all_valid_object_types(self, mcp, monkeypatch, valid_type): method test_timeout (line 508) | def test_timeout(self, mcp, monkeypatch): class TestHubSpotListAssociations (line 521) | class TestHubSpotListAssociations: method test_success (line 522) | def test_success(self, mcp, monkeypatch): method test_timeout (line 534) | def test_timeout(self, mcp, monkeypatch): class TestHubSpotCreateAssociation (line 546) | class TestHubSpotCreateAssociation: method test_success (line 547) | def test_success(self, mcp, monkeypatch): class TestToolRegistration (line 566) | class TestToolRegistration: method test_all_tools_registered (line 587) | def test_all_tools_registered(self, mcp): method test_tool_count (line 592) | def test_tool_count(self, mcp): FILE: tools/tests/tools/test_huggingface_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestHuggingFaceSearchModels (line 20) | class TestHuggingFaceSearchModels: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_successful_search (line 26) | def test_successful_search(self, tool_fns): class TestHuggingFaceGetModel (line 53) | class TestHuggingFaceGetModel: method test_missing_id (line 54) | def test_missing_id(self, tool_fns): method test_successful_get (line 59) | def test_successful_get(self, tool_fns): class TestHuggingFaceSearchDatasets (line 87) | class TestHuggingFaceSearchDatasets: method test_successful_search (line 88) | def test_successful_search(self, tool_fns): class TestHuggingFaceGetDataset (line 114) | class TestHuggingFaceGetDataset: method test_missing_id (line 115) | def test_missing_id(self, tool_fns): method test_successful_get (line 120) | def test_successful_get(self, tool_fns): class TestHuggingFaceSearchSpaces (line 145) | class TestHuggingFaceSearchSpaces: method test_successful_search (line 146) | def test_successful_search(self, tool_fns): class TestHuggingFaceWhoami (line 172) | class TestHuggingFaceWhoami: method test_missing_token (line 173) | def test_missing_token(self, tool_fns): method test_successful_whoami (line 178) | def test_successful_whoami(self, tool_fns): class TestHuggingFaceRunInference (line 202) | class TestHuggingFaceRunInference: method test_missing_token (line 203) | def test_missing_token(self, tool_fns): method test_missing_model_id (line 210) | def test_missing_model_id(self, tool_fns): method test_missing_inputs (line 216) | def test_missing_inputs(self, tool_fns): method test_invalid_parameters_json (line 224) | def test_invalid_parameters_json(self, tool_fns): method test_successful_inference (line 234) | def test_successful_inference(self, tool_fns): method test_inference_with_parameters (line 255) | def test_inference_with_parameters(self, tool_fns): method test_model_loading_503 (line 276) | def test_model_loading_503(self, tool_fns): class TestHuggingFaceRunEmbedding (line 296) | class TestHuggingFaceRunEmbedding: method test_missing_token (line 297) | def test_missing_token(self, tool_fns): method test_missing_model_id (line 304) | def test_missing_model_id(self, tool_fns): method test_missing_inputs (line 309) | def test_missing_inputs(self, tool_fns): method test_successful_embedding (line 316) | def test_successful_embedding(self, tool_fns): class TestHuggingFaceListInferenceEndpoints (line 338) | class TestHuggingFaceListInferenceEndpoints: method test_missing_token (line 339) | def test_missing_token(self, tool_fns): method test_successful_list (line 344) | def test_successful_list(self, tool_fns): method test_empty_endpoints (line 370) | def test_empty_endpoints(self, tool_fns): FILE: tools/tests/tools/test_intercom_tool.py function mcp (line 32) | def mcp(): function client (line 38) | def client(): function _register (line 43) | def _register(mcp, credentials=None): function _tool_fn (line 49) | def _tool_fn(mcp, name, credentials=None): function _mock_response (line 55) | def _mock_response(status_code=200, json_data=None, text=""): class TestIntercomClientHeaders (line 72) | class TestIntercomClientHeaders: method test_headers_contain_bearer_token (line 75) | def test_headers_contain_bearer_token(self, client): class TestIntercomClientHandleResponse (line 82) | class TestIntercomClientHandleResponse: method test_known_error_codes (line 94) | def test_known_error_codes(self, client, status_code, expected_substr): method test_intercom_error_list_format (line 100) | def test_intercom_error_list_format(self, client): method test_generic_error_fallback_to_text (line 111) | def test_generic_error_fallback_to_text(self, client): method test_success_returns_json (line 117) | def test_success_returns_json(self, client): class TestIntercomClientAdminId (line 122) | class TestIntercomClientAdminId: method test_fetches_admin_id_on_first_call (line 125) | def test_fetches_admin_id_on_first_call(self, client): method test_caches_admin_id (line 133) | def test_caches_admin_id(self, client): method test_returns_error_on_failure (line 141) | def test_returns_error_on_failure(self, client): class TestIntercomClientSearchConversations (line 149) | class TestIntercomClientSearchConversations: method test_posts_to_correct_url (line 150) | def test_posts_to_correct_url(self, client): method test_clamps_limit (line 157) | def test_clamps_limit(self, client): class TestIntercomClientGetConversation (line 165) | class TestIntercomClientGetConversation: method test_url_and_plaintext_param (line 166) | def test_url_and_plaintext_param(self, client): class TestIntercomClientReplyToConversation (line 175) | class TestIntercomClientReplyToConversation: method test_reply_sends_admin_id (line 176) | def test_reply_sends_admin_id(self, client): class TestIntercomClientCreateContact (line 187) | class TestIntercomClientCreateContact: method test_creates_with_role_and_email (line 188) | def test_creates_with_role_and_email(self, client): method test_omits_none_fields (line 196) | def test_omits_none_fields(self, client): class TestIntercomClientListConversations (line 205) | class TestIntercomClientListConversations: method test_passes_pagination_params (line 206) | def test_passes_pagination_params(self, client): class TestIntercomCredentials (line 220) | class TestIntercomCredentials: method test_no_credentials_returns_error (line 223) | def test_no_credentials_returns_error(self, mcp, monkeypatch): method test_env_var_credential (line 230) | def test_env_var_credential(self, mcp, monkeypatch): method test_credential_store_used (line 239) | def test_credential_store_used(self, mcp): method test_credential_store_non_string_raises (line 248) | def test_credential_store_non_string_raises(self, mcp): class TestIntercomSearchConversations (line 261) | class TestIntercomSearchConversations: method test_no_filters_returns_recent (line 262) | def test_no_filters_returns_recent(self, mcp, monkeypatch): method test_invalid_status (line 270) | def test_invalid_status(self, mcp, monkeypatch): method test_invalid_limit_too_high (line 277) | def test_invalid_limit_too_high(self, mcp, monkeypatch): method test_invalid_limit_too_low (line 284) | def test_invalid_limit_too_low(self, mcp, monkeypatch): method test_status_filter_applied (line 290) | def test_status_filter_applied(self, mcp, monkeypatch): method test_invalid_created_after (line 301) | def test_invalid_created_after(self, mcp, monkeypatch): method test_timeout (line 308) | def test_timeout(self, mcp, monkeypatch): class TestIntercomGetConversation (line 316) | class TestIntercomGetConversation: method test_success (line 317) | def test_success(self, mcp, monkeypatch): class TestIntercomGetContact (line 331) | class TestIntercomGetContact: method test_by_id (line 332) | def test_by_id(self, mcp, monkeypatch): method test_by_email_fallback (line 340) | def test_by_email_fallback(self, mcp, monkeypatch): method test_no_id_or_email (line 350) | def test_no_id_or_email(self, mcp, monkeypatch): method test_email_not_found (line 357) | def test_email_not_found(self, mcp, monkeypatch): class TestIntercomSearchContacts (line 367) | class TestIntercomSearchContacts: method test_success (line 368) | def test_success(self, mcp, monkeypatch): method test_invalid_limit (line 376) | def test_invalid_limit(self, mcp, monkeypatch): class TestIntercomCreateContact (line 384) | class TestIntercomCreateContact: method test_success (line 385) | def test_success(self, mcp, monkeypatch): method test_invalid_role (line 393) | def test_invalid_role(self, mcp, monkeypatch): class TestIntercomAddNote (line 406) | class TestIntercomAddNote: method test_success (line 407) | def test_success(self, mcp, monkeypatch): class TestIntercomAddTag (line 417) | class TestIntercomAddTag: method test_must_provide_target (line 418) | def test_must_provide_target(self, mcp, monkeypatch): method test_cannot_provide_both_targets (line 425) | def test_cannot_provide_both_targets(self, mcp, monkeypatch): method test_tag_conversation_success (line 432) | def test_tag_conversation_success(self, mcp, monkeypatch): class TestIntercomAssignConversation (line 446) | class TestIntercomAssignConversation: method test_success (line 447) | def test_success(self, mcp, monkeypatch): method test_invalid_assignee_type (line 461) | def test_invalid_assignee_type(self, mcp, monkeypatch): class TestIntercomCloseConversation (line 473) | class TestIntercomCloseConversation: method test_success (line 474) | def test_success(self, mcp, monkeypatch): method test_empty_conversation_id (line 483) | def test_empty_conversation_id(self, mcp, monkeypatch): class TestIntercomListTeams (line 491) | class TestIntercomListTeams: method test_success (line 492) | def test_success(self, mcp, monkeypatch): class TestIntercomListConversations (line 503) | class TestIntercomListConversations: method test_success (line 504) | def test_success(self, mcp, monkeypatch): class TestToolRegistration (line 518) | class TestToolRegistration: method test_all_tools_registered (line 535) | def test_all_tools_registered(self, mcp): method test_tool_count (line 540) | def test_tool_count(self, mcp): FILE: tools/tests/tools/test_jira_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestJiraSearchIssues (line 32) | class TestJiraSearchIssues: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_missing_jql (line 38) | def test_missing_jql(self, tool_fns): method test_successful_search (line 43) | def test_successful_search(self, tool_fns): class TestJiraGetIssue (line 69) | class TestJiraGetIssue: method test_missing_issue_key (line 70) | def test_missing_issue_key(self, tool_fns): method test_successful_get (line 75) | def test_successful_get(self, tool_fns): class TestJiraCreateIssue (line 108) | class TestJiraCreateIssue: method test_missing_params (line 109) | def test_missing_params(self, tool_fns): method test_successful_create (line 114) | def test_successful_create(self, tool_fns): class TestJiraListProjects (line 133) | class TestJiraListProjects: method test_missing_credentials (line 134) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 139) | def test_successful_list(self, tool_fns): class TestJiraGetProject (line 155) | class TestJiraGetProject: method test_missing_key (line 156) | def test_missing_key(self, tool_fns): method test_successful_get (line 161) | def test_successful_get(self, tool_fns): class TestJiraAddComment (line 184) | class TestJiraAddComment: method test_missing_params (line 185) | def test_missing_params(self, tool_fns): method test_successful_add (line 190) | def test_successful_add(self, tool_fns): FILE: tools/tests/tools/test_kafka_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestKafkaListTopics (line 31) | class TestKafkaListTopics: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 37) | def test_successful_list(self, tool_fns): class TestKafkaGetTopic (line 67) | class TestKafkaGetTopic: method test_missing_name (line 68) | def test_missing_name(self, tool_fns): method test_successful_get (line 73) | def test_successful_get(self, tool_fns): class TestKafkaCreateTopic (line 93) | class TestKafkaCreateTopic: method test_missing_name (line 94) | def test_missing_name(self, tool_fns): method test_successful_create (line 99) | def test_successful_create(self, tool_fns): class TestKafkaProduceMessage (line 117) | class TestKafkaProduceMessage: method test_missing_params (line 118) | def test_missing_params(self, tool_fns): method test_successful_produce (line 123) | def test_successful_produce(self, tool_fns): class TestKafkaListConsumerGroups (line 144) | class TestKafkaListConsumerGroups: method test_successful_list (line 145) | def test_successful_list(self, tool_fns): class TestKafkaGetConsumerGroupLag (line 169) | class TestKafkaGetConsumerGroupLag: method test_missing_id (line 170) | def test_missing_id(self, tool_fns): method test_successful_get (line 175) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_langfuse_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestLangfuseListTraces (line 32) | class TestLangfuseListTraces: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 38) | def test_successful_list(self, tool_fns): class TestLangfuseGetTrace (line 70) | class TestLangfuseGetTrace: method test_missing_id (line 71) | def test_missing_id(self, tool_fns): method test_successful_get (line 76) | def test_successful_get(self, tool_fns): class TestLangfuseListScores (line 125) | class TestLangfuseListScores: method test_successful_list (line 126) | def test_successful_list(self, tool_fns): class TestLangfuseCreateScore (line 157) | class TestLangfuseCreateScore: method test_missing_params (line 158) | def test_missing_params(self, tool_fns): method test_successful_create (line 163) | def test_successful_create(self, tool_fns): class TestLangfuseListPrompts (line 183) | class TestLangfuseListPrompts: method test_successful_list (line 184) | def test_successful_list(self, tool_fns): class TestLangfuseGetPrompt (line 211) | class TestLangfuseGetPrompt: method test_missing_name (line 212) | def test_missing_name(self, tool_fns): method test_successful_get (line 217) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_linear_tool.py class TestLinearClient (line 28) | class TestLinearClient: method setup_method (line 29) | def setup_method(self): method test_headers (line 32) | def test_headers(self): method test_handle_response_success (line 37) | def test_handle_response_success(self): method test_handle_response_errors (line 52) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_graphql_error (line 59) | def test_handle_response_graphql_error(self): method test_handle_response_generic_error (line 69) | def test_handle_response_generic_error(self): method test_execute_query (line 78) | def test_execute_query(self, mock_post): method test_execute_query_with_variables (line 97) | def test_execute_query_with_variables(self, mock_post): method test_create_issue (line 117) | def test_create_issue(self, mock_post): method test_get_issue (line 146) | def test_get_issue(self, mock_post): method test_update_issue (line 167) | def test_update_issue(self, mock_post): method test_delete_issue (line 189) | def test_delete_issue(self, mock_post): method test_search_issues (line 200) | def test_search_issues(self, mock_post): method test_add_comment (line 222) | def test_add_comment(self, mock_post): method test_create_project (line 242) | def test_create_project(self, mock_post): method test_get_project (line 270) | def test_get_project(self, mock_post): method test_list_projects (line 290) | def test_list_projects(self, mock_post): method test_list_teams (line 313) | def test_list_teams(self, mock_post): method test_get_workflow_states (line 334) | def test_get_workflow_states(self, mock_post): method test_list_users (line 357) | def test_list_users(self, mock_post): method test_get_viewer (line 377) | def test_get_viewer(self, mock_post): method test_create_label (line 398) | def test_create_label(self, mock_post): method test_list_labels (line 416) | def test_list_labels(self, mock_post): class TestToolRegistration (line 439) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 440) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 447) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 461) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_var (line 484) | def test_credentials_from_env_var(self): class TestIssueTools (line 513) | class TestIssueTools: method setup_method (line 514) | def setup_method(self): method _fn (line 522) | def _fn(self, name): method test_linear_issue_create (line 526) | def test_linear_issue_create(self, mock_post): method test_linear_issue_get (line 544) | def test_linear_issue_get(self, mock_post): method test_linear_issue_update (line 553) | def test_linear_issue_update(self, mock_post): method test_linear_issue_delete (line 564) | def test_linear_issue_delete(self, mock_post): method test_linear_issue_search (line 573) | def test_linear_issue_search(self, mock_post): method test_linear_issue_add_comment (line 591) | def test_linear_issue_add_comment(self, mock_post): method test_linear_issue_create_timeout (line 602) | def test_linear_issue_create_timeout(self, mock_post): method test_linear_issue_get_network_error (line 609) | def test_linear_issue_get_network_error(self, mock_post): class TestProjectTools (line 616) | class TestProjectTools: method setup_method (line 617) | def setup_method(self): method _fn (line 625) | def _fn(self, name): method test_linear_project_create (line 629) | def test_linear_project_create(self, mock_post): method test_linear_project_get (line 647) | def test_linear_project_get(self, mock_post): method test_linear_project_update (line 656) | def test_linear_project_update(self, mock_post): method test_linear_project_list (line 667) | def test_linear_project_list(self, mock_post): class TestTeamTools (line 685) | class TestTeamTools: method setup_method (line 686) | def setup_method(self): method _fn (line 694) | def _fn(self, name): method test_linear_teams_list (line 698) | def test_linear_teams_list(self, mock_post): method test_linear_team_get (line 709) | def test_linear_team_get(self, mock_post): method test_linear_workflow_states_get (line 720) | def test_linear_workflow_states_get(self, mock_post): class TestUserTools (line 731) | class TestUserTools: method setup_method (line 732) | def setup_method(self): method _fn (line 740) | def _fn(self, name): method test_linear_users_list (line 744) | def test_linear_users_list(self, mock_post): method test_linear_user_get (line 755) | def test_linear_user_get(self, mock_post): method test_linear_viewer (line 764) | def test_linear_viewer(self, mock_post): class TestLabelTools (line 773) | class TestLabelTools: method setup_method (line 774) | def setup_method(self): method _fn (line 782) | def _fn(self, name): method test_linear_label_create (line 786) | def test_linear_label_create(self, mock_post): method test_linear_labels_list (line 804) | def test_linear_labels_list(self, mock_post): FILE: tools/tests/tools/test_lusha_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestLushaEnrichPerson (line 28) | class TestLushaEnrichPerson: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_missing_params (line 34) | def test_missing_params(self, tool_fns): method test_successful_enrich_by_name (line 39) | def test_successful_enrich_by_name(self, tool_fns): method test_successful_enrich_by_email (line 65) | def test_successful_enrich_by_email(self, tool_fns): class TestLushaEnrichCompany (line 86) | class TestLushaEnrichCompany: method test_missing_params (line 87) | def test_missing_params(self, tool_fns): method test_successful_enrich (line 92) | def test_successful_enrich(self, tool_fns): class TestLushaSearchContacts (line 117) | class TestLushaSearchContacts: method test_missing_filters (line 118) | def test_missing_filters(self, tool_fns): method test_successful_search (line 123) | def test_successful_search(self, tool_fns): class TestLushaSearchCompanies (line 155) | class TestLushaSearchCompanies: method test_missing_filters (line 156) | def test_missing_filters(self, tool_fns): method test_successful_search (line 161) | def test_successful_search(self, tool_fns): class TestLushaGetUsage (line 187) | class TestLushaGetUsage: method test_missing_credentials (line 188) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 193) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_microsoft_graph_tool.py function tool_fns (line 12) | def tool_fns(mcp: FastMCP): class TestOutlookListMessages (line 19) | class TestOutlookListMessages: method test_missing_token (line 20) | def test_missing_token(self, tool_fns): method test_successful_list (line 26) | def test_successful_list(self, tool_fns): class TestOutlookGetMessage (line 56) | class TestOutlookGetMessage: method test_missing_message_id (line 57) | def test_missing_message_id(self, tool_fns): method test_successful_get (line 62) | def test_successful_get(self, tool_fns): class TestOutlookSendMail (line 90) | class TestOutlookSendMail: method test_missing_fields (line 91) | def test_missing_fields(self, tool_fns): method test_successful_send (line 96) | def test_successful_send(self, tool_fns): class TestTeamsListTeams (line 114) | class TestTeamsListTeams: method test_successful_list (line 115) | def test_successful_list(self, tool_fns): class TestTeamsListChannels (line 133) | class TestTeamsListChannels: method test_missing_team_id (line 134) | def test_missing_team_id(self, tool_fns): method test_successful_list (line 139) | def test_successful_list(self, tool_fns): class TestTeamsSendChannelMessage (line 164) | class TestTeamsSendChannelMessage: method test_missing_fields (line 165) | def test_missing_fields(self, tool_fns): method test_successful_send (line 170) | def test_successful_send(self, tool_fns): class TestOneDriveSearchFiles (line 188) | class TestOneDriveSearchFiles: method test_missing_query (line 189) | def test_missing_query(self, tool_fns): method test_successful_search (line 194) | def test_successful_search(self, tool_fns): class TestOneDriveUploadFile (line 223) | class TestOneDriveUploadFile: method test_missing_fields (line 224) | def test_missing_fields(self, tool_fns): method test_successful_upload (line 229) | def test_successful_upload(self, tool_fns): FILE: tools/tests/tools/test_mongodb_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestMongodbFind (line 32) | class TestMongodbFind: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_missing_params (line 38) | def test_missing_params(self, tool_fns): method test_invalid_filter_json (line 43) | def test_invalid_filter_json(self, tool_fns): method test_successful_find (line 48) | def test_successful_find(self, tool_fns): class TestMongodbFindOne (line 63) | class TestMongodbFindOne: method test_successful_find_one (line 64) | def test_successful_find_one(self, tool_fns): method test_no_match (line 80) | def test_no_match(self, tool_fns): class TestMongodbInsertOne (line 96) | class TestMongodbInsertOne: method test_missing_document (line 97) | def test_missing_document(self, tool_fns): method test_successful_insert (line 102) | def test_successful_insert(self, tool_fns): class TestMongodbUpdateOne (line 119) | class TestMongodbUpdateOne: method test_missing_params (line 120) | def test_missing_params(self, tool_fns): method test_successful_update (line 127) | def test_successful_update(self, tool_fns): class TestMongodbDeleteOne (line 147) | class TestMongodbDeleteOne: method test_missing_filter (line 148) | def test_missing_filter(self, tool_fns): method test_successful_delete (line 153) | def test_successful_delete(self, tool_fns): class TestMongodbAggregate (line 169) | class TestMongodbAggregate: method test_missing_pipeline (line 170) | def test_missing_pipeline(self, tool_fns): method test_invalid_pipeline (line 175) | def test_invalid_pipeline(self, tool_fns): method test_successful_aggregate (line 182) | def test_successful_aggregate(self, tool_fns): FILE: tools/tests/tools/test_n8n_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestN8nListWorkflows (line 31) | class TestN8nListWorkflows: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 37) | def test_successful_list(self, tool_fns): method test_pagination (line 64) | def test_pagination(self, tool_fns): class TestN8nGetWorkflow (line 88) | class TestN8nGetWorkflow: method test_missing_id (line 89) | def test_missing_id(self, tool_fns): method test_successful_get (line 94) | def test_successful_get(self, tool_fns): class TestN8nActivateWorkflow (line 118) | class TestN8nActivateWorkflow: method test_missing_id (line 119) | def test_missing_id(self, tool_fns): method test_successful_activate (line 124) | def test_successful_activate(self, tool_fns): class TestN8nDeactivateWorkflow (line 135) | class TestN8nDeactivateWorkflow: method test_successful_deactivate (line 136) | def test_successful_deactivate(self, tool_fns): class TestN8nListExecutions (line 147) | class TestN8nListExecutions: method test_successful_list (line 148) | def test_successful_list(self, tool_fns): class TestN8nGetExecution (line 174) | class TestN8nGetExecution: method test_missing_id (line 175) | def test_missing_id(self, tool_fns): method test_successful_get (line 180) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_news_tool.py class DummyResponse (line 13) | class DummyResponse: method __init__ (line 16) | def __init__(self, status_code: int, payload: dict): method json (line 20) | def json(self) -> dict: function news_tools (line 25) | def news_tools(mcp: FastMCP): class TestNewsSearch (line 31) | class TestNewsSearch: method test_news_search_newsdata_success (line 34) | def test_news_search_newsdata_success(self, news_tools, monkeypatch): method test_news_search_falls_back_to_finlight (line 68) | def test_news_search_falls_back_to_finlight(self, news_tools, monkeypa... class TestNewsByCompany (line 103) | class TestNewsByCompany: method test_news_by_company_date_filter (line 106) | def test_news_by_company_date_filter(self, news_tools, monkeypatch): class TestRateLimiting (line 134) | class TestRateLimiting: method test_newsdata_retries_on_429_then_succeeds (line 137) | def test_newsdata_retries_on_429_then_succeeds(self, news_tools, monke... method test_newsdata_429_exhausts_retries_then_falls_back (line 159) | def test_newsdata_429_exhausts_retries_then_falls_back(self, news_tool... method test_finlight_retries_on_429_then_succeeds (line 181) | def test_finlight_retries_on_429_then_succeeds(self, news_tools, monke... class TestSentimentNormalization (line 207) | class TestSentimentNormalization: method test_numeric_sentiment_passed_through (line 210) | def test_numeric_sentiment_passed_through(self, news_tools, monkeypatch): method test_categorical_sentiment_normalized (line 232) | def test_categorical_sentiment_normalized(self, news_tools, monkeypatch): method test_out_of_range_sentiment_clamped (line 256) | def test_out_of_range_sentiment_clamped(self, news_tools, monkeypatch): class TestFallbackBehavior (line 273) | class TestFallbackBehavior: method test_finlight_not_called_when_newsdata_succeeds (line 276) | def test_finlight_not_called_when_newsdata_succeeds(self, news_tools, ... method test_fallback_on_newsdata_timeout (line 299) | def test_fallback_on_newsdata_timeout(self, news_tools, monkeypatch): class TestNewsSentiment (line 322) | class TestNewsSentiment: method test_news_sentiment_requires_finlight (line 325) | def test_news_sentiment_requires_finlight(self, news_tools, monkeypatch): FILE: tools/tests/tools/test_notion_tool.py function _mock_resp (line 15) | def _mock_resp(data, status_code=200): function tool_fns (line 24) | def tool_fns(mcp: FastMCP): class TestRequestErrors (line 35) | class TestRequestErrors: method test_http_error_codes (line 48) | def test_http_error_codes(self, tool_fns, status_code, expected_fragme... method test_timeout_exception (line 60) | def test_timeout_exception(self, tool_fns): method test_generic_exception (line 72) | def test_generic_exception(self, tool_fns): class TestCredentialStoreAdapter (line 90) | class TestCredentialStoreAdapter: method test_credential_store_used_when_provided (line 91) | def test_credential_store_used_when_provided(self, mcp: FastMCP): class TestNotionSearch (line 116) | class TestNotionSearch: method test_missing_credentials (line 117) | def test_missing_credentials(self, tool_fns): method test_successful_search (line 122) | def test_successful_search(self, tool_fns): method test_filter_type_page (line 150) | def test_filter_type_page(self, tool_fns): method test_filter_type_database (line 161) | def test_filter_type_database(self, tool_fns): method test_filter_type_invalid_ignored (line 184) | def test_filter_type_invalid_ignored(self, tool_fns): method test_page_size_clamped (line 195) | def test_page_size_clamped(self, tool_fns): class TestNotionGetPage (line 217) | class TestNotionGetPage: method test_missing_page_id (line 218) | def test_missing_page_id(self, tool_fns): method test_successful_get (line 223) | def test_successful_get(self, tool_fns): method test_all_property_types (line 250) | def test_all_property_types(self, tool_fns): class TestNotionCreatePage (line 326) | class TestNotionCreatePage: method test_missing_title (line 327) | def test_missing_title(self, tool_fns): method test_missing_parent (line 333) | def test_missing_parent(self, tool_fns): method test_both_parents (line 339) | def test_both_parents(self, tool_fns): method test_successful_create (line 349) | def test_successful_create(self, tool_fns): method test_missing_title_property_for_database (line 364) | def test_missing_title_property_for_database(self, tool_fns): method test_with_properties_json (line 374) | def test_with_properties_json(self, tool_fns): method test_with_content (line 394) | def test_with_content(self, tool_fns): method test_custom_title_property (line 415) | def test_custom_title_property(self, tool_fns): method test_invalid_properties_json (line 435) | def test_invalid_properties_json(self, tool_fns): method test_create_under_parent_page (line 446) | def test_create_under_parent_page(self, tool_fns): method test_create_under_parent_page_ignores_properties_json (line 468) | def test_create_under_parent_page_ignores_properties_json(self, tool_f... class TestNotionUpdatePage (line 494) | class TestNotionUpdatePage: method test_missing_page_id (line 495) | def test_missing_page_id(self, tool_fns): method test_no_updates_provided (line 500) | def test_no_updates_provided(self, tool_fns): method test_successful_update_properties (line 506) | def test_successful_update_properties(self, tool_fns): method test_archive_page (line 521) | def test_archive_page(self, tool_fns): method test_invalid_properties_json (line 533) | def test_invalid_properties_json(self, tool_fns): method test_missing_credentials (line 542) | def test_missing_credentials(self, tool_fns): class TestNotionQueryDatabase (line 556) | class TestNotionQueryDatabase: method test_missing_database_id (line 557) | def test_missing_database_id(self, tool_fns): method test_successful_query (line 562) | def test_successful_query(self, tool_fns): method test_with_filter_json (line 589) | def test_with_filter_json(self, tool_fns): method test_invalid_filter_json (line 603) | def test_invalid_filter_json(self, tool_fns): method test_page_size_clamped (line 612) | def test_page_size_clamped(self, tool_fns): method test_with_sorts_json (line 621) | def test_with_sorts_json(self, tool_fns): method test_invalid_sorts_json (line 636) | def test_invalid_sorts_json(self, tool_fns): method test_with_start_cursor (line 645) | def test_with_start_cursor(self, tool_fns): method test_next_cursor_returned (line 659) | def test_next_cursor_returned(self, tool_fns): class TestNotionGetDatabase (line 676) | class TestNotionGetDatabase: method test_missing_database_id (line 677) | def test_missing_database_id(self, tool_fns): method test_missing_credentials (line 682) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 687) | def test_successful_get(self, tool_fns): class TestNotionCreateDatabase (line 714) | class TestNotionCreateDatabase: method test_missing_params (line 715) | def test_missing_params(self, tool_fns): method test_missing_credentials (line 720) | def test_missing_credentials(self, tool_fns): method test_successful_create_default_properties (line 725) | def test_successful_create_default_properties(self, tool_fns): method test_with_extra_properties (line 743) | def test_with_extra_properties(self, tool_fns): method test_invalid_properties_json (line 763) | def test_invalid_properties_json(self, tool_fns): class TestNotionUpdateDatabase (line 779) | class TestNotionUpdateDatabase: method test_missing_database_id (line 780) | def test_missing_database_id(self, tool_fns): method test_missing_credentials (line 785) | def test_missing_credentials(self, tool_fns): method test_no_updates_provided (line 790) | def test_no_updates_provided(self, tool_fns): method test_update_title (line 796) | def test_update_title(self, tool_fns): method test_update_properties (line 808) | def test_update_properties(self, tool_fns): method test_archive_database (line 823) | def test_archive_database(self, tool_fns): method test_invalid_properties_json (line 835) | def test_invalid_properties_json(self, tool_fns): class TestNotionGetBlockChildren (line 850) | class TestNotionGetBlockChildren: method test_missing_block_id (line 851) | def test_missing_block_id(self, tool_fns): method test_missing_credentials (line 856) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 861) | def test_successful_get(self, tool_fns): class TestNotionGetBlock (line 907) | class TestNotionGetBlock: method test_missing_block_id (line 908) | def test_missing_block_id(self, tool_fns): method test_missing_credentials (line 913) | def test_missing_credentials(self, tool_fns): method test_successful_get_paragraph (line 918) | def test_successful_get_paragraph(self, tool_fns): method test_block_without_text (line 941) | def test_block_without_text(self, tool_fns): class TestNotionUpdateBlock (line 966) | class TestNotionUpdateBlock: method test_missing_block_id (line 967) | def test_missing_block_id(self, tool_fns): method test_missing_credentials (line 972) | def test_missing_credentials(self, tool_fns): method test_no_updates_provided (line 979) | def test_no_updates_provided(self, tool_fns): method test_content_without_block_type (line 985) | def test_content_without_block_type(self, tool_fns): method test_successful_content_update (line 991) | def test_successful_content_update(self, tool_fns): method test_invalid_block_type (line 1005) | def test_invalid_block_type(self, tool_fns): method test_archive_block (line 1013) | def test_archive_block(self, tool_fns): class TestNotionDeleteBlock (line 1031) | class TestNotionDeleteBlock: method test_missing_block_id (line 1032) | def test_missing_block_id(self, tool_fns): method test_missing_credentials (line 1037) | def test_missing_credentials(self, tool_fns): method test_successful_delete (line 1042) | def test_successful_delete(self, tool_fns): class TestNotionAppendBlocks (line 1059) | class TestNotionAppendBlocks: method test_missing_params (line 1060) | def test_missing_params(self, tool_fns): method test_missing_credentials (line 1065) | def test_missing_credentials(self, tool_fns): method test_successful_append (line 1070) | def test_successful_append(self, tool_fns): method test_blank_lines_stripped (line 1088) | def test_blank_lines_stripped(self, tool_fns): method test_only_blank_lines (line 1103) | def test_only_blank_lines(self, tool_fns): method test_block_type_heading (line 1112) | def test_block_type_heading(self, tool_fns): method test_block_type_to_do (line 1128) | def test_block_type_to_do(self, tool_fns): method test_invalid_block_type (line 1145) | def test_invalid_block_type(self, tool_fns): method test_exceeds_100_block_limit (line 1155) | def test_exceeds_100_block_limit(self, tool_fns): FILE: tools/tests/tools/test_obsidian_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200, content_type="application/json"): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestObsidianReadNote (line 32) | class TestObsidianReadNote: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_missing_path (line 38) | def test_missing_path(self, tool_fns): method test_successful_read (line 43) | def test_successful_read(self, tool_fns): class TestObsidianWriteNote (line 65) | class TestObsidianWriteNote: method test_missing_path (line 66) | def test_missing_path(self, tool_fns): method test_successful_write (line 71) | def test_successful_write(self, tool_fns): class TestObsidianAppendNote (line 88) | class TestObsidianAppendNote: method test_successful_append (line 89) | def test_successful_append(self, tool_fns): class TestObsidianSearch (line 105) | class TestObsidianSearch: method test_missing_query (line 106) | def test_missing_query(self, tool_fns): method test_successful_search (line 111) | def test_successful_search(self, tool_fns): class TestObsidianListFiles (line 142) | class TestObsidianListFiles: method test_successful_list (line 143) | def test_successful_list(self, tool_fns): class TestObsidianGetActive (line 159) | class TestObsidianGetActive: method test_successful_get (line 160) | def test_successful_get(self, tool_fns): method test_no_active_file (line 179) | def test_no_active_file(self, tool_fns): FILE: tools/tests/tools/test_pagerduty_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestPagerdutyListIncidents (line 44) | class TestPagerdutyListIncidents: method test_missing_credentials (line 45) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 50) | def test_successful_list(self, tool_fns): class TestPagerdutyGetIncident (line 66) | class TestPagerdutyGetIncident: method test_missing_id (line 67) | def test_missing_id(self, tool_fns): method test_successful_get (line 72) | def test_successful_get(self, tool_fns): class TestPagerdutyCreateIncident (line 89) | class TestPagerdutyCreateIncident: method test_missing_params (line 90) | def test_missing_params(self, tool_fns): method test_successful_create (line 95) | def test_successful_create(self, tool_fns): class TestPagerdutyUpdateIncident (line 112) | class TestPagerdutyUpdateIncident: method test_missing_status (line 113) | def test_missing_status(self, tool_fns): method test_successful_acknowledge (line 118) | def test_successful_acknowledge(self, tool_fns): class TestPagerdutyListServices (line 136) | class TestPagerdutyListServices: method test_missing_credentials (line 137) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 142) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_pdf_read_tool.py function pdf_read_fn (line 14) | def pdf_read_fn(mcp: FastMCP): class TestPdfReadTool (line 20) | class TestPdfReadTool: method test_read_pdf_file_not_found (line 23) | def test_read_pdf_file_not_found(self, pdf_read_fn, tmp_path: Path): method test_read_pdf_invalid_extension (line 30) | def test_read_pdf_invalid_extension(self, pdf_read_fn, tmp_path: Path): method test_read_pdf_directory (line 40) | def test_read_pdf_directory(self, pdf_read_fn, tmp_path: Path): method test_max_pages_clamped_low (line 47) | def test_max_pages_clamped_low(self, pdf_read_fn, tmp_path: Path): method test_max_pages_clamped_high (line 56) | def test_max_pages_clamped_high(self, pdf_read_fn, tmp_path: Path): method test_pages_parameter_accepted (line 65) | def test_pages_parameter_accepted(self, pdf_read_fn, tmp_path: Path): method test_include_metadata_parameter (line 75) | def test_include_metadata_parameter(self, pdf_read_fn, tmp_path: Path): method test_truncation_flag_for_page_range (line 86) | def test_truncation_flag_for_page_range(self, pdf_read_fn, tmp_path: P... class TestPdfReadUrlSupport (line 118) | class TestPdfReadUrlSupport: method test_url_download_succeeds (line 123) | def test_url_download_succeeds(self, mock_pdf_reader, mock_get, pdf_re... method test_url_non_pdf_content_type (line 148) | def test_url_non_pdf_content_type(self, mock_get, pdf_read_fn): method test_url_http_404_error (line 164) | def test_url_http_404_error(self, mock_get, pdf_read_fn): method test_url_http_500_error (line 176) | def test_url_http_500_error(self, mock_get, pdf_read_fn): method test_url_timeout_error (line 188) | def test_url_timeout_error(self, mock_get, pdf_read_fn): method test_url_network_error (line 198) | def test_url_network_error(self, mock_get, pdf_read_fn): method test_url_with_http_scheme (line 209) | def test_url_with_http_scheme(self, mock_pdf_reader, mock_get, pdf_rea... method test_local_file_path_still_works (line 229) | def test_local_file_path_still_works(self, pdf_read_fn, tmp_path: Path): method test_temporary_file_cleanup (line 245) | def test_temporary_file_cleanup(self, mock_tempfile, mock_pdf_reader, ... method test_url_json_content_type (line 274) | def test_url_json_content_type(self, mock_get, pdf_read_fn): FILE: tools/tests/tools/test_pinecone_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestPineconeListIndexes (line 20) | class TestPineconeListIndexes: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_successful_list (line 26) | def test_successful_list(self, tool_fns): class TestPineconeCreateIndex (line 53) | class TestPineconeCreateIndex: method test_missing_params (line 54) | def test_missing_params(self, tool_fns): method test_successful_create (line 59) | def test_successful_create(self, tool_fns): class TestPineconeDescribeIndex (line 81) | class TestPineconeDescribeIndex: method test_missing_name (line 82) | def test_missing_name(self, tool_fns): method test_successful_describe (line 87) | def test_successful_describe(self, tool_fns): class TestPineconeDeleteIndex (line 111) | class TestPineconeDeleteIndex: method test_missing_name (line 112) | def test_missing_name(self, tool_fns): method test_successful_delete (line 117) | def test_successful_delete(self, tool_fns): class TestPineconeUpsertVectors (line 132) | class TestPineconeUpsertVectors: method test_missing_params (line 133) | def test_missing_params(self, tool_fns): method test_successful_upsert (line 138) | def test_successful_upsert(self, tool_fns): class TestPineconeQueryVectors (line 160) | class TestPineconeQueryVectors: method test_missing_vector_and_id (line 161) | def test_missing_vector_and_id(self, tool_fns): method test_successful_query (line 166) | def test_successful_query(self, tool_fns): class TestPineconeFetchVectors (line 193) | class TestPineconeFetchVectors: method test_missing_ids (line 194) | def test_missing_ids(self, tool_fns): method test_successful_fetch (line 199) | def test_successful_fetch(self, tool_fns): class TestPineconeDeleteVectors (line 221) | class TestPineconeDeleteVectors: method test_missing_criteria (line 222) | def test_missing_criteria(self, tool_fns): method test_successful_delete (line 227) | def test_successful_delete(self, tool_fns): class TestPineconeIndexStats (line 246) | class TestPineconeIndexStats: method test_missing_host (line 247) | def test_missing_host(self, tool_fns): method test_successful_stats (line 252) | def test_successful_stats(self, tool_fns): FILE: tools/tests/tools/test_pipedrive_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestPipedriveListDeals (line 20) | class TestPipedriveListDeals: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_successful_list (line 26) | def test_successful_list(self, tool_fns): class TestPipedriveGetDeal (line 56) | class TestPipedriveGetDeal: method test_missing_id (line 57) | def test_missing_id(self, tool_fns): method test_successful_get (line 62) | def test_successful_get(self, tool_fns): class TestPipedriveCreateDeal (line 92) | class TestPipedriveCreateDeal: method test_missing_title (line 93) | def test_missing_title(self, tool_fns): method test_successful_create (line 98) | def test_successful_create(self, tool_fns): class TestPipedriveListPersons (line 112) | class TestPipedriveListPersons: method test_successful_list (line 113) | def test_successful_list(self, tool_fns): class TestPipedriveSearchPersons (line 140) | class TestPipedriveSearchPersons: method test_empty_query (line 141) | def test_empty_query(self, tool_fns): method test_successful_search (line 146) | def test_successful_search(self, tool_fns): class TestPipedriveListOrganizations (line 175) | class TestPipedriveListOrganizations: method test_successful_list (line 176) | def test_successful_list(self, tool_fns): class TestPipedriveListActivities (line 201) | class TestPipedriveListActivities: method test_successful_list (line 202) | def test_successful_list(self, tool_fns): class TestPipedriveListPipelines (line 233) | class TestPipedriveListPipelines: method test_successful_list (line 234) | def test_successful_list(self, tool_fns): class TestPipedriveListStages (line 259) | class TestPipedriveListStages: method test_successful_list (line 260) | def test_successful_list(self, tool_fns): class TestPipedriveAddNote (line 285) | class TestPipedriveAddNote: method test_missing_content (line 286) | def test_missing_content(self, tool_fns): method test_missing_target (line 291) | def test_missing_target(self, tool_fns): method test_successful_add (line 296) | def test_successful_add(self, tool_fns): FILE: tools/tests/tools/test_plaid_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestPlaidGetAccounts (line 20) | class TestPlaidGetAccounts: method test_missing_credentials (line 21) | def test_missing_credentials(self, tool_fns): method test_missing_access_token (line 26) | def test_missing_access_token(self, tool_fns): method test_successful_get (line 31) | def test_successful_get(self, tool_fns): class TestPlaidGetBalance (line 63) | class TestPlaidGetBalance: method test_missing_token (line 64) | def test_missing_token(self, tool_fns): method test_successful_balance (line 69) | def test_successful_balance(self, tool_fns): class TestPlaidSyncTransactions (line 96) | class TestPlaidSyncTransactions: method test_missing_token (line 97) | def test_missing_token(self, tool_fns): method test_successful_sync (line 102) | def test_successful_sync(self, tool_fns): class TestPlaidGetTransactions (line 135) | class TestPlaidGetTransactions: method test_missing_params (line 136) | def test_missing_params(self, tool_fns): method test_successful_get (line 141) | def test_successful_get(self, tool_fns): class TestPlaidGetInstitution (line 174) | class TestPlaidGetInstitution: method test_missing_id (line 175) | def test_missing_id(self, tool_fns): method test_successful_get (line 180) | def test_successful_get(self, tool_fns): class TestPlaidSearchInstitutions (line 204) | class TestPlaidSearchInstitutions: method test_missing_query (line 205) | def test_missing_query(self, tool_fns): method test_successful_search (line 210) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_port_scanner.py function port_tools (line 15) | def port_tools(mcp: FastMCP): function scan_fn (line 23) | def scan_fn(port_tools): class TestInputValidation (line 32) | class TestInputValidation: method test_strips_https_prefix (line 36) | async def test_strips_https_prefix(self, scan_fn): method test_strips_path (line 47) | async def test_strips_path(self, scan_fn): method test_invalid_port_list (line 58) | async def test_invalid_port_list(self, scan_fn): method test_custom_port_list (line 65) | async def test_custom_port_list(self, scan_fn): method test_timeout_clamped (line 76) | async def test_timeout_clamped(self, scan_fn): class TestDnsResolution (line 94) | class TestDnsResolution: method test_hostname_not_found (line 98) | async def test_hostname_not_found(self, scan_fn): class TestPortScanning (line 110) | class TestPortScanning: method test_open_port_detected (line 114) | async def test_open_port_detected(self, scan_fn): method test_closed_port_detected (line 126) | async def test_closed_port_detected(self, scan_fn): method test_banner_captured (line 138) | async def test_banner_captured(self, scan_fn): class TestRiskyPorts (line 154) | class TestRiskyPorts: method test_database_port_flagged (line 158) | async def test_database_port_flagged(self, scan_fn): method test_admin_port_flagged (line 171) | async def test_admin_port_flagged(self, scan_fn): method test_legacy_port_flagged (line 183) | async def test_legacy_port_flagged(self, scan_fn): class TestGradeInput (line 200) | class TestGradeInput: method test_grade_input_keys_present (line 204) | async def test_grade_input_keys_present(self, scan_fn): method test_only_web_ports_true (line 220) | async def test_only_web_ports_true(self, scan_fn): method test_only_web_ports_false (line 237) | async def test_only_web_ports_false(self, scan_fn): class TestPortLists (line 259) | class TestPortLists: method test_top20_ports (line 263) | async def test_top20_ports(self, scan_fn): method test_top100_ports (line 274) | async def test_top100_ports(self, scan_fn): FILE: tools/tests/tools/test_postgres_tool.py function mcp (line 13) | def mcp(): function _mock_database_url (line 18) | def _mock_database_url(monkeypatch): function _mock_db (line 33) | def _mock_db(monkeypatch): function pg_query_fn (line 75) | def pg_query_fn(mcp: FastMCP, monkeypatch): function pg_list_schemas_fn (line 82) | def pg_list_schemas_fn(mcp: FastMCP, monkeypatch): function pg_list_tables_fn (line 89) | def pg_list_tables_fn(mcp: FastMCP, monkeypatch): function pg_describe_table_fn (line 96) | def pg_describe_table_fn(mcp: FastMCP, monkeypatch): function pg_explain_fn (line 103) | def pg_explain_fn(mcp: FastMCP, monkeypatch): class TestPgQuery (line 114) | class TestPgQuery: method test_simple_select (line 115) | def test_simple_select(self, pg_query_fn): method test_invalid_sql_returns_error (line 123) | def test_invalid_sql_returns_error(self, pg_query_fn, monkeypatch): method test_query_timeout (line 134) | def test_query_timeout(self, pg_query_fn, monkeypatch): class TestPgListSchemas (line 169) | class TestPgListSchemas: method test_list_schemas_success (line 170) | def test_list_schemas_success(self, pg_list_schemas_fn): class TestPgListTables (line 178) | class TestPgListTables: method test_list_tables_all (line 179) | def test_list_tables_all(self, pg_list_tables_fn): method test_list_tables_with_schema (line 184) | def test_list_tables_with_schema(self, pg_list_tables_fn): class TestPgDescribeTable (line 190) | class TestPgDescribeTable: method test_describe_table_success (line 191) | def test_describe_table_success(self, pg_describe_table_fn, monkeypatch): class TestPgExplain (line 239) | class TestPgExplain: method test_explain_success (line 240) | def test_explain_success(self, pg_explain_fn): method test_explain_invalid_sql (line 246) | def test_explain_invalid_sql(self, pg_explain_fn, monkeypatch): FILE: tools/tests/tools/test_powerbi_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200, headers=None): function tool_fns (line 24) | def tool_fns(mcp: FastMCP): class TestPowerBIListWorkspaces (line 30) | class TestPowerBIListWorkspaces: method test_missing_credentials (line 31) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 36) | def test_successful_list(self, tool_fns): class TestPowerBIListDatasets (line 61) | class TestPowerBIListDatasets: method test_missing_workspace (line 62) | def test_missing_workspace(self, tool_fns): method test_successful_list (line 67) | def test_successful_list(self, tool_fns): class TestPowerBIListReports (line 95) | class TestPowerBIListReports: method test_missing_workspace (line 96) | def test_missing_workspace(self, tool_fns): method test_successful_list (line 101) | def test_successful_list(self, tool_fns): class TestPowerBIRefreshDataset (line 128) | class TestPowerBIRefreshDataset: method test_missing_params (line 129) | def test_missing_params(self, tool_fns): method test_successful_refresh (line 134) | def test_successful_refresh(self, tool_fns): class TestPowerBIGetRefreshHistory (line 145) | class TestPowerBIGetRefreshHistory: method test_missing_params (line 146) | def test_missing_params(self, tool_fns): method test_successful_get (line 151) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_pushover_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestPushoverSend (line 20) | class TestPushoverSend: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_missing_fields (line 27) | def test_missing_fields(self, tool_fns): method test_message_too_long (line 32) | def test_message_too_long(self, tool_fns): method test_invalid_priority (line 38) | def test_invalid_priority(self, tool_fns): method test_successful_send (line 43) | def test_successful_send(self, tool_fns): method test_emergency_returns_receipt (line 54) | def test_emergency_returns_receipt(self, tool_fns): method test_api_error (line 68) | def test_api_error(self, tool_fns): class TestPushoverValidateUser (line 84) | class TestPushoverValidateUser: method test_missing_user_key (line 85) | def test_missing_user_key(self, tool_fns): method test_valid_user (line 90) | def test_valid_user(self, tool_fns): class TestPushoverListSounds (line 107) | class TestPushoverListSounds: method test_successful_list (line 108) | def test_successful_list(self, tool_fns): class TestPushoverCheckReceipt (line 122) | class TestPushoverCheckReceipt: method test_missing_receipt (line 123) | def test_missing_receipt(self, tool_fns): method test_successful_check (line 128) | def test_successful_check(self, tool_fns): FILE: tools/tests/tools/test_quickbooks_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestQuickbooksQuery (line 31) | class TestQuickbooksQuery: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_missing_entity (line 37) | def test_missing_entity(self, tool_fns): method test_successful_query (line 42) | def test_successful_query(self, tool_fns): class TestQuickbooksGetEntity (line 65) | class TestQuickbooksGetEntity: method test_missing_params (line 66) | def test_missing_params(self, tool_fns): method test_successful_get (line 71) | def test_successful_get(self, tool_fns): class TestQuickbooksCreateCustomer (line 93) | class TestQuickbooksCreateCustomer: method test_missing_name (line 94) | def test_missing_name(self, tool_fns): method test_successful_create (line 99) | def test_successful_create(self, tool_fns): class TestQuickbooksCreateInvoice (line 122) | class TestQuickbooksCreateInvoice: method test_missing_params (line 123) | def test_missing_params(self, tool_fns): method test_invalid_json (line 128) | def test_invalid_json(self, tool_fns): method test_successful_create (line 133) | def test_successful_create(self, tool_fns): class TestQuickbooksGetCompanyInfo (line 160) | class TestQuickbooksGetCompanyInfo: method test_missing_credentials (line 161) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 166) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_razorpay_tool.py class TestRazorpayClient (line 29) | class TestRazorpayClient: method setup_method (line 30) | def setup_method(self): method test_auth_tuple (line 33) | def test_auth_tuple(self): method test_handle_response_success (line 37) | def test_handle_response_success(self): method test_handle_response_errors (line 53) | def test_handle_response_errors(self, status_code, expected_substring): method test_handle_response_generic_error (line 62) | def test_handle_response_generic_error(self): method test_list_payments (line 71) | def test_list_payments(self, mock_get): method test_list_payments_with_filters (line 120) | def test_list_payments_with_filters(self, mock_get): method test_list_payments_limit_capped (line 137) | def test_list_payments_limit_capped(self, mock_get): method test_get_payment (line 149) | def test_get_payment(self, mock_get): method test_create_payment_link (line 187) | def test_create_payment_link(self, mock_post): method test_create_payment_link_minimal (line 235) | def test_create_payment_link_minimal(self, mock_post): method test_list_invoices (line 260) | def test_list_invoices(self, mock_get): method test_get_invoice (line 294) | def test_get_invoice(self, mock_get): method test_create_refund_full (line 338) | def test_create_refund_full(self, mock_post): method test_create_refund_partial (line 365) | def test_create_refund_partial(self, mock_post): class TestToolRegistration (line 395) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 396) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 402) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 415) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_vars (line 443) | def test_credentials_from_env_vars(self): class TestListPaymentsTool (line 475) | class TestListPaymentsTool: method setup_method (line 476) | def setup_method(self): method teardown_method (line 486) | def teardown_method(self): method _fn (line 489) | def _fn(self, name): method test_list_payments_success (line 493) | def test_list_payments_success(self, mock_get): method test_list_payments_normalizes_count (line 508) | def test_list_payments_normalizes_count(self, mock_get): method test_list_payments_timeout (line 521) | def test_list_payments_timeout(self, mock_get): method test_list_payments_network_error (line 528) | def test_list_payments_network_error(self, mock_get): class TestGetPaymentTool (line 535) | class TestGetPaymentTool: method setup_method (line 536) | def setup_method(self): method teardown_method (line 546) | def teardown_method(self): method _fn (line 549) | def _fn(self, name): method test_get_payment_success (line 553) | def test_get_payment_success(self, mock_get): method test_get_payment_invalid_id (line 569) | def test_get_payment_invalid_id(self): class TestCreatePaymentLinkTool (line 575) | class TestCreatePaymentLinkTool: method setup_method (line 576) | def setup_method(self): method teardown_method (line 586) | def teardown_method(self): method _fn (line 589) | def _fn(self, name): method test_create_payment_link_success (line 593) | def test_create_payment_link_success(self, mock_post): method test_create_payment_link_validation (line 611) | def test_create_payment_link_validation(self): class TestListInvoicesTool (line 634) | class TestListInvoicesTool: method setup_method (line 635) | def setup_method(self): method teardown_method (line 645) | def teardown_method(self): method _fn (line 648) | def _fn(self, name): method test_list_invoices_success (line 652) | def test_list_invoices_success(self, mock_get): method test_list_invoices_with_filter (line 670) | def test_list_invoices_with_filter(self, mock_get): class TestGetInvoiceTool (line 679) | class TestGetInvoiceTool: method setup_method (line 680) | def setup_method(self): method teardown_method (line 690) | def teardown_method(self): method _fn (line 693) | def _fn(self, name): method test_get_invoice_success (line 697) | def test_get_invoice_success(self, mock_get): method test_get_invoice_invalid_id (line 713) | def test_get_invoice_invalid_id(self): class TestCreateRefundTool (line 719) | class TestCreateRefundTool: method setup_method (line 720) | def setup_method(self): method teardown_method (line 730) | def teardown_method(self): method _fn (line 733) | def _fn(self, name): method test_create_refund_success (line 737) | def test_create_refund_success(self, mock_post): method test_create_refund_validation (line 753) | def test_create_refund_validation(self): method test_create_refund_timeout (line 765) | def test_create_refund_timeout(self, mock_post): class TestCredentialSpec (line 775) | class TestCredentialSpec: method test_razorpay_credential_spec_exists (line 776) | def test_razorpay_credential_spec_exists(self): method test_razorpay_spec_env_var (line 781) | def test_razorpay_spec_env_var(self): method test_razorpay_spec_tools (line 787) | def test_razorpay_spec_tools(self): method test_razorpay_spec_health_check (line 803) | def test_razorpay_spec_health_check(self): method test_razorpay_spec_auth_support (line 810) | def test_razorpay_spec_auth_support(self): method test_razorpay_secret_credential_spec_exists (line 818) | def test_razorpay_secret_credential_spec_exists(self): method test_razorpay_credentials_share_group (line 828) | def test_razorpay_credentials_share_group(self): FILE: tools/tests/tools/test_reddit_tool.py function _mock_token_resp (line 16) | def _mock_token_resp(): function _mock_listing (line 24) | def _mock_listing(children): function tool_fns (line 33) | def tool_fns(mcp: FastMCP): class TestRedditSearch (line 39) | class TestRedditSearch: method test_missing_credentials (line 40) | def test_missing_credentials(self, tool_fns): method test_missing_query (line 45) | def test_missing_query(self, tool_fns): method test_successful_search (line 50) | def test_successful_search(self, tool_fns): class TestRedditGetPosts (line 81) | class TestRedditGetPosts: method test_missing_credentials (line 82) | def test_missing_credentials(self, tool_fns): method test_missing_subreddit (line 87) | def test_missing_subreddit(self, tool_fns): method test_successful_get_posts (line 92) | def test_successful_get_posts(self, tool_fns): class TestRedditGetComments (line 123) | class TestRedditGetComments: method test_missing_credentials (line 124) | def test_missing_credentials(self, tool_fns): method test_missing_post_id (line 129) | def test_missing_post_id(self, tool_fns): method test_successful_get_comments (line 134) | def test_successful_get_comments(self, tool_fns): class TestRedditGetUser (line 184) | class TestRedditGetUser: method test_missing_credentials (line 185) | def test_missing_credentials(self, tool_fns): method test_missing_username (line 190) | def test_missing_username(self, tool_fns): method test_successful_get_user (line 195) | def test_successful_get_user(self, tool_fns): FILE: tools/tests/tools/test_redis_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): function mock_redis (line 21) | def mock_redis(): class TestRedisGet (line 30) | class TestRedisGet: method test_missing_url (line 31) | def test_missing_url(self, tool_fns): method test_missing_key (line 36) | def test_missing_key(self, tool_fns): method test_successful_get (line 41) | def test_successful_get(self, tool_fns, mock_redis): method test_key_not_found (line 48) | def test_key_not_found(self, tool_fns, mock_redis): class TestRedisSet (line 55) | class TestRedisSet: method test_successful_set (line 56) | def test_successful_set(self, tool_fns, mock_redis): method test_set_with_ttl (line 62) | def test_set_with_ttl(self, tool_fns, mock_redis): class TestRedisDelete (line 69) | class TestRedisDelete: method test_missing_keys (line 70) | def test_missing_keys(self, tool_fns): method test_successful_delete (line 75) | def test_successful_delete(self, tool_fns, mock_redis): class TestRedisKeys (line 82) | class TestRedisKeys: method test_successful_scan (line 83) | def test_successful_scan(self, tool_fns, mock_redis): class TestRedisHash (line 91) | class TestRedisHash: method test_hset (line 92) | def test_hset(self, tool_fns, mock_redis): method test_hgetall (line 99) | def test_hgetall(self, tool_fns, mock_redis): class TestRedisList (line 106) | class TestRedisList: method test_lpush (line 107) | def test_lpush(self, tool_fns, mock_redis): method test_lrange (line 113) | def test_lrange(self, tool_fns, mock_redis): class TestRedisPublish (line 120) | class TestRedisPublish: method test_missing_fields (line 121) | def test_missing_fields(self, tool_fns): method test_successful_publish (line 126) | def test_successful_publish(self, tool_fns, mock_redis): class TestRedisInfo (line 133) | class TestRedisInfo: method test_successful_info (line 134) | def test_successful_info(self, tool_fns, mock_redis): class TestRedisTtl (line 149) | class TestRedisTtl: method test_missing_key (line 150) | def test_missing_key(self, tool_fns): method test_successful_ttl (line 155) | def test_successful_ttl(self, tool_fns, mock_redis): FILE: tools/tests/tools/test_redshift_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestRedshiftExecuteSQL (line 32) | class TestRedshiftExecuteSQL: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_missing_sql (line 40) | def test_missing_sql(self, tool_fns): method test_missing_cluster (line 47) | def test_missing_cluster(self, tool_fns): method test_successful_execute (line 52) | def test_successful_execute(self, tool_fns): class TestRedshiftDescribeStatement (line 73) | class TestRedshiftDescribeStatement: method test_missing_id (line 74) | def test_missing_id(self, tool_fns): method test_successful_describe (line 79) | def test_successful_describe(self, tool_fns): class TestRedshiftGetResults (line 103) | class TestRedshiftGetResults: method test_missing_id (line 104) | def test_missing_id(self, tool_fns): method test_successful_get (line 109) | def test_successful_get(self, tool_fns): class TestRedshiftListDatabases (line 135) | class TestRedshiftListDatabases: method test_missing_cluster (line 136) | def test_missing_cluster(self, tool_fns): method test_successful_list (line 141) | def test_successful_list(self, tool_fns): class TestRedshiftListTables (line 156) | class TestRedshiftListTables: method test_missing_database (line 157) | def test_missing_database(self, tool_fns): method test_successful_list (line 162) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_risk_scorer.py function risk_tools (line 20) | def risk_tools(mcp: FastMCP): function score_fn (line 28) | def score_fn(risk_tools): class TestScoreToGrade (line 37) | class TestScoreToGrade: method test_grade_a (line 40) | def test_grade_a(self): method test_grade_b (line 44) | def test_grade_b(self): method test_grade_c (line 48) | def test_grade_c(self): method test_grade_d (line 52) | def test_grade_d(self): method test_grade_f (line 56) | def test_grade_f(self): class TestParseJson (line 61) | class TestParseJson: method test_valid_json (line 64) | def test_valid_json(self): method test_invalid_json (line 68) | def test_invalid_json(self): method test_empty_string (line 72) | def test_empty_string(self): method test_whitespace_only (line 76) | def test_whitespace_only(self): method test_non_dict_json (line 80) | def test_non_dict_json(self): class TestScoreCategory (line 85) | class TestScoreCategory: method test_perfect_ssl_score (line 88) | def test_perfect_ssl_score(self): method test_failing_ssl_score (line 100) | def test_failing_ssl_score(self): method test_missing_values_half_credit (line 112) | def test_missing_values_half_credit(self): class TestFullScoring (line 124) | class TestFullScoring: method test_empty_inputs_returns_zero (line 127) | def test_empty_inputs_returns_zero(self, score_fn): method test_all_categories_skipped (line 132) | def test_all_categories_skipped(self, score_fn): method test_ssl_results_only (line 137) | def test_ssl_results_only(self, score_fn): method test_headers_results_only (line 152) | def test_headers_results_only(self, score_fn): method test_combined_results (line 168) | def test_combined_results(self, score_fn): class TestTopRisks (line 206) | class TestTopRisks: method test_top_risks_generated (line 209) | def test_top_risks_generated(self, score_fn): method test_top_risks_limited_to_10 (line 225) | def test_top_risks_limited_to_10(self, score_fn): class TestGradeScale (line 272) | class TestGradeScale: method test_grade_scale_present (line 275) | def test_grade_scale_present(self, score_fn): class TestCategoryWeights (line 290) | class TestCategoryWeights: method test_weights_included_in_output (line 293) | def test_weights_included_in_output(self, score_fn): class TestEdgeCases (line 304) | class TestEdgeCases: method test_invalid_json_ignored (line 307) | def test_invalid_json_ignored(self, score_fn): method test_missing_grade_input_key (line 311) | def test_missing_grade_input_key(self, score_fn): FILE: tools/tests/tools/test_run_command_pythonpath.py function _build_pythonpath_buggy (line 21) | def _build_pythonpath_buggy(project_root: str) -> str: function _build_pythonpath_fixed (line 26) | def _build_pythonpath_fixed(project_root: str) -> str: class TestPythonpathSeparatorWindows (line 37) | class TestPythonpathSeparatorWindows: method test_pythonpath_with_semicolons_parses_multiple_paths (line 40) | def test_pythonpath_with_semicolons_parses_multiple_paths(self, tmp_pa... method test_pythonpath_with_colons_fails_on_windows (line 73) | def test_pythonpath_with_colons_fails_on_windows(self, tmp_path): method test_fixed_pythonpath_construction_uses_pathsep (line 106) | def test_fixed_pythonpath_construction_uses_pathsep(self, tmp_path): FILE: tools/tests/tools/test_runtime_logs_tool.py function _write_jsonl (line 18) | def _write_jsonl(path: Path, items: list[dict]) -> None: function runtime_logs_dir (line 26) | def runtime_logs_dir(tmp_path: Path) -> Path: function runtime_logs_dir_with_in_progress (line 176) | def runtime_logs_dir_with_in_progress(runtime_logs_dir: Path) -> Path: function query_logs_fn (line 208) | def query_logs_fn(mcp: FastMCP): function query_details_fn (line 214) | def query_details_fn(mcp: FastMCP): function query_raw_fn (line 220) | def query_raw_fn(mcp: FastMCP): class TestQueryRuntimeLogs (line 225) | class TestQueryRuntimeLogs: method test_list_all_runs (line 226) | def test_list_all_runs(self, query_logs_fn, runtime_logs_dir: Path): method test_filter_by_status (line 233) | def test_filter_by_status(self, query_logs_fn, runtime_logs_dir: Path): method test_filter_needs_attention (line 238) | def test_filter_needs_attention(self, query_logs_fn, runtime_logs_dir:... method test_empty_directory (line 243) | def test_empty_directory(self, query_logs_fn, tmp_path: Path): method test_limit (line 248) | def test_limit(self, query_logs_fn, runtime_logs_dir: Path): method test_in_progress_runs_visible (line 252) | def test_in_progress_runs_visible(self, query_logs_fn, runtime_logs_di... class TestQueryRuntimeLogDetails (line 267) | class TestQueryRuntimeLogDetails: method test_load_details (line 268) | def test_load_details(self, query_details_fn, runtime_logs_dir: Path): method test_filter_by_node_id (line 277) | def test_filter_by_node_id(self, query_details_fn, runtime_logs_dir: P... method test_needs_attention_only (line 286) | def test_needs_attention_only(self, query_details_fn, runtime_logs_dir... method test_missing_run (line 295) | def test_missing_run(self, query_details_fn, runtime_logs_dir: Path): class TestQueryRuntimeLogRaw (line 303) | class TestQueryRuntimeLogRaw: method test_load_all_steps (line 304) | def test_load_all_steps(self, query_raw_fn, runtime_logs_dir: Path): method test_filter_by_step_index (line 312) | def test_filter_by_step_index(self, query_raw_fn, runtime_logs_dir: Pa... method test_filter_by_node_id (line 321) | def test_filter_by_node_id(self, query_raw_fn, runtime_logs_dir: Path): method test_filter_by_node_id_and_step_index (line 331) | def test_filter_by_node_id_and_step_index(self, query_raw_fn, runtime_... method test_missing_run (line 342) | def test_missing_run(self, query_raw_fn, runtime_logs_dir: Path): FILE: tools/tests/tools/test_salesforce_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestSalesforceSOQLQuery (line 31) | class TestSalesforceSOQLQuery: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_missing_query (line 37) | def test_missing_query(self, tool_fns): method test_successful_query (line 42) | def test_successful_query(self, tool_fns): method test_pagination (line 64) | def test_pagination(self, tool_fns): class TestSalesforceGetRecord (line 84) | class TestSalesforceGetRecord: method test_missing_params (line 85) | def test_missing_params(self, tool_fns): method test_successful_get (line 90) | def test_successful_get(self, tool_fns): class TestSalesforceCreateRecord (line 113) | class TestSalesforceCreateRecord: method test_missing_fields (line 114) | def test_missing_fields(self, tool_fns): method test_successful_create (line 119) | def test_successful_create(self, tool_fns): class TestSalesforceUpdateRecord (line 137) | class TestSalesforceUpdateRecord: method test_successful_update (line 138) | def test_successful_update(self, tool_fns): class TestSalesforceDescribeObject (line 156) | class TestSalesforceDescribeObject: method test_successful_describe (line 157) | def test_successful_describe(self, tool_fns): class TestSalesforceListObjects (line 200) | class TestSalesforceListObjects: method test_successful_list (line 201) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_sap_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestSAPListPurchaseOrders (line 32) | class TestSAPListPurchaseOrders: method test_missing_credentials (line 33) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 38) | def test_successful_list(self, tool_fns): class TestSAPGetPurchaseOrder (line 67) | class TestSAPGetPurchaseOrder: method test_missing_id (line 68) | def test_missing_id(self, tool_fns): method test_successful_get (line 73) | def test_successful_get(self, tool_fns): class TestSAPListBusinessPartners (line 96) | class TestSAPListBusinessPartners: method test_successful_list (line 97) | def test_successful_list(self, tool_fns): class TestSAPListProducts (line 125) | class TestSAPListProducts: method test_successful_list (line 126) | def test_successful_list(self, tool_fns): class TestSAPListSalesOrders (line 152) | class TestSAPListSalesOrders: method test_successful_list (line 153) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_security.py class TestGetSecurePath (line 8) | class TestGetSecurePath: method setup_workspaces_dir (line 12) | def setup_workspaces_dir(self, tmp_path): method ids (line 23) | def ids(self): method test_creates_session_directory (line 31) | def test_creates_session_directory(self, ids): method test_relative_path_resolved (line 41) | def test_relative_path_resolved(self, ids): method test_absolute_path_treated_as_relative (line 57) | def test_absolute_path_treated_as_relative(self, ids): method test_path_traversal_blocked (line 73) | def test_path_traversal_blocked(self, ids): method test_path_traversal_with_nested_dotdot (line 80) | def test_path_traversal_with_nested_dotdot(self, ids): method test_path_traversal_absolute_with_dotdot (line 87) | def test_path_traversal_absolute_with_dotdot(self, ids): method test_missing_workspace_id_raises (line 94) | def test_missing_workspace_id_raises(self, ids): method test_missing_agent_id_raises (line 103) | def test_missing_agent_id_raises(self, ids): method test_missing_session_id_raises (line 115) | def test_missing_session_id_raises(self, ids): method test_none_ids_raise (line 127) | def test_none_ids_raise(self): method test_simple_filename (line 134) | def test_simple_filename(self, ids): method test_current_dir_path (line 145) | def test_current_dir_path(self, ids): method test_dot_slash_path (line 154) | def test_dot_slash_path(self, ids): method test_deeply_nested_path (line 170) | def test_deeply_nested_path(self, ids): method test_path_with_spaces (line 190) | def test_path_with_spaces(self, ids): method test_path_with_special_characters (line 206) | def test_path_with_special_characters(self, ids): method test_empty_path (line 221) | def test_empty_path(self, ids): method test_symlink_within_sandbox_works (line 230) | def test_symlink_within_sandbox_works(self, ids): method test_symlink_escape_blocked (line 250) | def test_symlink_escape_blocked(self, ids): method test_symlink_to_root_escape_blocked (line 268) | def test_symlink_to_root_escape_blocked(self, ids): FILE: tools/tests/tools/test_security_tools.py class FakeHeaders (line 20) | class FakeHeaders: method __init__ (line 23) | def __init__(self, set_cookie_values: list[str]): method get_list (line 26) | def get_list(self, name: str) -> list[str]: class TestAnalyzeCookies (line 32) | class TestAnalyzeCookies: method test_secure_and_httponly_detected (line 35) | def test_secure_and_httponly_detected(self): method test_missing_flags_detected (line 48) | def test_missing_flags_detected(self): method test_case_insensitive (line 61) | def test_case_insensitive(self): method test_samesite_lax (line 72) | def test_samesite_lax(self): method test_samesite_strict (line 83) | def test_samesite_strict(self): method test_samesite_none (line 93) | def test_samesite_none(self): method test_no_samesite (line 104) | def test_no_samesite(self): method test_multiple_cookies (line 114) | def test_multiple_cookies(self): method test_no_cookies (line 129) | def test_no_cookies(self): method test_cookie_value_with_equals (line 135) | def test_cookie_value_with_equals(self): method test_grade_input_reflects_real_flags (line 147) | def test_grade_input_reflects_real_flags(self): method test_secure_at_end_of_header (line 163) | def test_secure_at_end_of_header(self): method test_no_space_after_semicolons (line 173) | def test_no_space_after_semicolons(self): class TestExtractSamesite (line 186) | class TestExtractSamesite: method test_lax (line 189) | def test_lax(self): method test_strict (line 192) | def test_strict(self): method test_none (line 195) | def test_none(self): method test_missing (line 198) | def test_missing(self): method test_with_spaces (line 201) | def test_with_spaces(self): class TestCheckPort (line 210) | class TestCheckPort: method test_open_port_with_banner (line 214) | async def test_open_port_with_banner(self): method test_open_port_no_banner (line 234) | async def test_open_port_no_banner(self): method test_closed_port (line 253) | async def test_closed_port(self): method test_timeout_port (line 264) | async def test_timeout_port(self): method test_writer_closed_even_on_banner_failure (line 275) | async def test_writer_closed_even_on_banner_failure(self): FILE: tools/tests/tools/test_serpapi_tool.py function scholar_search_fn (line 13) | def scholar_search_fn(mcp: FastMCP): function scholar_cite_fn (line 20) | def scholar_cite_fn(mcp: FastMCP): function scholar_author_fn (line 27) | def scholar_author_fn(mcp: FastMCP): function patents_search_fn (line 34) | def patents_search_fn(mcp: FastMCP): function patents_details_fn (line 41) | def patents_details_fn(mcp: FastMCP): class TestCredentials (line 50) | class TestCredentials: method test_scholar_search_no_creds (line 53) | def test_scholar_search_no_creds(self, scholar_search_fn, monkeypatch): method test_scholar_cite_no_creds (line 61) | def test_scholar_cite_no_creds(self, scholar_cite_fn, monkeypatch): method test_scholar_author_no_creds (line 68) | def test_scholar_author_no_creds(self, scholar_author_fn, monkeypatch): method test_patents_search_no_creds (line 75) | def test_patents_search_no_creds(self, patents_search_fn, monkeypatch): method test_patents_details_no_creds (line 82) | def test_patents_details_no_creds(self, patents_details_fn, monkeypatch): class TestInputValidation (line 93) | class TestInputValidation: method test_scholar_empty_query (line 96) | def test_scholar_empty_query(self, scholar_search_fn, monkeypatch): method test_scholar_long_query (line 103) | def test_scholar_long_query(self, scholar_search_fn, monkeypatch): method test_cite_empty_result_id (line 110) | def test_cite_empty_result_id(self, scholar_cite_fn, monkeypatch): method test_author_empty_id (line 117) | def test_author_empty_id(self, scholar_author_fn, monkeypatch): method test_patents_empty_query (line 124) | def test_patents_empty_query(self, patents_search_fn, monkeypatch): method test_patents_long_query (line 131) | def test_patents_long_query(self, patents_search_fn, monkeypatch): method test_patents_details_empty_id (line 137) | def test_patents_details_empty_id(self, patents_details_fn, monkeypatch): function _mock_response (line 148) | def _mock_response(status_code: int, json_data: dict | None = None, text... class TestHTTPErrors (line 158) | class TestHTTPErrors: method test_401_returns_auth_error (line 161) | def test_401_returns_auth_error(self, scholar_search_fn, monkeypatch): method test_429_returns_rate_limit (line 169) | def test_429_returns_rate_limit(self, scholar_search_fn, monkeypatch): method test_500_returns_server_error (line 177) | def test_500_returns_server_error(self, patents_search_fn, monkeypatch): method test_timeout_returns_error (line 185) | def test_timeout_returns_error(self, scholar_search_fn, monkeypatch): method test_network_error_returns_error (line 193) | def test_network_error_returns_error(self, scholar_search_fn, monkeypa... class TestScholarSearch (line 293) | class TestScholarSearch: method test_successful_search (line 296) | def test_successful_search(self, scholar_search_fn, monkeypatch): method test_search_with_year_filter (line 317) | def test_search_with_year_filter(self, scholar_search_fn, monkeypatch): class TestScholarCite (line 327) | class TestScholarCite: method test_successful_cite (line 330) | def test_successful_cite(self, scholar_cite_fn, monkeypatch): class TestScholarAuthor (line 343) | class TestScholarAuthor: method test_successful_author (line 346) | def test_successful_author(self, scholar_author_fn, monkeypatch): class TestPatentsSearch (line 361) | class TestPatentsSearch: method test_successful_search (line 364) | def test_successful_search(self, patents_search_fn, monkeypatch): method test_search_with_filters (line 378) | def test_search_with_filters(self, patents_search_fn, monkeypatch): class TestPatentsDetails (line 388) | class TestPatentsDetails: method test_successful_details (line 391) | def test_successful_details(self, patents_details_fn, monkeypatch): method test_not_found (line 402) | def test_not_found(self, patents_details_fn, monkeypatch): FILE: tools/tests/tools/test_shopify_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestShopifyListOrders (line 31) | class TestShopifyListOrders: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 37) | def test_successful_list(self, tool_fns): class TestShopifyGetOrder (line 68) | class TestShopifyGetOrder: method test_missing_id (line 69) | def test_missing_id(self, tool_fns): method test_successful_get (line 74) | def test_successful_get(self, tool_fns): class TestShopifyListProducts (line 124) | class TestShopifyListProducts: method test_successful_list (line 125) | def test_successful_list(self, tool_fns): class TestShopifyGetProduct (line 155) | class TestShopifyGetProduct: method test_missing_id (line 156) | def test_missing_id(self, tool_fns): method test_successful_get (line 161) | def test_successful_get(self, tool_fns): class TestShopifyListCustomers (line 207) | class TestShopifyListCustomers: method test_successful_list (line 208) | def test_successful_list(self, tool_fns): class TestShopifySearchCustomers (line 239) | class TestShopifySearchCustomers: method test_missing_query (line 240) | def test_missing_query(self, tool_fns): method test_successful_search (line 245) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_slack_tool.py function mcp (line 12) | def mcp(): function slack_send_message_fn (line 18) | def slack_send_message_fn(mcp: FastMCP): function slack_list_channels_fn (line 25) | def slack_list_channels_fn(mcp: FastMCP): function slack_get_channel_history_fn (line 32) | def slack_get_channel_history_fn(mcp: FastMCP): function slack_add_reaction_fn (line 39) | def slack_add_reaction_fn(mcp: FastMCP): function slack_get_user_info_fn (line 46) | def slack_get_user_info_fn(mcp: FastMCP): class TestSlackCredentials (line 52) | class TestSlackCredentials: method test_no_credentials_returns_error (line 55) | def test_no_credentials_returns_error(self, slack_send_message_fn, mon... class TestSlackSendMessage (line 66) | class TestSlackSendMessage: method test_send_message_success (line 69) | def test_send_message_success(self, slack_send_message_fn, monkeypatch): method test_send_message_invalid_auth (line 90) | def test_send_message_invalid_auth(self, slack_send_message_fn, monkey... method test_send_message_channel_not_found (line 105) | def test_send_message_channel_not_found(self, slack_send_message_fn, m... method test_send_message_with_thread (line 120) | def test_send_message_with_thread(self, slack_send_message_fn, monkeyp... class TestSlackListChannels (line 144) | class TestSlackListChannels: method test_list_channels_success (line 147) | def test_list_channels_success(self, slack_list_channels_fn, monkeypat... class TestSlackGetChannelHistory (line 170) | class TestSlackGetChannelHistory: method test_get_history_success (line 173) | def test_get_history_success(self, slack_get_channel_history_fn, monke... class TestSlackAddReaction (line 196) | class TestSlackAddReaction: method test_add_reaction_success (line 199) | def test_add_reaction_success(self, slack_add_reaction_fn, monkeypatch): method test_add_reaction_strips_colons (line 215) | def test_add_reaction_strips_colons(self, slack_add_reaction_fn, monke... class TestSlackGetUserInfo (line 231) | class TestSlackGetUserInfo: method test_get_user_info_success (line 234) | def test_get_user_info_success(self, slack_get_user_info_fn, monkeypat... function get_tool_fn (line 268) | def get_tool_fn(mcp: FastMCP): class TestSlackUpdateMessage (line 278) | class TestSlackUpdateMessage: method test_update_message_success (line 281) | def test_update_message_success(self, get_tool_fn, monkeypatch): class TestSlackDeleteMessage (line 303) | class TestSlackDeleteMessage: method test_delete_message_success (line 306) | def test_delete_message_success(self, get_tool_fn, monkeypatch): class TestSlackScheduleMessage (line 326) | class TestSlackScheduleMessage: method test_schedule_message_success (line 329) | def test_schedule_message_success(self, get_tool_fn, monkeypatch): class TestSlackCreateChannel (line 351) | class TestSlackCreateChannel: method test_create_channel_success (line 354) | def test_create_channel_success(self, get_tool_fn, monkeypatch): class TestSlackArchiveChannel (line 374) | class TestSlackArchiveChannel: method test_archive_channel_success (line 377) | def test_archive_channel_success(self, get_tool_fn, monkeypatch): class TestSlackInviteToChannel (line 393) | class TestSlackInviteToChannel: method test_invite_to_channel_success (line 396) | def test_invite_to_channel_success(self, get_tool_fn, monkeypatch): class TestSlackSetChannelTopic (line 412) | class TestSlackSetChannelTopic: method test_set_topic_success (line 415) | def test_set_topic_success(self, get_tool_fn, monkeypatch): class TestSlackRemoveReaction (line 431) | class TestSlackRemoveReaction: method test_remove_reaction_success (line 434) | def test_remove_reaction_success(self, get_tool_fn, monkeypatch): class TestSlackListUsers (line 450) | class TestSlackListUsers: method test_list_users_success (line 453) | def test_list_users_success(self, get_tool_fn, monkeypatch): class TestSlackUploadFile (line 488) | class TestSlackUploadFile: method test_upload_file_success (line 491) | def test_upload_file_success(self, get_tool_fn, monkeypatch): class TestSlackSearchMessages (line 532) | class TestSlackSearchMessages: method test_search_messages_success (line 535) | def test_search_messages_success(self, get_tool_fn, monkeypatch): class TestSlackGetThreadReplies (line 574) | class TestSlackGetThreadReplies: method test_get_thread_replies_success (line 577) | def test_get_thread_replies_success(self, get_tool_fn, monkeypatch): class TestSlackPinMessage (line 601) | class TestSlackPinMessage: method test_pin_message_success (line 604) | def test_pin_message_success(self, get_tool_fn, monkeypatch): class TestSlackUnpinMessage (line 620) | class TestSlackUnpinMessage: method test_unpin_message_success (line 623) | def test_unpin_message_success(self, get_tool_fn, monkeypatch): class TestSlackListPins (line 639) | class TestSlackListPins: method test_list_pins_success (line 642) | def test_list_pins_success(self, get_tool_fn, monkeypatch): class TestSlackAddBookmark (line 668) | class TestSlackAddBookmark: method test_add_bookmark_success (line 671) | def test_add_bookmark_success(self, get_tool_fn, monkeypatch): class TestSlackListScheduledMessages (line 691) | class TestSlackListScheduledMessages: method test_list_scheduled_success (line 694) | def test_list_scheduled_success(self, get_tool_fn, monkeypatch): class TestSlackDeleteScheduledMessage (line 716) | class TestSlackDeleteScheduledMessage: method test_delete_scheduled_success (line 719) | def test_delete_scheduled_success(self, get_tool_fn, monkeypatch): class TestSlackSendDM (line 735) | class TestSlackSendDM: method test_send_dm_success (line 738) | def test_send_dm_success(self, get_tool_fn, monkeypatch): class TestSlackGetPermalink (line 761) | class TestSlackGetPermalink: method test_get_permalink_success (line 764) | def test_get_permalink_success(self, get_tool_fn, monkeypatch): class TestSlackSendEphemeral (line 784) | class TestSlackSendEphemeral: method test_send_ephemeral_success (line 787) | def test_send_ephemeral_success(self, get_tool_fn, monkeypatch): class TestSlackPostBlocks (line 809) | class TestSlackPostBlocks: method test_post_blocks_success (line 812) | def test_post_blocks_success(self, get_tool_fn, monkeypatch): method test_post_blocks_invalid_json (line 833) | def test_post_blocks_invalid_json(self, get_tool_fn, monkeypatch): class TestSlackOpenModal (line 844) | class TestSlackOpenModal: method test_open_modal_success (line 847) | def test_open_modal_success(self, get_tool_fn, monkeypatch): method test_open_modal_invalid_json (line 870) | def test_open_modal_invalid_json(self, get_tool_fn, monkeypatch): class TestSlackUpdateHomeTab (line 881) | class TestSlackUpdateHomeTab: method test_update_home_tab_success (line 884) | def test_update_home_tab_success(self, get_tool_fn, monkeypatch): method test_update_home_tab_invalid_json (line 904) | def test_update_home_tab_invalid_json(self, get_tool_fn, monkeypatch): class TestSlackGetConversationContext (line 920) | class TestSlackGetConversationContext: method test_get_conversation_context_success (line 923) | def test_get_conversation_context_success(self, get_tool_fn, monkeypat... class TestSlackFindUserByEmail (line 959) | class TestSlackFindUserByEmail: method test_find_user_by_email_success (line 962) | def test_find_user_by_email_success(self, get_tool_fn, monkeypatch): method test_find_user_by_email_not_found (line 987) | def test_find_user_by_email_not_found(self, get_tool_fn, monkeypatch): class TestSlackKickUserFromChannel (line 1006) | class TestSlackKickUserFromChannel: method test_kick_user_success (line 1009) | def test_kick_user_success(self, get_tool_fn, monkeypatch): class TestSlackDeleteFile (line 1025) | class TestSlackDeleteFile: method test_delete_file_success (line 1028) | def test_delete_file_success(self, get_tool_fn, monkeypatch): class TestSlackGetTeamStats (line 1044) | class TestSlackGetTeamStats: method test_get_team_stats_success (line 1047) | def test_get_team_stats_success(self, get_tool_fn, monkeypatch): FILE: tools/tests/tools/test_snowflake_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestSnowflakeExecuteSQL (line 28) | class TestSnowflakeExecuteSQL: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_missing_statement (line 34) | def test_missing_statement(self, tool_fns): method test_successful_sync_query (line 39) | def test_successful_sync_query(self, tool_fns): method test_async_query (line 65) | def test_async_query(self, tool_fns): class TestSnowflakeGetStatementStatus (line 83) | class TestSnowflakeGetStatementStatus: method test_missing_handle (line 84) | def test_missing_handle(self, tool_fns): method test_complete_result (line 89) | def test_complete_result(self, tool_fns): method test_still_running (line 110) | def test_still_running(self, tool_fns): method test_query_error (line 126) | def test_query_error(self, tool_fns): class TestSnowflakeCancelStatement (line 144) | class TestSnowflakeCancelStatement: method test_missing_handle (line 145) | def test_missing_handle(self, tool_fns): method test_successful_cancel (line 150) | def test_successful_cancel(self, tool_fns): FILE: tools/tests/tools/test_ssl_tls_scanner.py function ssl_tools (line 15) | def ssl_tools(mcp: FastMCP): function scan_fn (line 23) | def scan_fn(ssl_tools): function _mock_cert_dict (line 27) | def _mock_cert_dict( class TestInputValidation (line 52) | class TestInputValidation: method test_strips_https_prefix (line 55) | def test_strips_https_prefix(self, scan_fn): method test_strips_http_prefix (line 62) | def test_strips_http_prefix(self, scan_fn): method test_strips_path (line 69) | def test_strips_path(self, scan_fn): method test_strips_port_from_hostname (line 76) | def test_strips_port_from_hostname(self, scan_fn): class TestConnectionErrors (line 88) | class TestConnectionErrors: method test_timeout_error (line 91) | def test_timeout_error(self, scan_fn): method test_connection_refused (line 101) | def test_connection_refused(self, scan_fn): class TestTlsVersion (line 117) | class TestTlsVersion: method test_tls13_ok (line 120) | def test_tls13_ok(self, scan_fn): method test_tls10_insecure (line 136) | def test_tls10_insecure(self, scan_fn): class TestCipherSuite (line 159) | class TestCipherSuite: method test_strong_cipher (line 162) | def test_strong_cipher(self, scan_fn): method test_weak_cipher_rc4 (line 177) | def test_weak_cipher_rc4(self, scan_fn): class TestCertificateValidation (line 198) | class TestCertificateValidation: method test_valid_certificate (line 201) | def test_valid_certificate(self, scan_fn): method test_expiring_soon (line 216) | def test_expiring_soon(self, scan_fn): method test_self_signed_detected (line 231) | def test_self_signed_detected(self, scan_fn): class TestGradeInput (line 255) | class TestGradeInput: method test_grade_input_keys_present (line 258) | def test_grade_input_keys_present(self, scan_fn): FILE: tools/tests/tools/test_stripe_tool.py function _make_stripe_list (line 31) | def _make_stripe_list(items: list, has_more: bool = False): function _customer (line 39) | def _customer(**kwargs): function _subscription (line 58) | def _subscription(**kwargs): function _payment_intent (line 84) | def _payment_intent(**kwargs): function _charge (line 106) | def _charge(**kwargs): function _refund (line 131) | def _refund(**kwargs): function _invoice (line 150) | def _invoice(**kwargs): function _invoice_item (line 176) | def _invoice_item(**kwargs): function _product (line 195) | def _product(**kwargs): function _price (line 212) | def _price(**kwargs): function _payment_link (line 235) | def _payment_link(**kwargs): function _coupon (line 257) | def _coupon(**kwargs): function _payment_method (line 279) | def _payment_method(**kwargs): class TestStripeClientCustomers (line 306) | class TestStripeClientCustomers: method setup_method (line 307) | def setup_method(self): method _mock_stripe (line 310) | def _mock_stripe(self): method test_create_customer (line 313) | def test_create_customer(self): method test_create_customer_minimal (line 336) | def test_create_customer_minimal(self): method test_get_customer (line 345) | def test_get_customer(self): method test_get_customer_by_email_found (line 353) | def test_get_customer_by_email_found(self): method test_get_customer_by_email_not_found (line 361) | def test_get_customer_by_email_not_found(self): method test_update_customer (line 369) | def test_update_customer(self): method test_list_customers (line 377) | def test_list_customers(self): method test_list_customers_limit_capped (line 385) | def test_list_customers_limit_capped(self): class TestStripeClientSubscriptions (line 394) | class TestStripeClientSubscriptions: method setup_method (line 395) | def setup_method(self): method _mock_stripe (line 398) | def _mock_stripe(self): method test_get_subscription (line 401) | def test_get_subscription(self): method test_get_subscription_status_active (line 410) | def test_get_subscription_status_active(self): method test_get_subscription_status_no_subscription (line 419) | def test_get_subscription_status_no_subscription(self): method test_list_subscriptions (line 427) | def test_list_subscriptions(self): method test_create_subscription (line 437) | def test_create_subscription(self): method test_update_subscription_metadata (line 453) | def test_update_subscription_metadata(self): method test_update_subscription_quantity_only (line 464) | def test_update_subscription_quantity_only(self): method test_update_subscription_no_items_returns_error (line 474) | def test_update_subscription_no_items_returns_error(self): method test_cancel_subscription_immediately (line 484) | def test_cancel_subscription_immediately(self): method test_cancel_subscription_at_period_end (line 492) | def test_cancel_subscription_at_period_end(self): class TestStripeClientPaymentIntents (line 503) | class TestStripeClientPaymentIntents: method setup_method (line 504) | def setup_method(self): method _mock_stripe (line 507) | def _mock_stripe(self): method test_create_payment_intent (line 510) | def test_create_payment_intent(self): method test_get_payment_intent (line 528) | def test_get_payment_intent(self): method test_confirm_payment_intent (line 536) | def test_confirm_payment_intent(self): method test_cancel_payment_intent (line 546) | def test_cancel_payment_intent(self): method test_list_payment_intents (line 554) | def test_list_payment_intents(self): class TestStripeClientCharges (line 565) | class TestStripeClientCharges: method setup_method (line 566) | def setup_method(self): method _mock_stripe (line 569) | def _mock_stripe(self): method test_list_charges (line 572) | def test_list_charges(self): method test_get_charge (line 581) | def test_get_charge(self): method test_capture_charge (line 590) | def test_capture_charge(self): method test_capture_charge_full (line 598) | def test_capture_charge_full(self): class TestStripeClientRefunds (line 607) | class TestStripeClientRefunds: method setup_method (line 608) | def setup_method(self): method _mock_stripe (line 611) | def _mock_stripe(self): method test_create_refund_by_charge (line 614) | def test_create_refund_by_charge(self): method test_create_refund_by_payment_intent (line 624) | def test_create_refund_by_payment_intent(self): method test_get_refund (line 636) | def test_get_refund(self): method test_list_refunds (line 644) | def test_list_refunds(self): class TestStripeClientInvoices (line 654) | class TestStripeClientInvoices: method setup_method (line 655) | def setup_method(self): method _mock_stripe (line 658) | def _mock_stripe(self): method test_list_invoices (line 661) | def test_list_invoices(self): method test_get_invoice (line 671) | def test_get_invoice(self): method test_create_invoice (line 680) | def test_create_invoice(self): method test_finalize_invoice (line 695) | def test_finalize_invoice(self): method test_pay_invoice (line 703) | def test_pay_invoice(self): method test_void_invoice (line 711) | def test_void_invoice(self): class TestStripeClientInvoiceItems (line 720) | class TestStripeClientInvoiceItems: method setup_method (line 721) | def setup_method(self): method _mock_stripe (line 724) | def _mock_stripe(self): method test_create_invoice_item (line 727) | def test_create_invoice_item(self): method test_list_invoice_items (line 744) | def test_list_invoice_items(self): method test_delete_invoice_item (line 756) | def test_delete_invoice_item(self): class TestStripeClientProducts (line 769) | class TestStripeClientProducts: method setup_method (line 770) | def setup_method(self): method _mock_stripe (line 773) | def _mock_stripe(self): method test_create_product (line 776) | def test_create_product(self): method test_get_product (line 791) | def test_get_product(self): method test_list_products (line 799) | def test_list_products(self): method test_update_product (line 808) | def test_update_product(self): class TestStripeClientPrices (line 818) | class TestStripeClientPrices: method setup_method (line 819) | def setup_method(self): method _mock_stripe (line 822) | def _mock_stripe(self): method test_create_price_recurring (line 825) | def test_create_price_recurring(self): method test_create_price_one_time (line 839) | def test_create_price_one_time(self): method test_get_price (line 851) | def test_get_price(self): method test_list_prices (line 860) | def test_list_prices(self): method test_update_price (line 870) | def test_update_price(self): class TestStripeClientPaymentLinks (line 880) | class TestStripeClientPaymentLinks: method setup_method (line 881) | def setup_method(self): method _mock_stripe (line 884) | def _mock_stripe(self): method test_create_payment_link (line 887) | def test_create_payment_link(self): method test_get_payment_link (line 898) | def test_get_payment_link(self): method test_list_payment_links (line 906) | def test_list_payment_links(self): class TestStripeClientCoupons (line 916) | class TestStripeClientCoupons: method setup_method (line 917) | def setup_method(self): method _mock_stripe (line 920) | def _mock_stripe(self): method test_create_coupon_percent_off (line 923) | def test_create_coupon_percent_off(self): method test_create_coupon_amount_off (line 937) | def test_create_coupon_amount_off(self): method test_create_coupon_repeating (line 950) | def test_create_coupon_repeating(self): method test_list_coupons (line 962) | def test_list_coupons(self): method test_delete_coupon (line 969) | def test_delete_coupon(self): class TestStripeClientBalance (line 981) | class TestStripeClientBalance: method setup_method (line 982) | def setup_method(self): method _mock_stripe (line 985) | def _mock_stripe(self): method test_get_balance (line 988) | def test_get_balance(self): method test_list_balance_transactions (line 1002) | def test_list_balance_transactions(self): class TestStripeClientWebhookEndpoints (line 1023) | class TestStripeClientWebhookEndpoints: method setup_method (line 1024) | def setup_method(self): method _mock_stripe (line 1027) | def _mock_stripe(self): method test_list_webhook_endpoints (line 1030) | def test_list_webhook_endpoints(self): class TestStripeClientPaymentMethods (line 1046) | class TestStripeClientPaymentMethods: method setup_method (line 1047) | def setup_method(self): method _mock_stripe (line 1050) | def _mock_stripe(self): method test_list_payment_methods (line 1053) | def test_list_payment_methods(self): method test_get_payment_method (line 1064) | def test_get_payment_method(self): method test_detach_payment_method (line 1072) | def test_detach_payment_method(self): class TestToolRegistration (line 1087) | class TestToolRegistration: method test_register_tools_registers_all_tools (line 1088) | def test_register_tools_registers_all_tools(self): method test_no_credentials_returns_error (line 1094) | def test_no_credentials_returns_error(self): method test_credentials_from_credential_manager (line 1107) | def test_credentials_from_credential_manager(self): method test_credentials_from_env_vars (line 1127) | def test_credentials_from_env_vars(self): method test_stripe_error_is_caught (line 1146) | def test_stripe_error_is_caught(self): function _setup_tools (line 1171) | def _setup_tools(): class TestCustomerToolValidation (line 1183) | class TestCustomerToolValidation: method setup_method (line 1184) | def setup_method(self): method test_get_customer_invalid_id (line 1187) | def test_get_customer_invalid_id(self): method test_update_customer_invalid_id (line 1192) | def test_update_customer_invalid_id(self): method test_get_customer_by_email_invalid (line 1197) | def test_get_customer_by_email_invalid(self): method test_list_customers_success (line 1201) | def test_list_customers_success(self): method test_create_customer_success (line 1210) | def test_create_customer_success(self): class TestSubscriptionToolValidation (line 1220) | class TestSubscriptionToolValidation: method setup_method (line 1221) | def setup_method(self): method test_get_subscription_invalid_id (line 1224) | def test_get_subscription_invalid_id(self): method test_get_subscription_status_invalid_customer (line 1229) | def test_get_subscription_status_invalid_customer(self): method test_create_subscription_invalid_customer (line 1234) | def test_create_subscription_invalid_customer(self): method test_create_subscription_invalid_price (line 1239) | def test_create_subscription_invalid_price(self): method test_create_subscription_invalid_quantity (line 1246) | def test_create_subscription_invalid_quantity(self): method test_update_subscription_invalid_id (line 1253) | def test_update_subscription_invalid_id(self): method test_cancel_subscription_invalid_id (line 1258) | def test_cancel_subscription_invalid_id(self): class TestPaymentIntentToolValidation (line 1264) | class TestPaymentIntentToolValidation: method setup_method (line 1265) | def setup_method(self): method test_create_payment_intent_zero_amount (line 1268) | def test_create_payment_intent_zero_amount(self): method test_create_payment_intent_negative_amount (line 1273) | def test_create_payment_intent_negative_amount(self): method test_create_payment_intent_invalid_currency (line 1278) | def test_create_payment_intent_invalid_currency(self): method test_get_payment_intent_invalid_id (line 1283) | def test_get_payment_intent_invalid_id(self): method test_confirm_payment_intent_invalid_id (line 1288) | def test_confirm_payment_intent_invalid_id(self): method test_cancel_payment_intent_invalid_id (line 1293) | def test_cancel_payment_intent_invalid_id(self): class TestChargeToolValidation (line 1299) | class TestChargeToolValidation: method setup_method (line 1300) | def setup_method(self): method test_get_charge_invalid_id (line 1303) | def test_get_charge_invalid_id(self): method test_capture_charge_invalid_id (line 1308) | def test_capture_charge_invalid_id(self): method test_capture_charge_negative_amount (line 1313) | def test_capture_charge_negative_amount(self): class TestRefundToolValidation (line 1319) | class TestRefundToolValidation: method setup_method (line 1320) | def setup_method(self): method test_create_refund_no_identifiers (line 1323) | def test_create_refund_no_identifiers(self): method test_create_refund_negative_amount (line 1328) | def test_create_refund_negative_amount(self): method test_get_refund_invalid_id (line 1333) | def test_get_refund_invalid_id(self): class TestInvoiceToolValidation (line 1339) | class TestInvoiceToolValidation: method setup_method (line 1340) | def setup_method(self): method test_get_invoice_invalid_id (line 1343) | def test_get_invoice_invalid_id(self): method test_create_invoice_invalid_customer (line 1348) | def test_create_invoice_invalid_customer(self): method test_finalize_invoice_invalid_id (line 1353) | def test_finalize_invoice_invalid_id(self): method test_pay_invoice_invalid_id (line 1358) | def test_pay_invoice_invalid_id(self): method test_void_invoice_invalid_id (line 1363) | def test_void_invoice_invalid_id(self): class TestInvoiceItemToolValidation (line 1369) | class TestInvoiceItemToolValidation: method setup_method (line 1370) | def setup_method(self): method test_create_invoice_item_invalid_customer (line 1373) | def test_create_invoice_item_invalid_customer(self): method test_create_invoice_item_zero_amount (line 1380) | def test_create_invoice_item_zero_amount(self): method test_create_invoice_item_negative_amount_allowed (line 1387) | def test_create_invoice_item_negative_amount_allowed(self): method test_create_invoice_item_invalid_currency (line 1402) | def test_create_invoice_item_invalid_currency(self): method test_delete_invoice_item_invalid_id (line 1409) | def test_delete_invoice_item_invalid_id(self): class TestProductToolValidation (line 1415) | class TestProductToolValidation: method setup_method (line 1416) | def setup_method(self): method test_get_product_invalid_id (line 1419) | def test_get_product_invalid_id(self): method test_update_product_invalid_id (line 1424) | def test_update_product_invalid_id(self): method test_create_product_missing_name (line 1429) | def test_create_product_missing_name(self): class TestPriceToolValidation (line 1435) | class TestPriceToolValidation: method setup_method (line 1436) | def setup_method(self): method test_get_price_invalid_id (line 1439) | def test_get_price_invalid_id(self): method test_update_price_invalid_id (line 1444) | def test_update_price_invalid_id(self): method test_create_price_zero_amount (line 1449) | def test_create_price_zero_amount(self): method test_create_price_invalid_currency (line 1456) | def test_create_price_invalid_currency(self): method test_create_price_invalid_product (line 1463) | def test_create_price_invalid_product(self): class TestPaymentLinkToolValidation (line 1471) | class TestPaymentLinkToolValidation: method setup_method (line 1472) | def setup_method(self): method test_create_payment_link_invalid_price (line 1475) | def test_create_payment_link_invalid_price(self): method test_create_payment_link_zero_quantity (line 1480) | def test_create_payment_link_zero_quantity(self): method test_get_payment_link_invalid_id (line 1485) | def test_get_payment_link_invalid_id(self): class TestCouponToolValidation (line 1491) | class TestCouponToolValidation: method setup_method (line 1492) | def setup_method(self): method test_create_coupon_no_discount (line 1495) | def test_create_coupon_no_discount(self): method test_create_coupon_both_discount_types (line 1500) | def test_create_coupon_both_discount_types(self): method test_create_coupon_amount_off_missing_currency (line 1505) | def test_create_coupon_amount_off_missing_currency(self): method test_create_coupon_invalid_duration (line 1510) | def test_create_coupon_invalid_duration(self): method test_create_coupon_repeating_missing_months (line 1515) | def test_create_coupon_repeating_missing_months(self): method test_delete_coupon_missing_id (line 1520) | def test_delete_coupon_missing_id(self): class TestPaymentMethodToolValidation (line 1526) | class TestPaymentMethodToolValidation: method setup_method (line 1527) | def setup_method(self): method test_list_payment_methods_invalid_customer (line 1530) | def test_list_payment_methods_invalid_customer(self): method test_get_payment_method_invalid_id (line 1535) | def test_get_payment_method_invalid_id(self): method test_detach_payment_method_invalid_id (line 1540) | def test_detach_payment_method_invalid_id(self): function test_stripe_error_propagation (line 1567) | def test_stripe_error_propagation(tool_name, kwargs): class TestCredentialSpec (line 1583) | class TestCredentialSpec: method test_stripe_credential_spec_exists (line 1584) | def test_stripe_credential_spec_exists(self): method test_stripe_spec_env_var (line 1589) | def test_stripe_spec_env_var(self): method test_stripe_spec_tool_count (line 1595) | def test_stripe_spec_tool_count(self): method test_stripe_spec_tools_include_core_methods (line 1601) | def test_stripe_spec_tools_include_core_methods(self): method test_stripe_spec_health_check (line 1661) | def test_stripe_spec_health_check(self): method test_stripe_spec_auth_support (line 1668) | def test_stripe_spec_auth_support(self): method test_stripe_spec_credential_store_fields (line 1676) | def test_stripe_spec_credential_store_fields(self): method test_stripe_spec_required_not_startup (line 1684) | def test_stripe_spec_required_not_startup(self): FILE: tools/tests/tools/test_subdomain_enumerator.py function subdomain_tools (line 15) | def subdomain_tools(mcp: FastMCP): function enumerate_fn (line 23) | def enumerate_fn(subdomain_tools): function _mock_crtsh_response (line 27) | def _mock_crtsh_response(subdomains: list[str], status_code: int = 200) ... class TestInputValidation (line 40) | class TestInputValidation: method test_strips_https_prefix (line 44) | async def test_strips_https_prefix(self, enumerate_fn): method test_strips_http_prefix (line 56) | async def test_strips_http_prefix(self, enumerate_fn): method test_strips_path (line 68) | async def test_strips_path(self, enumerate_fn): method test_max_results_clamped (line 80) | async def test_max_results_clamped(self, enumerate_fn): class TestConnectionErrors (line 99) | class TestConnectionErrors: method test_timeout_error (line 103) | async def test_timeout_error(self, enumerate_fn): method test_http_error (line 116) | async def test_http_error(self, enumerate_fn): class TestSubdomainDiscovery (line 134) | class TestSubdomainDiscovery: method test_subdomains_extracted (line 138) | async def test_subdomains_extracted(self, enumerate_fn): method test_wildcards_filtered (line 157) | async def test_wildcards_filtered(self, enumerate_fn): method test_duplicates_removed (line 176) | async def test_duplicates_removed(self, enumerate_fn): class TestInterestingSubdomains (line 198) | class TestInterestingSubdomains: method test_staging_flagged (line 202) | async def test_staging_flagged(self, enumerate_fn): method test_admin_flagged (line 217) | async def test_admin_flagged(self, enumerate_fn): method test_dev_flagged (line 231) | async def test_dev_flagged(self, enumerate_fn): class TestGradeInput (line 250) | class TestGradeInput: method test_grade_input_keys_present (line 254) | async def test_grade_input_keys_present(self, enumerate_fn): method test_no_dev_staging_true_when_clean (line 270) | async def test_no_dev_staging_true_when_clean(self, enumerate_fn): method test_reasonable_surface_area (line 283) | async def test_reasonable_surface_area(self, enumerate_fn): FILE: tools/tests/tools/test_supabase_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestSupabaseSelect (line 21) | class TestSupabaseSelect: method test_missing_credentials (line 22) | def test_missing_credentials(self, tool_fns): method test_missing_table (line 27) | def test_missing_table(self, tool_fns): method test_successful_select (line 32) | def test_successful_select(self, tool_fns): method test_with_filters (line 46) | def test_with_filters(self, tool_fns): class TestSupabaseInsert (line 59) | class TestSupabaseInsert: method test_missing_fields (line 60) | def test_missing_fields(self, tool_fns): method test_invalid_json (line 65) | def test_invalid_json(self, tool_fns): method test_successful_insert (line 71) | def test_successful_insert(self, tool_fns): class TestSupabaseUpdate (line 84) | class TestSupabaseUpdate: method test_missing_filters (line 85) | def test_missing_filters(self, tool_fns): method test_successful_update (line 90) | def test_successful_update(self, tool_fns): class TestSupabaseDelete (line 105) | class TestSupabaseDelete: method test_missing_filters (line 106) | def test_missing_filters(self, tool_fns): method test_successful_delete (line 111) | def test_successful_delete(self, tool_fns): class TestSupabaseAuth (line 124) | class TestSupabaseAuth: method test_signup_missing_fields (line 125) | def test_signup_missing_fields(self, tool_fns): method test_signup_short_password (line 130) | def test_signup_short_password(self, tool_fns): method test_successful_signup (line 136) | def test_successful_signup(self, tool_fns): method test_signin_missing_fields (line 150) | def test_signin_missing_fields(self, tool_fns): method test_successful_signin (line 155) | def test_successful_signin(self, tool_fns): class TestSupabaseEdgeInvoke (line 172) | class TestSupabaseEdgeInvoke: method test_missing_function_name (line 173) | def test_missing_function_name(self, tool_fns): method test_invalid_body_json (line 178) | def test_invalid_body_json(self, tool_fns): method test_successful_invoke (line 183) | def test_successful_invoke(self, tool_fns): FILE: tools/tests/tools/test_tech_stack_detector.py function tech_tools (line 21) | def tech_tools(mcp: FastMCP): function detect_fn (line 29) | def detect_fn(tech_tools): class FakeHeaders (line 33) | class FakeHeaders: method __init__ (line 36) | def __init__(self, headers: dict): method get (line 39) | def get(self, name: str, default=None): method get_list (line 42) | def get_list(self, name: str) -> list[str]: class TestDetectServer (line 56) | class TestDetectServer: method test_server_with_version (line 59) | def test_server_with_version(self): method test_server_without_version (line 65) | def test_server_without_version(self): method test_no_server_header (line 71) | def test_no_server_header(self): class TestDetectCdn (line 77) | class TestDetectCdn: method test_cloudflare_detected (line 80) | def test_cloudflare_detected(self): method test_vercel_detected (line 85) | def test_vercel_detected(self): method test_no_cdn (line 90) | def test_no_cdn(self): class TestDetectJsLibraries (line 96) | class TestDetectJsLibraries: method test_react_detected (line 99) | def test_react_detected(self): method test_jquery_detected (line 104) | def test_jquery_detected(self): method test_nextjs_detected (line 109) | def test_nextjs_detected(self): method test_no_libraries (line 114) | def test_no_libraries(self): class TestDetectCms (line 120) | class TestDetectCms: method test_wordpress_detected (line 123) | def test_wordpress_detected(self): method test_shopify_detected (line 128) | def test_shopify_detected(self): method test_drupal_detected (line 133) | def test_drupal_detected(self): method test_no_cms (line 138) | def test_no_cms(self): class TestConnectionErrors (line 149) | class TestConnectionErrors: method test_connection_error (line 153) | async def test_connection_error(self, detect_fn): method test_timeout_error (line 166) | async def test_timeout_error(self, detect_fn): class TestFullDetection (line 184) | class TestFullDetection: method _mock_response (line 187) | def _mock_response( method test_detects_server (line 201) | async def test_detects_server(self, detect_fn): method test_detects_framework (line 213) | async def test_detects_framework(self, detect_fn): class TestGradeInput (line 230) | class TestGradeInput: method _mock_response (line 233) | def _mock_response(self, html: str = "", headers: dict | ... method test_grade_input_keys_present (line 242) | async def test_grade_input_keys_present(self, detect_fn): method test_server_version_exposed (line 260) | async def test_server_version_exposed(self, detect_fn): FILE: tools/tests/tools/test_telegram_tool.py class TestTelegramClient (line 31) | class TestTelegramClient: method setup_method (line 32) | def setup_method(self): method test_base_url (line 35) | def test_base_url(self): method test_handle_response_success (line 39) | def test_handle_response_success(self): method test_handle_response_401 (line 47) | def test_handle_response_401(self): method test_handle_response_400 (line 54) | def test_handle_response_400(self): method test_handle_response_403 (line 62) | def test_handle_response_403(self): method test_handle_response_404 (line 69) | def test_handle_response_404(self): method test_handle_response_429 (line 76) | def test_handle_response_429(self): method test_send_message (line 84) | def test_send_message(self, mock_post): method test_send_message_with_parse_mode (line 100) | def test_send_message_with_parse_mode(self, mock_post): method test_send_document (line 112) | def test_send_document(self, mock_post): method test_get_me (line 132) | def test_get_me(self, mock_get): method test_edit_message_text (line 150) | def test_edit_message_text(self, mock_post): method test_edit_message_text_with_parse_mode (line 170) | def test_edit_message_text_with_parse_mode(self, mock_post): method test_delete_message (line 184) | def test_delete_message(self, mock_post): method test_forward_message (line 200) | def test_forward_message(self, mock_post): method test_forward_message_silent (line 220) | def test_forward_message_silent(self, mock_post): method test_send_photo (line 237) | def test_send_photo(self, mock_post): method test_send_photo_no_caption (line 264) | def test_send_photo_no_caption(self, mock_post): method test_send_chat_action (line 276) | def test_send_chat_action(self, mock_post): method test_pin_chat_message (line 292) | def test_pin_chat_message(self, mock_post): method test_pin_chat_message_silent (line 308) | def test_pin_chat_message_silent(self, mock_post): method test_unpin_chat_message (line 320) | def test_unpin_chat_message(self, mock_post): method test_unpin_chat_message_most_recent (line 336) | def test_unpin_chat_message_most_recent(self, mock_post): method test_get_chat (line 349) | def test_get_chat(self, mock_post): class TestRegisterTools (line 374) | class TestRegisterTools: method setup_method (line 375) | def setup_method(self): method test_register_tools_creates_tools (line 378) | def test_register_tools_creates_tools(self): method test_send_message_no_token_error (line 395) | def test_send_message_no_token_error(self): method test_send_message_success (line 411) | def test_send_message_success(self, mock_getenv, mock_post): method test_credentials_adapter_used (line 425) | def test_credentials_adapter_used(self): class TestNewToolOperations (line 449) | class TestNewToolOperations: method setup_method (line 452) | def setup_method(self): method _get_tools (line 455) | def _get_tools(self): method test_edit_message_success (line 460) | def test_edit_message_success(self, mock_getenv, mock_post): method test_delete_message_success (line 478) | def test_delete_message_success(self, mock_getenv, mock_post): method test_forward_message_success (line 492) | def test_forward_message_success(self, mock_getenv, mock_post): method test_send_photo_success (line 511) | def test_send_photo_success(self, mock_getenv, mock_post): method test_send_chat_action_success (line 528) | def test_send_chat_action_success(self, mock_getenv, mock_post): method test_send_chat_action_invalid_action (line 540) | def test_send_chat_action_invalid_action(self): method test_get_chat_success (line 554) | def test_get_chat_success(self, mock_getenv, mock_post): method test_pin_message_success (line 576) | def test_pin_message_success(self, mock_getenv, mock_post): method test_unpin_message_success (line 590) | def test_unpin_message_success(self, mock_getenv, mock_post): method test_unpin_message_most_recent (line 604) | def test_unpin_message_most_recent(self, mock_getenv, mock_post): method test_new_tools_return_error_without_token (line 623) | def test_new_tools_return_error_without_token(self): class TestErrorHandling (line 653) | class TestErrorHandling: method setup_method (line 654) | def setup_method(self): method test_network_error (line 658) | def test_network_error(self, mock_post): method test_timeout_error (line 667) | def test_timeout_error(self, mock_post): method test_tool_returns_error_on_timeout (line 677) | def test_tool_returns_error_on_timeout(self, mock_getenv, mock_post): method test_tool_returns_error_on_network_failure (line 694) | def test_tool_returns_error_on_network_failure(self, mock_getenv, mock... method test_handle_response_generic_error (line 709) | def test_handle_response_generic_error(self): class TestNewOperationsErrorHandling (line 724) | class TestNewOperationsErrorHandling: method setup_method (line 727) | def setup_method(self): method _get_tools (line 730) | def _get_tools(self): method test_edit_message_timeout (line 735) | def test_edit_message_timeout(self, mock_getenv, mock_post): method test_delete_message_network_error (line 749) | def test_delete_message_network_error(self, mock_getenv, mock_post): method test_forward_message_timeout (line 763) | def test_forward_message_timeout(self, mock_getenv, mock_post): method test_send_photo_network_error (line 779) | def test_send_photo_network_error(self, mock_getenv, mock_post): method test_get_chat_timeout (line 793) | def test_get_chat_timeout(self, mock_getenv, mock_post): method test_pin_message_timeout (line 807) | def test_pin_message_timeout(self, mock_getenv, mock_post): method test_unpin_message_network_error (line 821) | def test_unpin_message_network_error(self, mock_getenv, mock_post): method test_delete_message_api_error_returned (line 835) | def test_delete_message_api_error_returned(self, mock_getenv, mock_post): FILE: tools/tests/tools/test_terraform_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestTerraformListWorkspaces (line 28) | class TestTerraformListWorkspaces: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_missing_organization (line 34) | def test_missing_organization(self, tool_fns): method test_successful_list (line 39) | def test_successful_list(self, tool_fns): class TestTerraformGetWorkspace (line 79) | class TestTerraformGetWorkspace: method test_missing_id (line 80) | def test_missing_id(self, tool_fns): method test_successful_get (line 85) | def test_successful_get(self, tool_fns): class TestTerraformListRuns (line 119) | class TestTerraformListRuns: method test_missing_workspace (line 120) | def test_missing_workspace(self, tool_fns): method test_successful_list (line 125) | def test_successful_list(self, tool_fns): class TestTerraformGetRun (line 165) | class TestTerraformGetRun: method test_missing_id (line 166) | def test_missing_id(self, tool_fns): method test_successful_get (line 171) | def test_successful_get(self, tool_fns): class TestTerraformCreateRun (line 204) | class TestTerraformCreateRun: method test_missing_workspace (line 205) | def test_missing_workspace(self, tool_fns): method test_successful_create (line 210) | def test_successful_create(self, tool_fns): FILE: tools/tests/tools/test_time_tool.py function mcp (line 21) | def mcp(): function time_tool (line 27) | def time_tool(mcp): class TestGetCurrentTime (line 37) | class TestGetCurrentTime: method test_returns_dict (line 40) | def test_returns_dict(self, time_tool): method test_default_timezone_is_utc (line 45) | def test_default_timezone_is_utc(self, time_tool): method test_returns_required_fields (line 50) | def test_returns_required_fields(self, time_tool): method test_date_format (line 57) | def test_date_format(self, time_tool): method test_time_format (line 63) | def test_time_format(self, time_tool): method test_datetime_is_iso_format (line 69) | def test_datetime_is_iso_format(self, time_tool): method test_unix_timestamp_is_int (line 75) | def test_unix_timestamp_is_int(self, time_tool): method test_day_of_week_is_string (line 80) | def test_day_of_week_is_string(self, time_tool): method test_custom_timezone (line 86) | def test_custom_timezone(self, time_tool): method test_asia_timezone (line 91) | def test_asia_timezone(self, time_tool): method test_europe_timezone (line 96) | def test_europe_timezone(self, time_tool): method test_invalid_timezone_returns_error (line 101) | def test_invalid_timezone_returns_error(self, time_tool): method test_time_is_current (line 106) | def test_time_is_current(self, time_tool): method test_different_timezones_same_timestamp (line 115) | def test_different_timezones_same_timestamp(self, time_tool): class TestToolRegistration (line 124) | class TestToolRegistration: method test_tool_is_registered (line 127) | def test_tool_is_registered(self, mcp): method test_tool_has_description (line 133) | def test_tool_has_description(self, mcp): FILE: tools/tests/tools/test_tines_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=200): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestTinesListStories (line 31) | class TestTinesListStories: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 37) | def test_successful_list(self, tool_fns): class TestTinesGetStory (line 66) | class TestTinesGetStory: method test_missing_id (line 67) | def test_missing_id(self, tool_fns): method test_successful_get (line 72) | def test_successful_get(self, tool_fns): class TestTinesListActions (line 100) | class TestTinesListActions: method test_successful_list (line 101) | def test_successful_list(self, tool_fns): class TestTinesGetAction (line 129) | class TestTinesGetAction: method test_missing_id (line 130) | def test_missing_id(self, tool_fns): method test_successful_get (line 135) | def test_successful_get(self, tool_fns): class TestTinesGetActionLogs (line 161) | class TestTinesGetActionLogs: method test_missing_id (line 162) | def test_missing_id(self, tool_fns): method test_successful_get (line 167) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_trello_tool.py function trello_tools (line 12) | def trello_tools(mcp: FastMCP, monkeypatch): class TestTrelloTools (line 20) | class TestTrelloTools: method test_missing_credentials_returns_error (line 21) | def test_missing_credentials_returns_error(self, mcp: FastMCP, monkeyp... method test_list_boards_success (line 32) | def test_list_boards_success(self, trello_tools, monkeypatch): method test_list_boards_limit_out_of_range (line 44) | def test_list_boards_limit_out_of_range(self, trello_tools): method test_create_card_requires_name (line 49) | def test_create_card_requires_name(self, trello_tools): method test_create_card_desc_too_long (line 53) | def test_create_card_desc_too_long(self, trello_tools): method test_add_comment_requires_text (line 59) | def test_add_comment_requires_text(self, trello_tools): method test_list_cards_limit_out_of_range (line 63) | def test_list_cards_limit_out_of_range(self, trello_tools): method test_rate_limit_error (line 68) | def test_rate_limit_error(self, trello_tools, monkeypatch): method test_get_member_success (line 78) | def test_get_member_success(self, trello_tools, monkeypatch): class TestTrelloClientErrorHandling (line 90) | class TestTrelloClientErrorHandling: method test_not_found (line 91) | def test_not_found(self, trello_tools, monkeypatch): FILE: tools/tests/tools/test_trello_tool_integration.py function test_list_boards_integration (line 15) | def test_list_boards_integration(): function test_get_member_integration (line 30) | def test_get_member_integration(): function test_list_lists_and_cards_integration (line 45) | def test_list_lists_and_cards_integration(): FILE: tools/tests/tools/test_twilio_tool.py function _mock_resp (line 16) | def _mock_resp(data, status_code=201): function tool_fns (line 25) | def tool_fns(mcp: FastMCP): class TestTwilioSendSms (line 31) | class TestTwilioSendSms: method test_missing_credentials (line 32) | def test_missing_credentials(self, tool_fns): method test_missing_params (line 37) | def test_missing_params(self, tool_fns): method test_successful_send (line 42) | def test_successful_send(self, tool_fns): class TestTwilioSendWhatsapp (line 69) | class TestTwilioSendWhatsapp: method test_successful_send (line 70) | def test_successful_send(self, tool_fns): class TestTwilioListMessages (line 96) | class TestTwilioListMessages: method test_missing_credentials (line 97) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 102) | def test_successful_list(self, tool_fns): class TestTwilioGetMessage (line 132) | class TestTwilioGetMessage: method test_missing_sid (line 133) | def test_missing_sid(self, tool_fns): method test_successful_get (line 138) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_twitter_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestTwitterSearchTweets (line 28) | class TestTwitterSearchTweets: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_missing_query (line 34) | def test_missing_query(self, tool_fns): method test_successful_search (line 39) | def test_successful_search(self, tool_fns): class TestTwitterGetUser (line 74) | class TestTwitterGetUser: method test_missing_username (line 75) | def test_missing_username(self, tool_fns): method test_successful_get (line 80) | def test_successful_get(self, tool_fns): class TestTwitterGetUserTweets (line 110) | class TestTwitterGetUserTweets: method test_missing_user_id (line 111) | def test_missing_user_id(self, tool_fns): method test_successful_get (line 116) | def test_successful_get(self, tool_fns): class TestTwitterGetTweet (line 147) | class TestTwitterGetTweet: method test_missing_id (line 148) | def test_missing_id(self, tool_fns): method test_successful_get (line 153) | def test_successful_get(self, tool_fns): FILE: tools/tests/tools/test_vercel_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestVercelListDeployments (line 20) | class TestVercelListDeployments: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_successful_list (line 26) | def test_successful_list(self, tool_fns): class TestVercelGetDeployment (line 51) | class TestVercelGetDeployment: method test_missing_id (line 52) | def test_missing_id(self, tool_fns): method test_successful_get (line 57) | def test_successful_get(self, tool_fns): class TestVercelListProjects (line 81) | class TestVercelListProjects: method test_successful_list (line 82) | def test_successful_list(self, tool_fns): class TestVercelListProjectDomains (line 106) | class TestVercelListProjectDomains: method test_missing_project_id (line 107) | def test_missing_project_id(self, tool_fns): method test_successful_list (line 112) | def test_successful_list(self, tool_fns): class TestVercelEnvVars (line 127) | class TestVercelEnvVars: method test_list_env_vars (line 128) | def test_list_env_vars(self, tool_fns): method test_create_env_var_missing_fields (line 145) | def test_create_env_var_missing_fields(self, tool_fns): method test_create_env_var_success (line 150) | def test_create_env_var_success(self, tool_fns): FILE: tools/tests/tools/test_vision_tool.py function mcp (line 16) | def mcp() -> FastMCP: function sample_image (line 22) | def sample_image(tmp_path: Path) -> Path: function large_file (line 34) | def large_file(tmp_path: Path) -> Path: function test_missing_credentials (line 44) | def test_missing_credentials(mcp: FastMCP): function test_credentials_from_env (line 57) | def test_credentials_from_env(mcp: FastMCP): function test_file_not_found (line 75) | def test_file_not_found(mcp: FastMCP): function test_file_too_large (line 87) | def test_file_too_large(mcp: FastMCP, large_file: Path): function test_directory_not_file (line 99) | def test_directory_not_file(mcp: FastMCP, tmp_path: Path): function test_detect_labels_success (line 114) | def test_detect_labels_success(mcp: FastMCP): function test_detect_text_success (line 141) | def test_detect_text_success(mcp: FastMCP): function test_detect_faces_success (line 169) | def test_detect_faces_success(mcp: FastMCP): function test_localize_objects_success (line 202) | def test_localize_objects_success(mcp: FastMCP): function test_detect_logos_success (line 236) | def test_detect_logos_success(mcp: FastMCP): function test_detect_landmarks_success (line 262) | def test_detect_landmarks_success(mcp: FastMCP): function test_image_properties_success (line 292) | def test_image_properties_success(mcp: FastMCP): function test_web_detection_success (line 329) | def test_web_detection_success(mcp: FastMCP): function test_safe_search_success (line 359) | def test_safe_search_success(mcp: FastMCP): function test_local_file_success (line 391) | def test_local_file_success(mcp: FastMCP, sample_image: Path): function test_api_error_401 (line 413) | def test_api_error_401(mcp: FastMCP): function test_api_error_403 (line 427) | def test_api_error_403(mcp: FastMCP): function test_api_error_429 (line 441) | def test_api_error_429(mcp: FastMCP): function test_timeout_error (line 455) | def test_timeout_error(mcp: FastMCP): function test_network_error (line 469) | def test_network_error(mcp: FastMCP): function test_empty_response (line 483) | def test_empty_response(mcp: FastMCP): function test_api_error_in_response (line 497) | def test_api_error_in_response(mcp: FastMCP): function test_max_labels_clamped (line 516) | def test_max_labels_clamped(mcp: FastMCP): function test_detect_text_no_text_found (line 535) | def test_detect_text_no_text_found(mcp: FastMCP): FILE: tools/tests/tools/test_web_scrape_tool.py function web_scrape_fn (line 12) | def web_scrape_fn(mcp: FastMCP): function _make_playwright_mocks (line 18) | def _make_playwright_mocks(html, status=200, final_url="https://example.... class TestWebScrapeTool (line 52) | class TestWebScrapeTool: method test_url_auto_prefixed_with_https (line 58) | async def test_url_auto_prefixed_with_https(self, mock_pw, mock_stealt... method test_max_length_clamped_low (line 72) | async def test_max_length_clamped_low(self, mock_pw, mock_stealth, web... method test_max_length_clamped_high (line 86) | async def test_max_length_clamped_high(self, mock_pw, mock_stealth, we... method test_valid_max_length_accepted (line 100) | async def test_valid_max_length_accepted(self, mock_pw, mock_stealth, ... method test_include_links_option (line 114) | async def test_include_links_option(self, mock_pw, mock_stealth, web_s... method test_selector_option (line 128) | async def test_selector_option(self, mock_pw, mock_stealth, web_scrape... class TestWebScrapeToolLinkConversion (line 140) | class TestWebScrapeToolLinkConversion: method test_relative_links_converted_to_absolute (line 146) | async def test_relative_links_converted_to_absolute(self, mock_pw, moc... method test_root_relative_links_converted (line 178) | async def test_root_relative_links_converted(self, mock_pw, mock_steal... method test_absolute_links_unchanged (line 206) | async def test_absolute_links_unchanged(self, mock_pw, mock_stealth, w... method test_links_after_redirects (line 234) | async def test_links_after_redirects(self, mock_pw, mock_stealth, web_... method test_fragment_links_preserved (line 268) | async def test_fragment_links_preserved(self, mock_pw, mock_stealth, w... method test_query_parameters_preserved (line 296) | async def test_query_parameters_preserved(self, mock_pw, mock_stealth,... method test_empty_href_skipped (line 325) | async def test_empty_href_skipped(self, mock_pw, mock_stealth, web_scr... class TestWebScrapeToolErrorHandling (line 354) | class TestWebScrapeToolErrorHandling: method test_http_error_returns_without_waiting (line 360) | async def test_http_error_returns_without_waiting(self, mock_pw, mock_... method test_null_response_returns_error (line 374) | async def test_null_response_returns_error(self, mock_pw, mock_stealth... method test_non_html_content_type_skipped (line 388) | async def test_non_html_content_type_skipped(self, mock_pw, mock_steal... class TestWebScrapeToolRobotsTxt (line 401) | class TestWebScrapeToolRobotsTxt: method test_blocked_by_robots_txt (line 408) | async def test_blocked_by_robots_txt(self, mock_rp_cls, mock_pw, mock_... method test_robots_txt_disabled (line 423) | async def test_robots_txt_disabled(self, mock_rp_cls, mock_pw, mock_st... FILE: tools/tests/tools/test_web_search_tool.py function web_search_fn (line 10) | def web_search_fn(mcp: FastMCP): class TestWebSearchTool (line 16) | class TestWebSearchTool: method test_no_credentials_returns_error (line 19) | def test_no_credentials_returns_error(self, web_search_fn, monkeypatch): method test_empty_query_returns_error (line 31) | def test_empty_query_returns_error(self, web_search_fn, monkeypatch): method test_long_query_returns_error (line 40) | def test_long_query_returns_error(self, web_search_fn, monkeypatch): class TestBraveProvider (line 49) | class TestBraveProvider: method test_brave_missing_api_key (line 52) | def test_brave_missing_api_key(self, web_search_fn, monkeypatch): method test_brave_explicit_provider (line 62) | def test_brave_explicit_provider(self, web_search_fn, monkeypatch): class TestGoogleProvider (line 71) | class TestGoogleProvider: method test_google_missing_api_key (line 74) | def test_google_missing_api_key(self, web_search_fn, monkeypatch): method test_google_missing_cse_id (line 84) | def test_google_missing_cse_id(self, web_search_fn, monkeypatch): method test_google_explicit_provider (line 94) | def test_google_explicit_provider(self, web_search_fn, monkeypatch): class TestAutoProvider (line 103) | class TestAutoProvider: method test_auto_prefers_brave_for_backward_compatibility (line 106) | def test_auto_prefers_brave_for_backward_compatibility(self, web_searc... method test_auto_falls_back_to_google (line 115) | def test_auto_falls_back_to_google(self, web_search_fn, monkeypatch): method test_default_provider_is_auto (line 124) | def test_default_provider_is_auto(self, web_search_fn, monkeypatch): class TestParameters (line 132) | class TestParameters: method test_custom_language_and_country (line 135) | def test_custom_language_and_country(self, web_search_fn, monkeypatch): method test_num_results_parameter (line 142) | def test_num_results_parameter(self, web_search_fn, monkeypatch): FILE: tools/tests/tools/test_wikipedia_tool.py function mcp (line 10) | def mcp(): function tool_func (line 15) | def tool_func(mcp): function test_search_wikipedia_success (line 48) | def test_search_wikipedia_success(tool_func): function test_search_wikipedia_empty_query (line 85) | def test_search_wikipedia_empty_query(tool_func): function test_search_wikipedia_api_error (line 91) | def test_search_wikipedia_api_error(tool_func): function test_search_wikipedia_timeout (line 102) | def test_search_wikipedia_timeout(tool_func): FILE: tools/tests/tools/test_yahoo_finance_tool.py function tool_fns (line 13) | def tool_fns(mcp: FastMCP): function _mock_yf (line 19) | def _mock_yf(): class TestYahooFinanceQuote (line 27) | class TestYahooFinanceQuote: method test_empty_symbol (line 28) | def test_empty_symbol(self, tool_fns): method test_successful_quote (line 32) | def test_successful_quote(self, tool_fns): class TestYahooFinanceHistory (line 62) | class TestYahooFinanceHistory: method test_empty_symbol (line 63) | def test_empty_symbol(self, tool_fns): method test_successful_history (line 67) | def test_successful_history(self, tool_fns): class TestYahooFinanceInfo (line 95) | class TestYahooFinanceInfo: method test_empty_symbol (line 96) | def test_empty_symbol(self, tool_fns): method test_successful_info (line 100) | def test_successful_info(self, tool_fns): class TestYahooFinanceSearch (line 124) | class TestYahooFinanceSearch: method test_empty_query (line 125) | def test_empty_query(self, tool_fns): method test_successful_search (line 129) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_youtube_tool.py function tool_fns (line 12) | def tool_fns(mcp: FastMCP): class TestYoutubeSearchVideos (line 19) | class TestYoutubeSearchVideos: method test_missing_api_key (line 22) | def test_missing_api_key(self, tool_fns): method test_empty_query (line 28) | def test_empty_query(self, tool_fns): method test_successful_search (line 34) | def test_successful_search(self, tool_fns): method test_max_results_clamped (line 64) | def test_max_results_clamped(self, tool_fns): class TestYoutubeGetVideoDetails (line 76) | class TestYoutubeGetVideoDetails: method test_missing_video_ids (line 79) | def test_missing_video_ids(self, tool_fns): method test_successful_details (line 84) | def test_successful_details(self, tool_fns): class TestYoutubeGetChannel (line 123) | class TestYoutubeGetChannel: method test_no_identifier (line 126) | def test_no_identifier(self, tool_fns): method test_channel_not_found (line 132) | def test_channel_not_found(self, tool_fns): method test_successful_channel (line 143) | def test_successful_channel(self, tool_fns): class TestYoutubeGetPlaylist (line 177) | class TestYoutubeGetPlaylist: method test_missing_playlist_id (line 180) | def test_missing_playlist_id(self, tool_fns): method test_playlist_not_found (line 185) | def test_playlist_not_found(self, tool_fns): class TestYoutubeGetVideoComments (line 196) | class TestYoutubeGetVideoComments: method test_missing_video_id (line 199) | def test_missing_video_id(self, tool_fns): method test_successful_comments (line 204) | def test_successful_comments(self, tool_fns): class TestParseDuration (line 236) | class TestParseDuration: method test_hours_minutes_seconds (line 239) | def test_hours_minutes_seconds(self): method test_minutes_only (line 244) | def test_minutes_only(self): method test_seconds_only (line 249) | def test_seconds_only(self): method test_empty_string (line 254) | def test_empty_string(self): FILE: tools/tests/tools/test_youtube_transcript_tool.py function tool_fns (line 13) | def tool_fns(mcp: FastMCP): function _make_mock_module (line 19) | def _make_mock_module(mock_api_class): class TestYoutubeGetTranscript (line 26) | class TestYoutubeGetTranscript: method test_missing_video_id (line 27) | def test_missing_video_id(self, tool_fns): method test_successful_get (line 31) | def test_successful_get(self, tool_fns): method test_video_not_found (line 54) | def test_video_not_found(self, tool_fns): class TestYoutubeListTranscripts (line 66) | class TestYoutubeListTranscripts: method test_missing_video_id (line 67) | def test_missing_video_id(self, tool_fns): method test_successful_list (line 71) | def test_successful_list(self, tool_fns): FILE: tools/tests/tools/test_zendesk_tool.py function _mock_resp (line 17) | def _mock_resp(data, status_code=200): function tool_fns (line 26) | def tool_fns(mcp: FastMCP): class TestZendeskListTickets (line 47) | class TestZendeskListTickets: method test_missing_credentials (line 48) | def test_missing_credentials(self, tool_fns): method test_successful_list (line 53) | def test_successful_list(self, tool_fns): class TestZendeskGetTicket (line 68) | class TestZendeskGetTicket: method test_missing_id (line 69) | def test_missing_id(self, tool_fns): method test_successful_get (line 74) | def test_successful_get(self, tool_fns): class TestZendeskCreateTicket (line 89) | class TestZendeskCreateTicket: method test_missing_params (line 90) | def test_missing_params(self, tool_fns): method test_successful_create (line 95) | def test_successful_create(self, tool_fns): class TestZendeskUpdateTicket (line 110) | class TestZendeskUpdateTicket: method test_missing_id (line 111) | def test_missing_id(self, tool_fns): method test_successful_update (line 116) | def test_successful_update(self, tool_fns): class TestZendeskSearchTickets (line 132) | class TestZendeskSearchTickets: method test_missing_query (line 133) | def test_missing_query(self, tool_fns): method test_successful_search (line 138) | def test_successful_search(self, tool_fns): FILE: tools/tests/tools/test_zoho_crm_tool.py function tool_fns (line 14) | def tool_fns(mcp: FastMCP): class TestZohoCrmListRecords (line 20) | class TestZohoCrmListRecords: method test_missing_token (line 21) | def test_missing_token(self, tool_fns): method test_missing_module (line 26) | def test_missing_module(self, tool_fns): method test_successful_list (line 31) | def test_successful_list(self, tool_fns): class TestZohoCrmGetRecord (line 50) | class TestZohoCrmGetRecord: method test_missing_params (line 51) | def test_missing_params(self, tool_fns): method test_successful_get (line 56) | def test_successful_get(self, tool_fns): class TestZohoCrmCreateRecord (line 71) | class TestZohoCrmCreateRecord: method test_missing_data (line 72) | def test_missing_data(self, tool_fns): method test_successful_create (line 77) | def test_successful_create(self, tool_fns): class TestZohoCrmSearchRecords (line 101) | class TestZohoCrmSearchRecords: method test_no_search_params (line 102) | def test_no_search_params(self, tool_fns): method test_successful_search (line 107) | def test_successful_search(self, tool_fns): class TestZohoCrmListModules (line 122) | class TestZohoCrmListModules: method test_successful_list (line 123) | def test_successful_list(self, tool_fns): class TestZohoCrmAddNote (line 146) | class TestZohoCrmAddNote: method test_missing_content (line 147) | def test_missing_content(self, tool_fns): method test_successful_add (line 154) | def test_successful_add(self, tool_fns): FILE: tools/tests/tools/test_zoom_tool.py function _mock_resp (line 13) | def _mock_resp(data, status_code=200): function tool_fns (line 22) | def tool_fns(mcp: FastMCP): class TestZoomGetUser (line 28) | class TestZoomGetUser: method test_missing_credentials (line 29) | def test_missing_credentials(self, tool_fns): method test_successful_get (line 34) | def test_successful_get(self, tool_fns): class TestZoomListMeetings (line 57) | class TestZoomListMeetings: method test_successful_list (line 58) | def test_successful_list(self, tool_fns): method test_pagination (line 86) | def test_pagination(self, tool_fns): class TestZoomGetMeeting (line 113) | class TestZoomGetMeeting: method test_missing_id (line 114) | def test_missing_id(self, tool_fns): method test_successful_get (line 119) | def test_successful_get(self, tool_fns): class TestZoomCreateMeeting (line 153) | class TestZoomCreateMeeting: method test_missing_topic (line 154) | def test_missing_topic(self, tool_fns): method test_successful_create (line 159) | def test_successful_create(self, tool_fns): class TestZoomDeleteMeeting (line 187) | class TestZoomDeleteMeeting: method test_missing_id (line 188) | def test_missing_id(self, tool_fns): method test_successful_delete (line 193) | def test_successful_delete(self, tool_fns): class TestZoomListRecordings (line 205) | class TestZoomListRecordings: method test_missing_dates (line 206) | def test_missing_dates(self, tool_fns): method test_successful_list (line 211) | def test_successful_list(self, tool_fns): FILE: tools/top_salaries.py function main (line 25) | def main():