This commit is contained in:
Frank 2025-08-18 00:59:22 +08:00
parent 0a6152a0e0
commit 27f7cc86ab

View file

@ -113,10 +113,6 @@ type IssueQueryResponse = {
}
const { client, server } = createOpencode()
let input = {
mockEvent: process.env["MOCK_EVENT"],
mockToken: process.env["MOCK_TOKEN"],
}
let accessToken: string
let octoRest: Octokit
let octoGraph: typeof graphql
@ -150,8 +146,8 @@ try {
session = await client.session.create<true>().then((r) => r.data)
await subscribeSessionEvents()
shareId = await (async () => {
if (useShare() === false) return
if (!useShare() && repoData.data.private) return
if (useEnvShare() === false) return
if (!useEnvShare() && repoData.data.private) return
await client.session.share<true>({ path: session })
return session.id.slice(-8)
})()
@ -274,23 +270,7 @@ function assertContextEvent(...events: string[]) {
return context
}
function isMock() {
const { mockEvent, mockToken } = input
return Boolean(mockEvent || mockToken)
}
function isPullRequest() {
const context = useContext()
const payload = context.payload as IssueCommentEvent
return Boolean(payload.issue.pull_request)
}
function useContext() {
const { mockEvent } = input
return isMock() ? (JSON.parse(mockEvent!) as GitHubContext) : github.context
}
function useModel() {
function useEnvModel() {
const value = process.env["MODEL"]
if (!value) throw new Error(`Environment variable "MODEL" is not set`)
@ -302,7 +282,7 @@ function useModel() {
return { providerID, modelID }
}
function useRunUrl() {
function useEnvRunUrl() {
const { repo } = useContext()
const runId = process.env["GITHUB_RUN_ID"]
@ -311,7 +291,7 @@ function useRunUrl() {
return `/${repo.owner}/${repo.repo}/actions/runs/${runId}`
}
function useShare() {
function useEnvShare() {
const value = process.env["SHARE"]
if (!value) return undefined
if (value === "true") return true
@ -319,6 +299,33 @@ function useShare() {
throw new Error(`Invalid share value: ${value}. Share must be a boolean.`)
}
function useEnvMock() {
return {
mockEvent: process.env["MOCK_EVENT"],
mockToken: process.env["MOCK_TOKEN"],
}
}
function useEnvGithubApp() {
if (process.env["USE_GITHUB_APP"]?.toLowerCase() === "false") return false
return true
}
function isMock() {
const { mockEvent, mockToken } = useEnvMock()
return Boolean(mockEvent || mockToken)
}
function isPullRequest() {
const context = useContext()
const payload = context.payload as IssueCommentEvent
return Boolean(payload.issue.pull_request)
}
function useContext() {
return isMock() ? (JSON.parse(useEnvMock().mockEvent!) as GitHubContext) : github.context
}
function useIssueId() {
const payload = useContext().payload as IssueCommentEvent
return payload.issue.number
@ -331,12 +338,14 @@ function useShareUrl() {
async function getAccessToken() {
const { repo } = useContext()
if (useEnvGithubApp()) return await core.getIDToken("opencode-github-action")
let response
if (isMock()) {
response = await fetch("https://api.opencode.ai/exchange_github_app_token_with_pat", {
method: "POST",
headers: {
Authorization: `Bearer ${input.mockToken}`,
Authorization: `Bearer ${useEnvMock().mockToken}`,
},
body: JSON.stringify({ owner: repo.owner, repo: repo.repo }),
})
@ -366,7 +375,7 @@ async function createComment() {
owner: repo.owner,
repo: repo.repo,
issue_number: useIssueId(),
body: `[Working...](${useRunUrl()})`,
body: `[Working...](${useEnvRunUrl()})`,
})
}
@ -525,7 +534,7 @@ async function summarize(response: string) {
async function chat(text: string, files: PromptFiles = []) {
console.log("Sending message to opencode...")
const { providerID, modelID } = useModel()
const { providerID, modelID } = useEnvModel()
const chat = await client.session.chat<true>({
path: session,
@ -722,7 +731,7 @@ async function createPR(base: string, branch: string, title: string, body: strin
}
function footer(opts?: { image?: boolean }) {
const { providerID, modelID } = useModel()
const { providerID, modelID } = useEnvModel()
const image = (() => {
if (!shareId) return ""
@ -734,7 +743,7 @@ function footer(opts?: { image?: boolean }) {
return `<a href="${useShareUrl()}/s/${shareId}"><img width="200" alt="${titleAlt}" src="https://social-cards.sst.dev/opencode-share/${title64}.png?model=${providerID}/${modelID}&version=${session.version}&id=${shareId}" /></a>\n`
})()
const shareUrl = shareId ? `[opencode session](${useShareUrl()}/s/${shareId})&nbsp;&nbsp;|&nbsp;&nbsp;` : ""
return `\n\n${image}${shareUrl}[github run](${useRunUrl()})`
return `\n\n${image}${shareUrl}[github run](${useEnvRunUrl()})`
}
async function fetchRepo() {