from typing import Any from langgraph.config import get_config from agent.utils.slack import GitHubPrRef, parse_github_pr_url async def trigger_pr_review_from_ref( pr_ref: GitHubPrRef, *, source: str, github_login: str = "", github_user_id: int | None = None, slack_channel_id: str = "", slack_thread_ts: str = "", instructions: str = "", request_verdict: bool = False, ) -> dict[str, Any]: from agent.webhooks.github import trigger_pr_review_from_ref as _trigger_pr_review_from_ref return await _trigger_pr_review_from_ref( pr_ref, source=source, github_login=github_login, github_user_id=github_user_id, slack_channel_id=slack_channel_id, slack_thread_ts=slack_thread_ts, instructions=instructions, request_verdict=request_verdict, ) async def request_pr_review( pr_url: str, instructions: str = "", request_verdict: bool = False, ) -> dict[str, Any]: """Start the reviewer agent for a GitHub pull request URL. Args: pr_url: The pull request URL, e.g. ``https://github.com/OWNER/REPO/pull/NUMBER``. instructions: The requesting user's review instructions, passed VERBATIM (do not paraphrase, summarize, or add your own). They may set review focus, a merge bar, or decision criteria. Dispatch independently resolves whether the reviewer may submit a GitHub verdict under repository policy. request_verdict: Set True only for an explicit human request for an approve/request-changes decision. This grants direct verdict authority in addition to dispatch-side policy; never infer that elevated requested authority from tone or context. False does not force a comment-only review because dispatch may independently authorize verdicts from repository and pull-request context. Never submit a verdict yourself through ``gh pr review`` or the GitHub API; that path is blocked. """ pr_ref = parse_github_pr_url(pr_url) if not pr_ref: return { "success": False, "error": "Expected a GitHub PR URL like https://github.com/OWNER/REPO/pull/NUMBER", } configurable = get_config().get("configurable", {}) source = configurable.get("source") or "agent" slack_thread = configurable.get("slack_thread") or {} return await trigger_pr_review_from_ref( pr_ref, source=source, github_login=configurable.get("github_login", ""), github_user_id=configurable.get("github_user_id"), slack_channel_id=slack_thread.get("channel_id", ""), slack_thread_ts=slack_thread.get("thread_ts", ""), instructions=instructions, request_verdict=request_verdict, )