diff --git a/github/index.ts b/github/index.ts index fc32083b..38bafd36 100644 --- a/github/index.ts +++ b/github/index.ts @@ -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().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({ 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({ 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 `${titleAlt}\n` })() const shareUrl = shareId ? `[opencode session](${useShareUrl()}/s/${shareId})  |  ` : "" - return `\n\n${image}${shareUrl}[github run](${useRunUrl()})` + return `\n\n${image}${shareUrl}[github run](${useEnvRunUrl()})` } async function fetchRepo() {