From 31e6ed6806927d3ffd925d12fe6cd1df14cd6a25 Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Wed, 10 Dec 2025 16:35:55 -0300 Subject: [PATCH] Add Eyes Reaction instead of Comment Working on Github Action (#5072) --- packages/opencode/src/cli/cmd/github.ts | 67 ++++++++++++++++--------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/packages/opencode/src/cli/cmd/github.ts b/packages/opencode/src/cli/cmd/github.ts index 99bbb8cc4..c61c2c491 100644 --- a/packages/opencode/src/cli/cmd/github.ts +++ b/packages/opencode/src/cli/cmd/github.ts @@ -403,12 +403,12 @@ export const GithubRunCommand = cmd({ let appToken: string let octoRest: Octokit let octoGraph: typeof graphql - let commentId: number let gitConfig: string let session: { id: string; title: string; version: string } let shareId: string | undefined let exitCode = 0 type PromptFiles = Awaited>["promptFiles"] + const triggerCommentId = payload.comment.id try { const actionToken = isMock ? args.token! : await getOidcToken() @@ -422,8 +422,7 @@ export const GithubRunCommand = cmd({ await configureGit(appToken) await assertPermissions() - const comment = await createComment() - commentId = comment.data.id + await addReaction("eyes") // Setup opencode session const repoData = await fetchRepo() @@ -455,7 +454,8 @@ export const GithubRunCommand = cmd({ await pushToLocalBranch(summary, uncommittedChanges) } const hasShared = prData.comments.nodes.some((c) => c.body.includes(`${shareBaseUrl}/s/${shareId}`)) - await updateComment(`${response}${footer({ image: !hasShared })}`) + await createComment(`${response}${footer({ image: !hasShared })}`) + await removeReaction() } // Fork PR else { @@ -469,7 +469,8 @@ export const GithubRunCommand = cmd({ await pushToForkBranch(summary, prData, uncommittedChanges) } const hasShared = prData.comments.nodes.some((c) => c.body.includes(`${shareBaseUrl}/s/${shareId}`)) - await updateComment(`${response}${footer({ image: !hasShared })}`) + await createComment(`${response}${footer({ image: !hasShared })}`) + await removeReaction() } } // Issue @@ -489,9 +490,11 @@ export const GithubRunCommand = cmd({ summary, `${response}\n\nCloses #${issueId}${footer({ image: true })}`, ) - await updateComment(`Created PR #${pr}${footer({ image: true })}`) + await createComment(`Created PR #${pr}${footer({ image: true })}`) + await removeReaction() } else { - await updateComment(`${response}${footer({ image: true })}`) + await createComment(`${response}${footer({ image: true })}`) + await removeReaction() } } } catch (e: any) { @@ -503,7 +506,8 @@ export const GithubRunCommand = cmd({ } else if (e instanceof Error) { msg = e.message } - await updateComment(`${msg}${footer()}`) + await createComment(`${msg}${footer()}`) + await removeReaction() core.setFailed(msg) // Also output the clean error message for the action to capture //core.setOutput("prepare_error", e.message); @@ -931,24 +935,41 @@ Co-authored-by: ${actor} <${actor}@users.noreply.github.com>"` if (!["admin", "write"].includes(permission)) throw new Error(`User ${actor} does not have write permissions`) } - async function createComment() { + async function addReaction(reaction: "eyes") { + console.log("Adding reaction...") + return await octoRest.rest.reactions.createForIssueComment({ + owner, + repo, + comment_id: triggerCommentId, + content: reaction, + }) + } + + async function removeReaction() { + console.log("Removing reaction...") + const reactions = await octoRest.rest.reactions.listForIssueComment({ + owner, + repo, + comment_id: triggerCommentId, + }) + + const eyesReaction = reactions.data.find((r) => r.content === "eyes") + if (!eyesReaction) return + + await octoRest.rest.reactions.deleteForIssueComment({ + owner, + repo, + comment_id: triggerCommentId, + reaction_id: eyesReaction.id, + }) + } + + async function createComment(body: string) { console.log("Creating comment...") return await octoRest.rest.issues.createComment({ owner, repo, issue_number: issueId, - body: `[Working...](${runUrl})`, - }) - } - - async function updateComment(body: string) { - if (!commentId) return - - console.log("Updating comment...") - return await octoRest.rest.issues.updateComment({ - owner, - repo, - comment_id: commentId, body, }) } @@ -1029,7 +1050,7 @@ query($owner: String!, $repo: String!, $number: Int!) { const comments = (issue.comments?.nodes || []) .filter((c) => { const id = parseInt(c.databaseId) - return id !== commentId && id !== payload.comment.id + return id !== payload.comment.id }) .map((c) => ` - ${c.author.login} at ${c.createdAt}: ${c.body}`) @@ -1148,7 +1169,7 @@ query($owner: String!, $repo: String!, $number: Int!) { const comments = (pr.comments?.nodes || []) .filter((c) => { const id = parseInt(c.databaseId) - return id !== commentId && id !== payload.comment.id + return id !== payload.comment.id }) .map((c) => `- ${c.author.login} at ${c.createdAt}: ${c.body}`)