Accept review_requested on pull_request webhook events.

Gitea sends review requests as pull_request/review_requested, not only pull_request_review_request.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Daan Schouteden
2026-06-03 10:59:22 +02:00
parent 376c499c81
commit 84db121a4c
3 changed files with 17 additions and 4 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ This bot is designed to run once for many repositories in `Bram/*` instead of du
- Listens to Gitea webhook events. - Listens to Gitea webhook events.
- Triggers on: - Triggers on:
- `pull_request` with action `opened` - `pull_request` with action `opened`
- `pull_request_review_request` with action `review_requested` when requested reviewer is the bot user - `pull_request` or `pull_request_review_request` with action `review_requested` when requested reviewer is the bot user
- Loads PR metadata and changed files from Gitea. - Loads PR metadata and changed files from Gitea.
- Builds a review prompt (including optional repo-specific rule files). - Builds a review prompt (including optional repo-specific rule files).
- Calls Cursor Cloud Agent (`Agent.prompt`) for structured review output. - Calls Cursor Cloud Agent (`Agent.prompt`) for structured review output.
+1 -1
View File
@@ -4,7 +4,7 @@
- Processes only: - Processes only:
- `pull_request` with action `opened` - `pull_request` with action `opened`
- `pull_request_review_request` with action `review_requested` and reviewer matching bot login - `pull_request` or `pull_request_review_request` with action `review_requested` and reviewer matching bot login
- Idempotency key: `{owner}/{repo}#{pr_number}#{head_sha}` - Idempotency key: `{owner}/{repo}#{pr_number}#{head_sha}`
- Removes bot from reviewers after a successful review post - Removes bot from reviewers after a successful review post
+15 -2
View File
@@ -1,5 +1,7 @@
import { RoutedEvent, PullRequestWebhookPayload } from "../types/events.js"; import { RoutedEvent, PullRequestWebhookPayload } from "../types/events.js";
const REVIEW_REQUEST_EVENTS = new Set(["pull_request", "pull_request_review_request"]);
export function routeEvent(input: { export function routeEvent(input: {
eventName: string | undefined; eventName: string | undefined;
payload: PullRequestWebhookPayload; payload: PullRequestWebhookPayload;
@@ -12,12 +14,23 @@ export function routeEvent(input: {
} }
if ( if (
eventName === "pull_request_review_request" && eventName &&
REVIEW_REQUEST_EVENTS.has(eventName) &&
payload.action === "review_requested" && payload.action === "review_requested" &&
payload.requested_reviewer?.login === botLogin isReviewRequestedForBot(payload, botLogin)
) { ) {
return { kind: "review_requested", payload }; return { kind: "review_requested", payload };
} }
return null; return null;
} }
function isReviewRequestedForBot(payload: PullRequestWebhookPayload, botLogin: string): boolean {
if (payload.requested_reviewer?.login === botLogin) {
return true;
}
return (payload.pull_request.requested_reviewers ?? []).some(
(reviewer) => reviewer.login === botLogin
);
}