SYMBOL INDEX (297 symbols across 45 files) FILE: agent/encryption.py class EncryptionKeyMissingError (line 11) | class EncryptionKeyMissingError(ValueError): function _get_encryption_key (line 15) | def _get_encryption_key() -> bytes: function encrypt_token (line 34) | def encrypt_token(token: str) -> str: function decrypt_token (line 52) | def decrypt_token(encrypted_token: str) -> str: FILE: agent/integrations/daytona.py function create_daytona_sandbox (line 10) | def create_daytona_sandbox(sandbox_id: str | None = None): FILE: agent/integrations/langsmith.py function _get_langsmith_api_key (line 25) | def _get_langsmith_api_key() -> str | None: function _get_sandbox_template_config (line 34) | def _get_sandbox_template_config() -> tuple[str | None, str | None]: function create_langsmith_sandbox (line 46) | def create_langsmith_sandbox( function _update_thread_sandbox_metadata (line 75) | def _update_thread_sandbox_metadata(sandbox_id: str) -> None: class SandboxProvider (line 106) | class SandboxProvider(ABC): method get_or_create (line 110) | def get_or_create( method delete (line 120) | def delete( class LangSmithBackend (line 135) | class LangSmithBackend(BaseSandbox): method __init__ (line 142) | def __init__(self, sandbox: Sandbox) -> None: method id (line 147) | def id(self) -> str: method execute (line 151) | def execute(self, command: str, *, timeout: int | None = None) -> Exec... method write (line 176) | def write(self, file_path: str, content: str) -> WriteResult: method download_files (line 189) | def download_files(self, paths: list[str]) -> list[FileDownloadResponse]: method upload_files (line 197) | def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUpl... class LangSmithProvider (line 206) | class LangSmithProvider(SandboxProvider): method __init__ (line 212) | def __init__(self, api_key: str | None = None) -> None: method get_or_create (line 221) | def get_or_create( method delete (line 273) | def delete(self, *, sandbox_id: str, **kwargs: Any) -> None: method _resolve_template (line 278) | def _resolve_template( method _ensure_template (line 293) | def _ensure_template( FILE: agent/integrations/local.py function create_local_sandbox (line 6) | def create_local_sandbox(sandbox_id: str | None = None): FILE: agent/integrations/modal.py function create_modal_sandbox (line 9) | def create_modal_sandbox(sandbox_id: str | None = None): FILE: agent/integrations/runloop.py function create_runloop_sandbox (line 7) | def create_runloop_sandbox(sandbox_id: str | None = None): FILE: agent/middleware/check_message_queue.py class LinearNotifyState (line 23) | class LinearNotifyState(AgentState): function _build_blocks_from_payload (line 29) | async def _build_blocks_from_payload( function check_message_queue_before_model (line 49) | async def check_message_queue_before_model( # noqa: PLR0911 FILE: agent/middleware/ensure_no_empty_msg.py function get_every_message_since_last_human (line 9) | def get_every_message_since_last_human(state: AgentState) -> list[AnyMes... function check_if_model_already_called_commit_and_open_pr (line 19) | def check_if_model_already_called_commit_and_open_pr(messages: list[AnyM... function check_if_model_messaged_user (line 26) | def check_if_model_messaged_user(messages: list[AnyMessage]) -> bool: function check_if_confirming_completion (line 37) | def check_if_confirming_completion(messages: list[AnyMessage]) -> bool: function check_if_no_op (line 44) | def check_if_no_op(messages: list[AnyMessage]) -> bool: function ensure_no_empty_msg (line 52) | def ensure_no_empty_msg(state: AgentState, runtime: Runtime) -> dict[str... FILE: agent/middleware/open_pr.py function _extract_pr_params_from_messages (line 39) | def _extract_pr_params_from_messages(messages: list) -> dict[str, Any] |... function open_pr_if_needed (line 60) | async def open_pr_if_needed( FILE: agent/middleware/tool_error_handler.py function _get_name (line 24) | def _get_name(candidate: object) -> str | None: function _extract_tool_name (line 36) | def _extract_tool_name(request: ToolCallRequest | None) -> str | None: function _to_error_payload (line 46) | def _to_error_payload(e: Exception, request: ToolCallRequest | None = No... function _get_tool_call_id (line 58) | def _get_tool_call_id(request: ToolCallRequest) -> str | None: class ToolErrorMiddleware (line 64) | class ToolErrorMiddleware(AgentMiddleware): method wrap_tool_call (line 74) | def wrap_tool_call( method awrap_tool_call (line 90) | async def awrap_tool_call( FILE: agent/prompt.py function construct_system_prompt (line 280) | def construct_system_prompt( FILE: agent/server.py function _clone_or_pull_repo_in_sandbox (line 67) | async def _clone_or_pull_repo_in_sandbox( # noqa: PLR0915 function _recreate_sandbox (line 175) | async def _recreate_sandbox( function _wait_for_sandbox_id (line 204) | async def _wait_for_sandbox_id(thread_id: str) -> str: function graph_loaded_for_execution (line 225) | def graph_loaded_for_execution(config: RunnableConfig) -> bool: function get_agent (line 237) | async def get_agent(config: RunnableConfig) -> Pregel: # noqa: PLR0915 FILE: agent/tools/commit_and_open_pr.py function commit_and_open_pr (line 27) | def commit_and_open_pr( FILE: agent/tools/fetch_url.py function fetch_url (line 7) | def fetch_url(url: str, timeout: int = 30) -> dict[str, Any]: FILE: agent/tools/github_comment.py function github_comment (line 10) | def github_comment(message: str, issue_number: int) -> dict[str, Any]: FILE: agent/tools/http_request.py function _is_url_safe (line 9) | def _is_url_safe(url: str) -> tuple[bool, str]: function _blocked_response (line 37) | def _blocked_response(url: str, reason: str) -> dict[str, Any]: function http_request (line 47) | def http_request( FILE: agent/tools/linear_comment.py function linear_comment (line 7) | def linear_comment(comment_body: str, ticket_id: str) -> dict[str, Any]: FILE: agent/tools/slack_thread_reply.py function slack_thread_reply (line 9) | def slack_thread_reply(message: str) -> dict[str, Any]: FILE: agent/utils/agents_md.py function read_agents_md_in_sandbox (line 14) | async def read_agents_md_in_sandbox( FILE: agent/utils/auth.py function is_bot_token_only_mode (line 44) | def is_bot_token_only_mode() -> bool: function _retry_instruction (line 55) | def _retry_instruction(source: str) -> str: function _source_account_label (line 61) | def _source_account_label(source: str) -> str: function _auth_link_text (line 67) | def _auth_link_text(source: str, auth_url: str) -> str: function _work_item_label (line 73) | def _work_item_label(source: str) -> str: function get_secret_key_for_user (line 79) | def get_secret_key_for_user( function get_ls_user_id_from_email (line 96) | async def get_ls_user_id_from_email(email: str) -> dict[str, str | None]: function get_github_token_for_user (line 125) | async def get_github_token_for_user(ls_user_id: str, tenant_id: str) -> ... function resolve_github_token_from_email (line 175) | async def resolve_github_token_from_email(email: str) -> dict[str, Any]: function leave_failure_comment (line 203) | async def leave_failure_comment( function persist_encrypted_github_token (line 268) | async def persist_encrypted_github_token(thread_id: str, token: str) -> ... function save_encrypted_token_from_email (line 278) | async def save_encrypted_token_from_email( function _resolve_bot_installation_token (line 344) | async def _resolve_bot_installation_token(thread_id: str) -> tuple[str, ... function resolve_github_token (line 360) | async def resolve_github_token(config: RunnableConfig, thread_id: str) -... FILE: agent/utils/comments.py function get_recent_comments (line 9) | def get_recent_comments( FILE: agent/utils/github.py function _run_git (line 18) | def _run_git( function is_valid_git_repo (line 25) | def is_valid_git_repo(sandbox_backend: SandboxBackendProtocol, repo_dir:... function remove_directory (line 33) | def remove_directory(sandbox_backend: SandboxBackendProtocol, repo_dir: ... function git_has_uncommitted_changes (line 40) | def git_has_uncommitted_changes(sandbox_backend: SandboxBackendProtocol,... function git_fetch_origin (line 46) | def git_fetch_origin(sandbox_backend: SandboxBackendProtocol, repo_dir: ... function git_has_unpushed_commits (line 51) | def git_has_unpushed_commits(sandbox_backend: SandboxBackendProtocol, re... function git_current_branch (line 61) | def git_current_branch(sandbox_backend: SandboxBackendProtocol, repo_dir... function git_checkout_branch (line 67) | def git_checkout_branch( function git_config_user (line 82) | def git_config_user( function git_add_all (line 95) | def git_add_all(sandbox_backend: SandboxBackendProtocol, repo_dir: str) ... function git_commit (line 100) | def git_commit( function git_get_remote_url (line 108) | def git_get_remote_url(sandbox_backend: SandboxBackendProtocol, repo_dir... function setup_git_credentials (line 119) | def setup_git_credentials(sandbox_backend: SandboxBackendProtocol, githu... function cleanup_git_credentials (line 129) | def cleanup_git_credentials(sandbox_backend: SandboxBackendProtocol) -> ... function _git_with_credentials (line 134) | def _git_with_credentials( function git_push (line 144) | def git_push( function create_github_pr (line 161) | async def create_github_pr( function _find_existing_pr (line 249) | async def _find_existing_pr( function get_github_default_branch (line 279) | async def get_github_default_branch( FILE: agent/utils/github_app.py function _generate_app_jwt (line 19) | def _generate_app_jwt() -> str: function get_github_app_installation_token (line 31) | async def get_github_app_installation_token() -> str | None: FILE: agent/utils/github_comments.py function verify_github_signature (line 32) | def verify_github_signature(body: bytes, signature: str, *, secret: str)... function get_thread_id_from_branch (line 51) | def get_thread_id_from_branch(branch_name: str) -> str | None: function sanitize_github_comment_body (line 60) | def sanitize_github_comment_body(body: str) -> str: function format_github_comment_body_for_prompt (line 74) | def format_github_comment_body_for_prompt(author: str, body: str) -> str: function react_to_github_comment (line 87) | async def react_to_github_comment( function _react_via_graphql (line 125) | async def _react_via_graphql(node_id: str | None, *, token: str) -> bool: function post_github_comment (line 155) | async def post_github_comment( function fetch_issue_comments (line 183) | async def fetch_issue_comments( function fetch_pr_comments_since_last_tag (line 214) | async def fetch_pr_comments_since_last_tag( function fetch_pr_branch (line 321) | async def fetch_pr_branch( function extract_pr_context (line 358) | async def extract_pr_context( function build_pr_prompt (line 386) | def build_pr_prompt(comments: list[dict[str, Any]], pr_url: str) -> str: function _fetch_paginated (line 415) | async def _fetch_paginated( FILE: agent/utils/github_token.py function _read_encrypted_github_token (line 21) | def _read_encrypted_github_token(metadata: dict[str, Any]) -> str | None: function _decrypt_github_token (line 26) | def _decrypt_github_token(encrypted_token: str | None) -> str | None: function get_github_token (line 33) | def get_github_token() -> str | None: function get_github_token_from_thread (line 39) | async def get_github_token_from_thread(thread_id: str) -> tuple[str | No... FILE: agent/utils/langsmith.py function _compose_langsmith_url_base (line 11) | def _compose_langsmith_url_base() -> str: function get_langsmith_trace_url (line 23) | def get_langsmith_trace_url(run_id: str) -> str | None: FILE: agent/utils/linear.py function comment_on_linear_issue (line 17) | async def comment_on_linear_issue( function post_linear_trace_comment (line 70) | async def post_linear_trace_comment(issue_id: str, run_id: str, triggeri... FILE: agent/utils/messages.py function extract_text_content (line 8) | def extract_text_content(content: str | list[ContentBlock]) -> str: FILE: agent/utils/model.py function make_model (line 6) | def make_model(model_id: str, **kwargs: dict): FILE: agent/utils/multimodal.py function extract_image_urls (line 25) | def extract_image_urls(text: str) -> list[str]: function fetch_image_block (line 40) | async def fetch_image_block( function dedupe_urls (line 102) | def dedupe_urls(urls: list[str]) -> list[str]: FILE: agent/utils/repo.py function extract_repo_from_text (line 11) | def extract_repo_from_text(text: str, default_owner: str | None = None) ... FILE: agent/utils/sandbox.py function create_sandbox (line 18) | def create_sandbox(sandbox_id: str | None = None): FILE: agent/utils/sandbox_paths.py function resolve_repo_dir (line 20) | def resolve_repo_dir(sandbox_backend: SandboxBackendProtocol, repo_name:... function aresolve_repo_dir (line 29) | async def aresolve_repo_dir(sandbox_backend: SandboxBackendProtocol, rep... function resolve_sandbox_work_dir (line 34) | def resolve_sandbox_work_dir(sandbox_backend: SandboxBackendProtocol) ->... function aresolve_sandbox_work_dir (line 53) | async def aresolve_sandbox_work_dir(sandbox_backend: SandboxBackendProto... function _iter_work_dir_candidates (line 58) | def _iter_work_dir_candidates( function _iter_provider_paths (line 88) | def _iter_provider_paths( function _iter_path_providers (line 99) | def _iter_path_providers(sandbox_backend: SandboxBackendProtocol) -> Ite... function _call_path_method (line 107) | def _call_path_method(provider: Any, method_name: str) -> str | None: function _resolve_shell_path (line 119) | def _resolve_shell_path( function _normalize_path (line 129) | def _normalize_path(raw_path: str | None) -> str | None: function _is_writable_directory (line 140) | def _is_writable_directory( function _cache_work_dir (line 149) | def _cache_work_dir(sandbox_backend: SandboxBackendProtocol, work_dir: s... FILE: agent/utils/sandbox_state.py function get_sandbox_id_from_metadata (line 19) | async def get_sandbox_id_from_metadata(thread_id: str) -> str | None: function get_sandbox_backend (line 29) | async def get_sandbox_backend(thread_id: str) -> Any | None: function get_sandbox_backend_sync (line 44) | def get_sandbox_backend_sync(thread_id: str) -> Any | None: FILE: agent/utils/slack.py function _slack_headers (line 23) | def _slack_headers() -> dict[str, str]: function _parse_ts (line 32) | def _parse_ts(ts: str | None) -> float: function _extract_slack_user_name (line 39) | def _extract_slack_user_name(user: dict[str, Any]) -> str: function replace_bot_mention_with_username (line 60) | def replace_bot_mention_with_username(text: str, bot_user_id: str, bot_u... function verify_slack_signature (line 69) | def verify_slack_signature( function strip_bot_mention (line 97) | def strip_bot_mention(text: str, bot_user_id: str, bot_username: str = "... function select_slack_context_messages (line 109) | def select_slack_context_messages( function format_slack_messages_for_prompt (line 144) | def format_slack_messages_for_prompt( function post_slack_thread_reply (line 179) | async def post_slack_thread_reply(channel_id: str, thread_ts: str, text:... function post_slack_ephemeral_message (line 208) | async def post_slack_ephemeral_message( function add_slack_reaction (line 241) | async def add_slack_reaction(channel_id: str, message_ts: str, emoji: st... function get_slack_user_info (line 272) | async def get_slack_user_info(user_id: str) -> dict[str, Any] | None: function get_slack_user_names (line 297) | async def get_slack_user_names(user_ids: list[str]) -> dict[str, str]: function fetch_slack_thread_messages (line 317) | async def fetch_slack_thread_messages(channel_id: str, thread_ts: str) -... function post_slack_trace_reply (line 362) | async def post_slack_trace_reply(channel_id: str, thread_ts: str, run_id... FILE: agent/webapp.py function get_repo_config_from_team_mapping (line 98) | def get_repo_config_from_team_mapping( function react_to_linear_comment (line 123) | async def react_to_linear_comment(comment_id: str, emoji: str = "👀") -> ... function fetch_linear_issue_details (line 166) | async def fetch_linear_issue_details(issue_id: str) -> dict[str, Any] | ... function generate_thread_id_from_issue (line 234) | def generate_thread_id_from_issue(issue_id: str) -> str: function generate_thread_id_from_github_issue (line 250) | def generate_thread_id_from_github_issue(issue_id: str) -> str: function generate_thread_id_from_slack_thread (line 259) | def generate_thread_id_from_slack_thread(channel_id: str, thread_id: str... function _extract_repo_config_from_thread (line 266) | def _extract_repo_config_from_thread(thread: dict[str, Any]) -> dict[str... function _is_not_found_error (line 287) | def _is_not_found_error(exc: Exception) -> bool: function _is_repo_org_allowed (line 292) | def _is_repo_org_allowed(repo_config: dict[str, str]) -> bool: function _upsert_slack_thread_repo_metadata (line 304) | async def _upsert_slack_thread_repo_metadata( function check_if_using_repo_msg_sent (line 330) | async def check_if_using_repo_msg_sent( function get_slack_repo_config (line 340) | async def get_slack_repo_config(message: str, channel_id: str, thread_ts... function is_thread_active (line 372) | async def is_thread_active(thread_id: str) -> bool: function _thread_exists (line 403) | async def _thread_exists(thread_id: str) -> bool: function queue_message_for_thread (line 416) | async def queue_message_for_thread( function process_linear_issue (line 463) | async def process_linear_issue( # noqa: PLR0912, PLR0915 function process_slack_mention (line 685) | async def process_slack_mention(event_data: dict[str, Any], repo_config:... function verify_linear_signature (line 838) | def verify_linear_signature(body: bytes, signature: str, secret: str) ->... function linear_webhook (line 859) | async def linear_webhook( # noqa: PLR0911, PLR0912, PLR0915 function linear_webhook_verify (line 986) | async def linear_webhook_verify() -> dict[str, str]: function slack_webhook (line 992) | async def slack_webhook(request: Request, background_tasks: BackgroundTa... function slack_webhook_verify (line 1087) | async def slack_webhook_verify() -> dict[str, str]: function health_check (line 1093) | async def health_check() -> dict[str, str]: function _build_github_issue_comments_text (line 1104) | def _build_github_issue_comments_text(comments: list[dict[str, Any]]) ->... function build_github_issue_prompt (line 1119) | def build_github_issue_prompt( function build_github_issue_followup_prompt (line 1148) | def build_github_issue_followup_prompt(github_login: str, comment_body: ... function build_github_issue_update_prompt (line 1155) | def build_github_issue_update_prompt(github_login: str, title: str, body... function _trigger_or_queue_run (line 1166) | async def _trigger_or_queue_run( function _get_or_resolve_thread_github_token (line 1201) | async def _get_or_resolve_thread_github_token(thread_id: str, email: str... function process_github_pr_comment (line 1234) | async def process_github_pr_comment(payload: dict[str, Any], event_type:... function process_github_issue (line 1327) | async def process_github_issue(payload: dict[str, Any], event_type: str)... function github_webhook (line 1445) | async def github_webhook(request: Request, background_tasks: BackgroundT... FILE: tests/test_auth_sources.py function test_leave_failure_comment_posts_to_slack_thread (line 10) | def test_leave_failure_comment_posts_to_slack_thread( function test_leave_failure_comment_falls_back_to_slack_thread_when_ephemeral_fails (line 53) | def test_leave_failure_comment_falls_back_to_slack_thread_when_ephemeral... FILE: tests/test_ensure_no_empty_msg.py class TestGetEveryMessageSinceLastHuman (line 14) | class TestGetEveryMessageSinceLastHuman: method test_returns_messages_after_last_human (line 15) | def test_returns_messages_after_last_human(self) -> None: method test_returns_all_messages_when_no_human (line 30) | def test_returns_all_messages_when_no_human(self) -> None: method test_returns_empty_when_human_is_last (line 44) | def test_returns_empty_when_human_is_last(self) -> None: method test_returns_multiple_messages_after_human (line 56) | def test_returns_multiple_messages_after_human(self) -> None: class TestCheckIfModelAlreadyCalledCommitAndOpenPr (line 74) | class TestCheckIfModelAlreadyCalledCommitAndOpenPr: method test_returns_true_when_commit_and_open_pr_called (line 75) | def test_returns_true_when_commit_and_open_pr_called(self) -> None: method test_returns_false_when_not_called (line 83) | def test_returns_false_when_not_called(self) -> None: method test_returns_false_for_empty_list (line 91) | def test_returns_false_for_empty_list(self) -> None: method test_ignores_non_tool_messages (line 94) | def test_ignores_non_tool_messages(self) -> None: class TestCheckIfModelMessagedUser (line 103) | class TestCheckIfModelMessagedUser: method test_returns_true_for_slack_thread_reply (line 104) | def test_returns_true_for_slack_thread_reply(self) -> None: method test_returns_true_for_linear_comment (line 111) | def test_returns_true_for_linear_comment(self) -> None: method test_returns_true_for_github_comment (line 118) | def test_returns_true_for_github_comment(self) -> None: method test_returns_false_for_other_tools (line 125) | def test_returns_false_for_other_tools(self) -> None: method test_returns_false_for_empty_list (line 133) | def test_returns_false_for_empty_list(self) -> None: class TestCheckIfConfirmingCompletion (line 137) | class TestCheckIfConfirmingCompletion: method test_returns_true_when_confirming_completion_called (line 138) | def test_returns_true_when_confirming_completion_called(self) -> None: method test_returns_false_for_other_tools (line 145) | def test_returns_false_for_other_tools(self) -> None: method test_returns_false_for_empty_list (line 152) | def test_returns_false_for_empty_list(self) -> None: method test_finds_confirming_completion_among_other_messages (line 155) | def test_finds_confirming_completion_among_other_messages(self) -> None: class TestEnsureNoEmptyMsgCommitAndNotify (line 166) | class TestEnsureNoEmptyMsgCommitAndNotify: method _make_runtime (line 169) | def _make_runtime(self) -> MagicMock: method test_returns_none_when_pr_opened_and_user_messaged (line 172) | def test_returns_none_when_pr_opened_and_user_messaged(self) -> None: method test_returns_none_with_linear_comment_instead_of_slack (line 187) | def test_returns_none_with_linear_comment_instead_of_slack(self) -> None: method test_returns_none_with_github_comment_instead_of_slack (line 202) | def test_returns_none_with_github_comment_instead_of_slack(self) -> None: method test_injects_no_op_when_only_pr_opened_but_user_not_messaged (line 217) | def test_injects_no_op_when_only_pr_opened_but_user_not_messaged(self)... method test_injects_no_op_when_only_user_messaged_but_no_pr (line 233) | def test_injects_no_op_when_only_user_messaged_but_no_pr(self) -> None: FILE: tests/test_github_comment_prompts.py function test_build_pr_prompt_wraps_external_comments_without_trust_section (line 8) | def test_build_pr_prompt_wraps_external_comments_without_trust_section()... function test_construct_system_prompt_includes_untrusted_comment_guidance (line 26) | def test_construct_system_prompt_includes_untrusted_comment_guidance() -... function test_build_pr_prompt_sanitizes_reserved_tags_from_comment_body (line 34) | def test_build_pr_prompt_sanitizes_reserved_tags_from_comment_body() -> ... function test_build_github_issue_prompt_only_wraps_external_comments (line 55) | def test_build_github_issue_prompt_only_wraps_external_comments() -> None: FILE: tests/test_github_issue_webhook.py function _sign_body (line 16) | def _sign_body(body: bytes, secret: str = _TEST_WEBHOOK_SECRET) -> str: function _post_github_webhook (line 22) | def _post_github_webhook(client: TestClient, event_type: str, payload: d... function test_generate_thread_id_from_github_issue_is_deterministic (line 36) | def test_generate_thread_id_from_github_issue_is_deterministic() -> None: function test_build_github_issue_prompt_includes_issue_context (line 44) | def test_build_github_issue_prompt_includes_issue_context() -> None: function test_build_github_issue_followup_prompt_only_includes_comment (line 61) | def test_build_github_issue_followup_prompt_only_includes_comment() -> N... function test_github_webhook_accepts_issue_events (line 69) | def test_github_webhook_accepts_issue_events(monkeypatch) -> None: function test_github_webhook_ignores_issue_events_without_body_or_title_change (line 101) | def test_github_webhook_ignores_issue_events_without_body_or_title_chang... function test_github_webhook_accepts_issue_comment_events (line 134) | def test_github_webhook_accepts_issue_comment_events(monkeypatch) -> None: function test_process_github_issue_uses_resolved_user_token_for_reaction (line 161) | def test_process_github_issue_uses_resolved_user_token_for_reaction(monk... function test_process_github_issue_existing_thread_uses_followup_prompt (line 238) | def test_process_github_issue_existing_thread_uses_followup_prompt(monke... FILE: tests/test_multimodal.py function test_extract_image_urls_empty (line 6) | def test_extract_image_urls_empty() -> None: function test_extract_image_urls_markdown_and_direct_dedupes (line 10) | def test_extract_image_urls_markdown_and_direct_dedupes() -> None: function test_extract_image_urls_ignores_non_images (line 22) | def test_extract_image_urls_ignores_non_images() -> None: function test_extract_image_urls_markdown_syntax (line 28) | def test_extract_image_urls_markdown_syntax() -> None: function test_extract_image_urls_direct_links (line 34) | def test_extract_image_urls_direct_links() -> None: function test_extract_image_urls_various_formats (line 43) | def test_extract_image_urls_various_formats() -> None: function test_extract_image_urls_with_query_params (line 64) | def test_extract_image_urls_with_query_params() -> None: function test_extract_image_urls_case_insensitive (line 70) | def test_extract_image_urls_case_insensitive() -> None: function test_extract_image_urls_deduplication (line 79) | def test_extract_image_urls_deduplication() -> None: function test_extract_image_urls_mixed_markdown_and_direct (line 85) | def test_extract_image_urls_mixed_markdown_and_direct() -> None: FILE: tests/test_recent_comments.py function test_get_recent_comments_returns_none_for_empty (line 4) | def test_get_recent_comments_returns_none_for_empty() -> None: function test_get_recent_comments_returns_none_when_newest_is_bot_message (line 8) | def test_get_recent_comments_returns_none_when_newest_is_bot_message() -... function test_get_recent_comments_collects_since_last_bot_message (line 17) | def test_get_recent_comments_collects_since_last_bot_message() -> None: FILE: tests/test_repo_extraction.py class TestExtractRepoFromText (line 11) | class TestExtractRepoFromText: method test_repo_colon_with_org (line 12) | def test_repo_colon_with_org(self) -> None: method test_repo_space_with_org (line 16) | def test_repo_space_with_org(self) -> None: method test_repo_colon_name_only_uses_default_owner (line 20) | def test_repo_colon_name_only_uses_default_owner(self) -> None: method test_repo_space_name_only_uses_default_owner (line 24) | def test_repo_space_name_only_uses_default_owner(self) -> None: method test_repo_name_only_custom_default_owner (line 28) | def test_repo_name_only_custom_default_owner(self) -> None: method test_github_url (line 32) | def test_github_url(self) -> None: method test_explicit_repo_beats_github_url (line 38) | def test_explicit_repo_beats_github_url(self) -> None: method test_no_repo_returns_none (line 44) | def test_no_repo_returns_none(self) -> None: method test_empty_string_returns_none (line 48) | def test_empty_string_returns_none(self) -> None: method test_trailing_slash_stripped (line 52) | def test_trailing_slash_stripped(self) -> None: class TestLinearWebhookRepoOverride (line 57) | class TestLinearWebhookRepoOverride: method _base_payload (line 61) | def _base_payload(self) -> dict: method test_comment_repo_overrides_team_mapping (line 77) | async def test_comment_repo_overrides_team_mapping(self, _base_payload... method test_falls_back_to_team_mapping_when_no_repo_in_comment (line 113) | async def test_falls_back_to_team_mapping_when_no_repo_in_comment(self... FILE: tests/test_sandbox_paths.py class _FakeProvider (line 14) | class _FakeProvider: method __init__ (line 15) | def __init__(self, work_dir: str | None = None, home_dir: str | None =... method get_work_dir (line 19) | def get_work_dir(self) -> str: method get_user_home_dir (line 24) | def get_user_home_dir(self) -> str: class _FakeSandboxBackend (line 30) | class _FakeSandboxBackend: method __init__ (line 31) | def __init__( method id (line 44) | def id(self) -> str: method execute (line 47) | def execute(self, command: str, *, timeout: int | None = None) -> Exec... function test_resolve_repo_dir_uses_provider_work_dir (line 66) | def test_resolve_repo_dir_uses_provider_work_dir() -> None: function test_resolve_sandbox_work_dir_falls_back_to_home_when_work_dir_is_not_writable (line 78) | def test_resolve_sandbox_work_dir_falls_back_to_home_when_work_dir_is_no... function test_resolve_sandbox_work_dir_caches_the_result (line 98) | def test_resolve_sandbox_work_dir_caches_the_result() -> None: function test_aresolve_repo_dir_offloads_sync_resolution (line 112) | async def test_aresolve_repo_dir_offloads_sync_resolution() -> None: FILE: tests/test_slack_context.py class _FakeNotFoundError (line 15) | class _FakeNotFoundError(Exception): class _FakeThreadsClient (line 19) | class _FakeThreadsClient: method __init__ (line 20) | def __init__(self, thread: dict | None = None, raise_not_found: bool =... method get (line 25) | async def get(self, thread_id: str) -> dict: class _FakeClient (line 34) | class _FakeClient: method __init__ (line 35) | def __init__(self, threads_client: _FakeThreadsClient) -> None: function test_generate_thread_id_from_slack_thread_is_deterministic (line 39) | def test_generate_thread_id_from_slack_thread_is_deterministic() -> None: function test_select_slack_context_messages_uses_thread_start_when_no_prior_mention (line 48) | def test_select_slack_context_messages_uses_thread_start_when_no_prior_m... function test_select_slack_context_messages_uses_previous_mention_boundary (line 62) | def test_select_slack_context_messages_uses_previous_mention_boundary() ... function test_select_slack_context_messages_ignores_messages_after_current_event (line 77) | def test_select_slack_context_messages_ignores_messages_after_current_ev... function test_strip_bot_mention_removes_bot_tag (line 92) | def test_strip_bot_mention_removes_bot_tag() -> None: function test_strip_bot_mention_removes_bot_username_tag (line 96) | def test_strip_bot_mention_removes_bot_username_tag() -> None: function test_replace_bot_mention_with_username (line 103) | def test_replace_bot_mention_with_username() -> None: function test_format_slack_messages_for_prompt_uses_name_and_id (line 110) | def test_format_slack_messages_for_prompt_uses_name_and_id() -> None: function test_format_slack_messages_for_prompt_replaces_bot_id_mention_in_text (line 119) | def test_format_slack_messages_for_prompt_replaces_bot_id_mention_in_tex... function test_select_slack_context_messages_detects_username_mention (line 130) | def test_select_slack_context_messages_detects_username_mention() -> None: function test_get_slack_repo_config_message_repo_overrides_existing_thread_repo (line 146) | def test_get_slack_repo_config_message_repo_overrides_existing_thread_repo( function test_get_slack_repo_config_parses_message_for_new_thread (line 172) | def test_get_slack_repo_config_parses_message_for_new_thread( function test_get_slack_repo_config_existing_thread_without_repo_uses_default (line 190) | def test_get_slack_repo_config_existing_thread_without_repo_uses_default( function test_get_slack_repo_config_space_syntax_detected (line 211) | def test_get_slack_repo_config_space_syntax_detected( function test_get_slack_repo_config_github_url_extracted (line 232) | def test_get_slack_repo_config_github_url_extracted( function test_get_slack_repo_config_explicit_repo_beats_github_url (line 255) | def test_get_slack_repo_config_explicit_repo_beats_github_url( function test_get_slack_repo_config_explicit_space_syntax_beats_thread_metadata (line 278) | def test_get_slack_repo_config_explicit_space_syntax_beats_thread_metadata( function test_get_slack_repo_config_github_url_beats_thread_metadata (line 301) | def test_get_slack_repo_config_github_url_beats_thread_metadata( function test_get_slack_repo_config_repo_name_only_defaults_org (line 326) | def test_get_slack_repo_config_repo_name_only_defaults_org( function test_get_slack_repo_config_repo_name_only_space_syntax (line 345) | def test_get_slack_repo_config_repo_name_only_space_syntax(