summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Polito <[email protected]>2025-12-10 16:35:55 -0300
committerGitHub <[email protected]>2025-12-10 13:35:55 -0600
commit31e6ed6806927d3ffd925d12fe6cd1df14cd6a25 (patch)
tree4af0ee119d2dd341c7d06c3350b5d94768788793
parentda56319af496d05f9470d4ee877a2dd423a3fdec (diff)
downloadopencode-31e6ed6806927d3ffd925d12fe6cd1df14cd6a25.tar.gz
opencode-31e6ed6806927d3ffd925d12fe6cd1df14cd6a25.zip
Add Eyes Reaction instead of Comment Working on Github Action (#5072)
-rw-r--r--packages/opencode/src/cli/cmd/github.ts61
1 files changed, 41 insertions, 20 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<ReturnType<typeof getUserPrompt>>["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() {
- console.log("Creating comment...")
- return await octoRest.rest.issues.createComment({
+ async function addReaction(reaction: "eyes") {
+ console.log("Adding reaction...")
+ return await octoRest.rest.reactions.createForIssueComment({
owner,
repo,
- issue_number: issueId,
- body: `[Working...](${runUrl})`,
+ comment_id: triggerCommentId,
+ content: reaction,
})
}
- async function updateComment(body: string) {
- if (!commentId) return
+ 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
- console.log("Updating comment...")
- return await octoRest.rest.issues.updateComment({
+ await octoRest.rest.reactions.deleteForIssueComment({
owner,
repo,
- comment_id: commentId,
+ 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,
})
}
@@ -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}`)