Skip to content

Commit 17fce5c

Browse files
committed
feedback
1 parent d37daee commit 17fce5c

12 files changed

+142
-94
lines changed

packages/agents/reviewAgent/nodes/fetch_file_content.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { sourcebot_context, sourcebot_pr_payload } from "../types.js";
1+
import { sourcebot_context, sourcebot_pr_payload } from "../src/types.js";
22
import { z } from "zod";
33

44
// TODO: use original Sourcebot schemas instead of redefining here

packages/agents/reviewAgent/nodes/generate_pr_reviews.ts

Lines changed: 0 additions & 46 deletions
This file was deleted.

packages/agents/reviewAgent/nodes/github_push_pr_reviews.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

packages/agents/reviewAgent/package.json

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "review-agent",
2+
"name": "@sourcebot/review-agent",
33
"version": "1.0.0",
44
"description": "",
55
"main": "index.js",
@@ -8,17 +8,6 @@
88
"build": "tsc",
99
"start": "node dist/app.js"
1010
},
11-
"repository": {
12-
"type": "git",
13-
"url": "git+https://github.com/sourcebot-dev/review-agent.git"
14-
},
15-
"keywords": [],
16-
"author": "",
17-
"license": "ISC",
18-
"bugs": {
19-
"url": "https://github.com/sourcebot-dev/review-agent/issues"
20-
},
21-
"homepage": "https://github.com/sourcebot-dev/review-agent#readme",
2211
"dependencies": {
2312
"@octokit/webhooks": "^13.8.2",
2413
"@octokit/webhooks-definitions": "octokit/webhooks",
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { sourcebot_context, sourcebot_pr_payload } from "../types.js";
2+
import { fileSourceResponseSchema } from "@sourcebot/web/src/features/search/schemas.js";
3+
import { base64Decode } from "@sourcebot/web/src/lib/utils.js";
4+
5+
export const fetch_file_content = async (pr_payload: sourcebot_pr_payload, filename: string): Promise<sourcebot_context> => {
6+
console.log("Executing fetch_file_content");
7+
8+
const repoPath = pr_payload.hostDomain + "/" + pr_payload.owner + "/" + pr_payload.repo;
9+
const fileSourceRequest = {
10+
fileName: filename,
11+
repository: repoPath,
12+
}
13+
console.log(JSON.stringify(fileSourceRequest, null, 2));
14+
15+
const response = await fetch('http://localhost:3000/api/source', {
16+
method: 'POST',
17+
headers: {
18+
'Content-Type': 'application/json',
19+
'X-Org-Domain': '~'
20+
},
21+
body: JSON.stringify(fileSourceRequest)
22+
});
23+
24+
if (!response.ok) {
25+
throw new Error(`Failed to fetch file content for ${filename} from ${repoPath}: ${response.statusText}`);
26+
}
27+
28+
const responseData = await response.json();
29+
const fileSourceResponse = fileSourceResponseSchema.parse(responseData);
30+
const fileContent = base64Decode(fileSourceResponse.source);
31+
32+
const fileContentContext: sourcebot_context = {
33+
type: "file_content",
34+
description: `The content of the file ${filename}`,
35+
context: fileContent,
36+
}
37+
38+
console.log("Completed fetch_file_content");
39+
return fileContentContext;
40+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { sourcebot_pr_payload, sourcebot_diff_review, sourcebot_file_diff_review, sourcebot_context } from "../types.js";
2+
import { generate_diff_review_prompt } from "./generate_diff_review_prompt.js";
3+
import { invoke_diff_review_llm } from "./invoke_diff_review_llm.js";
4+
import { fetch_file_content } from "./fetch_file_content.js";
5+
6+
export const generate_pr_reviews = async (pr_payload: sourcebot_pr_payload, rules: string[]): Promise<sourcebot_file_diff_review[]> => {
7+
console.log("Executing generate_pr_reviews");
8+
9+
const file_diff_reviews: sourcebot_file_diff_review[] = [];
10+
for (const file_diff of pr_payload.file_diffs) {
11+
const reviews: sourcebot_diff_review[] = [];
12+
13+
for (const diff of file_diff.diffs) {
14+
try {
15+
const fileContentContext = await fetch_file_content(pr_payload, file_diff.to);
16+
const context: sourcebot_context[] = [
17+
{
18+
type: "pr_title",
19+
description: "The title of the pull request",
20+
context: pr_payload.title,
21+
},
22+
{
23+
type: "pr_description",
24+
description: "The description of the pull request",
25+
context: pr_payload.description,
26+
},
27+
fileContentContext,
28+
];
29+
30+
const prompt = await generate_diff_review_prompt(diff, context, rules);
31+
32+
const diffReview = await invoke_diff_review_llm(prompt, file_diff.to);
33+
reviews.push(diffReview);
34+
} catch (error) {
35+
console.error(`Error fetching file content for ${file_diff.to}: ${error}`);
36+
}
37+
}
38+
39+
if (reviews.length > 0) {
40+
file_diff_reviews.push({
41+
filename: file_diff.to,
42+
reviews: reviews,
43+
});
44+
}
45+
}
46+
47+
console.log("Completed generate_pr_reviews");
48+
return file_diff_reviews;
49+
}

packages/agents/reviewAgent/nodes/github_pr_parser.ts renamed to packages/agents/reviewAgent/src/nodes/github_pr_parser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import { Octokit } from "octokit";
66
export const github_pr_parser = async (octokit: Octokit, payload: WebhookEventDefinition<"pull-request-opened"> | WebhookEventDefinition<"pull-request-synchronize">): Promise<sourcebot_pr_payload> => {
77
console.log("Executing github_pr_parser");
88

9+
if (!payload.installation) {
10+
throw new Error("Installation not found in github payload");
11+
}
12+
913
const diff = await octokit.request(payload.pull_request.patch_url);
1014
const parsedDiff: parse.File[] = parse(diff.data);
1115

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { App } from "octokit";
2+
import { sourcebot_pr_payload, sourcebot_file_diff_review } from "../types.js";
3+
4+
export const github_push_pr_reviews = async (app: App, pr_payload: sourcebot_pr_payload, file_diff_reviews: sourcebot_file_diff_review[]) => {
5+
console.log("Executing github_push_pr_reviews");
6+
7+
try {
8+
const installationId = pr_payload.installation_id;
9+
const installation = await app.getInstallationOctokit(installationId);
10+
11+
for (const file_diff_review of file_diff_reviews) {
12+
for (const review of file_diff_review.reviews) {
13+
try {
14+
await installation.rest.pulls.createReviewComment({
15+
owner: pr_payload.owner,
16+
repo: pr_payload.repo,
17+
pull_number: pr_payload.number,
18+
body: review.review,
19+
path: file_diff_review.filename,
20+
commit_id: pr_payload.head_sha,
21+
side: "RIGHT",
22+
...(review.line_start === review.line_end
23+
? { line: review.line_start }
24+
: {
25+
start_line: review.line_start,
26+
line: review.line_end,
27+
start_side: "RIGHT",
28+
}),
29+
});
30+
} catch (error) {
31+
console.error(`Error pushing pr reviews for ${file_diff_review.filename}: ${error}`);
32+
}
33+
}
34+
}
35+
} catch (error) {
36+
console.error(`Error pushing pr reviews: ${error}`);
37+
}
38+
39+
console.log("Completed github_push_pr_reviews");
40+
}

0 commit comments

Comments
 (0)