eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
6 lines (5 loc) • 3.4 kB
JavaScript
import{createLogger,extractErrorId,formatErrorHint,logError}from"#internal/logging.js";import{checkoutGitHubRepository}from"#public/channels/github/checkout.js";import{shouldDispatchGitHubComment}from"#public/channels/github/inbound.js";import{splitGitHubCommentBody}from"#public/channels/github/limits.js";const log=createLogger(`github.defaults`);function defaultGitHubAuth(e){let{sender:t}=e;return{attributes:{conversation_kind:e.conversation.kind,delivery_id:e.delivery.id,installation_id:String(e.github.installationId??``),issue_number:String(e.conversation.issueNumber??``),pull_request_number:String(e.conversation.pullRequestNumber??``),repository:e.repository.fullName,repository_id:String(e.repository.id),user_login:t.login,user_type:t.type},authenticator:`github-webhook`,issuer:`github:${e.repository.owner}`,principalId:`github:${t.id}`,principalType:t.type===`Bot`?`service`:`user`,subject:t.login}}async function defaultOnComment(e,t,n){return shouldDispatchGitHubComment({author:t.author,body:t.body,botName:await n.botName?.()})?{auth:defaultGitHubAuth(e)}:null}function createDefaultEvents(e={}){return{async"turn.started"(t,n,r){if(e.progress?.reactions!==!1)try{await n.thread.react(`eyes`)}catch(e){logError(log,`GitHub reaction failed — swallowed`,e)}await checkoutRepositoryForTurn(n,r,e)},async"message.completed"(e,t,n){e.finishReason!==`tool-calls`&&e.message&&await postCommentChunks(t,e.message)},async"input.requested"(t,n,r){if(t.requests.length===0)return;let i=t.requests.map(renderInputRequest),a=renderReplyInstruction(t.requests,await e.botName?.());a!==void 0&&i.push(a),await postCommentChunks(n,i.join(`
`))},async"session.failed"(e,t){let n=formatErrorHint(e),r=extractErrorId(e.details);await postFailure(t,[`This session could not recover from an error${n}.`,``,`Start a new comment to continue.`,...r?[``,`Error id: ${r}`]:[]].join(`
`))},async"turn.failed"(e,t,n){let r=formatErrorHint(e),i=extractErrorId(e.details);await postFailure(t,[`I hit an error while handling your request${r}.`,``,`Please try again, rephrase, or reach out if it keeps failing.`,...i?[``,`Error id: ${i}`]:[]].join(`
`))}}}function renderInputRequest(e){let t=[e.prompt];return e.options!==void 0&&e.options.length>0&&t.push(``,...e.options.map((e,t)=>{let n=e.description?` - ${e.description}`:``;return`${t+1}. ${e.label}${n}`})),e.allowFreeform===!0&&t.push(``,`You can also reply with a custom answer.`),t.join(`
`)}function renderReplyInstruction(e,t){let n=t?.trim();return n?`Answer by mentioning me in a reply, e.g. \`@${n} ${e.find(e=>(e.options?.length??0)>0)?.options?.[0]?.label??`<your answer>`}\`.`:void 0}async function checkoutRepositoryForTurn(e,t,n){let{state:r}=e;try{let e=await t.getSandbox(),i=await checkoutGitHubRepository(e,{api:n.api,baseRef:r.baseRef,baseSha:r.baseSha,credentials:n.credentials,defaultBranch:r.defaultBranch,headRef:r.headRef,headSha:r.headSha,includeBase:r.pullRequestNumber!==null,installationId:r.installationId,owner:r.owner,pullRequestNumber:r.pullRequestNumber,repo:r.repo});r.checkoutPath=i.path,r.headSha=i.sha,r.baseRef=i.baseRef}catch(e){logError(log,`GitHub checkout failed — swallowed`,e)}}async function postCommentChunks(e,t){for(let n of splitGitHubCommentBody(t))await e.thread.post(n)}async function postFailure(e,t){await postCommentChunks(e,t)}export{createDefaultEvents,defaultGitHubAuth,defaultOnComment};